Index: test/cctest/test-compiler.cc |
diff --git a/test/cctest/test-compiler.cc b/test/cctest/test-compiler.cc |
index ae414d78434d3290fd086a1bef9c2a094b66417c..4f458f4ce5fae4c0864dbbeb008fa8a9d52f46fc 100644 |
--- a/test/cctest/test-compiler.cc |
+++ b/test/cctest/test-compiler.cc |
@@ -313,6 +313,40 @@ TEST(GetScriptLineNumber) { |
} |
+TEST(FeedbackVectorPreservedAcrossRecompiles) { |
+ if (i::FLAG_always_opt || !i::FLAG_crankshaft) return; |
+ i::FLAG_allow_natives_syntax = true; |
+ CcTest::InitializeVM(); |
+ v8::HandleScope scope(CcTest::isolate()); |
+ |
+ // Make sure function f has a call that uses a type feedback slot. |
+ CompileRun("function fun() {};" |
+ "fun1 = fun;" |
+ "function f(a) { a(); } f(fun1);"); |
+ |
+ Handle<JSFunction> f = |
+ v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast( |
+ CcTest::global()->Get(v8_str("f")))); |
+ |
+ // We shouldn't have deoptimization support. We want to recompile and |
+ // verify that our feedback vector preserves information. |
+ CHECK(!f->shared()->has_deoptimization_support()); |
+ Handle<FixedArray> feedback_vector(f->shared()->feedback_vector()); |
+ |
+ // Verify that we gathered feedback. |
+ CHECK_EQ(1, feedback_vector->length()); |
+ CHECK(feedback_vector->get(0)->IsJSFunction()); |
+ |
+ CompileRun("%OptimizeFunctionOnNextCall(f); f(fun1);"); |
+ |
+ // Verify that the feedback is still "gathered" despite a recompilation |
+ // of the full code. |
+ CHECK(f->shared()->has_deoptimization_support()); |
+ CHECK(f->shared()->feedback_vector()->get(0)->IsJSFunction()); |
+} |
+ |
+ |
// Test that optimized code for different closures is actually shared |
// immediately by the FastNewClosureStub when run in the same context. |
TEST(OptimizedCodeSharing) { |