Index: src/compiler/common-operator-reducer.cc |
diff --git a/src/compiler/common-operator-reducer.cc b/src/compiler/common-operator-reducer.cc |
index c66cce0538794f8019fba27966bc3181b088113d..8001961d37215c8b57ddaac7ea0ebbc5e6a38d7a 100644 |
--- a/src/compiler/common-operator-reducer.cc |
+++ b/src/compiler/common-operator-reducer.cc |
@@ -55,21 +55,39 @@ Reduction CommonOperatorReducer::ReducePhi(Node* node) { |
if (matcher.Matched()) { |
if (matcher.IfTrue() == merge->InputAt(1)) std::swap(vtrue, vfalse); |
Node* cond = matcher.Branch()->InputAt(0); |
- if (cond->opcode() == IrOpcode::kFloat64LessThan) { |
- if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse && |
+ if (cond->opcode() == IrOpcode::kFloat32LessThan) { |
+ Float32BinopMatcher mcond(cond); |
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
+ vfalse->opcode() == IrOpcode::kFloat32Sub && |
+ machine()->HasFloat32Abs()) { |
+ Float32BinopMatcher mvfalse(vfalse); |
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
+ return Change(node, machine()->Float32Abs(), vtrue); |
+ } |
+ } |
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
+ machine()->HasFloat32Min()) { |
+ return Change(node, machine()->Float32Min(), vtrue, vfalse); |
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
+ machine()->HasFloat32Max()) { |
+ return Change(node, machine()->Float32Max(), vtrue, vfalse); |
+ } |
+ } else if (cond->opcode() == IrOpcode::kFloat64LessThan) { |
+ Float64BinopMatcher mcond(cond); |
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
+ vfalse->opcode() == IrOpcode::kFloat64Sub && |
+ machine()->HasFloat64Abs()) { |
+ Float64BinopMatcher mvfalse(vfalse); |
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
+ return Change(node, machine()->Float64Abs(), vtrue); |
+ } |
+ } |
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
machine()->HasFloat64Min()) { |
- node->set_op(machine()->Float64Min()); |
- node->ReplaceInput(0, vtrue); |
- node->ReplaceInput(1, vfalse); |
- node->TrimInputCount(2); |
- return Changed(node); |
- } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue && |
+ return Change(node, machine()->Float64Min(), vtrue, vfalse); |
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
machine()->HasFloat64Max()) { |
- node->set_op(machine()->Float64Max()); |
- node->ReplaceInput(0, vtrue); |
- node->ReplaceInput(1, vfalse); |
- node->TrimInputCount(2); |
- return Changed(node); |
+ return Change(node, machine()->Float64Max(), vtrue, vfalse); |
} |
} |
} |
@@ -91,27 +109,64 @@ Reduction CommonOperatorReducer::ReduceSelect(Node* node) { |
Node* vtrue = NodeProperties::GetValueInput(node, 1); |
Node* vfalse = NodeProperties::GetValueInput(node, 2); |
if (vtrue == vfalse) return Replace(vtrue); |
- if (cond->opcode() == IrOpcode::kFloat64LessThan) { |
- if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse && |
+ if (cond->opcode() == IrOpcode::kFloat32LessThan) { |
+ Float32BinopMatcher mcond(cond); |
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
+ vfalse->opcode() == IrOpcode::kFloat32Sub && |
+ machine()->HasFloat32Abs()) { |
+ Float32BinopMatcher mvfalse(vfalse); |
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
+ return Change(node, machine()->Float32Abs(), vtrue); |
+ } |
+ } |
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
+ machine()->HasFloat32Min()) { |
+ return Change(node, machine()->Float32Min(), vtrue, vfalse); |
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
+ machine()->HasFloat32Max()) { |
+ return Change(node, machine()->Float32Max(), vtrue, vfalse); |
+ } |
+ } else if (cond->opcode() == IrOpcode::kFloat64LessThan) { |
+ Float64BinopMatcher mcond(cond); |
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
+ vfalse->opcode() == IrOpcode::kFloat64Sub && |
+ machine()->HasFloat64Abs()) { |
+ Float64BinopMatcher mvfalse(vfalse); |
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
+ return Change(node, machine()->Float64Abs(), vtrue); |
+ } |
+ } |
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
machine()->HasFloat64Min()) { |
- node->set_op(machine()->Float64Min()); |
- node->ReplaceInput(0, vtrue); |
- node->ReplaceInput(1, vfalse); |
- node->TrimInputCount(2); |
- return Changed(node); |
- } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue && |
+ return Change(node, machine()->Float64Min(), vtrue, vfalse); |
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
machine()->HasFloat64Max()) { |
- node->set_op(machine()->Float64Max()); |
- node->ReplaceInput(0, vtrue); |
- node->ReplaceInput(1, vfalse); |
- node->TrimInputCount(2); |
- return Changed(node); |
+ return Change(node, machine()->Float64Max(), vtrue, vfalse); |
} |
} |
return NoChange(); |
} |
+Reduction CommonOperatorReducer::Change(Node* node, Operator const* op, |
+ Node* a) { |
+ node->set_op(op); |
+ node->ReplaceInput(0, a); |
+ node->TrimInputCount(1); |
+ return Changed(node); |
+} |
+ |
+ |
+Reduction CommonOperatorReducer::Change(Node* node, Operator const* op, Node* a, |
+ Node* b) { |
+ node->set_op(op); |
+ node->ReplaceInput(0, a); |
+ node->ReplaceInput(1, b); |
+ node->TrimInputCount(2); |
+ return Changed(node); |
+} |
+ |
+ |
CommonOperatorBuilder* CommonOperatorReducer::common() const { |
return jsgraph()->common(); |
} |