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 32var X = true; // For forcing branches. 33X = false; 34X = true; 35X = false; 36 37function B(x, y) { 38 this.x = x; 39 this.y = y; 40 return this; 41} 42 43function 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 50function 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 57function 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 64function 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 72function 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 92function 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 104function 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 131function killall() { 132 try { } catch(e) { } 133} 134 135%NeverOptimizeFunction(killall); 136 137function 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 159function 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 173function 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 189test(4, test_load); 190test(8, test_store_load); 191test(12, test_store_load2); 192test(8, test_nonaliasing_store1); 193test(22, test_store_load_kill); 194test(7, test_store_store); 195test(2, test_loop); 196test(2, test_loop2); 197