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