• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 local load elimination of redundant loads and stores.
31
32function B(x, y) {
33  this.x = x;
34  this.y = y;
35  return this;
36}
37
38function C() {
39}
40
41function test_load() {
42  var a = new B(1, 2);
43  return a.x + a.x + a.x + a.x;
44}
45
46
47function test_load_from_different_contexts() {
48  var r = 1;
49  this.f = function() {
50    var fr = r;
51    this.g = function(flag) {
52      var gr;
53      if (flag) {
54        gr = r;
55      } else {
56        gr = r;
57      }
58      return gr + r + fr;
59    };
60  };
61  this.f();
62  return this.g(true);
63}
64
65
66function test_store_load() {
67  var a = new B(1, 2);
68  a.x = 4;
69  var f = a.x;
70  a.x = 5;
71  var g = a.x;
72  a.x = 6;
73  var h = a.x;
74  a.x = 7;
75  return f + g + h + a.x;
76}
77
78function test_nonaliasing_store1() {
79  var a = new B(2, 3), b = new B(3, 4);
80  b.x = 4;
81  var f = a.x;
82  b.x = 5;
83  var g = a.x;
84  b.x = 6;
85  var h = a.x;
86  b.x = 7;
87  return f + g + h + a.x;
88}
89
90function test_transitioning_store1() {
91  var a = new B(2, 3);
92  var f = a.x, g = a.y;
93  var b = new B(3, 4);
94  return a.x + a.y;
95}
96
97function test_transitioning_store2() {
98  var b = new C();
99  var a = new B(-1, 5);
100  var f = a.x, g = a.y;
101  b.x = 9;
102  b.y = 11;
103  return a.x + a.y;
104}
105
106var false_v = false;
107function test_transitioning_store3() {
108  var o = new C();
109  var v = o;
110  if (false_v) v = 0;
111  v.x = 20;
112  return o.x;
113}
114
115function killall() {
116  try { } catch(e) { }
117}
118
119%NeverOptimizeFunction(killall);
120
121function test_store_load_kill() {
122  var a = new B(1, 2);
123  a.x = 4;
124  var f = a.x;
125  a.x = 5;
126  var g = a.x;
127  killall();
128  a.x = 6;
129  var h = a.x;
130  a.x = 7;
131  return f + g + h + a.x;
132}
133
134function test_store_store() {
135  var a = new B(6, 7);
136  a.x = 7;
137  a.x = 7;
138  a.x = 7;
139  a.x = 7;
140  return a.x;
141}
142
143function test(x, f) {
144  assertEquals(x, f());
145  assertEquals(x, f());
146  %OptimizeFunctionOnNextCall(f);
147  assertEquals(x, f());
148}
149
150test(4, test_load);
151test(3, new test_load_from_different_contexts().g);
152test(22, test_store_load);
153test(8, test_nonaliasing_store1);
154test(5, test_transitioning_store1);
155test(4, test_transitioning_store2);
156test(20, test_transitioning_store3);
157test(22, test_store_load_kill);
158test(7, test_store_store);
159