Index: test/cctest/interpreter/test-interpreter.cc |
diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc |
index 07a22b7fbe71648e006200e0e2a91165764a6644..0e65b41de1f15c2600557aa8483714e9bb9fff46 100644 |
--- a/test/cctest/interpreter/test-interpreter.cc |
+++ b/test/cctest/interpreter/test-interpreter.cc |
@@ -790,7 +790,8 @@ TEST(InterpreterStoreKeyedProperty) { |
CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); |
} |
-static void TestInterpreterCall(TailCallMode tail_call_mode) { |
+static void TestInterpreterCall(TailCallMode tail_call_mode, |
+ bool has_feedback_slot) { |
HandleAndZoneScope handles; |
i::Isolate* isolate = handles.main_isolate(); |
i::Factory* factory = isolate->factory(); |
@@ -798,10 +799,15 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
i::FeedbackVectorSpec feedback_spec(&zone); |
i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
+ i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot(); |
Handle<i::TypeFeedbackVector> vector = |
i::NewTypeFeedbackVector(isolate, &feedback_spec); |
int slot_index = vector->GetIndex(slot); |
+ int call_slot_index = -1; |
+ if (has_feedback_slot) { |
+ call_slot_index = vector->GetIndex(call_slot); |
+ } |
Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
name = factory->string_table()->LookupString(isolate, name); |
@@ -812,9 +818,16 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
0, 1); |
builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
- .StoreAccumulatorInRegister(Register(0)) |
- .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) |
- .Return(); |
+ .StoreAccumulatorInRegister(Register(0)); |
+ |
+ if (has_feedback_slot) { |
+ builder.CallWithFeedback(Register(0), builder.Parameter(0), 1, |
+ call_slot_index, tail_call_mode); |
+ } else { |
+ builder.Call(Register(0), builder.Parameter(0), 1, tail_call_mode); |
+ } |
+ |
+ builder.Return(); |
Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
@@ -832,9 +845,14 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
0, 1); |
builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
- .StoreAccumulatorInRegister(Register(0)) |
- .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) |
- .Return(); |
+ .StoreAccumulatorInRegister(Register(0)); |
+ if (has_feedback_slot) { |
+ builder.CallWithFeedback(Register(0), builder.Parameter(0), 1, |
+ call_slot_index, tail_call_mode); |
+ } else { |
+ builder.Call(Register(0), builder.Parameter(0), 1, tail_call_mode); |
+ } |
+ builder.Return(); |
Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
@@ -861,9 +879,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
.LoadLiteral(Smi::FromInt(51)) |
.StoreAccumulatorInRegister(Register(2)) |
.LoadLiteral(Smi::FromInt(11)) |
- .StoreAccumulatorInRegister(Register(3)) |
- .Call(Register(0), Register(1), 3, 0, tail_call_mode) |
- .Return(); |
+ .StoreAccumulatorInRegister(Register(3)); |
+ |
+ if (has_feedback_slot) { |
+ builder.CallWithFeedback(Register(0), Register(1), 3, call_slot_index, |
+ tail_call_mode); |
+ } else { |
+ builder.Call(Register(0), Register(1), 3, tail_call_mode); |
+ } |
+ |
+ builder.Return(); |
+ |
Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
@@ -905,9 +931,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
.LoadLiteral(factory->NewStringFromAsciiChecked("i")) |
.StoreAccumulatorInRegister(Register(10)) |
.LoadLiteral(factory->NewStringFromAsciiChecked("j")) |
- .StoreAccumulatorInRegister(Register(11)) |
- .Call(Register(0), Register(1), 11, 0, tail_call_mode) |
- .Return(); |
+ .StoreAccumulatorInRegister(Register(11)); |
+ |
+ if (has_feedback_slot) { |
+ builder.CallWithFeedback(Register(0), Register(1), 11, call_slot_index, |
+ tail_call_mode); |
+ } else { |
+ builder.Call(Register(0), Register(1), 11, tail_call_mode); |
+ } |
+ |
+ builder.Return(); |
+ |
Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
@@ -927,9 +961,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) { |
} |
} |
-TEST(InterpreterCall) { TestInterpreterCall(TailCallMode::kDisallow); } |
+TEST(InterpreterCall) { TestInterpreterCall(TailCallMode::kDisallow, false); } |
-TEST(InterpreterTailCall) { TestInterpreterCall(TailCallMode::kAllow); } |
+TEST(InterpreterTailCall) { TestInterpreterCall(TailCallMode::kAllow, false); } |
+ |
+TEST(InterpreterCallWithFeedback) { |
+ TestInterpreterCall(TailCallMode::kDisallow, true); |
+} |
+ |
+TEST(InterpreterTailCallWithFeedback) { |
+ TestInterpreterCall(TailCallMode::kAllow, true); |
+} |
static BytecodeArrayBuilder& SetRegister(BytecodeArrayBuilder& builder, |
Register reg, int value, |