146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Redistribution and use in source and binary forms, with or without 346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// modification, are permitted provided that the following conditions are 446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// met: 546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// 646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// * Redistributions of source code must retain the above copyright 746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// notice, this list of conditions and the following disclaimer. 846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// * Redistributions in binary form must reproduce the above 946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// copyright notice, this list of conditions and the following 1046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// disclaimer in the documentation and/or other materials provided 1146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// with the distribution. 1246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// * Neither the name of Google Inc. nor the names of its 1346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// contributors may be used to endorse or promote products derived 1446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// from this software without specific prior written permission. 1546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// 1646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 2846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Flags: --allow-natives-syntax 2946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 3046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// The original problem from the bug: In the example below SMI check for b 3146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// generated for inlining of equals invocation (marked with (*)) will be hoisted 3246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// out of the loop across the typeof b === "object" condition and cause an 3346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// immediate deopt. Another problem here is that no matter how many time we 3446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// deopt and reopt we will continue to produce the wrong code. 3546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// 3646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// The fix is to notice when a deopt and subsequent reopt doesn't find 3746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// additional type information, indicating that optimistic LICM should be 3846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// disabled during compilation. 3946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 4046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgfunction eq(a, b) { 4146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (typeof b === "object") { 4246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return b.equals(a); // (*) 4346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 4446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return a === b; 4546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org} 4646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 4746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgObject.prototype.equals = function (other) { 4846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return (this === other); 4946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}; 5046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 5146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgfunction test() { 5246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org for (var i = 0; !eq(i, 10); i++) 5346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ; 5446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org} 5546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 5646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgeq({}, {}); 5746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgeq({}, {}); 5846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgeq(1, 1); 5946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgeq(1, 1); 6046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgtest(); 6146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org%OptimizeFunctionOnNextCall(test); 6246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgtest(); 6346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org%OptimizeFunctionOnNextCall(test); 6446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Second compilation should have noticed that LICM wasn't a good idea, and now 6546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// function should no longer deopt when called. 6646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgtest(); 67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertOptimized(test); 68