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