The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / test / mjsunit / compiler / load-elimination-global.js @ f230a1cf

History | View | Annotate | Download (4.14 KB)

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);