Index: src/compiler/machine-operator-reducer.cc |
diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc |
index 53b1d8006ab2ce9d4e6970da7d0dd9cf5b216fbf..bb1596f58bd93e74e8467555f6053cf2988dca49 100644 |
--- a/src/compiler/machine-operator-reducer.cc |
+++ b/src/compiler/machine-operator-reducer.cc |
@@ -523,12 +523,8 @@ Reduction MachineOperatorReducer::Reduce(Node* node) { |
if (m.HasValue()) return ReplaceInt64(static_cast<uint64_t>(m.Value())); |
break; |
} |
- case IrOpcode::kTruncateFloat64ToInt32: { |
- Float64Matcher m(node->InputAt(0)); |
- if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); |
- if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
- break; |
- } |
+ case IrOpcode::kTruncateFloat64ToInt32: |
+ return ReduceTruncateFloat64ToInt32(node); |
case IrOpcode::kTruncateInt64ToInt32: { |
Int64Matcher m(node->InputAt(0)); |
if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); |
@@ -692,6 +688,36 @@ Reduction MachineOperatorReducer::ReduceUint32Mod(Node* node) { |
} |
+Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32(Node* node) { |
+ Float64Matcher m(node->InputAt(0)); |
+ if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); |
+ if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); |
+ if (m.IsPhi()) { |
+ Node* const phi = m.node(); |
+ DCHECK_EQ(kRepFloat64, RepresentationOf(OpParameter<MachineType>(phi))); |
+ if (phi->OwnedBy(node)) { |
+ // TruncateFloat64ToInt32(Phi[Float64](x1,...,xn)) |
+ // => Phi[Int32](TruncateFloat64ToInt32(x1), |
+ // ..., |
+ // TruncateFloat64ToInt32(xn)) |
+ const int value_input_count = phi->InputCount() - 1; |
+ for (int i = 0; i < value_input_count; ++i) { |
+ Node* input = graph()->NewNode(machine()->TruncateFloat64ToInt32(), |
+ phi->InputAt(i)); |
+ // TODO(bmeurer): Reschedule input for reduction once we have Revisit() |
+ // instead of recursing into ReduceTruncateFloat64ToInt32() here. |
+ Reduction reduction = ReduceTruncateFloat64ToInt32(input); |
+ if (reduction.Changed()) input = reduction.replacement(); |
+ phi->ReplaceInput(i, input); |
+ } |
+ phi->set_op(common()->Phi(kMachInt32, value_input_count)); |
+ return Replace(phi); |
+ } |
+ } |
+ return NoChange(); |
+} |
+ |
+ |
Reduction MachineOperatorReducer::ReduceStore(Node* node) { |
MachineType const rep = |
RepresentationOf(StoreRepresentationOf(node->op()).machine_type()); |