1 // Copyright 2013 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 --load-elimination 29 30 // Test global load elimination of redundant loads and stores. 31 32 var X = true; // For forcing branches. 33 X = false; 34 X = true; 35 X = false; 36 37 function B(x, y) { 38 this.x = x; 39 this.y = y; 40 return this; 41 } 42 43 function test_load() { 44 var a = new B(1, 2); 45 var f = a.x + a.x; 46 if (false) ; 47 return f + a.x + a.x; 48 } 49 50 function test_load2() { 51 var a = new B(1, 2); 52 var f = a.x + a.x; 53 if (true) ; 54 return f + a.x + a.x; 55 } 56 57 function test_store_load() { 58 var a = new B(1, 2); 59 a.x = 4; 60 var b = X ? a.x : a.x; 61 return b + a.x; 62 } 63 64 function test_store_load2() { 65 var a = new B(1, 2); 66 var c = 6; 67 if (X) a.x = c; 68 else a.x = c; 69 return a.x + a.x; 70 } 71 72 function test_nonaliasing_store1() { 73 var a = new B(2, 3), b = new B(3, 4); 74 if (X) ; 75 b.x = 4; 76 if (X) ; 77 var f = a.x; 78 if (X) ; 79 b.x = 5; 80 if (X) ; 81 var g = a.x; 82 if (X) ; 83 b.x = 6; 84 if (X) ; 85 var h = a.x; 86 if (X) ; 87 b.x = 7; 88 if (X) ; 89 return f + g + h + a.x; 90 } 91 92 function test_loop(x) { 93 var a = new B(2, 3); 94 var v = a.x; 95 var total = v; 96 var i = 0; 97 while (i++ < 10) { 98 total = a.x; 99 a.y = 4; 100 } 101 return total; 102 } 103 104 function test_loop2(x) { 105 var a = new B(2, 3); 106 var v = a.x; 107 var total = v; 108 var i = 0; 109 while (i++ < 10) { 110 total = a.x; // a.x not affected by loop 111 a.y = 4; 112 113 var j = 0; 114 while (j++ < 10) { 115 total = a.x; // a.x not affected by loop 116 a.y = 5; 117 } 118 119 total = a.x; 120 a.y = 6; 121 122 j = 0; 123 while (j++ < 10) { 124 total = a.x; // a.x not affected by loop 125 a.y = 7; 126 } 127 } 128 return total; 129 } 130 131 function killall() { 132 try { } catch(e) { } 133 } 134 135 %NeverOptimizeFunction(killall); 136 137 function test_store_load_kill() { 138 var a = new B(1, 2); 139 if (X) ; 140 a.x = 4; 141 if (X) ; 142 var f = a.x; 143 if (X) ; 144 a.x = 5; 145 if (X) ; 146 var g = a.x; 147 if (X) ; 148 killall(); 149 if (X) ; 150 a.x = 6; 151 if (X) ; 152 var h = a.x; 153 if (X) ; 154 a.x = 7; 155 if (X) ; 156 return f + g + h + a.x; 157 } 158 159 function test_store_store() { 160 var a = new B(6, 7); 161 if (X) ; 162 a.x = 7; 163 if (X) ; 164 a.x = 7; 165 if (X) ; 166 a.x = 7; 167 if (X) ; 168 a.x = 7; 169 if (X) ; 170 return a.x; 171 } 172 173 function test(x, f) { 174 X = true; 175 assertEquals(x, f()); 176 assertEquals(x, f()); 177 X = false; 178 assertEquals(x, f()); 179 assertEquals(x, f()); 180 X = true; 181 %OptimizeFunctionOnNextCall(f); 182 assertEquals(x, f()); 183 assertEquals(x, f()); 184 X = false; 185 assertEquals(x, f()); 186 assertEquals(x, f()); 187 } 188 189 test(4, test_load); 190 test(8, test_store_load); 191 test(12, test_store_load2); 192 test(8, test_nonaliasing_store1); 193 test(22, test_store_load_kill); 194 test(7, test_store_store); 195 test(2, test_loop); 196 test(2, test_loop2); 197