Index: src/compiler/effect-control-linearizer.cc |
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc |
index 44f428d17531d8faa6b3c4c2eca8e40ccf75ca0a..b7f6b129e548340287492e13cb0d3c47a9a74f66 100644 |
--- a/src/compiler/effect-control-linearizer.cc |
+++ b/src/compiler/effect-control-linearizer.cc |
@@ -440,6 +440,12 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, |
case IrOpcode::kCheckTaggedSigned: |
state = LowerCheckTaggedSigned(node, frame_state, *effect, *control); |
break; |
+ case IrOpcode::kCheckedInt32Add: |
+ state = LowerCheckedInt32Add(node, frame_state, *effect, *control); |
+ break; |
+ case IrOpcode::kCheckedInt32Sub: |
+ state = LowerCheckedInt32Sub(node, frame_state, *effect, *control); |
+ break; |
case IrOpcode::kCheckedUint32ToInt32: |
state = LowerCheckedUint32ToInt32(node, frame_state, *effect, *control); |
break; |
@@ -476,9 +482,6 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, |
case IrOpcode::kStringFromCharCode: |
state = LowerStringFromCharCode(node, *effect, *control); |
break; |
- case IrOpcode::kCheckIf: |
- state = LowerCheckIf(node, frame_state, *effect, *control); |
- break; |
case IrOpcode::kCheckFloat64Hole: |
state = LowerCheckFloat64Hole(node, frame_state, *effect, *control); |
break; |
@@ -554,10 +557,11 @@ EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, |
if (machine()->Is64()) { |
vsmi = ChangeInt32ToSmi(value32); |
} else { |
- Node* smi_tag = |
- graph()->NewNode(machine()->Int32AddWithOverflow(), value32, value32); |
+ Node* smi_tag = graph()->NewNode(machine()->Int32AddWithOverflow(), value32, |
+ value32, if_smi); |
- Node* check_ovf = graph()->NewNode(common()->Projection(1), smi_tag); |
+ Node* check_ovf = |
+ graph()->NewNode(common()->Projection(1), smi_tag, if_smi); |
Node* branch_ovf = graph()->NewNode(common()->Branch(BranchHint::kFalse), |
check_ovf, if_smi); |
@@ -565,7 +569,7 @@ EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, |
if_box = graph()->NewNode(common()->Merge(2), if_ovf, if_box); |
if_smi = graph()->NewNode(common()->IfFalse(), branch_ovf); |
- vsmi = graph()->NewNode(common()->Projection(0), smi_tag); |
+ vsmi = graph()->NewNode(common()->Projection(0), smi_tag, if_smi); |
} |
// Allocate the box for the {value}. |
@@ -617,9 +621,10 @@ EffectControlLinearizer::LowerChangeInt32ToTagged(Node* node, Node* effect, |
return ValueEffectControl(ChangeInt32ToSmi(value), effect, control); |
} |
- Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); |
+ Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value, |
+ control); |
- Node* ovf = graph()->NewNode(common()->Projection(1), add); |
+ Node* ovf = graph()->NewNode(common()->Projection(1), add, control); |
Node* branch = |
graph()->NewNode(common()->Branch(BranchHint::kFalse), ovf, control); |
@@ -628,7 +633,7 @@ EffectControlLinearizer::LowerChangeInt32ToTagged(Node* node, Node* effect, |
AllocateHeapNumberWithValue(ChangeInt32ToFloat64(value), effect, if_true); |
Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
- Node* vfalse = graph()->NewNode(common()->Projection(0), add); |
+ Node* vfalse = graph()->NewNode(common()->Projection(0), add, if_false); |
Node* merge = graph()->NewNode(common()->Merge(2), alloc.control, if_false); |
Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
@@ -835,6 +840,48 @@ EffectControlLinearizer::LowerCheckTaggedSigned(Node* node, Node* frame_state, |
} |
EffectControlLinearizer::ValueEffectControl |
+EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, |
+ Node* effect, Node* control) { |
+ Node* lhs = node->InputAt(0); |
+ Node* rhs = node->InputAt(1); |
+ |
+ Node* value = |
+ graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); |
+ |
+ Node* check = graph()->NewNode(common()->Projection(1), value, control); |
+ control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
+ frame_state, effect, control); |
+ |
+ value = graph()->NewNode(common()->Projection(0), value, control); |
+ |
+ // Make sure the lowered node does not appear in any use lists. |
+ node->TrimInputCount(0); |
+ |
+ return ValueEffectControl(value, effect, control); |
+} |
+ |
+EffectControlLinearizer::ValueEffectControl |
+EffectControlLinearizer::LowerCheckedInt32Sub(Node* node, Node* frame_state, |
+ Node* effect, Node* control) { |
+ Node* lhs = node->InputAt(0); |
+ Node* rhs = node->InputAt(1); |
+ |
+ Node* value = |
+ graph()->NewNode(machine()->Int32SubWithOverflow(), lhs, rhs, control); |
+ |
+ Node* check = graph()->NewNode(common()->Projection(1), value, control); |
+ control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
+ frame_state, effect, control); |
+ |
+ value = graph()->NewNode(common()->Projection(0), value, control); |
+ |
+ // Make sure the lowered node does not appear in any use lists. |
+ node->TrimInputCount(0); |
+ |
+ return ValueEffectControl(value, effect, control); |
+} |
+ |
+EffectControlLinearizer::ValueEffectControl |
EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, |
Node* frame_state, |
Node* effect, |
@@ -1372,17 +1419,6 @@ EffectControlLinearizer::LowerStringFromCharCode(Node* node, Node* effect, |
} |
EffectControlLinearizer::ValueEffectControl |
-EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state, |
- Node* effect, Node* control) { |
- NodeProperties::ReplaceEffectInput(node, effect); |
- NodeProperties::ReplaceControlInput(node, control); |
- DCHECK_NOT_NULL(frame_state); |
- node->InsertInput(graph()->zone(), 1, frame_state); |
- NodeProperties::ChangeOp(node, common()->DeoptimizeIf()); |
- return ValueEffectControl(node, node, node); |
-} |
- |
-EffectControlLinearizer::ValueEffectControl |
EffectControlLinearizer::LowerCheckFloat64Hole(Node* node, Node* frame_state, |
Node* effect, Node* control) { |
// If we reach this point w/o eliminating the {node} that's marked |