Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Unified Diff: src/compiler/instruction-selector.cc

Issue 1485183002: [turbofan] Deopt support for escape analysis (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@ea-local
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/instruction-selector.cc
diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
index 299138e70fb6028e827dd20caa9fda1cc4b9d91f..2954f0f6e9df672f01790eebc35140583e15bae4 100644
--- a/src/compiler/instruction-selector.cc
+++ b/src/compiler/instruction-selector.cc
@@ -254,84 +254,6 @@ void InstructionSelector::MarkAsRepresentation(MachineType rep, Node* node) {
}
-namespace {
-
-enum class FrameStateInputKind { kAny, kStackSlot };
-
-
-InstructionOperand OperandForDeopt(OperandGenerator* g, Node* input,
- FrameStateInputKind kind) {
- switch (input->opcode()) {
- case IrOpcode::kInt32Constant:
- case IrOpcode::kNumberConstant:
- case IrOpcode::kFloat32Constant:
- case IrOpcode::kFloat64Constant:
- case IrOpcode::kHeapConstant:
- return g->UseImmediate(input);
- default:
- switch (kind) {
- case FrameStateInputKind::kStackSlot:
- return g->UseUniqueSlot(input);
- case FrameStateInputKind::kAny:
- return g->UseAny(input);
- }
- UNREACHABLE();
- return InstructionOperand();
- }
-}
-
-
-void AddFrameStateInputs(Node* state, OperandGenerator* g,
- InstructionOperandVector* inputs,
- FrameStateDescriptor* descriptor,
- FrameStateInputKind kind, Zone* zone) {
- DCHECK_EQ(IrOpcode::kFrameState, state->op()->opcode());
-
- if (descriptor->outer_state()) {
- AddFrameStateInputs(state->InputAt(kFrameStateOuterStateInput), g, inputs,
- descriptor->outer_state(), kind, zone);
- }
-
- Node* parameters = state->InputAt(kFrameStateParametersInput);
- Node* locals = state->InputAt(kFrameStateLocalsInput);
- Node* stack = state->InputAt(kFrameStateStackInput);
- Node* context = state->InputAt(kFrameStateContextInput);
- Node* function = state->InputAt(kFrameStateFunctionInput);
-
- DCHECK_EQ(descriptor->parameters_count(),
- StateValuesAccess(parameters).size());
- DCHECK_EQ(descriptor->locals_count(), StateValuesAccess(locals).size());
- DCHECK_EQ(descriptor->stack_count(), StateValuesAccess(stack).size());
-
- ZoneVector<MachineType> types(zone);
- types.reserve(descriptor->GetSize());
-
- size_t value_index = 0;
- inputs->push_back(OperandForDeopt(g, function, kind));
- descriptor->SetType(value_index++, kMachAnyTagged);
- for (StateValuesAccess::TypedNode input_node :
- StateValuesAccess(parameters)) {
- inputs->push_back(OperandForDeopt(g, input_node.node, kind));
- descriptor->SetType(value_index++, input_node.type);
- }
- if (descriptor->HasContext()) {
- inputs->push_back(OperandForDeopt(g, context, kind));
- descriptor->SetType(value_index++, kMachAnyTagged);
- }
- for (StateValuesAccess::TypedNode input_node : StateValuesAccess(locals)) {
- inputs->push_back(OperandForDeopt(g, input_node.node, kind));
- descriptor->SetType(value_index++, input_node.type);
- }
- for (StateValuesAccess::TypedNode input_node : StateValuesAccess(stack)) {
- inputs->push_back(OperandForDeopt(g, input_node.node, kind));
- descriptor->SetType(value_index++, input_node.type);
- }
- DCHECK(value_index == descriptor->GetSize());
-}
-
-} // namespace
-
-
// An internal helper class for generating the operands to calls.
// TODO(bmeurer): Get rid of the CallBuffer business and make
// InstructionSelector::VisitCall platform independent instead.
@@ -458,6 +380,7 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
// follows (n is the number of value inputs to the frame state):
// arg 1 : deoptimization id.
// arg 2 - arg (n + 1) : value inputs to the frame state.
+ size_t frame_state_entries = 0;
if (buffer->frame_state_descriptor != NULL) {
InstructionSequence::StateId state_id =
sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor);
@@ -465,12 +388,17 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
Node* frame_state =
call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
- AddFrameStateInputs(frame_state, &g, &buffer->instruction_args,
- buffer->frame_state_descriptor,
- FrameStateInputKind::kStackSlot, instruction_zone());
+
+ StateObjectCache cache(instruction_zone());
+
+ frame_state_entries =
+ 1 +
+ buffer->frame_state_descriptor->AddInputs(
+ frame_state, &g, &cache, &buffer->instruction_args,
+ FrameStateInputKind::kStackSlot, instruction_zone());
+
+ DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size());
}
- DCHECK(1 + buffer->frame_state_value_count() ==
- buffer->instruction_args.size());
size_t input_count = static_cast<size_t>(buffer->input_count());
@@ -506,7 +434,7 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
}
}
DCHECK_EQ(input_count, buffer->instruction_args.size() + pushed_count -
- buffer->frame_state_value_count());
+ frame_state_entries);
Jarin 2015/12/02 12:24:34 Hmm, does not the compiler complain that frame_sta
sigurds 2015/12/02 16:35:13 Done.
if (call_tail && stack_param_delta != 0) {
// For tail calls that change the size of their parameter list, move the
// saved caller return address, parent frame pointer and parent constant
@@ -733,6 +661,7 @@ void InstructionSelector::VisitNode(Node* node) {
return VisitCall(node);
case IrOpcode::kFrameState:
case IrOpcode::kStateValues:
+ case IrOpcode::kObjectState:
return;
case IrOpcode::kLoad: {
LoadRepresentation rep = OpParameter<LoadRepresentation>(node);
@@ -1421,21 +1350,20 @@ void InstructionSelector::VisitDeoptimize(Node* value) {
OperandGenerator g(this);
FrameStateDescriptor* desc = GetFrameStateDescriptor(value);
- size_t arg_count = desc->GetTotalSize() + 1; // Include deopt id.
InstructionOperandVector args(instruction_zone());
- args.reserve(arg_count);
+ args.reserve(desc->GetTotalSize() + 1); // Include deopt id.
InstructionSequence::StateId state_id =
sequence()->AddFrameStateDescriptor(desc);
args.push_back(g.TempImmediate(state_id.ToInt()));
- AddFrameStateInputs(value, &g, &args, desc, FrameStateInputKind::kAny,
- instruction_zone());
+ StateObjectCache cache(instruction_zone());
- DCHECK_EQ(args.size(), arg_count);
+ desc->AddInputs(value, &g, &cache, &args, FrameStateInputKind::kAny,
+ instruction_zone());
- Emit(kArchDeoptimize, 0, nullptr, arg_count, &args.front(), 0, nullptr);
+ Emit(kArchDeoptimize, 0, nullptr, args.size(), &args.front(), 0, nullptr);
}

Powered by Google App Engine
This is Rietveld 408576698