blob: e689bf73c7d1b29c30346eddc2ae527c65072fdc [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005#include "src/frames-inl.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00006#include "test/cctest/compiler/function-tester.h"
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008namespace v8 {
9namespace internal {
10namespace compiler {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012namespace {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014// Helper to determine inline count via JavaScriptFrame::GetFunctions.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015// Note that a count of 1 indicates that no inlining has occured.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000016void AssertInlineCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017 StackTraceFrameIterator it(CcTest::i_isolate());
18 int frames_seen = 0;
Ben Murdochc5610432016-08-08 18:44:38 +010019 JavaScriptFrame* topmost = it.javascript_frame();
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020 while (!it.done()) {
Ben Murdochc5610432016-08-08 18:44:38 +010021 JavaScriptFrame* frame = it.javascript_frame();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 List<JSFunction*> functions(2);
23 frame->GetFunctions(&functions);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000024 PrintF("%d %s, inline count: %d\n", frames_seen,
25 frame->function()->shared()->DebugName()->ToCString().get(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026 functions.length());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027 frames_seen++;
28 it.Advance();
29 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030 List<JSFunction*> functions(2);
31 topmost->GetFunctions(&functions);
32 CHECK_EQ(args[0]
33 ->ToInt32(args.GetIsolate()->GetCurrentContext())
34 .ToLocalChecked()
35 ->Value(),
36 functions.length());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037}
38
39
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040void InstallAssertInlineCountHelper(v8::Isolate* isolate) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000041 v8::Local<v8::Context> context = isolate->GetCurrentContext();
42 v8::Local<v8::FunctionTemplate> t =
43 v8::FunctionTemplate::New(isolate, AssertInlineCount);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044 CHECK(context->Global()
45 ->Set(context, v8_str("AssertInlineCount"),
46 t->GetFunction(context).ToLocalChecked())
47 .FromJust());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048}
49
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050const uint32_t kRestrictedInliningFlags =
Ben Murdochc5610432016-08-08 18:44:38 +010051 CompilationInfo::kFunctionContextSpecializing;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052
53const uint32_t kInlineFlags = CompilationInfo::kInliningEnabled |
Ben Murdochc5610432016-08-08 18:44:38 +010054 CompilationInfo::kFunctionContextSpecializing;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055
56} // namespace
Emily Bernierd0a1eb72015-03-24 16:35:39 -040057
58
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059TEST(SimpleInlining) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060 FunctionTester T(
61 "(function(){"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040062 " function foo(s) { AssertInlineCount(2); return s; };"
63 " function bar(s, t) { return foo(s); };"
64 " return bar;"
65 "})();",
66 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000067
68 InstallAssertInlineCountHelper(CcTest::isolate());
69 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
70}
71
72
73TEST(SimpleInliningDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000074 FunctionTester T(
75 "(function(){"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040076 " function foo(s) { %DeoptimizeFunction(bar); return s; };"
77 " function bar(s, t) { return foo(s); };"
78 " return bar;"
79 "})();",
80 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081
82 InstallAssertInlineCountHelper(CcTest::isolate());
83 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
84}
85
86
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087TEST(SimpleInliningDeoptSelf) {
88 FunctionTester T(
89 "(function(){"
90 " function foo(s) { %_DeoptimizeNow(); return s; };"
91 " function bar(s, t) { return foo(s); };"
92 " return bar;"
93 "})();",
94 kInlineFlags);
95
96 InstallAssertInlineCountHelper(CcTest::isolate());
97 T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
98}
99
100
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000101TEST(SimpleInliningContext) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102 FunctionTester T(
103 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400104 " function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };"
105 " function bar(s, t) { return foo(s); };"
106 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400108 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000109
110 InstallAssertInlineCountHelper(CcTest::isolate());
111 T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
112}
113
114
115TEST(SimpleInliningContextDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116 FunctionTester T(
117 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400118 " function foo(s) {"
119 " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;"
120 " return s + x;"
121 " };"
122 " function bar(s, t) { return foo(s); };"
123 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000124 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400125 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126
127 InstallAssertInlineCountHelper(CcTest::isolate());
128 T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
129}
130
131
132TEST(CaptureContext) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000133 FunctionTester T(
134 "var f = (function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400135 " var x = 42;"
136 " function bar(s) { return x + s; };"
137 " return (function (s) { return bar(s); });"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138 "})();"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400139 "(function (s) { return f(s) })",
140 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000141
142 InstallAssertInlineCountHelper(CcTest::isolate());
143 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
144}
145
146
147// TODO(sigurds) For now we do not inline any native functions. If we do at
148// some point, change this test.
149TEST(DontInlineEval) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000150 FunctionTester T(
151 "var x = 42;"
152 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400153 " function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };"
154 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000155 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400156 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157
158 InstallAssertInlineCountHelper(CcTest::isolate());
159 T.CheckCall(T.Val(42), T.Val("x"), T.undefined());
160}
161
162
163TEST(InlineOmitArguments) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164 FunctionTester T(
165 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400166 " var x = 42;"
167 " function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000168 " function foo(s, t) { return bar(s); };"
169 " return foo;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000170 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400171 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000172
173 InstallAssertInlineCountHelper(CcTest::isolate());
174 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
175}
176
177
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000178TEST(InlineOmitArgumentsObject) {
179 FunctionTester T(
180 "(function () {"
181 " function bar(s, t, u, v) { AssertInlineCount(2); return arguments; };"
182 " function foo(s, t) { var args = bar(s);"
183 " return args.length == 1 &&"
184 " args[0] == 11; };"
185 " return foo;"
186 "})();",
187 kInlineFlags);
188
189 InstallAssertInlineCountHelper(CcTest::isolate());
190 T.CheckCall(T.true_value(), T.Val(11), T.undefined());
191}
192
193
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000194TEST(InlineOmitArgumentsDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195 FunctionTester T(
196 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400197 " function foo(s,t,u,v) { AssertInlineCount(2);"
198 " %DeoptimizeFunction(bar); return baz(); };"
199 " function bar() { return foo(11); };"
200 " function baz() { return foo.arguments.length == 1 &&"
201 " foo.arguments[0] == 11; }"
202 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400204 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000205
206 InstallAssertInlineCountHelper(CcTest::isolate());
207 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
208}
209
210
211TEST(InlineSurplusArguments) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212 FunctionTester T(
213 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400214 " var x = 42;"
215 " function foo(s) { AssertInlineCount(2); return x + s; };"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000216 " function bar(s, t) { return foo(s, t, 13); };"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400217 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400219 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000220
221 InstallAssertInlineCountHelper(CcTest::isolate());
222 T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
223}
224
225
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000226TEST(InlineSurplusArgumentsObject) {
227 FunctionTester T(
228 "(function () {"
229 " function foo(s) { AssertInlineCount(2); return arguments; };"
230 " function bar(s, t) { var args = foo(s, t, 13);"
231 " return args.length == 3 &&"
232 " args[0] == 11 &&"
233 " args[1] == 12 &&"
234 " args[2] == 13; };"
235 " return bar;"
236 "})();",
237 kInlineFlags);
238
239 InstallAssertInlineCountHelper(CcTest::isolate());
240 T.CheckCall(T.true_value(), T.Val(11), T.Val(12));
241}
242
243
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000244TEST(InlineSurplusArgumentsDeopt) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000245 FunctionTester T(
246 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400247 " function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar);"
248 " return baz(); };"
249 " function bar() { return foo(13, 14, 15); };"
250 " function baz() { return foo.arguments.length == 3 &&"
251 " foo.arguments[0] == 13 &&"
252 " foo.arguments[1] == 14 &&"
253 " foo.arguments[2] == 15; }"
254 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000255 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400256 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000257
258 InstallAssertInlineCountHelper(CcTest::isolate());
259 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
260}
261
262
263TEST(InlineTwice) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000264 FunctionTester T(
265 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400266 " var x = 42;"
267 " function bar(s) { AssertInlineCount(2); return x + s; };"
Ben Murdochda12d292016-06-02 14:46:10 +0100268 " function foo(s, t) { return bar(s) + bar(t); };"
269 " return foo;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000270 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400271 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272
273 InstallAssertInlineCountHelper(CcTest::isolate());
274 T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4));
275}
276
277
278TEST(InlineTwiceDependent) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000279 FunctionTester T(
280 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281 " var x = 42;"
282 " function foo(s) { AssertInlineCount(2); return x + s; };"
283 " function bar(s,t) { return foo(foo(s)); };"
284 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400286 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287
288 InstallAssertInlineCountHelper(CcTest::isolate());
289 T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4));
290}
291
292
293TEST(InlineTwiceDependentDiamond) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294 FunctionTester T(
295 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400296 " var x = 41;"
297 " function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {"
298 " return x - s } else { return x + s; } };"
299 " function bar(s,t) { return foo(foo(s)); };"
300 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000301 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400302 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000303
304 InstallAssertInlineCountHelper(CcTest::isolate());
305 T.CheckCall(T.Val(-11), T.Val(11), T.Val(4));
306}
307
308
309TEST(InlineTwiceDependentDiamondDifferent) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000310 FunctionTester T(
311 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400312 " var x = 41;"
313 " function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {"
314 " return x - s * t } else { return x + s * t; } };"
315 " function bar(s,t) { return foo(foo(s, 3), 5); };"
316 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000317 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400318 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319
320 InstallAssertInlineCountHelper(CcTest::isolate());
321 T.CheckCall(T.Val(-329), T.Val(11), T.Val(4));
322}
323
324
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400325TEST(InlineLoopGuardedEmpty) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000326 FunctionTester T(
327 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400328 " function foo(s) { AssertInlineCount(2); if (s) while (s); return s; };"
329 " function bar(s,t) { return foo(s); };"
330 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400332 kInlineFlags);
333
334 InstallAssertInlineCountHelper(CcTest::isolate());
335 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
336}
337
338
339TEST(InlineLoopGuardedOnce) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400340 FunctionTester T(
341 "(function () {"
342 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {"
343 " s = s - 1; }; return s; };"
344 " function bar(s,t) { return foo(s,t); };"
345 " return bar;"
346 "})();",
347 kInlineFlags);
348
349 InstallAssertInlineCountHelper(CcTest::isolate());
350 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4));
351}
352
353
354TEST(InlineLoopGuardedTwice) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400355 FunctionTester T(
356 "(function () {"
357 " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {"
358 " s = s - 1; }; return s; };"
359 " function bar(s,t) { return foo(foo(s,t),t); };"
360 " return bar;"
361 "})();",
362 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363
364 InstallAssertInlineCountHelper(CcTest::isolate());
365 T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4));
366}
367
368
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369TEST(InlineLoopUnguardedEmpty) {
370 FunctionTester T(
371 "(function () {"
372 " function foo(s) { AssertInlineCount(2); while (s); return s; };"
373 " function bar(s, t) { return foo(s); };"
374 " return bar;"
375 "})();",
376 kInlineFlags);
377
378 InstallAssertInlineCountHelper(CcTest::isolate());
379 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
380}
381
382
383TEST(InlineLoopUnguardedOnce) {
384 FunctionTester T(
385 "(function () {"
386 " function foo(s) { AssertInlineCount(2); while (s) {"
387 " s = s - 1; }; return s; };"
388 " function bar(s, t) { return foo(s); };"
389 " return bar;"
390 "})();",
391 kInlineFlags);
392
393 InstallAssertInlineCountHelper(CcTest::isolate());
394 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
395}
396
397
398TEST(InlineLoopUnguardedTwice) {
399 FunctionTester T(
400 "(function () {"
401 " function foo(s) { AssertInlineCount(2); while (s > 0) {"
402 " s = s - 1; }; return s; };"
403 " function bar(s,t) { return foo(foo(s,t),t); };"
404 " return bar;"
405 "})();",
406 kInlineFlags);
407
408 InstallAssertInlineCountHelper(CcTest::isolate());
409 T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4));
410}
411
412
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000413TEST(InlineStrictIntoNonStrict) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000414 FunctionTester T(
415 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400416 " var x = Object.create({}, { y: { value:42, writable:false } });"
417 " function foo(s) { 'use strict';"
418 " x.y = 9; };"
419 " function bar(s,t) { return foo(s); };"
420 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000421 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400422 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423
424 InstallAssertInlineCountHelper(CcTest::isolate());
425 T.CheckThrows(T.undefined(), T.undefined());
426}
427
428
429TEST(InlineNonStrictIntoStrict) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000430 FunctionTester T(
431 "(function () {"
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400432 " var x = Object.create({}, { y: { value:42, writable:false } });"
433 " function foo(s) { x.y = 9; return x.y; };"
434 " function bar(s,t) { \'use strict\'; return foo(s); };"
435 " return bar;"
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000436 "})();",
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400437 kInlineFlags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000438
439 InstallAssertInlineCountHelper(CcTest::isolate());
440 T.CheckCall(T.Val(42), T.undefined(), T.undefined());
441}
442
443
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400444TEST(InlineIntrinsicIsSmi) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400445 FunctionTester T(
446 "(function () {"
447 " var x = 42;"
448 " function bar(s,t) { return %_IsSmi(x); };"
449 " return bar;"
450 "})();",
451 kInlineFlags);
452
453 InstallAssertInlineCountHelper(CcTest::isolate());
454 T.CheckCall(T.true_value(), T.Val(12), T.Val(4));
455}
456
457
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400458TEST(InlineIntrinsicIsArray) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400459 FunctionTester T(
460 "(function () {"
461 " var x = [1,2,3];"
462 " function bar(s,t) { return %_IsArray(x); };"
463 " return bar;"
464 "})();",
465 kInlineFlags);
466
467 InstallAssertInlineCountHelper(CcTest::isolate());
468 T.CheckCall(T.true_value(), T.Val(12), T.Val(4));
469
470 FunctionTester T2(
471 "(function () {"
472 " var x = 32;"
473 " function bar(s,t) { return %_IsArray(x); };"
474 " return bar;"
475 "})();",
476 kInlineFlags);
477
478 T2.CheckCall(T.false_value(), T.Val(12), T.Val(4));
479
480 FunctionTester T3(
481 "(function () {"
482 " var x = bar;"
483 " function bar(s,t) { return %_IsArray(x); };"
484 " return bar;"
485 "})();",
486 kInlineFlags);
487
488 T3.CheckCall(T.false_value(), T.Val(12), T.Val(4));
489}
490
491
492TEST(InlineWithArguments) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400493 FunctionTester T(
494 "(function () {"
495 " function foo(s,t,u) { AssertInlineCount(2);"
496 " return foo.arguments.length == 3 &&"
497 " foo.arguments[0] == 13 &&"
498 " foo.arguments[1] == 14 &&"
499 " foo.arguments[2] == 15;"
500 " }"
501 " function bar() { return foo(13, 14, 15); };"
502 " return bar;"
503 "})();",
504 kInlineFlags);
505
506 InstallAssertInlineCountHelper(CcTest::isolate());
507 T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
508}
509
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000510
511TEST(InlineBuiltin) {
512 FunctionTester T(
513 "(function () {"
514 " function foo(s,t,u) { AssertInlineCount(2); return true; }"
515 " function bar() { return foo(); };"
516 " %SetForceInlineFlag(foo);"
517 " return bar;"
518 "})();",
519 kRestrictedInliningFlags);
520
521 InstallAssertInlineCountHelper(CcTest::isolate());
522 T.CheckCall(T.true_value());
523}
524
525
526TEST(InlineNestedBuiltin) {
527 FunctionTester T(
528 "(function () {"
529 " function foo(s,t,u) { AssertInlineCount(3); return true; }"
530 " function baz(s,t,u) { return foo(s,t,u); }"
531 " function bar() { return baz(); };"
532 " %SetForceInlineFlag(foo);"
533 " %SetForceInlineFlag(baz);"
534 " return bar;"
535 "})();",
536 kRestrictedInliningFlags);
537
538 InstallAssertInlineCountHelper(CcTest::isolate());
539 T.CheckCall(T.true_value());
540}
541
542
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000543TEST(InlineSelfRecursive) {
544 FunctionTester T(
545 "(function () {"
546 " function foo(x) { "
547 " AssertInlineCount(1);"
548 " if (x == 1) return foo(12);"
549 " return x;"
550 " }"
551 " return foo;"
552 "})();",
553 kInlineFlags);
554
555 InstallAssertInlineCountHelper(CcTest::isolate());
556 T.CheckCall(T.Val(12), T.Val(1));
557}
558
559
560TEST(InlineMutuallyRecursive) {
561 FunctionTester T(
562 "(function () {"
563 " function bar(x) { AssertInlineCount(2); return foo(x); }"
564 " function foo(x) { "
565 " if (x == 1) return bar(42);"
566 " return x;"
567 " }"
568 " return foo;"
569 "})();",
570 kInlineFlags);
571
572 InstallAssertInlineCountHelper(CcTest::isolate());
573 T.CheckCall(T.Val(42), T.Val(1));
574}
575
576} // namespace compiler
577} // namespace internal
578} // namespace v8