| // Copyright 2013 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: | 
 | // | 
 | //     * Redistributions of source code must retain the above copyright | 
 | //       notice, this list of conditions and the following disclaimer. | 
 | //     * Redistributions in binary form must reproduce the above | 
 | //       copyright notice, this list of conditions and the following | 
 | //       disclaimer in the documentation and/or other materials provided | 
 | //       with the distribution. | 
 | //     * Neither the name of Google Inc. nor the names of its | 
 | //       contributors may be used to endorse or promote products derived | 
 | //       from this software without specific prior written permission. | 
 | // | 
 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 | // (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 | 
 |  | 
 | var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; | 
 |  | 
 | // Key is HParameter | 
 | function aoo(i) { | 
 |   return a[i + 1]; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(aoo); | 
 | aoo(1); | 
 | aoo(-1); | 
 | %OptimizeFunctionOnNextCall(aoo); | 
 | aoo(-1); | 
 |  | 
 |  | 
 | // Key is HChange, used by either dehoised or non-dehoisted | 
 | function boo(i) { | 
 |   var ret = 0; | 
 |   if (i < 0) { | 
 |     ret = a[i + 10]; | 
 |   } else { | 
 |     ret = a[i]; | 
 |   } | 
 |   return ret; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(boo); | 
 | boo(1); | 
 | boo(-1); | 
 | %OptimizeFunctionOnNextCall(boo); | 
 | boo(-1); | 
 |  | 
 |  | 
 | // Key is HMul(-i ==> i * (-1)) | 
 | function coo() { | 
 |   var ret = 0; | 
 |   for (var i = 4; i > 0; i -= 1) { | 
 |     ret += a[-i + 4];  // dehoisted | 
 |   } | 
 |  | 
 |   return ret; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(coo); | 
 | coo(); | 
 | coo(); | 
 | %OptimizeFunctionOnNextCall(coo); | 
 | coo(); | 
 |  | 
 |  | 
 | // Key is HPhi, used only by dehoisted | 
 | function doo() { | 
 |   var ret = 0; | 
 |   for (var i = 0; i < 5; i += 1) { | 
 |     ret += a[i + 1];  // dehoisted | 
 |   } | 
 |   return ret; | 
 | } | 
 | %PrepareFunctionForOptimization(doo); | 
 | doo(); | 
 | doo(); | 
 | %OptimizeFunctionOnNextCall(doo); | 
 | doo(); | 
 |  | 
 | // Key is HPhi, but used by both dehoisted and non-dehoisted | 
 | // sign extend is useless | 
 | function eoo() { | 
 |   var ret = 0; | 
 |   for (var i = 0; i < 5; i += 1) { | 
 |     ret += a[i];      // non-dehoisted | 
 |     ret += a[i + 1];  // dehoisted | 
 |   } | 
 |  | 
 |   return ret; | 
 | } | 
 | %PrepareFunctionForOptimization(eoo); | 
 | eoo(); | 
 | eoo(); | 
 | %OptimizeFunctionOnNextCall(eoo); | 
 | eoo(); | 
 |  | 
 |  | 
 |  | 
 | // Key is HPhi, but used by either dehoisted or non-dehoisted | 
 | function foo() { | 
 |   var ret = 0; | 
 |   for (var i = -3; i < 4; i += 1) { | 
 |     if (i < 0) { | 
 |       ret += a[i + 4];  // dehoisted | 
 |     } else { | 
 |       ret += a[i];      // non-dehoisted | 
 |     } | 
 |   } | 
 |  | 
 |   return ret; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(foo); | 
 | foo(); | 
 | foo(); | 
 | %OptimizeFunctionOnNextCall(foo); | 
 | foo(); | 
 |  | 
 | // Key is HPhi, but not induction variable | 
 | function goo(i) { | 
 |   if (i > 0) { | 
 |     i += 1; | 
 |   } else { | 
 |     i += -1; | 
 |   } | 
 |  | 
 |   return a[i + 3]; | 
 | } | 
 | %PrepareFunctionForOptimization(goo); | 
 | goo(-1); | 
 | goo(-1); | 
 | %OptimizeFunctionOnNextCall(goo); | 
 | goo(-1); | 
 |  | 
 | // Key is return value of function | 
 | function index() { | 
 |   return 1; | 
 | } | 
 | %NeverOptimizeFunction(index); | 
 | function hoo() { | 
 |    return a[index() + 3]; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(hoo); | 
 | hoo(); | 
 | hoo(); | 
 | %OptimizeFunctionOnNextCall(hoo); | 
 | hoo(); | 
 |  | 
 | // Sign extension of key makes AssertZeroExtended fail in DoBoundsCheck | 
 | function ioo(i) { | 
 |   return a[i] + a[i + 1]; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(ioo); | 
 | ioo(1); | 
 | ioo(1); | 
 | %OptimizeFunctionOnNextCall(ioo); | 
 | ioo(-1); |