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

Side by Side Diff: src/ic.cc

Issue 441643008: Track number of generic ICs per function (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/flag-definitions.h ('k') | src/objects.h » ('j') | 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 321
322 322
323 MaybeHandle<Object> IC::ReferenceError(const char* type, Handle<String> name) { 323 MaybeHandle<Object> IC::ReferenceError(const char* type, Handle<String> name) {
324 HandleScope scope(isolate()); 324 HandleScope scope(isolate());
325 Handle<Object> error = isolate()->factory()->NewReferenceError( 325 Handle<Object> error = isolate()->factory()->NewReferenceError(
326 type, HandleVector(&name, 1)); 326 type, HandleVector(&name, 1));
327 return isolate()->Throw<Object>(error); 327 return isolate()->Throw<Object>(error);
328 } 328 }
329 329
330 330
331 static int ComputeTypeInfoCountDelta(IC::State old_state, IC::State new_state) { 331 static void ComputeTypeInfoCountDelta(IC::State old_state, IC::State new_state,
332 bool was_uninitialized = 332 int* polymorphic_delta,
333 old_state == UNINITIALIZED || old_state == PREMONOMORPHIC; 333 int* generic_delta) {
334 bool is_uninitialized = 334 switch (old_state) {
335 new_state == UNINITIALIZED || new_state == PREMONOMORPHIC; 335 case UNINITIALIZED:
336 return (was_uninitialized && !is_uninitialized) ? 1 : 336 case PREMONOMORPHIC:
337 (!was_uninitialized && is_uninitialized) ? -1 : 0; 337 if (new_state == UNINITIALIZED || new_state == PREMONOMORPHIC) break;
338 if (new_state == MONOMORPHIC || new_state == POLYMORPHIC) {
339 *polymorphic_delta = 1;
340 } else if (new_state == MEGAMORPHIC || new_state == GENERIC) {
341 *generic_delta = 1;
342 }
343 break;
344 case MONOMORPHIC:
345 case POLYMORPHIC:
346 if (new_state == MONOMORPHIC || new_state == POLYMORPHIC) break;
347 *polymorphic_delta = -1;
348 if (new_state == MEGAMORPHIC || new_state == GENERIC) {
349 *generic_delta = 1;
350 }
351 break;
352 case MEGAMORPHIC:
353 case GENERIC:
354 if (new_state == MEGAMORPHIC || new_state == GENERIC) break;
355 *generic_delta = -1;
356 if (new_state == MONOMORPHIC || new_state == POLYMORPHIC) {
357 *polymorphic_delta = 1;
358 }
359 break;
360 case PROTOTYPE_FAILURE:
361 case DEBUG_STUB:
362 UNREACHABLE();
363 }
338 } 364 }
339 365
340 366
341 void IC::PostPatching(Address address, Code* target, Code* old_target) { 367 void IC::PostPatching(Address address, Code* target, Code* old_target) {
342 Isolate* isolate = target->GetHeap()->isolate(); 368 Isolate* isolate = target->GetHeap()->isolate();
343 Code* host = isolate-> 369 Code* host = isolate->
344 inner_pointer_to_code_cache()->GetCacheEntry(address)->code; 370 inner_pointer_to_code_cache()->GetCacheEntry(address)->code;
345 if (host->kind() != Code::FUNCTION) return; 371 if (host->kind() != Code::FUNCTION) return;
346 372
347 if (FLAG_type_info_threshold > 0 && 373 if (FLAG_type_info_threshold > 0 && old_target->is_inline_cache_stub() &&
348 old_target->is_inline_cache_stub() && 374 target->is_inline_cache_stub() &&
349 target->is_inline_cache_stub()) { 375 // Call ICs don't have interesting state changes from this point
350 int delta = ComputeTypeInfoCountDelta(old_target->ic_state(), 376 // of view.
351 target->ic_state()); 377 target->kind() != Code::CALL_IC &&
352 // Call ICs don't have interesting state changes from this point 378 // Not all Code objects have TypeFeedbackInfo.
353 // of view. 379 host->type_feedback_info()->IsTypeFeedbackInfo()) {
354 DCHECK(target->kind() != Code::CALL_IC || delta == 0); 380 int polymorphic_delta = 0; // "Polymorphic" here includes monomorphic.
355 381 int generic_delta = 0; // "Generic" here includes megamorphic.
356 // Not all Code objects have TypeFeedbackInfo. 382 ComputeTypeInfoCountDelta(old_target->ic_state(), target->ic_state(),
357 if (host->type_feedback_info()->IsTypeFeedbackInfo() && delta != 0) { 383 &polymorphic_delta, &generic_delta);
358 TypeFeedbackInfo* info = 384 TypeFeedbackInfo* info = TypeFeedbackInfo::cast(host->type_feedback_info());
359 TypeFeedbackInfo::cast(host->type_feedback_info()); 385 info->change_ic_with_type_info_count(polymorphic_delta);
360 info->change_ic_with_type_info_count(delta); 386 info->change_ic_generic_count(generic_delta);
361 }
362 } 387 }
363 if (host->type_feedback_info()->IsTypeFeedbackInfo()) { 388 if (host->type_feedback_info()->IsTypeFeedbackInfo()) {
364 TypeFeedbackInfo* info = 389 TypeFeedbackInfo* info =
365 TypeFeedbackInfo::cast(host->type_feedback_info()); 390 TypeFeedbackInfo::cast(host->type_feedback_info());
366 info->change_own_type_change_checksum(); 391 info->change_own_type_change_checksum();
367 } 392 }
368 host->set_profiler_ticks(0); 393 host->set_profiler_ticks(0);
369 isolate->runtime_profiler()->NotifyICChanged(); 394 isolate->runtime_profiler()->NotifyICChanged();
370 // TODO(2029): When an optimized function is patched, it would 395 // TODO(2029): When an optimized function is patched, it would
371 // be nice to propagate the corresponding type information to its 396 // be nice to propagate the corresponding type information to its
(...skipping 2689 matching lines...) Expand 10 before | Expand all | Expand 10 after
3061 #undef ADDR 3086 #undef ADDR
3062 }; 3087 };
3063 3088
3064 3089
3065 Address IC::AddressFromUtilityId(IC::UtilityId id) { 3090 Address IC::AddressFromUtilityId(IC::UtilityId id) {
3066 return IC_utilities[id]; 3091 return IC_utilities[id];
3067 } 3092 }
3068 3093
3069 3094
3070 } } // namespace v8::internal 3095 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/flag-definitions.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698