Index: test/cctest/compiler/test-run-inlining.cc |
diff --git a/test/cctest/compiler/test-run-inlining.cc b/test/cctest/compiler/test-run-inlining.cc |
index 8656b986b43033dba9ac6f0fcaeabb4fd1233427..3d295f719d915c7fc9a74c6c84f2a1fdfe696800 100644 |
--- a/test/cctest/compiler/test-run-inlining.cc |
+++ b/test/cctest/compiler/test-run-inlining.cc |
@@ -37,16 +37,20 @@ static void InstallAssertInlineCountHelper(v8::Isolate* isolate) { |
} |
+static uint32_t kInlineFlags = CompilationInfo::kInliningEnabled | |
+ CompilationInfo::kContextSpecializing | |
+ CompilationInfo::kTypingEnabled; |
+ |
+ |
TEST(SimpleInlining) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function(){" |
- "function foo(s) { AssertInlineCount(2); return s; };" |
- "function bar(s, t) { return foo(s); };" |
- "return bar;})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ " function foo(s) { AssertInlineCount(2); return s; };" |
+ " function bar(s, t) { return foo(s); };" |
+ " return bar;" |
+ "})();", |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); |
@@ -57,13 +61,11 @@ TEST(SimpleInliningDeopt) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function(){" |
- "function foo(s) { %DeoptimizeFunction(bar); return " |
- "s; };" |
- "function bar(s, t) { return foo(s); };" |
- "return bar;})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ " function foo(s) { %DeoptimizeFunction(bar); return s; };" |
+ " function bar(s, t) { return foo(s); };" |
+ " return bar;" |
+ "})();", |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(1), T.Val(1), T.Val(2)); |
@@ -74,13 +76,11 @@ TEST(SimpleInliningContext) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };" |
- "function bar(s, t) { return foo(s); };" |
- "return bar;" |
+ " function foo(s) { AssertInlineCount(2); var x = 12; return s + x; };" |
+ " function bar(s, t) { return foo(s); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); |
@@ -91,16 +91,14 @@ TEST(SimpleInliningContextDeopt) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "function foo(s) { " |
- " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;" |
- " return s + x;" |
- "};" |
- "function bar(s, t) { return foo(s); };" |
- "return bar;" |
+ " function foo(s) {" |
+ " AssertInlineCount(2); %DeoptimizeFunction(bar); var x = 12;" |
+ " return s + x;" |
+ " };" |
+ " function bar(s, t) { return foo(s); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(13), T.Val(1), T.Val(2)); |
@@ -116,9 +114,7 @@ TEST(CaptureContext) { |
"return (function (s) { return bar(s); });" |
"})();" |
"(function (s) { return f(s)})", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
@@ -132,12 +128,10 @@ TEST(DontInlineEval) { |
FunctionTester T( |
"var x = 42;" |
"(function () {" |
- "function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };" |
- "return bar;" |
+ " function bar(s, t) { return eval(\"AssertInlineCount(1); x\") };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); |
@@ -148,13 +142,11 @@ TEST(InlineOmitArguments) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };" |
- "return (function (s,t) { return bar(s); });" |
+ " var x = 42;" |
+ " function bar(s, t, u, v) { AssertInlineCount(2); return x + s; };" |
+ " return (function (s,t) { return bar(s); });" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
@@ -165,16 +157,14 @@ TEST(InlineOmitArgumentsDeopt) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "function foo(s,t,u,v) { AssertInlineCount(2); %DeoptimizeFunction(bar); " |
- "return baz(); };" |
- "function bar() { return foo(11); };" |
- "function baz() { return foo.arguments.length == 1 && " |
- " foo.arguments[0] == 11 ; }" |
- "return bar;" |
+ " function foo(s,t,u,v) { AssertInlineCount(2);" |
+ " %DeoptimizeFunction(bar); return baz(); };" |
+ " function bar() { return foo(11); };" |
+ " function baz() { return foo.arguments.length == 1 &&" |
+ " foo.arguments[0] == 11; }" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |
@@ -185,14 +175,12 @@ TEST(InlineSurplusArguments) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function foo(s) { AssertInlineCount(2); return x + s; };" |
- "function bar(s,t) { return foo(s,t,13); };" |
- "return bar;" |
+ " var x = 42;" |
+ " function foo(s) { AssertInlineCount(2); return x + s; };" |
+ " function bar(s,t) { return foo(s,t,13); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42 + 12), T.Val(12), T.undefined()); |
@@ -203,18 +191,16 @@ TEST(InlineSurplusArgumentsDeopt) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar); " |
- "return baz(); };" |
- "function bar() { return foo(13, 14, 15); };" |
- "function baz() { return foo.arguments.length == 3 && " |
- " foo.arguments[0] == 13 && " |
- " foo.arguments[1] == 14 && " |
- " foo.arguments[2] == 15; }" |
- "return bar;" |
+ " function foo(s) { AssertInlineCount(2); %DeoptimizeFunction(bar);" |
+ " return baz(); };" |
+ " function bar() { return foo(13, 14, 15); };" |
+ " function baz() { return foo.arguments.length == 3 &&" |
+ " foo.arguments[0] == 13 &&" |
+ " foo.arguments[1] == 14 &&" |
+ " foo.arguments[2] == 15; }" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |
@@ -225,13 +211,11 @@ TEST(InlineTwice) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function bar(s) { AssertInlineCount(2); return x + s; };" |
- "return (function (s,t) { return bar(s) + bar(t); });" |
+ " var x = 42;" |
+ " function bar(s) { AssertInlineCount(2); return x + s; };" |
+ " return (function (s,t) { return bar(s) + bar(t); });" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(2 * 42 + 12 + 4), T.Val(12), T.Val(4)); |
@@ -242,14 +226,12 @@ TEST(InlineTwiceDependent) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function foo(s) { AssertInlineCount(2); return x + s; };" |
- "function bar(s,t) { return foo(foo(s)); };" |
- "return bar;" |
+ " var x = 42;" |
+ " function foo(s) { AssertInlineCount(2); return x + s; };" |
+ " function bar(s,t) { return foo(foo(s)); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42 + 42 + 12), T.Val(12), T.Val(4)); |
@@ -260,15 +242,13 @@ TEST(InlineTwiceDependentDiamond) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 41;" |
- "function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {" |
- " return x - s } else { return x + s; } };" |
- "function bar(s,t) { return foo(foo(s)); };" |
- "return bar;" |
+ " var x = 41;" |
+ " function foo(s) { AssertInlineCount(2); if (s % 2 == 0) {" |
+ " return x - s } else { return x + s; } };" |
+ " function bar(s,t) { return foo(foo(s)); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(-11), T.Val(11), T.Val(4)); |
@@ -279,34 +259,60 @@ TEST(InlineTwiceDependentDiamondDifferent) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 41;" |
- "function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {" |
- " return x - s * t } else { return x + s * t; } };" |
- "function bar(s,t) { return foo(foo(s, 3), 5); };" |
- "return bar;" |
+ " var x = 41;" |
+ " function foo(s,t) { AssertInlineCount(2); if (s % 2 == 0) {" |
+ " return x - s * t } else { return x + s * t; } };" |
+ " function bar(s,t) { return foo(foo(s, 3), 5); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(-329), T.Val(11), T.Val(4)); |
} |
-TEST(InlineLoop) { |
+TEST(InlineLoopGuardedEmpty) { |
+ FLAG_turbo_deoptimization = true; |
+ FunctionTester T( |
+ "(function () {" |
+ " function foo(s) { AssertInlineCount(2); if (s) while (s); return s; };" |
+ " function bar(s,t) { return foo(s); };" |
+ " return bar;" |
+ "})();", |
+ kInlineFlags); |
+ |
+ InstallAssertInlineCountHelper(CcTest::isolate()); |
+ T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(4)); |
+} |
+ |
+ |
+TEST(InlineLoopGuardedOnce) { |
+ FLAG_turbo_deoptimization = true; |
+ FunctionTester T( |
+ "(function () {" |
+ " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {" |
+ " s = s - 1; }; return s; };" |
+ " function bar(s,t) { return foo(s,t); };" |
+ " return bar;" |
+ "})();", |
+ kInlineFlags); |
+ |
+ InstallAssertInlineCountHelper(CcTest::isolate()); |
+ T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); |
+} |
+ |
+ |
+TEST(InlineLoopGuardedTwice) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 41;" |
- "function foo(s) { AssertInlineCount(2); while (s > 0) {" |
- " s = s - 1; }; return s; };" |
- "function bar(s,t) { return foo(foo(s)); };" |
- "return bar;" |
+ " function foo(s,t) { AssertInlineCount(2); if (t > 0) while (s > 0) {" |
+ " s = s - 1; }; return s; };" |
+ " function bar(s,t) { return foo(foo(s,t),t); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(0.0), T.Val(11), T.Val(4)); |
@@ -317,15 +323,13 @@ TEST(InlineStrictIntoNonStrict) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = Object.create({}, { y: { value:42, writable:false } });" |
- "function foo(s) { 'use strict';" |
- " x.y = 9; };" |
- "function bar(s,t) { return foo(s); };" |
- "return bar;" |
+ " var x = Object.create({}, { y: { value:42, writable:false } });" |
+ " function foo(s) { 'use strict';" |
+ " x.y = 9; };" |
+ " function bar(s,t) { return foo(s); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckThrows(T.undefined(), T.undefined()); |
@@ -336,14 +340,12 @@ TEST(InlineNonStrictIntoStrict) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = Object.create({}, { y: { value:42, writable:false } });" |
- "function foo(s) { x.y = 9; return x.y; };" |
- "function bar(s,t) { \'use strict\'; return foo(s); };" |
- "return bar;" |
+ " var x = Object.create({}, { y: { value:42, writable:false } });" |
+ " function foo(s) { x.y = 9; return x.y; };" |
+ " function bar(s,t) { \'use strict\'; return foo(s); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.Val(42), T.undefined(), T.undefined()); |
@@ -354,13 +356,11 @@ TEST(InlineIntrinsicIsSmi) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function bar(s,t) { return %_IsSmi(x); };" |
- "return bar;" |
+ " var x = 42;" |
+ " function bar(s,t) { return %_IsSmi(x); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
@@ -371,13 +371,11 @@ TEST(InlineIntrinsicIsNonNegativeSmi) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = 42;" |
- "function bar(s,t) { return %_IsNonNegativeSmi(x); };" |
- "return bar;" |
+ " var x = 42;" |
+ " function bar(s,t) { return %_IsNonNegativeSmi(x); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
@@ -388,38 +386,32 @@ TEST(InlineIntrinsicIsArray) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- "var x = [1,2,3];" |
- "function bar(s,t) { return %_IsArray(x); };" |
- "return bar;" |
+ " var x = [1,2,3];" |
+ " function bar(s,t) { return %_IsArray(x); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(4)); |
FunctionTester T2( |
"(function () {" |
- "var x = 32;" |
- "function bar(s,t) { return %_IsArray(x); };" |
- "return bar;" |
+ " var x = 32;" |
+ " function bar(s,t) { return %_IsArray(x); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
T2.CheckCall(T.false_value(), T.Val(12), T.Val(4)); |
FunctionTester T3( |
"(function () {" |
- "var x = bar;" |
- "function bar(s,t) { return %_IsArray(x); };" |
- "return bar;" |
+ " var x = bar;" |
+ " function bar(s,t) { return %_IsArray(x); };" |
+ " return bar;" |
"})();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ kInlineFlags); |
T3.CheckCall(T.false_value(), T.Val(12), T.Val(4)); |
} |
@@ -429,19 +421,16 @@ TEST(InlineWithArguments) { |
FLAG_turbo_deoptimization = true; |
FunctionTester T( |
"(function () {" |
- " function foo(s,t,u) { AssertInlineCount(2); " |
- " return foo.arguments.length == 3 && " |
- " foo.arguments[0] == 13 && " |
- " foo.arguments[1] == 14 && " |
- " foo.arguments[2] == 15; " |
+ " function foo(s,t,u) { AssertInlineCount(2);" |
+ " return foo.arguments.length == 3 &&" |
+ " foo.arguments[0] == 13 &&" |
+ " foo.arguments[1] == 14 &&" |
+ " foo.arguments[2] == 15;" |
" }" |
" function bar() { return foo(13, 14, 15); };" |
" return bar;" |
- "}" |
- ")();", |
- CompilationInfo::kInliningEnabled | |
- CompilationInfo::kContextSpecializing | |
- CompilationInfo::kTypingEnabled); |
+ "})();", |
+ kInlineFlags); |
InstallAssertInlineCountHelper(CcTest::isolate()); |
T.CheckCall(T.true_value(), T.Val(12), T.Val(14)); |