blob: 9caaa9f71874b9c8b8f48b3d60bb4bcf2c1bbf75 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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);