1a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
2a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Redistribution and use in source and binary forms, with or without
3a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// modification, are permitted provided that the following conditions are
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// met:
5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions of source code must retain the above copyright
7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
8a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions in binary form must reproduce the above
9a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       copyright notice, this list of conditions and the following
10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       with the distribution.
12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       contributors may be used to endorse or promote products derived
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       from this software without specific prior written permission.
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
28a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org// Flags: --allow-natives-syntax
29a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on parameter.
31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar max_smi = 1073741823;
32a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar o = {x:0};
33a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign1(x) { x += 1; o.x = x; }
35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign1(max_smi);
36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(max_smi + 1, o.x);
37a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign1(1.1);
39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(2.1, o.x);
40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on named property.
43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign2(p) { p.x += 1 }
44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = "42";
46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign2(o);
47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("421", o.x);
48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
49a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgvar s = max_smi - 10;
50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = s;
51a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 20; i++) {
52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assign2(o);
53a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  if (i == 4) {
54a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org    %OptimizeFunctionOnNextCall(assign2);
55a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  }
56a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
57a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 10, o.x);
58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt with count operation on keyed property.
61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign3(a, b) { a[b] += 1; }
62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = ["42"];
64a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassign3(o, 0);
65a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("421", o[0]);
66a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
67a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgvar s = max_smi - 10;
68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = s;
69a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 20; i++) {
70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assign3(o, 0);
71a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  if (i == 4) {
72a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org    %OptimizeFunctionOnNextCall(assign3);
73a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  }
74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
75a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 10, o[0]);
76a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
77a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, "0");
78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
79a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(max_smi + 11, o[0]);
80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test bailout when accessing a non-existing array element.
82a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = 0;
83a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor(var i = 0; i < 5; i++) {
84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assign3(o, 0);
85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
86a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign3);
87a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, 0);
88a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign3(o, 1);
89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test bailout with count operation in a value context.
91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign5(x,y) { return (x += 1) + y; }
92a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) assertEquals(4, assign5(2, 1));
93a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign5);
94a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(4, assign5(2, 1));
95a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(4.1, assign5(2, 1.1));
97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(4.1, assign5(2.1, 1));
98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign7(o,y) { return (o.x += 1) + y; }
100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = {x:0};
101a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) {
102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  o.x = 42;
103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assertEquals(44, assign7(o, 1));
104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
105a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign7);
106a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo.x = 42;
107a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(44, assign7(o, 1));
108a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = 42;
110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign7(o, 1.1));
111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = 42.1;
112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign7(o, 1));
113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign9(o,y) { return (o[0] += 1) + y; }
115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq = [0];
116a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) {
117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  q[0] = 42;
118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assertEquals(44, assign9(q, 1));
119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
120a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign9);
121a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgq[0] = 42;
122a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(44, assign9(q, 1));
123a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq[0] = 42;
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign9(q, 1.1));
126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgq[0] = 42.1;
127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(44.1, assign9(q, 1));
128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt because of a failed map check on the load.
130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign10(p) { return p.x += 1 }
131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g1 = {x:0};
132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g2 = {y:0, x:42};
133a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; ++i) {
134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  g1.x = 42;
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assertEquals(43, assign10(g1));
136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assertEquals(43, g1.x);
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
138a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign10);
139a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgg1.x = 42;
140a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(43, assign10(g1));
141a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassertEquals(43, g1.x);
142a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign10(g2));
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, g2.x);
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deopt because of a failed map check on the store.
147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// The binary operation changes the map as a side effect.
148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = {x:0};
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g3 = { valueOf: function() { o.y = "bar"; return 42; }};
150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign11(p) { return p.x += 1; }
151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
152a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; i++) {
153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  o.x = "a";
154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assign11(o);
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
156a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign11);
157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo.x = "a";
158a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign11(o);
159a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("a11", assign11(o));
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo.x = g3;
162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign11(o));
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("bar", o.y);
164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo = [0];
166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvar g4 = { valueOf: function() { o.y = "bar"; return 42; }};
167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgfunction assign12(p) { return p[0] += 1; }
168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
169a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; i++) {
170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  o[0] = "a";
171a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assign12(o);
172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
173a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(assign12);
174a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgo[0] = "a";
175a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgassign12(o);
176a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("a11", assign12(o));
178a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgo[0] = g4;
179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals(43, assign12(o));
180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgassertEquals("bar", o.y);
181