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