From 8bcdbc354f27a26ef9869245d9c2a034a128c725 Mon Sep 17 00:00:00 2001 From: "mvstanton@chromium.org" Date: Mon, 17 Feb 2014 14:22:18 +0000 Subject: [PATCH] Revert "Add a premonomorphic state to the call target cache." This reverts commit r19402 R=verwaest@chromium.org Review URL: https://codereview.chromium.org/169713002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19412 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/a64/code-stubs-a64.cc | 19 +------------------ src/arm/code-stubs-arm.cc | 22 ++-------------------- src/ia32/code-stubs-ia32.cc | 20 ++------------------ src/objects-inl.h | 5 ----- src/objects.h | 3 --- src/runtime.cc | 1 - src/x64/code-stubs-x64.cc | 19 ++----------------- test/cctest/test-heap.cc | 4 +--- test/mjsunit/allocation-site-info.js | 17 ----------------- test/mjsunit/array-constructor-feedback.js | 7 ------- 10 files changed, 8 insertions(+), 109 deletions(-) diff --git a/src/a64/code-stubs-a64.cc b/src/a64/code-stubs-a64.cc index 036e59a..bf6ab32 100644 --- a/src/a64/code-stubs-a64.cc +++ b/src/a64/code-stubs-a64.cc @@ -3195,8 +3195,6 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { masm->isolate()->heap()->undefined_value()); ASSERT_EQ(*TypeFeedbackInfo::UninitializedSentinel(masm->isolate()), masm->isolate()->heap()->the_hole_value()); - ASSERT_EQ(*TypeFeedbackInfo::PremonomorphicSentinel(masm->isolate()), - masm->isolate()->heap()->null_value()); // Load the cache state. __ Add(x4, x2, Operand::UntagSmiAndScale(x3, kPointerSizeLog2)); @@ -3224,22 +3222,7 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { // A monomorphic miss (i.e, here the cache is not uninitialized) goes // megamorphic. - Label not_uninitialized; - __ JumpIfNotRoot(x4, Heap::kTheHoleValueRootIndex, ¬_uninitialized); - - // PremonomorphicSentinel is an immortal immovable object (null) so no - // write-barrier is needed. - __ Add(x4, x2, Operand::UntagSmiAndScale(x3, kPointerSizeLog2)); - __ LoadRoot(x10, Heap::kNullValueRootIndex); - __ Str(x10, FieldMemOperand(x4, FixedArray::kHeaderSize)); - __ B(&done); - - // If the cache isn't uninitialized, it is either premonomorphic or - // monomorphic. If it is premonomorphic, we initialize it thus making - // it monomorphic. Otherwise, we go megamorphic. - __ Bind(¬_uninitialized); - __ JumpIfRoot(x4, Heap::kNullValueRootIndex, &initialize); - + __ JumpIfRoot(x4, Heap::kTheHoleValueRootIndex, &initialize); // MegamorphicSentinel is an immortal immovable object (undefined) so no // write-barrier is needed. __ Bind(&megamorphic); diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index 9c03a08..c9b479e 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -3017,8 +3017,6 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { masm->isolate()->heap()->undefined_value()); ASSERT_EQ(*TypeFeedbackInfo::UninitializedSentinel(masm->isolate()), masm->isolate()->heap()->the_hole_value()); - ASSERT_EQ(*TypeFeedbackInfo::PremonomorphicSentinel(masm->isolate()), - masm->isolate()->heap()->null_value()); // Load the cache state into r4. __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3)); @@ -3045,26 +3043,10 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { __ bind(&miss); - // A monomorphic miss (i.e, here the cache is not uninitialized or - // pre-monomorphic) goes megamorphic. - Label not_uninitialized; + // A monomorphic miss (i.e, here the cache is not uninitialized) goes + // megamorphic. __ CompareRoot(r4, Heap::kTheHoleValueRootIndex); - __ b(ne, ¬_uninitialized); - - // PremonomorphicSentinel is an immortal immovable object (null) so no - // write-barrier is needed. - __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3)); - __ LoadRoot(ip, Heap::kNullValueRootIndex); - __ str(ip, FieldMemOperand(r4, FixedArray::kHeaderSize)); - __ jmp(&done); - - // If the cache isn't uninitialized, it is either premonomorphic or - // monomorphic. If it is premonomorphic, we initialize it thus making - // it monomorphic. Otherwise, we go megamorphic. - __ bind(¬_uninitialized); - __ CompareRoot(r4, Heap::kNullValueRootIndex); __ b(eq, &initialize); - // MegamorphicSentinel is an immortal immovable object (undefined) so no // write-barrier is needed. __ bind(&megamorphic); diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index e8e721c..7882419 100644 --- a/src/ia32/code-stubs-ia32.cc +++ b/src/ia32/code-stubs-ia32.cc @@ -2362,26 +2362,10 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { __ bind(&miss); - // A monomorphic miss (i.e, here the cache is not uninitialized or - // pre-monomorphic) goes megamorphic. - Label not_uninitialized; + // A monomorphic miss (i.e, here the cache is not uninitialized) goes + // megamorphic. __ cmp(ecx, Immediate(TypeFeedbackInfo::UninitializedSentinel(isolate))); - __ j(not_equal, ¬_uninitialized); - - // PremonomorphicSentinel is an immortal immovable object (null) so no - // write-barrier is needed. - __ mov(FieldOperand(ebx, edx, times_half_pointer_size, - FixedArray::kHeaderSize), - Immediate(TypeFeedbackInfo::PremonomorphicSentinel(isolate))); - __ jmp(&done, Label::kFar); - - // If the cache isn't uninitialized, it is either premonomorphic or - // monomorphic. If it is premonomorphic, we initialize it thus making - // it monomorphic. Otherwise, we go megamorphic. - __ bind(¬_uninitialized); - __ cmp(ecx, Immediate(TypeFeedbackInfo::PremonomorphicSentinel(isolate))); __ j(equal, &initialize); - // MegamorphicSentinel is an immortal immovable object (undefined) so no // write-barrier is needed. __ bind(&megamorphic); diff --git a/src/objects-inl.h b/src/objects-inl.h index 7f23688..0cc0d09 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -6537,11 +6537,6 @@ Handle TypeFeedbackInfo::UninitializedSentinel(Isolate* isolate) { } -Handle TypeFeedbackInfo::PremonomorphicSentinel(Isolate* isolate) { - return isolate->factory()->null_value(); -} - - Handle TypeFeedbackInfo::MegamorphicSentinel(Isolate* isolate) { return isolate->factory()->undefined_value(); } diff --git a/src/objects.h b/src/objects.h index c5cd193..3692922 100644 --- a/src/objects.h +++ b/src/objects.h @@ -8172,9 +8172,6 @@ class TypeFeedbackInfo: public Struct { // The object that indicates an uninitialized cache. static inline Handle UninitializedSentinel(Isolate* isolate); - // The object that indicates a cache in pre-monomorphic state. - static inline Handle PremonomorphicSentinel(Isolate* isolate); - // The object that indicates a megamorphic state. static inline Handle MegamorphicSentinel(Isolate* isolate); diff --git a/src/runtime.cc b/src/runtime.cc index d5768a4..958675a 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -14762,7 +14762,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConstructor) { Handle site; if (!type_info.is_null() && - *type_info != isolate->heap()->null_value() && *type_info != isolate->heap()->undefined_value()) { site = Handle::cast(type_info); ASSERT(!site->SitePointsToLiteral()); diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index 29cfcb0..8c5a430 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -2201,25 +2201,10 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { __ bind(&miss); - // A monomorphic miss (i.e, here the cache is not uninitialized or - // pre-monomorphic) goes megamorphic. - Label not_uninitialized; + // A monomorphic miss (i.e, here the cache is not uninitialized) goes + // megamorphic. __ Cmp(rcx, TypeFeedbackInfo::UninitializedSentinel(isolate)); - __ j(not_equal, ¬_uninitialized); - - // PremonomorphicSentinel is an immortal immovable object (null) so no - // write-barrier is needed. - __ Move(FieldOperand(rbx, rdx, times_pointer_size, FixedArray::kHeaderSize), - TypeFeedbackInfo::PremonomorphicSentinel(isolate)); - __ jmp(&done); - - // If the cache isn't uninitialized, it is either premonomorphic or - // monomorphic. If it is premonomorphic, we initialize it thus making - // it monomorphic. Otherwise, we go megamorphic. - __ bind(¬_uninitialized); - __ Cmp(rcx, TypeFeedbackInfo::PremonomorphicSentinel(isolate)); __ j(equal, &initialize); - // MegamorphicSentinel is an immortal immovable object (undefined) so no // write-barrier is needed. __ bind(&megamorphic); diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc index 2cc9eca..ff9e51a 100644 --- a/test/cctest/test-heap.cc +++ b/test/cctest/test-heap.cc @@ -2848,9 +2848,7 @@ TEST(IncrementalMarkingClearsTypeFeedbackInfo) { // originating from two different native contexts. CcTest::global()->Set(v8_str("fun1"), fun1); CcTest::global()->Set(v8_str("fun2"), fun2); - CompileRun("function f(a, b) { a(); b(); }" - "f(fun1, fun2);" // Run twice to skip premonomorphic state. - "f(fun1, fun2)"); + CompileRun("function f(a, b) { a(); b(); } f(fun1, fun2);"); Handle f = v8::Utils::OpenHandle( diff --git a/test/mjsunit/allocation-site-info.js b/test/mjsunit/allocation-site-info.js index 51ca687..cd086d3 100644 --- a/test/mjsunit/allocation-site-info.js +++ b/test/mjsunit/allocation-site-info.js @@ -128,7 +128,6 @@ if (support_smi_only_arrays) { } // Case: [1,2,3] as allocation site - get_standard_literal(); // Skip premonomorphic state. obj = fastliteralcase(get_standard_literal(), 1); assertKind(elements_kind.fast_smi_only, obj); obj = fastliteralcase(get_standard_literal(), 1.5); @@ -170,7 +169,6 @@ if (support_smi_only_arrays) { return literal; } - fastliteralcase_smifast(1); // Skip premonomorphic state. obj = fastliteralcase_smifast(1); assertKind(elements_kind.fast_smi_only, obj); obj = fastliteralcase_smifast("carter"); @@ -185,7 +183,6 @@ if (support_smi_only_arrays) { return literal; } - fastliteralcase_smiholey(5, 1); // Skip premonomorphic state. obj = fastliteralcase_smiholey(5, 1); assertKind(elements_kind.fast_smi_only, obj); assertHoley(obj); @@ -200,7 +197,6 @@ if (support_smi_only_arrays) { } // Case: new Array() as allocation site, smi->double - newarraycase_smidouble(1); // Skip premonomorphic state. obj = newarraycase_smidouble(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_smidouble(1.5); @@ -215,7 +211,6 @@ if (support_smi_only_arrays) { } // Case: new Array() as allocation site, smi->fast - newarraycase_smiobj(1); // Skip premonomorphic state. obj = newarraycase_smiobj(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_smiobj("gloria"); @@ -230,7 +225,6 @@ if (support_smi_only_arrays) { } // Case: new Array(length) as allocation site - newarraycase_length_smidouble(1); // Skip premonomorphic state. obj = newarraycase_length_smidouble(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_length_smidouble(1.5); @@ -254,7 +248,6 @@ if (support_smi_only_arrays) { } // Case: new Array() as allocation site, smi->fast - newarraycase_length_smiobj(1); // Skip premonomorphic state. obj = newarraycase_length_smiobj(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_length_smiobj("gloria"); @@ -268,7 +261,6 @@ if (support_smi_only_arrays) { return a; } - newarraycase_list_smidouble(1); // Skip premonomorphic state. obj = newarraycase_list_smidouble(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_list_smidouble(1.5); @@ -282,7 +274,6 @@ if (support_smi_only_arrays) { return a; } - newarraycase_list_smiobj(1); // Skip premonomorphic state. obj = newarraycase_list_smiobj(1); assertKind(elements_kind.fast_smi_only, obj); obj = newarraycase_list_smiobj("coates"); @@ -302,7 +293,6 @@ if (support_smi_only_arrays) { return a; } - foo(0); foo(1); // Skip premonomorphic state. for (i = 0; i < 2; i++) { a = foo(i); b = foo(i); @@ -323,7 +313,6 @@ if (support_smi_only_arrays) { return a; } - newarraycase_onearg(5, 3.5); // Skip premonomorphic state. obj = newarraycase_onearg(5, 3.5); assertKind(elements_kind.fast_double, obj); obj = newarraycase_onearg(10, 5); @@ -399,7 +388,6 @@ if (support_smi_only_arrays) { return literal; } - get_nested_literal(); // Skip premonomorphic state. obj = get_nested_literal(); assertKind(elements_kind.fast, obj); obj[0][0] = 3.5; @@ -415,7 +403,6 @@ if (support_smi_only_arrays) { return literal; } - get_deep_nested_literal(); // Skip premonomorphic state. obj = get_deep_nested_literal(); assertKind(elements_kind.fast_smi_only, obj[1][0]); obj[0][0] = 3.5; @@ -441,7 +428,6 @@ if (support_smi_only_arrays) { return literal; } - get_object_literal(); // Skip premonomorphic state. obj = get_object_literal(); assertKind(elements_kind.fast_smi_only, obj.array); obj.array[1] = 3.5; @@ -457,7 +443,6 @@ if (support_smi_only_arrays) { return literal; } - get_nested_object_literal(); // Skip premonomorphic state. obj = get_nested_object_literal(); assertKind(elements_kind.fast, obj.array); assertKind(elements_kind.fast_smi_only, obj.array[1]); @@ -477,7 +462,6 @@ if (support_smi_only_arrays) { return literal; } - get_nested_literal(); // Skip premonomorphic state. obj = get_nested_literal(); assertKind(elements_kind.fast, obj); obj[0][0] = 3.5; @@ -493,7 +477,6 @@ if (support_smi_only_arrays) { return literal; } - get_deep_nested_literal(); // Skip premonomorphic state. obj = get_deep_nested_literal(); assertKind(elements_kind.fast_smi_only, obj[1][0]); obj[0][0] = 3.5; diff --git a/test/mjsunit/array-constructor-feedback.js b/test/mjsunit/array-constructor-feedback.js index 2c0d9c1..7cd421b 100644 --- a/test/mjsunit/array-constructor-feedback.js +++ b/test/mjsunit/array-constructor-feedback.js @@ -89,7 +89,6 @@ if (support_smi_only_arrays) { return new t(len); } - bar(Array, 10); // Skip premonomorphic state. a = bar(Array, 10); a[0] = 3.5; b = bar(Array, 1); @@ -109,8 +108,6 @@ if (support_smi_only_arrays) { function bar0(t) { return new t(); } - - bar0(Array); // Skip premonomorphic state. a = bar0(Array); a[0] = 3.5; b = bar0(Array); @@ -142,8 +139,6 @@ if (support_smi_only_arrays) { function bar(len) { return new Array(len); } - - bar(10); // Skip premonomorphic state. a = bar(10); a[0] = "a string"; a = bar(10); @@ -195,8 +190,6 @@ if (support_smi_only_arrays) { function bar() { return new Array(); } - - bar(); // Skip premonomorphic state. a = bar(); bar(); %OptimizeFunctionOnNextCall(bar); -- 2.7.4