OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
8 | 8 |
9 #if V8_TURBOFAN_TARGET | 9 #if V8_TURBOFAN_TARGET |
10 | 10 |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 | 31 |
32 static void InstallAssertInlineCountHelper(v8::Isolate* isolate) { | 32 static void InstallAssertInlineCountHelper(v8::Isolate* isolate) { |
33 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 33 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
34 v8::Local<v8::FunctionTemplate> t = | 34 v8::Local<v8::FunctionTemplate> t = |
35 v8::FunctionTemplate::New(isolate, AssertInlineCount); | 35 v8::FunctionTemplate::New(isolate, AssertInlineCount); |
36 context->Global()->Set(v8_str("AssertInlineCount"), t->GetFunction()); | 36 context->Global()->Set(v8_str("AssertInlineCount"), t->GetFunction()); |
37 } | 37 } |
38 | 38 |
39 | 39 |
| 40 static uint32_t kInlineFlags = CompilationInfo::kInliningEnabled | |
| 41 CompilationInfo::kContextSpecializing | |
| 42 CompilationInfo::kTypingEnabled; |
| 43 |
| 44 |
40 TEST(SimpleInlining) { | 45 TEST(SimpleInlining) { |
41 FLAG_turbo_deoptimization = true; | 46 FLAG_turbo_deoptimization = true; |
42 FunctionTester T( | 47 FunctionTester T( |
43 "(function(){" | 48 "(function(){" |
44 "function foo(s) { AssertInlineCount(2); return s; };" | 49 " function foo(s) { AssertInlineCount(2); return s; };" |
45 "function bar(s, t) { return foo(s); };" | 50 " function bar(s, t) { return foo(s); };" |
46 "return bar;})();", | 51 " return bar;" |
47 CompilationInfo::kInliningEnabled | | 52 "})();", |
48 CompilationInfo::kContextSpecializing | | 53 kInlineFlags); |
49 CompilationInfo::kTypingEnabled); | |
50 | 54 |
51 InstallAssertInlineCountHelper(CcTest::isolate()); | 55 InstallAssertInlineCountHelper(CcTest::isolate()); |
52 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); | 56 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); |
53 } | 57 } |
54 | 58 |
55 | 59 |
56 TEST(SimpleInliningDeopt) { | 60 TEST(SimpleInliningDeopt) { |
57 FLAG_turbo_deoptimization = true; | 61 FLAG_turbo_deoptimization = true; |
58 FunctionTester T( | 62 FunctionTester T( |
59 "(function(){" | 63 "(function(){" |
60 "function foo(s) { %DeoptimizeFunction(bar); return " | 64 " function foo(s) { %DeoptimizeFunction(bar); return s; };" |
61 "s; };" | 65 " function bar(s, t) { return foo(s); };" |
62 "function bar(s, t) { return foo(s); };" | 66 " return bar;" |
63 "return bar;})();", | 67 "})();", |
64 CompilationInfo::kInliningEnabled | | 68 kInlineFlags); |
65 CompilationInfo::kContextSpecializing | | |
66 CompilationInfo::kTypingEnabled); | |
67 | 69 |
68 InstallAssertInlineCountHelper(CcTest::isolate()); | 70 InstallAssertInlineCountHelper(CcTest::isolate()); |
69 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); | 71 T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); |
70 } | 72 } |
71 | 73 |
72 | 74 |
73 TEST(SimpleInliningContext) { | 75 TEST(SimpleInliningContext) { |
74 FLAG_turbo_deoptimization = true; | 76 FLAG_turbo_deoptimization = true; |
75 FunctionTester T( | 77 FunctionTester T( |
76 "(function () {" | 78 "(function () {" |
77 "function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };" | 79 " function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };" |
78 "function bar(s, t) { return foo(s); };" | 80 " function bar(s, t) { return foo(s); };" |
79 "return bar;" | 81 " return bar;" |
80 "})();", | 82 "})();", |
81 CompilationInfo::kInliningEnabled | | 83 kInlineFlags); |
82 CompilationInfo::kContextSpecializing | | |
83 CompilationInfo::kTypingEnabled); | |
84 | 84 |
85 InstallAssertInlineCountHelper(CcTest::isolate()); | 85 InstallAssertInlineCountHelper(CcTest::isolate()); |
86 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); | 86 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); |
87 } | 87 } |
88 | 88 |
89 | 89 |
90 TEST(SimpleInliningContextDeopt) { | 90 TEST(SimpleInliningContextDeopt) { |
91 FLAG_turbo_deoptimization = true; | 91 FLAG_turbo_deoptimization = true; |
92 FunctionTester T( | 92 FunctionTester T( |
93 "(function () {" | 93 "(function () {" |
94 "function foo(s) { " | 94 " function foo(s) {" |
95 " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;" | 95 " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;" |
96 " return s + x;" | 96 " return s + x;" |
97 "};" | 97 " };" |
98 "function bar(s, t) { return foo(s); };" | 98 " function bar(s, t) { return foo(s); };" |
99 "return bar;" | 99 " return bar;" |
100 "})();", | 100 "})();", |
101 CompilationInfo::kInliningEnabled | | 101 kInlineFlags); |
102 CompilationInfo::kContextSpecializing | | |
103 CompilationInfo::kTypingEnabled); | |
104 | 102 |
105 InstallAssertInlineCountHelper(CcTest::isolate()); | 103 InstallAssertInlineCountHelper(CcTest::isolate()); |
106 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); | 104 T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); |
107 } | 105 } |
108 | 106 |
109 | 107 |
110 TEST(CaptureContext) { | 108 TEST(CaptureContext) { |
111 FLAG_turbo_deoptimization = true; | 109 FLAG_turbo_deoptimization = true; |
112 FunctionTester T( | 110 FunctionTester T( |
113 "var f = (function () {" | 111 "var f = (function () {" |
114 "var x = 42;" | 112 "var x = 42;" |
115 "function bar(s) { return x + s; };" | 113 "function bar(s) { return x + s; };" |
116 "return (function (s) { return bar(s); });" | 114 "return (function (s) { return bar(s); });" |
117 "})();" | 115 "})();" |
118 "(function (s) { return f(s)})", | 116 "(function (s) { return f(s)})", |
119 CompilationInfo::kInliningEnabled | | 117 kInlineFlags); |
120 CompilationInfo::kContextSpecializing | | |
121 CompilationInfo::kTypingEnabled); | |
122 | 118 |
123 InstallAssertInlineCountHelper(CcTest::isolate()); | 119 InstallAssertInlineCountHelper(CcTest::isolate()); |
124 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 120 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
125 } | 121 } |
126 | 122 |
127 | 123 |
128 // TODO(sigurds) For now we do not inline any native functions. If we do at | 124 // TODO(sigurds) For now we do not inline any native functions. If we do at |
129 // some point, change this test. | 125 // some point, change this test. |
130 TEST(DontInlineEval) { | 126 TEST(DontInlineEval) { |
131 FLAG_turbo_deoptimization = true; | 127 FLAG_turbo_deoptimization = true; |
132 FunctionTester T( | 128 FunctionTester T( |
133 "var x = 42;" | 129 "var x = 42;" |
134 "(function () {" | 130 "(function () {" |
135 "function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };" | 131 " function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };" |
136 "return bar;" | 132 " return bar;" |
137 "})();", | 133 "})();", |
138 CompilationInfo::kInliningEnabled | | 134 kInlineFlags); |
139 CompilationInfo::kContextSpecializing | | |
140 CompilationInfo::kTypingEnabled); | |
141 | 135 |
142 InstallAssertInlineCountHelper(CcTest::isolate()); | 136 InstallAssertInlineCountHelper(CcTest::isolate()); |
143 T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); | 137 T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); |
144 } | 138 } |
145 | 139 |
146 | 140 |
147 TEST(InlineOmitArguments) { | 141 TEST(InlineOmitArguments) { |
148 FLAG_turbo_deoptimization = true; | 142 FLAG_turbo_deoptimization = true; |
149 FunctionTester T( | 143 FunctionTester T( |
150 "(function () {" | 144 "(function () {" |
151 "var x = 42;" | 145 " var x = 42;" |
152 "function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };" | 146 " function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };" |
153 "return (function (s,t) { return bar(s); });" | 147 " return (function (s,t) { return bar(s); });" |
154 "})();", | 148 "})();", |
155 CompilationInfo::kInliningEnabled | | 149 kInlineFlags); |
156 CompilationInfo::kContextSpecializing | | |
157 CompilationInfo::kTypingEnabled); | |
158 | 150 |
159 InstallAssertInlineCountHelper(CcTest::isolate()); | 151 InstallAssertInlineCountHelper(CcTest::isolate()); |
160 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 152 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
161 } | 153 } |
162 | 154 |
163 | 155 |
164 TEST(InlineOmitArgumentsDeopt) { | 156 TEST(InlineOmitArgumentsDeopt) { |
165 FLAG_turbo_deoptimization = true; | 157 FLAG_turbo_deoptimization = true; |
166 FunctionTester T( | 158 FunctionTester T( |
167 "(function () {" | 159 "(function () {" |
168 "function foo(s,t,u,v) { AssertInlineCount(2); %DeoptimizeFunction(bar); " | 160 " function foo(s,t,u,v) { AssertInlineCount(2);" |
169 "return baz(); };" | 161 " %DeoptimizeFunction(bar); return baz(); };" |
170 "function bar() { return foo(11); };" | 162 " function bar() { return foo(11); };" |
171 "function baz() { return foo.arguments.length == 1 && " | 163 " function baz() { return foo.arguments.length == 1 &&" |
172 " foo.arguments[0] == 11 ; }" | 164 " foo.arguments[0] == 11; }" |
173 "return bar;" | 165 " return bar;" |
174 "})();", | 166 "})();", |
175 CompilationInfo::kInliningEnabled | | 167 kInlineFlags); |
176 CompilationInfo::kContextSpecializing | | |
177 CompilationInfo::kTypingEnabled); | |
178 | 168 |
179 InstallAssertInlineCountHelper(CcTest::isolate()); | 169 InstallAssertInlineCountHelper(CcTest::isolate()); |
180 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); | 170 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |
181 } | 171 } |
182 | 172 |
183 | 173 |
184 TEST(InlineSurplusArguments) { | 174 TEST(InlineSurplusArguments) { |
185 FLAG_turbo_deoptimization = true; | 175 FLAG_turbo_deoptimization = true; |
186 FunctionTester T( | 176 FunctionTester T( |
187 "(function () {" | 177 "(function () {" |
188 "var x = 42;" | 178 " var x = 42;" |
189 "function foo(s) { AssertInlineCount(2); return x + s; };" | 179 " function foo(s) { AssertInlineCount(2); return x + s; };" |
190 "function bar(s,t) { return foo(s,t,13); };" | 180 " function bar(s,t) { return foo(s,t,13); };" |
191 "return bar;" | 181 " return bar;" |
192 "})();", | 182 "})();", |
193 CompilationInfo::kInliningEnabled | | 183 kInlineFlags); |
194 CompilationInfo::kContextSpecializing | | |
195 CompilationInfo::kTypingEnabled); | |
196 | 184 |
197 InstallAssertInlineCountHelper(CcTest::isolate()); | 185 InstallAssertInlineCountHelper(CcTest::isolate()); |
198 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); | 186 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
199 } | 187 } |
200 | 188 |
201 | 189 |
202 TEST(InlineSurplusArgumentsDeopt) { | 190 TEST(InlineSurplusArgumentsDeopt) { |
203 FLAG_turbo_deoptimization = true; | 191 FLAG_turbo_deoptimization = true; |
204 FunctionTester T( | 192 FunctionTester T( |
205 "(function () {" | 193 "(function () {" |
206 "function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar); " | 194 " function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar);" |
207 "return baz(); };" | 195 " return baz(); };" |
208 "function bar() { return foo(13, 14, 15); };" | 196 " function bar() { return foo(13, 14, 15); };" |
209 "function baz() { return foo.arguments.length == 3 && " | 197 " function baz() { return foo.arguments.length == 3 &&" |
210 " foo.arguments[0] == 13 && " | 198 " foo.arguments[0] == 13 &&" |
211 " foo.arguments[1] == 14 && " | 199 " foo.arguments[1] == 14 &&" |
212 " foo.arguments[2] == 15; }" | 200 " foo.arguments[2] == 15; }" |
213 "return bar;" | 201 " return bar;" |
214 "})();", | 202 "})();", |
215 CompilationInfo::kInliningEnabled | | 203 kInlineFlags); |
216 CompilationInfo::kContextSpecializing | | |
217 CompilationInfo::kTypingEnabled); | |
218 | 204 |
219 InstallAssertInlineCountHelper(CcTest::isolate()); | 205 InstallAssertInlineCountHelper(CcTest::isolate()); |
220 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); | 206 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |
221 } | 207 } |
222 | 208 |
223 | 209 |
224 TEST(InlineTwice) { | 210 TEST(InlineTwice) { |
225 FLAG_turbo_deoptimization = true; | 211 FLAG_turbo_deoptimization = true; |
226 FunctionTester T( | 212 FunctionTester T( |
227 "(function () {" | 213 "(function () {" |
228 "var x = 42;" | 214 " var x = 42;" |
229 "function bar(s) { AssertInlineCount(2); return x + s; };" | 215 " function bar(s) { AssertInlineCount(2); return x + s; };" |
230 "return (function (s,t) { return bar(s) + bar(t); });" | 216 " return (function (s,t) { return bar(s) + bar(t); });" |
231 "})();", | 217 "})();", |
232 CompilationInfo::kInliningEnabled | | 218 kInlineFlags); |
233 CompilationInfo::kContextSpecializing | | |
234 CompilationInfo::kTypingEnabled); | |
235 | 219 |
236 InstallAssertInlineCountHelper(CcTest::isolate()); | 220 InstallAssertInlineCountHelper(CcTest::isolate()); |
237 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4)); | 221 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4)); |
238 } | 222 } |
239 | 223 |
240 | 224 |
241 TEST(InlineTwiceDependent) { | 225 TEST(InlineTwiceDependent) { |
242 FLAG_turbo_deoptimization = true; | 226 FLAG_turbo_deoptimization = true; |
243 FunctionTester T( | 227 FunctionTester T( |
244 "(function () {" | 228 "(function () {" |
245 "var x = 42;" | 229 " var x = 42;" |
246 "function foo(s) { AssertInlineCount(2); return x + s; };" | 230 " function foo(s) { AssertInlineCount(2); return x + s; };" |
247 "function bar(s,t) { return foo(foo(s)); };" | 231 " function bar(s,t) { return foo(foo(s)); };" |
248 "return bar;" | 232 " return bar;" |
249 "})();", | 233 "})();", |
250 CompilationInfo::kInliningEnabled | | 234 kInlineFlags); |
251 CompilationInfo::kContextSpecializing | | |
252 CompilationInfo::kTypingEnabled); | |
253 | 235 |
254 InstallAssertInlineCountHelper(CcTest::isolate()); | 236 InstallAssertInlineCountHelper(CcTest::isolate()); |
255 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4)); | 237 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4)); |
256 } | 238 } |
257 | 239 |
258 | 240 |
259 TEST(InlineTwiceDependentDiamond) { | 241 TEST(InlineTwiceDependentDiamond) { |
260 FLAG_turbo_deoptimization = true; | 242 FLAG_turbo_deoptimization = true; |
261 FunctionTester T( | 243 FunctionTester T( |
262 "(function () {" | 244 "(function () {" |
263 "var x = 41;" | 245 " var x = 41;" |
264 "function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {" | 246 " function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {" |
265 " return x - s } else { return x + s; } };" | 247 " return x - s } else { return x + s; } };" |
266 "function bar(s,t) { return foo(foo(s)); };" | 248 " function bar(s,t) { return foo(foo(s)); };" |
267 "return bar;" | 249 " return bar;" |
268 "})();", | 250 "})();", |
269 CompilationInfo::kInliningEnabled | | 251 kInlineFlags); |
270 CompilationInfo::kContextSpecializing | | |
271 CompilationInfo::kTypingEnabled); | |
272 | 252 |
273 InstallAssertInlineCountHelper(CcTest::isolate()); | 253 InstallAssertInlineCountHelper(CcTest::isolate()); |
274 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4)); | 254 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4)); |
275 } | 255 } |
276 | 256 |
277 | 257 |
278 TEST(InlineTwiceDependentDiamondDifferent) { | 258 TEST(InlineTwiceDependentDiamondDifferent) { |
279 FLAG_turbo_deoptimization = true; | 259 FLAG_turbo_deoptimization = true; |
280 FunctionTester T( | 260 FunctionTester T( |
281 "(function () {" | 261 "(function () {" |
282 "var x = 41;" | 262 " var x = 41;" |
283 "function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {" | 263 " function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {" |
284 " return x - s * t } else { return x + s * t; } };" | 264 " return x - s * t } else { return x + s * t; } };" |
285 "function bar(s,t) { return foo(foo(s, 3), 5); };" | 265 " function bar(s,t) { return foo(foo(s, 3), 5); };" |
286 "return bar;" | 266 " return bar;" |
287 "})();", | 267 "})();", |
288 CompilationInfo::kInliningEnabled | | 268 kInlineFlags); |
289 CompilationInfo::kContextSpecializing | | |
290 CompilationInfo::kTypingEnabled); | |
291 | 269 |
292 InstallAssertInlineCountHelper(CcTest::isolate()); | 270 InstallAssertInlineCountHelper(CcTest::isolate()); |
293 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4)); | 271 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4)); |
294 } | 272 } |
295 | 273 |
296 | 274 |
297 TEST(InlineLoop) { | 275 TEST(InlineLoopGuardedEmpty) { |
298 FLAG_turbo_deoptimization = true; | 276 FLAG_turbo_deoptimization = true; |
299 FunctionTester T( | 277 FunctionTester T( |
300 "(function () {" | 278 "(function () {" |
301 "var x = 41;" | 279 " function foo(s) { AssertInlineCount(2); if (s) while (s); return s; };" |
302 "function foo(s) { AssertInlineCount(2); while (s > 0) {" | 280 " function bar(s,t) { return foo(s); };" |
303 " s = s - 1; }; return s; };" | 281 " return bar;" |
304 "function bar(s,t) { return foo(foo(s)); };" | |
305 "return bar;" | |
306 "})();", | 282 "})();", |
307 CompilationInfo::kInliningEnabled | | 283 kInlineFlags); |
308 CompilationInfo::kContextSpecializing | | 284 |
309 CompilationInfo::kTypingEnabled); | 285 InstallAssertInlineCountHelper(CcTest::isolate()); |
| 286 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4)); |
| 287 } |
| 288 |
| 289 |
| 290 TEST(InlineLoopGuardedOnce) { |
| 291 FLAG_turbo_deoptimization = true; |
| 292 FunctionTester T( |
| 293 "(function () {" |
| 294 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {" |
| 295 " s = s - 1; }; return s; };" |
| 296 " function bar(s,t) { return foo(s,t); };" |
| 297 " return bar;" |
| 298 "})();", |
| 299 kInlineFlags); |
310 | 300 |
311 InstallAssertInlineCountHelper(CcTest::isolate()); | 301 InstallAssertInlineCountHelper(CcTest::isolate()); |
312 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); | 302 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); |
| 303 } |
| 304 |
| 305 |
| 306 TEST(InlineLoopGuardedTwice) { |
| 307 FLAG_turbo_deoptimization = true; |
| 308 FunctionTester T( |
| 309 "(function () {" |
| 310 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {" |
| 311 " s = s - 1; }; return s; };" |
| 312 " function bar(s,t) { return foo(foo(s,t),t); };" |
| 313 " return bar;" |
| 314 "})();", |
| 315 kInlineFlags); |
| 316 |
| 317 InstallAssertInlineCountHelper(CcTest::isolate()); |
| 318 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); |
313 } | 319 } |
314 | 320 |
315 | 321 |
316 TEST(InlineStrictIntoNonStrict) { | 322 TEST(InlineStrictIntoNonStrict) { |
317 FLAG_turbo_deoptimization = true; | 323 FLAG_turbo_deoptimization = true; |
318 FunctionTester T( | 324 FunctionTester T( |
319 "(function () {" | 325 "(function () {" |
320 "var x = Object.create({}, { y: { value:42, writable:false } });" | 326 " var x = Object.create({}, { y: { value:42, writable:false } });" |
321 "function foo(s) { 'use strict';" | 327 " function foo(s) { 'use strict';" |
322 " x.y = 9; };" | 328 " x.y = 9; };" |
323 "function bar(s,t) { return foo(s); };" | 329 " function bar(s,t) { return foo(s); };" |
324 "return bar;" | 330 " return bar;" |
325 "})();", | 331 "})();", |
326 CompilationInfo::kInliningEnabled | | 332 kInlineFlags); |
327 CompilationInfo::kContextSpecializing | | |
328 CompilationInfo::kTypingEnabled); | |
329 | 333 |
330 InstallAssertInlineCountHelper(CcTest::isolate()); | 334 InstallAssertInlineCountHelper(CcTest::isolate()); |
331 T.CheckThrows(T.undefined(), T.undefined()); | 335 T.CheckThrows(T.undefined(), T.undefined()); |
332 } | 336 } |
333 | 337 |
334 | 338 |
335 TEST(InlineNonStrictIntoStrict) { | 339 TEST(InlineNonStrictIntoStrict) { |
336 FLAG_turbo_deoptimization = true; | 340 FLAG_turbo_deoptimization = true; |
337 FunctionTester T( | 341 FunctionTester T( |
338 "(function () {" | 342 "(function () {" |
339 "var x = Object.create({}, { y: { value:42, writable:false } });" | 343 " var x = Object.create({}, { y: { value:42, writable:false } });" |
340 "function foo(s) { x.y = 9; return x.y; };" | 344 " function foo(s) { x.y = 9; return x.y; };" |
341 "function bar(s,t) { \'use strict\'; return foo(s); };" | 345 " function bar(s,t) { \'use strict\'; return foo(s); };" |
342 "return bar;" | 346 " return bar;" |
343 "})();", | 347 "})();", |
344 CompilationInfo::kInliningEnabled | | 348 kInlineFlags); |
345 CompilationInfo::kContextSpecializing | | |
346 CompilationInfo::kTypingEnabled); | |
347 | 349 |
348 InstallAssertInlineCountHelper(CcTest::isolate()); | 350 InstallAssertInlineCountHelper(CcTest::isolate()); |
349 T.CheckCall(T.Val(42), T.undefined(), T.undefined()); | 351 T.CheckCall(T.Val(42), T.undefined(), T.undefined()); |
350 } | 352 } |
351 | 353 |
352 | 354 |
353 TEST(InlineIntrinsicIsSmi) { | 355 TEST(InlineIntrinsicIsSmi) { |
354 FLAG_turbo_deoptimization = true; | 356 FLAG_turbo_deoptimization = true; |
355 FunctionTester T( | 357 FunctionTester T( |
356 "(function () {" | 358 "(function () {" |
357 "var x = 42;" | 359 " var x = 42;" |
358 "function bar(s,t) { return %_IsSmi(x); };" | 360 " function bar(s,t) { return %_IsSmi(x); };" |
359 "return bar;" | 361 " return bar;" |
360 "})();", | 362 "})();", |
361 CompilationInfo::kInliningEnabled | | 363 kInlineFlags); |
362 CompilationInfo::kContextSpecializing | | |
363 CompilationInfo::kTypingEnabled); | |
364 | 364 |
365 InstallAssertInlineCountHelper(CcTest::isolate()); | 365 InstallAssertInlineCountHelper(CcTest::isolate()); |
366 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); | 366 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
367 } | 367 } |
368 | 368 |
369 | 369 |
370 TEST(InlineIntrinsicIsNonNegativeSmi) { | 370 TEST(InlineIntrinsicIsNonNegativeSmi) { |
371 FLAG_turbo_deoptimization = true; | 371 FLAG_turbo_deoptimization = true; |
372 FunctionTester T( | 372 FunctionTester T( |
373 "(function () {" | 373 "(function () {" |
374 "var x = 42;" | 374 " var x = 42;" |
375 "function bar(s,t) { return %_IsNonNegativeSmi(x); };" | 375 " function bar(s,t) { return %_IsNonNegativeSmi(x); };" |
376 "return bar;" | 376 " return bar;" |
377 "})();", | 377 "})();", |
378 CompilationInfo::kInliningEnabled | | 378 kInlineFlags); |
379 CompilationInfo::kContextSpecializing | | |
380 CompilationInfo::kTypingEnabled); | |
381 | 379 |
382 InstallAssertInlineCountHelper(CcTest::isolate()); | 380 InstallAssertInlineCountHelper(CcTest::isolate()); |
383 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); | 381 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
384 } | 382 } |
385 | 383 |
386 | 384 |
387 TEST(InlineIntrinsicIsArray) { | 385 TEST(InlineIntrinsicIsArray) { |
388 FLAG_turbo_deoptimization = true; | 386 FLAG_turbo_deoptimization = true; |
389 FunctionTester T( | 387 FunctionTester T( |
390 "(function () {" | 388 "(function () {" |
391 "var x = [1,2,3];" | 389 " var x = [1,2,3];" |
392 "function bar(s,t) { return %_IsArray(x); };" | 390 " function bar(s,t) { return %_IsArray(x); };" |
393 "return bar;" | 391 " return bar;" |
394 "})();", | 392 "})();", |
395 CompilationInfo::kInliningEnabled | | 393 kInlineFlags); |
396 CompilationInfo::kContextSpecializing | | |
397 CompilationInfo::kTypingEnabled); | |
398 | 394 |
399 InstallAssertInlineCountHelper(CcTest::isolate()); | 395 InstallAssertInlineCountHelper(CcTest::isolate()); |
400 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); | 396 T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
401 | 397 |
402 FunctionTester T2( | 398 FunctionTester T2( |
403 "(function () {" | 399 "(function () {" |
404 "var x = 32;" | 400 " var x = 32;" |
405 "function bar(s,t) { return %_IsArray(x); };" | 401 " function bar(s,t) { return %_IsArray(x); };" |
406 "return bar;" | 402 " return bar;" |
407 "})();", | 403 "})();", |
408 CompilationInfo::kInliningEnabled | | 404 kInlineFlags); |
409 CompilationInfo::kContextSpecializing | | |
410 CompilationInfo::kTypingEnabled); | |
411 | 405 |
412 T2.CheckCall(T.false_value(), T.Val(12), T.Val(4)); | 406 T2.CheckCall(T.false_value(), T.Val(12), T.Val(4)); |
413 | 407 |
414 FunctionTester T3( | 408 FunctionTester T3( |
415 "(function () {" | 409 "(function () {" |
416 "var x = bar;" | 410 " var x = bar;" |
417 "function bar(s,t) { return %_IsArray(x); };" | 411 " function bar(s,t) { return %_IsArray(x); };" |
418 "return bar;" | 412 " return bar;" |
419 "})();", | 413 "})();", |
420 CompilationInfo::kInliningEnabled | | 414 kInlineFlags); |
421 CompilationInfo::kContextSpecializing | | |
422 CompilationInfo::kTypingEnabled); | |
423 | 415 |
424 T3.CheckCall(T.false_value(), T.Val(12), T.Val(4)); | 416 T3.CheckCall(T.false_value(), T.Val(12), T.Val(4)); |
425 } | 417 } |
426 | 418 |
427 | 419 |
428 TEST(InlineWithArguments) { | 420 TEST(InlineWithArguments) { |
429 FLAG_turbo_deoptimization = true; | 421 FLAG_turbo_deoptimization = true; |
430 FunctionTester T( | 422 FunctionTester T( |
431 "(function () {" | 423 "(function () {" |
432 " function foo(s,t,u) { AssertInlineCount(2); " | 424 " function foo(s,t,u) { AssertInlineCount(2);" |
433 " return foo.arguments.length == 3 && " | 425 " return foo.arguments.length == 3 &&" |
434 " foo.arguments[0] == 13 && " | 426 " foo.arguments[0] == 13 &&" |
435 " foo.arguments[1] == 14 && " | 427 " foo.arguments[1] == 14 &&" |
436 " foo.arguments[2] == 15; " | 428 " foo.arguments[2] == 15;" |
437 " }" | 429 " }" |
438 " function bar() { return foo(13, 14, 15); };" | 430 " function bar() { return foo(13, 14, 15); };" |
439 " return bar;" | 431 " return bar;" |
440 "}" | 432 "})();", |
441 ")();", | 433 kInlineFlags); |
442 CompilationInfo::kInliningEnabled | | |
443 CompilationInfo::kContextSpecializing | | |
444 CompilationInfo::kTypingEnabled); | |
445 | 434 |
446 InstallAssertInlineCountHelper(CcTest::isolate()); | 435 InstallAssertInlineCountHelper(CcTest::isolate()); |
447 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); | 436 T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |
448 } | 437 } |
449 | 438 |
450 #endif // V8_TURBOFAN_TARGET | 439 #endif // V8_TURBOFAN_TARGET |
OLD | NEW |