diff options
Diffstat (limited to 'src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js')
-rw-r--r-- | src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js b/src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js index 5e78f10..017e7ec 100644 --- a/src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js +++ b/src/3rdparty/v8/test/mjsunit/elements-transition-hoisting.js @@ -1,4 +1,4 @@ -// Copyright 2011 the V8 project authors. All rights reserved. +// Copyright 2012 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -25,13 +25,13 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// Flags: --allow-natives-syntax --smi-only-arrays --expose-gc +// Flags: --allow-natives-syntax --smi-only-arrays --noparallel-recompilation // Ensure that ElementsKind transitions in various situations are hoisted (or // not hoisted) correctly, don't change the semantics programs and don't trigger // deopt through hoisting in important situations. -support_smi_only_arrays = %HasFastSmiOnlyElements(new Array(1,2,3,4,5,6)); +support_smi_only_arrays = %HasFastSmiElements(new Array(1,2,3,4,5,6)); if (support_smi_only_arrays) { print("Tests include smi-only arrays."); @@ -39,11 +39,6 @@ if (support_smi_only_arrays) { print("Tests do NOT include smi-only arrays."); } -// Force existing ICs from previous stress runs to be flushed, otherwise the -// assumptions in this test about when deoptimizations get triggered are not -// valid. -gc(); - if (support_smi_only_arrays) { // Make sure that a simple elements array transitions inside a loop before // stores to an array gets hoisted in a way that doesn't generate a deopt in @@ -58,10 +53,14 @@ if (support_smi_only_arrays) { } testDoubleConversion4(new Array(5)); + testDoubleConversion4(new Array(5)); // Call twice to make sure that second + // store is a transition and not + // optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testDoubleConversion4); testDoubleConversion4(new Array(5)); testDoubleConversion4(new Array(5)); assertTrue(2 != %GetOptimizationStatus(testDoubleConversion4)); + %ClearFunctionTypeFeedback(testDoubleConversion4); // Make sure that non-element related map checks that are not preceded by // transitions in a loop still get hoisted in a way that doesn't generate a @@ -73,17 +72,21 @@ if (support_smi_only_arrays) { a[1] = 1; var count = 3; do { - a.foo = object; // This map check should be hoistable + a.foo = object; // This map check should be hoistable a[1] = object; result = a.foo == object && a[1] == object; } while (--count > 0); } testExactMapHoisting(new Array(5)); + testExactMapHoisting(new Array(5)); // Call twice to make sure that second + // store is a transition and not + // optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testExactMapHoisting); testExactMapHoisting(new Array(5)); testExactMapHoisting(new Array(5)); assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting)); + %ClearFunctionTypeFeedback(testExactMapHoisting); // Make sure that non-element related map checks do NOT get hoisted if they // depend on an elements transition before them and it's not possible to hoist @@ -98,19 +101,24 @@ if (support_smi_only_arrays) { if (a.bar === undefined) { a[1] = 2.5; } - a.foo = object; // This map check should NOT be hoistable because it - // includes a check for the FAST_ELEMENTS map as well as - // the FAST_DOUBLE_ELEMENTS map, which depends on the - // double transition above in the if, which cannot be - // hoisted. + a.foo = object; // This map check should NOT be hoistable because it + // includes a check for the FAST_ELEMENTS map as well as + // the FAST_DOUBLE_ELEMENTS map, which depends on the + // double transition above in the if, which cannot be + // hoisted. } while (--count > 0); } testExactMapHoisting2(new Array(5)); + testExactMapHoisting2(new Array(5)); // Call twice to make sure that second + // store is a transition and not + // optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testExactMapHoisting2); testExactMapHoisting2(new Array(5)); testExactMapHoisting2(new Array(5)); - assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting2)); + // Temporarily disabled - see bug 2176. + // assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting2)); + %ClearFunctionTypeFeedback(testExactMapHoisting2); // Make sure that non-element related map checks do get hoisted if they use // the transitioned map for the check and all transitions that they depend @@ -123,19 +131,23 @@ if (support_smi_only_arrays) { var count = 3; do { a[1] = 2.5; - a.foo = object; // This map check should be hoistable because all elements - // transitions in the loop can also be hoisted. + a.foo = object; // This map check should be hoistable because all elements + // transitions in the loop can also be hoisted. } while (--count > 0); } var add_transition = new Array(5); add_transition.foo = 0; - add_transition[0] = new Object(); // For FAST_ELEMENT transition to be created + add_transition[0] = new Object(); // For FAST_ELEMENT transition to be created testExactMapHoisting3(new Array(5)); + testExactMapHoisting3(new Array(5)); // Call twice to make sure that second + // store is a transition and not + // optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testExactMapHoisting3); testExactMapHoisting3(new Array(5)); testExactMapHoisting3(new Array(5)); assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting3)); + %ClearFunctionTypeFeedback(testExactMapHoisting3); function testDominatingTransitionHoisting1(a) { var object = new Object(); @@ -149,11 +161,21 @@ if (support_smi_only_arrays) { } while (--count > 3); } + /* testDominatingTransitionHoisting1(new Array(5)); + testDominatingTransitionHoisting1(new Array(5)); // Call twice to make sure + // that second store is a + // transition and not + // optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testDominatingTransitionHoisting1); testDominatingTransitionHoisting1(new Array(5)); testDominatingTransitionHoisting1(new Array(5)); + // TODO(verwaest) With current changes the elements transition gets hoisted + // above the access, causing a deopt. We should update the type of access + // rather than forbid hoisting the transition. assertTrue(2 != %GetOptimizationStatus(testDominatingTransitionHoisting1)); + %ClearFunctionTypeFeedback(testDominatingTransitionHoisting1); + */ function testHoistingWithSideEffect(a) { var object = new Object(); @@ -166,10 +188,14 @@ if (support_smi_only_arrays) { } testHoistingWithSideEffect(new Array(5)); + testHoistingWithSideEffect(new Array(5)); // Call twice to make sure that + // second store is a transition and + // not optimistically MONOMORPHIC %OptimizeFunctionOnNextCall(testHoistingWithSideEffect); testHoistingWithSideEffect(new Array(5)); testHoistingWithSideEffect(new Array(5)); assertTrue(2 != %GetOptimizationStatus(testHoistingWithSideEffect)); + %ClearFunctionTypeFeedback(testHoistingWithSideEffect); function testStraightLineDupeElinination(a,b,c,d,e,f) { var count = 3; @@ -179,7 +205,7 @@ if (support_smi_only_arrays) { a[1] = c; a[2] = d; assertTrue(true); - a[3] = e; // TransitionElementsKind should be eliminated despite call. + a[3] = e; // TransitionElementsKind should be eliminated despite call. a[4] = f; } while (--count > 3); } @@ -205,7 +231,8 @@ if (support_smi_only_arrays) { testStraightLineDupeElinination(new Array(5),0,0,0,.5,0); testStraightLineDupeElinination(new Array(5),0,0,0,0,.5); %OptimizeFunctionOnNextCall(testStraightLineDupeElinination); - testStraightLineDupeElinination(new Array(5)); - testStraightLineDupeElinination(new Array(5)); + testStraightLineDupeElinination(new Array(5),0,0,0,0,0); + testStraightLineDupeElinination(new Array(5),0,0,0,0,0); assertTrue(2 != %GetOptimizationStatus(testStraightLineDupeElinination)); + %ClearFunctionTypeFeedback(testStraightLineDupeElinination); } |