1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax --expose-gc 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test uint32 handing in optimized frames. 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar K1 = 0x7fffffff; 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar K2 = 0xffffffff; 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar uint32_array = new Uint32Array(2); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_array[0] = K1; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_array[1] = K2; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ChangeI2T(arr, i) { 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return uint32_array[i]; 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, ChangeI2T(uint32_array, 0)); 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K2, ChangeI2T(uint32_array, 1)); 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(ChangeI2T); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, ChangeI2T(uint32_array, 0)); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Loop to force inline allocation failure and a call into runtime. 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 80000; i++) { 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(K2, ChangeI2T(uint32_array, 1)); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SideEffect() { 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch with ({}) { } // not inlinable 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction Deopt(obj, arr, i) { 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var x = arr[i]; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SideEffect(); // x will be used by HSimulate. 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj.x; 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return x; 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, Deopt({x: 0}, uint32_array, 0)); 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K2, Deopt({x: 0}, uint32_array, 1)); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(Deopt); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K2, Deopt({}, uint32_array, 1)); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ChangeI2D(arr) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This addition will have a double type feedback so ChangeI2D will 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be generated for its operands. 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return arr[0] + arr[1]; 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1 + K2, ChangeI2D(uint32_array)); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1 + K2, ChangeI2D(uint32_array)); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(ChangeI2D); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1 + K2, ChangeI2D(uint32_array)); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction ShrShr(val) { 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (val >>> 0) >>> 1; 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, ShrShr(K2 | 0)); 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, ShrShr(K2 | 0)); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(ShrShr); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K1, ShrShr(K2 | 0)); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SarShr(val) { 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return val >> (-2 >>> 0); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar K3 = 0x80000000; 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(-2, SarShr(K3 | 0)); 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(-2, SarShr(K3 | 0)); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(SarShr); 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(-2, SarShr(K3 | 0)); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction Uint32Phi(a, b, c) { 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var i = a ? (b >>> 0) : (c >>> 0); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (i | 0); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar K4 = 0x80000001; 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, Uint32Phi(true, K3, K4)); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, Uint32Phi(false, K3, K4)); 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, Uint32Phi(true, K3, K4)); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, Uint32Phi(false, K3, K4)); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(Uint32Phi); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, Uint32Phi(true, K3, K4)); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, Uint32Phi(false, K3, K4)); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction NonUint32Phi(a, b, c) { 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var i = a ? (b >>> 0) : c; 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (i | 0); 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, NonUint32Phi(true, K3, K4)); 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, NonUint32Phi(false, K3, K4)); 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, NonUint32Phi(true, K3, K4)); 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, NonUint32Phi(false, K3, K4)); 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(NonUint32Phi); 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, NonUint32Phi(true, K3, K4)); 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K4 | 0, NonUint32Phi(false, K3, K4)); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction PhiOfPhi(x) { 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = (x >>> 0); 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < 2; i++) { 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var j = 0; j < 2; j++) { 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a = (a >>> 0); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (a | 0); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, PhiOfPhi(1)); 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, PhiOfPhi(1)); 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(PhiOfPhi); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(K3 | 0, PhiOfPhi(K3)); 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction PhiOfPhiUnsafe(x) { 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = x >>> 0; 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < 2; i++) { 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var j = 0; j < 2; j++) { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a = (a >>> 0); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return a + a; 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(2, PhiOfPhiUnsafe(1)); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(2, PhiOfPhiUnsafe(1)); 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(PhiOfPhiUnsafe); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(2 * K3, PhiOfPhiUnsafe(K3)); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar old_array = new Array(1000); 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < old_array.length; i++) old_array[i] = null; 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Force promotion. 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgc(); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgc(); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction FillOldArrayWithHeapNumbers(N) { 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < N; i++) { 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch old_array[i] = uint32_array[1]; 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFillOldArrayWithHeapNumbers(1); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFillOldArrayWithHeapNumbers(1); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch%OptimizeFunctionOnNextCall(FillOldArrayWithHeapNumbers); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFillOldArrayWithHeapNumbers(old_array.length); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgc(); 174