Index: src/compiler/common-operator-reducer.cc |
diff --git a/src/compiler/common-operator-reducer.cc b/src/compiler/common-operator-reducer.cc |
index 8001961d37215c8b57ddaac7ea0ebbc5e6a38d7a..ac20d5aded59843cd179cc45ab11a2a6a9267407 100644 |
--- a/src/compiler/common-operator-reducer.cc |
+++ b/src/compiler/common-operator-reducer.cc |
@@ -109,40 +109,59 @@ 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::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); |
+ switch (cond->opcode()) { |
+ case IrOpcode::kHeapConstant: { |
+ HeapObjectMatcher<HeapObject> mcond(cond); |
+ if (mcond.Is( |
Michael Starzinger
2015/04/10 09:32:39
We should be able to use the following here ...
H
Benedikt Meurer
2015/04/10 09:39:38
Done.
|
+ Unique<HeapObject>::CreateImmovable(factory()->true_value()))) { |
+ return Replace(vtrue); |
} |
+ if (mcond.Is( |
+ Unique<HeapObject>::CreateImmovable(factory()->false_value()))) { |
+ return Replace(vfalse); |
+ } |
+ break; |
} |
- 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); |
+ case 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); |
+ } |
+ break; |
} |
- if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
- machine()->HasFloat64Min()) { |
- return Change(node, machine()->Float64Min(), vtrue, vfalse); |
- } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
- machine()->HasFloat64Max()) { |
- return Change(node, machine()->Float64Max(), vtrue, vfalse); |
+ case 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()) { |
+ return Change(node, machine()->Float64Min(), vtrue, vfalse); |
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
+ machine()->HasFloat64Max()) { |
+ return Change(node, machine()->Float64Max(), vtrue, vfalse); |
+ } |
+ break; |
} |
+ default: |
+ break; |
} |
return NoChange(); |
} |
@@ -175,6 +194,11 @@ CommonOperatorBuilder* CommonOperatorReducer::common() const { |
Graph* CommonOperatorReducer::graph() const { return jsgraph()->graph(); } |
+Factory* CommonOperatorReducer::factory() const { |
Michael Starzinger
2015/04/10 09:32:39
If the above suggestion works, then the factory ge
Benedikt Meurer
2015/04/10 09:39:38
Done.
|
+ return jsgraph()->isolate()->factory(); |
+} |
+ |
+ |
MachineOperatorBuilder* CommonOperatorReducer::machine() const { |
return jsgraph()->machine(); |
} |