| Index: test/cctest/test-cpu-profiler.cc
|
| diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc
|
| index c8f052416fe2aad4972d300833dd39c762a75c89..a990f987cdd8459a9685aa73f32c4264f32cb3a8 100644
|
| --- a/test/cctest/test-cpu-profiler.cc
|
| +++ b/test/cctest/test-cpu-profiler.cc
|
| @@ -1696,6 +1696,16 @@ TEST(DontStopOnFinishedProfileDelete) {
|
| }
|
|
|
|
|
| +const char* GetBranchDeoptReason(i::CpuProfile* iprofile, const char* branch[],
|
| + int length) {
|
| + v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile);
|
| + const ProfileNode* iopt_function = NULL;
|
| + iopt_function = GetSimpleBranch(profile, branch, length);
|
| + CHECK_EQ(1, iopt_function->deopt_infos().length());
|
| + return iopt_function->deopt_infos()[0].deopt_reason;
|
| +}
|
| +
|
| +
|
| // deopt at top function
|
| TEST(CollectDeoptEvents) {
|
| if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
|
| @@ -1707,34 +1717,46 @@ TEST(CollectDeoptEvents) {
|
| v8::CpuProfiler* profiler = isolate->GetCpuProfiler();
|
| i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler);
|
|
|
| - const char* source =
|
| - "function opt_function(left, right, depth) {\n"
|
| - " if (depth) return opt_function(left, right, depth - 1);\n"
|
| + const char opt_source[] =
|
| + "function opt_function%d(value, depth) {\n"
|
| + " if (depth) return opt_function%d(value, depth - 1);\n"
|
| "\n"
|
| - " var k = left / 10;\n"
|
| - " var r = 10 / right;\n"
|
| - " return k + r;"
|
| + " return 10 / value;\n"
|
| "}\n"
|
| + "\n";
|
| +
|
| + for (int i = 0; i < 3; ++i) {
|
| + i::EmbeddedVector<char, sizeof(opt_source) + 100> buffer;
|
| + i::SNPrintF(buffer, opt_source, i, i);
|
| + v8::Script::Compile(v8_str(buffer.start()))->Run();
|
| + }
|
| +
|
| + const char* source =
|
| + "startProfiling();\n"
|
| "\n"
|
| - "function test(left, right) {\n"
|
| - " return opt_function(left, right, 1);\n"
|
| - "}\n"
|
| + "opt_function0(1, 1);\n"
|
| "\n"
|
| - "startProfiling();\n"
|
| + "%OptimizeFunctionOnNextCall(opt_function0)\n"
|
| + "\n"
|
| + "opt_function0(1, 1);\n"
|
| + "\n"
|
| + "opt_function0(undefined, 1);\n"
|
| "\n"
|
| - "test(10, 10);\n"
|
| + "opt_function1(1, 1);\n"
|
| "\n"
|
| - "%OptimizeFunctionOnNextCall(opt_function)\n"
|
| + "%OptimizeFunctionOnNextCall(opt_function1)\n"
|
| "\n"
|
| - "test(10, 10);\n"
|
| + "opt_function1(1, 1);\n"
|
| "\n"
|
| - "test(undefined, 10);\n"
|
| + "opt_function1(NaN, 1);\n"
|
| "\n"
|
| - "%OptimizeFunctionOnNextCall(opt_function)\n"
|
| + "opt_function2(1, 1);\n"
|
| "\n"
|
| - "test(10, 10);\n"
|
| + "%OptimizeFunctionOnNextCall(opt_function2)\n"
|
| "\n"
|
| - "test(10, 0);\n"
|
| + "opt_function2(1, 1);\n"
|
| + "\n"
|
| + "opt_function2(0, 1);\n"
|
| "\n"
|
| "stopProfiling();\n"
|
| "\n";
|
| @@ -1742,15 +1764,21 @@ TEST(CollectDeoptEvents) {
|
| v8::Script::Compile(v8_str(source))->Run();
|
| i::CpuProfile* iprofile = iprofiler->GetProfile(0);
|
| iprofile->Print();
|
| - v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile);
|
| - const char* branch[] = {"", "test", "opt_function", "opt_function"};
|
| - const ProfileNode* iopt_function =
|
| - GetSimpleBranch(profile, branch, arraysize(branch));
|
| - CHECK_EQ(2, iopt_function->deopt_infos().length());
|
| - CHECK_EQ(reason(i::Deoptimizer::kNotAHeapNumber),
|
| - iopt_function->deopt_infos()[0].deopt_reason);
|
| - CHECK_EQ(reason(i::Deoptimizer::kDivisionByZero),
|
| - iopt_function->deopt_infos()[1].deopt_reason);
|
| + {
|
| + const char* branch[] = {"", "opt_function0", "opt_function0"};
|
| + CHECK_EQ(reason(i::Deoptimizer::kNotAHeapNumber),
|
| + GetBranchDeoptReason(iprofile, branch, arraysize(branch)));
|
| + }
|
| + {
|
| + const char* branch[] = {"", "opt_function1", "opt_function1"};
|
| + CHECK_EQ(reason(i::Deoptimizer::kNaN),
|
| + GetBranchDeoptReason(iprofile, branch, arraysize(branch)));
|
| + }
|
| + {
|
| + const char* branch[] = {"", "opt_function2", "opt_function2"};
|
| + CHECK_EQ(reason(i::Deoptimizer::kDivisionByZero),
|
| + GetBranchDeoptReason(iprofile, branch, arraysize(branch)));
|
| + }
|
| iprofiler->DeleteProfile(iprofile);
|
| }
|
|
|
|
|