Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Side by Side Diff: src/type-info.cc

Issue 2406843002: [Interpreter] Collect feedback about Oddballs in Subtract Stub. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/globals.h ('K') | « src/type-feedback-vector-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/type-info.h" 5 #include "src/type-info.h"
6 6
7 #include "src/ast/ast.h" 7 #include "src/ast/ast.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/ic/ic.h" 9 #include "src/ic/ic.h"
10 #include "src/ic/stub-cache.h" 10 #include "src/ic/stub-cache.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 FeedbackVectorSlot slot) { 186 FeedbackVectorSlot slot) {
187 Handle<Object> info = GetInfo(slot); 187 Handle<Object> info = GetInfo(slot);
188 if (info->IsAllocationSite()) { 188 if (info->IsAllocationSite()) {
189 return Handle<AllocationSite>::cast(info); 189 return Handle<AllocationSite>::cast(info);
190 } 190 }
191 return Handle<AllocationSite>::null(); 191 return Handle<AllocationSite>::null();
192 } 192 }
193 193
194 namespace { 194 namespace {
195 195
196 AstType* CompareOpHintToType(CompareOperationHint hint) { 196 AstType* CompareOpHintToType(CompareOperationHint hint) {
Leszek Swirski 2016/10/10 11:57:22 Should this have a similar change to below?
mythria 2016/10/10 13:26:00 Yes, I think so. I was planning to do with along w
197 switch (hint) { 197 switch (hint) {
198 case CompareOperationHint::kNone: 198 case CompareOperationHint::kNone:
199 return AstType::None(); 199 return AstType::None();
200 case CompareOperationHint::kSignedSmall: 200 case CompareOperationHint::kSignedSmall:
201 return AstType::SignedSmall(); 201 return AstType::SignedSmall();
202 case CompareOperationHint::kNumber: 202 case CompareOperationHint::kNumber:
203 return AstType::Number(); 203 return AstType::Number();
204 case CompareOperationHint::kNumberOrOddball: 204 case CompareOperationHint::kNumberOrOddball:
205 return AstType::NumberOrOddball(); 205 return AstType::NumberOrOddball();
206 case CompareOperationHint::kAny: 206 case CompareOperationHint::kAny:
207 return AstType::Any(); 207 return AstType::Any();
208 } 208 }
209 UNREACHABLE(); 209 UNREACHABLE();
210 return AstType::None(); 210 return AstType::None();
211 } 211 }
212 212
213 AstType* BinaryOpHintToType(BinaryOperationHint hint) { 213 AstType* BinaryOpFeedbackToType(int hint) {
214 switch (hint) { 214 switch (hint) {
215 case BinaryOperationHint::kNone: 215 case BinaryOperationFeedback::kNone:
216 return AstType::None(); 216 return AstType::None();
217 case BinaryOperationHint::kSignedSmall: 217 case BinaryOperationFeedback::kSignedSmall:
218 return AstType::SignedSmall(); 218 return AstType::SignedSmall();
219 case BinaryOperationHint::kSigned32: 219 case BinaryOperationFeedback::kNumber:
220 return AstType::Signed32();
221 case BinaryOperationHint::kNumberOrOddball:
222 return AstType::Number(); 220 return AstType::Number();
223 case BinaryOperationHint::kString: 221 case BinaryOperationFeedback::kString:
224 return AstType::String(); 222 return AstType::String();
225 case BinaryOperationHint::kAny: 223 // TODO(mythria): Merge Number and NumberOrOddball feedback, after
224 // fixing crankshaft to handle Oddballs along with Numbers.
225 case BinaryOperationFeedback::kNumberOrOddball:
226 case BinaryOperationFeedback::kAny:
227 default:
226 return AstType::Any(); 228 return AstType::Any();
227 } 229 }
228 UNREACHABLE(); 230 UNREACHABLE();
229 return AstType::None(); 231 return AstType::None();
230 } 232 }
231 233
232 } // end anonymous namespace 234 } // end anonymous namespace
233 235
234 void TypeFeedbackOracle::CompareType(TypeFeedbackId id, FeedbackVectorSlot slot, 236 void TypeFeedbackOracle::CompareType(TypeFeedbackId id, FeedbackVectorSlot slot,
235 AstType** left_type, AstType** right_type, 237 AstType** left_type, AstType** right_type,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 *allocation_site = Handle<AllocationSite>::null(); 294 *allocation_site = Handle<AllocationSite>::null();
293 return; 295 return;
294 } 296 }
295 297
296 // Feedback from Ignition. The feedback slot will be allocated and initialized 298 // Feedback from Ignition. The feedback slot will be allocated and initialized
297 // to AstType::None() even when ignition is not enabled. So it is safe to get 299 // to AstType::None() even when ignition is not enabled. So it is safe to get
298 // feedback from the type feedback vector. 300 // feedback from the type feedback vector.
299 DCHECK(!slot.IsInvalid()); 301 DCHECK(!slot.IsInvalid());
300 BinaryOpICNexus nexus(feedback_vector_, slot); 302 BinaryOpICNexus nexus(feedback_vector_, slot);
301 *left = *right = *result = 303 *left = *right = *result =
302 BinaryOpHintToType(nexus.GetBinaryOperationFeedback()); 304 BinaryOpFeedbackToType(Smi::cast(nexus.GetFeedback())->value());
303 *fixed_right_arg = Nothing<int>(); 305 *fixed_right_arg = Nothing<int>();
304 *allocation_site = Handle<AllocationSite>::null(); 306 *allocation_site = Handle<AllocationSite>::null();
305 307
306 if (!object->IsCode()) return; 308 if (!object->IsCode()) return;
307 309
308 // Merge the feedback from full-codegen if available. 310 // Merge the feedback from full-codegen if available.
309 Handle<Code> code = Handle<Code>::cast(object); 311 Handle<Code> code = Handle<Code>::cast(object);
310 DCHECK_EQ(Code::BINARY_OP_IC, code->kind()); 312 DCHECK_EQ(Code::BINARY_OP_IC, code->kind());
311 BinaryOpICState state(isolate(), code->extra_ic_state()); 313 BinaryOpICState state(isolate(), code->extra_ic_state());
312 DCHECK_EQ(op, state.op()); 314 DCHECK_EQ(op, state.op());
(...skipping 14 matching lines...) Expand all
327 AstType* TypeFeedbackOracle::CountType(TypeFeedbackId id, 329 AstType* TypeFeedbackOracle::CountType(TypeFeedbackId id,
328 FeedbackVectorSlot slot) { 330 FeedbackVectorSlot slot) {
329 Handle<Object> object = GetInfo(id); 331 Handle<Object> object = GetInfo(id);
330 if (slot.IsInvalid()) { 332 if (slot.IsInvalid()) {
331 DCHECK(!object->IsCode()); 333 DCHECK(!object->IsCode());
332 return AstType::None(); 334 return AstType::None();
333 } 335 }
334 336
335 DCHECK(!slot.IsInvalid()); 337 DCHECK(!slot.IsInvalid());
336 BinaryOpICNexus nexus(feedback_vector_, slot); 338 BinaryOpICNexus nexus(feedback_vector_, slot);
337 AstType* type = BinaryOpHintToType(nexus.GetBinaryOperationFeedback()); 339 AstType* type =
340 BinaryOpFeedbackToType(Smi::cast(nexus.GetFeedback())->value());
338 341
339 if (!object->IsCode()) return type; 342 if (!object->IsCode()) return type;
340 343
341 Handle<Code> code = Handle<Code>::cast(object); 344 Handle<Code> code = Handle<Code>::cast(object);
342 DCHECK_EQ(Code::BINARY_OP_IC, code->kind()); 345 DCHECK_EQ(Code::BINARY_OP_IC, code->kind());
343 BinaryOpICState state(isolate(), code->extra_ic_state()); 346 BinaryOpICState state(isolate(), code->extra_ic_state());
344 return AstType::Union(type, state.GetLeftType(), zone()); 347 return AstType::Union(type, state.GetLeftType(), zone());
345 } 348 }
346 349
347 350
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 // Dictionary has been allocated with sufficient size for all elements. 548 // Dictionary has been allocated with sufficient size for all elements.
546 DisallowHeapAllocation no_need_to_resize_dictionary; 549 DisallowHeapAllocation no_need_to_resize_dictionary;
547 HandleScope scope(isolate()); 550 HandleScope scope(isolate());
548 USE(UnseededNumberDictionary::AtNumberPut( 551 USE(UnseededNumberDictionary::AtNumberPut(
549 dictionary_, IdToKey(ast_id), handle(target, isolate()))); 552 dictionary_, IdToKey(ast_id), handle(target, isolate())));
550 } 553 }
551 554
552 555
553 } // namespace internal 556 } // namespace internal
554 } // namespace v8 557 } // namespace v8
OLDNEW
« src/globals.h ('K') | « src/type-feedback-vector-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698