Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index dc86dc3ad33586979794a54736483912a1ce557f..34f30c28869db3a31abd7b79cea93c271a731d87 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -63,6 +63,9 @@ class JSBinopReduction final { |
case CompareOperationHints::kSignedSmall: |
*hint = NumberOperationHint::kSignedSmall; |
return true; |
+ case CompareOperationHints::kNumber: |
+ *hint = NumberOperationHint::kNumber; |
+ return true; |
case CompareOperationHints::kNumberOrOddball: |
*hint = NumberOperationHint::kNumberOrOddball; |
return true; |
@@ -159,7 +162,8 @@ class JSBinopReduction final { |
return lowering_->Changed(node_); |
} |
- Reduction ChangeToSpeculativeOperator(const Operator* op, Type* upper_bound) { |
+ Reduction ChangeToSpeculativeOperator(const Operator* op, bool invert, |
+ Type* upper_bound) { |
DCHECK_EQ(1, op->EffectInputCount()); |
DCHECK_EQ(1, op->EffectOutputCount()); |
DCHECK_EQ(false, OperatorProperties::HasContextInput(op)); |
@@ -202,6 +206,14 @@ class JSBinopReduction final { |
NodeProperties::SetType(node_, |
Type::Intersect(node_type, upper_bound, zone())); |
+ if (invert) { |
+ // Insert an boolean not to invert the value. |
+ Node* value = graph()->NewNode(simplified()->BooleanNot(), node_); |
+ node_->ReplaceUses(value); |
+ // Note: ReplaceUses() smashes all uses, so smash it back here. |
+ value->ReplaceInput(0, node_); |
+ return lowering_->Replace(value); |
+ } |
return lowering_->Changed(node_); |
} |
@@ -209,6 +221,10 @@ class JSBinopReduction final { |
return ChangeToPureOperator(op, false, type); |
} |
+ Reduction ChangeToSpeculativeOperator(const Operator* op, Type* type) { |
+ return ChangeToSpeculativeOperator(op, false, type); |
+ } |
+ |
bool LeftInputIs(Type* t) { return left_type()->Is(t); } |
bool RightInputIs(Type* t) { return right_type()->Is(t); } |
@@ -692,9 +708,6 @@ Reduction JSTypedLowering::ReduceJSEqual(Node* node, bool invert) { |
JSBinopReduction r(this, node); |
- if (r.BothInputsAre(Type::Number())) { |
- return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); |
- } |
if (r.BothInputsAre(Type::String())) { |
return r.ChangeToPureOperator(simplified()->StringEqual(), invert); |
} |
@@ -721,6 +734,17 @@ Reduction JSTypedLowering::ReduceJSEqual(Node* node, bool invert) { |
} |
return Changed(node); |
} |
+ |
+ NumberOperationHint hint; |
+ if (r.BothInputsAre(Type::Signed32()) || |
+ r.BothInputsAre(Type::Unsigned32())) { |
+ return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); |
+ } else if (r.GetCompareNumberOperationHint(&hint)) { |
+ return r.ChangeToSpeculativeOperator( |
+ simplified()->SpeculativeNumberEqual(hint), invert, Type::Boolean()); |
+ } else if (r.BothInputsAre(Type::Number())) { |
+ return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); |
+ } |
return NoChange(); |
} |