| 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..2ade817c234b1b3a564a27d080bcd8a446bdcdff 100644
|
| --- a/src/compiler/common-operator-reducer.cc
|
| +++ b/src/compiler/common-operator-reducer.cc
|
| @@ -109,40 +109,51 @@ 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);
|
| - }
|
| - }
|
| - 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);
|
| + switch (cond->opcode()) {
|
| + case IrOpcode::kHeapConstant: {
|
| + HeapObjectMatcher<HeapObject> mcond(cond);
|
| + return Replace(mcond.Value().handle()->BooleanValue() ? 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();
|
| }
|
|
|