Index: src/compiler/js-generic-lowering.cc |
diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc |
index a2253bf53ab2be4862da414c383d89ccfaccfbde..2ff98387f7cd88d0d47ad9b9a80ad409195fb01a 100644 |
--- a/src/compiler/js-generic-lowering.cc |
+++ b/src/compiler/js-generic-lowering.cc |
@@ -300,28 +300,48 @@ void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, |
bool pure) { |
BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack. |
CodeStubInterfaceDescriptor* d = stub.GetInterfaceDescriptor(); |
+ bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op()); |
CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor( |
- d, 0, CallDescriptor::kPatchableCallSiteWithNop); |
+ d, 0, CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node)); |
Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token); |
- Node* compare; |
+ NodeVector inputs(zone()); |
+ inputs.reserve(node->InputCount() + 1); |
+ inputs.push_back(CodeConstant(ic)); |
+ inputs.push_back(NodeProperties::GetValueInput(node, 0)); |
+ inputs.push_back(NodeProperties::GetValueInput(node, 1)); |
+ inputs.push_back(NodeProperties::GetContextInput(node)); |
if (pure) { |
- // A pure (strict) comparison doesn't have an effect or control. |
- // But for the graph, we need to add these inputs. |
- compare = graph()->NewNode(common()->Call(desc_compare), CodeConstant(ic), |
- NodeProperties::GetValueInput(node, 0), |
- NodeProperties::GetValueInput(node, 1), |
- NodeProperties::GetContextInput(node), |
- graph()->start(), graph()->start()); |
+ // A pure (strict) comparison doesn't have an effect, control or frame |
+ // state. But for the graph, we need to add control and effect inputs. |
+ DCHECK(!has_frame_state); |
+ inputs.push_back(graph()->start()); |
+ inputs.push_back(graph()->start()); |
} else { |
- compare = graph()->NewNode(common()->Call(desc_compare), CodeConstant(ic), |
- NodeProperties::GetValueInput(node, 0), |
- NodeProperties::GetValueInput(node, 1), |
- NodeProperties::GetContextInput(node), |
- NodeProperties::GetEffectInput(node), |
- NodeProperties::GetControlInput(node)); |
+ DCHECK(has_frame_state == FLAG_turbo_deoptimization); |
+ if (FLAG_turbo_deoptimization) { |
+ inputs.push_back(NodeProperties::GetFrameStateInput(node)); |
+ } |
+ inputs.push_back(NodeProperties::GetEffectInput(node)); |
+ inputs.push_back(NodeProperties::GetControlInput(node)); |
} |
+ Node* compare = graph()->NewNode(common()->Call(desc_compare), inputs.size(), |
+ &inputs.front()); |
+ |
node->ReplaceInput(0, compare); |
node->ReplaceInput(1, SmiConstant(token)); |
+ |
+ if (has_frame_state) { |
+ // Remove the frame state from inputs. |
+ // TODO(jarin) This should use Node::RemoveInput (which does not exist yet). |
+ int dest = NodeProperties::FirstFrameStateIndex(node); |
+ for (int i = NodeProperties::PastFrameStateIndex(node); |
+ i < node->InputCount(); i++) { |
+ node->ReplaceInput(dest, node->InputAt(i)); |
+ dest++; |
+ } |
+ node->TrimInputCount(dest); |
+ } |
+ |
ReplaceWithRuntimeCall(node, Runtime::kBooleanize); |
} |
@@ -361,8 +381,7 @@ void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, |
Operator::Property props = node->op()->properties(); |
const Runtime::Function* fun = Runtime::FunctionForId(f); |
int nargs = (nargs_override < 0) ? fun->nargs : nargs_override; |
- CallDescriptor* desc = |
- linkage()->GetRuntimeCallDescriptor(f, nargs, props, FlagsForNode(node)); |
+ CallDescriptor* desc = linkage()->GetRuntimeCallDescriptor(f, nargs, props); |
Node* ref = ExternalConstant(ExternalReference(f, isolate())); |
Node* arity = Int32Constant(nargs); |
if (!centrystub_constant_.is_set()) { |