1e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// found in the LICENSE file.
4e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
5e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#include "src/v8.h"
6e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
7e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#include "test/cctest/compiler/function-tester.h"
8e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
9e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#if V8_TURBOFAN_TARGET
10e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
11e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgusing namespace v8::internal;
12e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgusing namespace v8::internal::compiler;
13e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
14a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// Helper to determine inline count via JavaScriptFrame::GetInlineCount.
15a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// Note that a count of 1 indicates that no inlining has occured.
16a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic void AssertInlineCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
17a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  StackTraceFrameIterator it(CcTest::i_isolate());
18a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  int frames_seen = 0;
19a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  JavaScriptFrame* topmost = it.frame();
20a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  while (!it.done()) {
21a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    JavaScriptFrame* frame = it.frame();
22a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    PrintF("%d %s, inline count: %d\n", frames_seen,
23a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org           frame->function()->shared()->DebugName()->ToCString().get(),
24a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org           frame->GetInlineCount());
25a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    frames_seen++;
26a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    it.Advance();
27a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
28a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CHECK_EQ(args[0]->ToInt32()->Value(), topmost->GetInlineCount());
29e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
30e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
31e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
32a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic void InstallAssertInlineCountHelper(v8::Isolate* isolate) {
33e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  v8::Local<v8::Context> context = isolate->GetCurrentContext();
34e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  v8::Local<v8::FunctionTemplate> t =
35a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::FunctionTemplate::New(isolate, AssertInlineCount);
36a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  context->Global()->Set(v8_str("AssertInlineCount"), t->GetFunction());
37e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
38e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
39e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
40e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(SimpleInlining) {
41a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
42e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
43e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function(){"
44a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); return s; };"
45e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "function bar(s, t) { return foo(s); };"
46c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "return bar;})();",
47c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
50e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
51a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
52a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
53a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
54a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
55a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
56a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgTEST(SimpleInliningDeopt) {
57a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
58a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FunctionTester T(
59a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "(function(){"
60a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { %DeoptimizeFunction(bar); return "
61a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "s; };"
62a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar(s, t) { return foo(s); };"
63a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return bar;})();",
64a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CompilationInfo::kInliningEnabled |
65a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kContextSpecializing |
66a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kTypingEnabled);
67a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
68a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
69e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(1), T.Val(1), T.Val(2));
70e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
71e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
72e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
73e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(SimpleInliningContext) {
74a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
75e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
76e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
77a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };"
78e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "function bar(s, t) { return foo(s); };"
79e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
80c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
81c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
84e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
85a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
86a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
87a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
88a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
89a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
90a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgTEST(SimpleInliningContextDeopt) {
91a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
92a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FunctionTester T(
93a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "(function () {"
94a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { "
95a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "  AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;"
96a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "  return s + x;"
97a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "};"
98a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar(s, t) { return foo(s); };"
99a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return bar;"
100a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "})();",
101a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CompilationInfo::kInliningEnabled |
102a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kContextSpecializing |
103a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kTypingEnabled);
104a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
105a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
106e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(13), T.Val(1), T.Val(2));
107e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
108e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
109e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
110e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(CaptureContext) {
111a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
112e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
113e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var f = (function () {"
114e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
115e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "function bar(s) { return x + s; };"
116e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return (function (s) { return bar(s); });"
117e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "})();"
118c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "(function (s) { return f(s)})",
119c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
1202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
1212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
122e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
123a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
124e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
125e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
126e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
127e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
128e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// TODO(sigurds) For now we do not inline any native functions. If we do at
129e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// some point, change this test.
130e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(DontInlineEval) {
131a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
132e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
133e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
134e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
135a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };"
136e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
137c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
138c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
1392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
1402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
141e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
142a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
143e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(42), T.Val("x"), T.undefined());
144e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
145e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
146e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
147e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(InlineOmitArguments) {
148a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
149e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
150e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
151e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
152a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };"
153e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return (function (s,t) { return bar(s); });"
154c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
155c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
1562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
1572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
158e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
159a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
160e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
161e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
162e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
163e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
164a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgTEST(InlineOmitArgumentsDeopt) {
165a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
166a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FunctionTester T(
167a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "(function () {"
168a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s,t,u,v) { AssertInlineCount(2); %DeoptimizeFunction(bar); "
169a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return baz(); };"
170a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar() { return foo(11); };"
171a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function baz() { return foo.arguments.length == 1 && "
172a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "                        foo.arguments[0] == 11 ; }"
173a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return bar;"
174a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "})();",
175a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CompilationInfo::kInliningEnabled |
176a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kContextSpecializing |
177a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kTypingEnabled);
178a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
179a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
180a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
181a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
182a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
183a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
184e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(InlineSurplusArguments) {
185a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
186e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
187e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
188e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
189a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); return x + s; };"
190e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "function bar(s,t) { return foo(s,t,13); };"
191e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
192c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
193c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
1942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
1952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
196e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
197a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
198e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined());
199e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
200e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
201e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
202a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgTEST(InlineSurplusArgumentsDeopt) {
203a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
204a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FunctionTester T(
205a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "(function () {"
206a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar); "
207a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return baz(); };"
208a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar() { return foo(13, 14, 15); };"
209a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function baz() { return foo.arguments.length == 3 && "
210a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "                        foo.arguments[0] == 13 && "
211a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "                        foo.arguments[1] == 14 && "
212a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "                        foo.arguments[2] == 15; }"
213a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "return bar;"
214a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "})();",
215a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CompilationInfo::kInliningEnabled |
216a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kContextSpecializing |
217a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          CompilationInfo::kTypingEnabled);
218a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
219a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
220a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  T.CheckCall(T.true_value(), T.Val(12), T.Val(14));
221a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
222a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
223a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
224e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(InlineTwice) {
225a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
226e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
227e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
228e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
229a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function bar(s) { AssertInlineCount(2); return x + s; };"
230e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return (function (s,t) { return bar(s) + bar(t); });"
231c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
232c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
2332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
2342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
235e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
236a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
237e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4));
238e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
239e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
240e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
241e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(InlineTwiceDependent) {
242a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
243e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
244e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
245e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 42;"
246a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); return x + s; };"
247e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "function bar(s,t) { return foo(foo(s)); };"
248e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
249c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
250c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
2512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
2522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
253e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
254a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
255e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4));
256e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
257e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
258e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
259e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgTEST(InlineTwiceDependentDiamond) {
260a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
261e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
262e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
263d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org      "var x = 41;"
264a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {"
265d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org      "                  return x - s } else { return x + s; } };"
266d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org      "function bar(s,t) { return foo(foo(s)); };"
267e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
268c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
269c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
2702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
2712c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
272e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
273a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
274d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org  T.CheckCall(T.Val(-11), T.Val(11), T.Val(4));
275e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
276e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
277e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
278d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.orgTEST(InlineTwiceDependentDiamondDifferent) {
279a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
280e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  FunctionTester T(
281e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "(function () {"
282e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "var x = 41;"
283a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {"
284d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org      "                    return x - s * t } else { return x + s * t; } };"
285d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org      "function bar(s,t) { return foo(foo(s, 3), 5); };"
286e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org      "return bar;"
287c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      "})();",
288c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org      CompilationInfo::kInliningEnabled |
2892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
2902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
291e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
292a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
293d71b62088ad094b1187c06c92d1f27fab56aaddbmachenbach@chromium.org  T.CheckCall(T.Val(-329), T.Val(11), T.Val(4));
294e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org}
295e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org
296d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
297d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgTEST(InlineLoop) {
298a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
299d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  FunctionTester T(
300d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "(function () {"
301d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "var x = 41;"
302a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      "function foo(s) { AssertInlineCount(2); while (s > 0) {"
303d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "                  s = s - 1; }; return s; };"
304d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "function bar(s,t) { return foo(foo(s)); };"
305d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "return bar;"
306d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "})();",
307d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      CompilationInfo::kInliningEnabled |
3082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
3092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
310d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
311a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
312d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4));
313d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}
314d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
315d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
316d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgTEST(InlineStrictIntoNonStrict) {
317a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
318d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  FunctionTester T(
319d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "(function () {"
320d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "var x = Object.create({}, { y: { value:42, writable:false } });"
321d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "function foo(s) { 'use strict';"
322d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "                   x.y = 9; };"
323d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "function bar(s,t) { return foo(s); };"
324d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "return bar;"
325d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "})();",
326d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      CompilationInfo::kInliningEnabled |
3272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
3282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
329d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
330a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
331d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  T.CheckThrows(T.undefined(), T.undefined());
332d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}
333d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
334d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
335d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgTEST(InlineNonStrictIntoStrict) {
336a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  FLAG_turbo_deoptimization = true;
337d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  FunctionTester T(
338d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "(function () {"
339d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "var x = Object.create({}, { y: { value:42, writable:false } });"
340d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "function foo(s) { x.y = 9; return x.y; };"
341d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "function bar(s,t) { \'use strict\'; return foo(s); };"
342d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "return bar;"
343d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      "})();",
344d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org      CompilationInfo::kInliningEnabled |
3452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kContextSpecializing |
3462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org          CompilationInfo::kTypingEnabled);
347d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  InstallAssertInlineCountHelper(CcTest::isolate());
349d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  T.CheckCall(T.Val(42), T.undefined(), T.undefined());
350d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}
351d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
352d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
353e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#endif  // V8_TURBOFAN_TARGET
354