Index: src/compiler/machine-operator-reducer.cc |
diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc |
index f8555da33bb7dc1864c3d42caaf8be5defe11d01..1c615294cdf228debbc60f36c565aec7707bc489 100644 |
--- a/src/compiler/machine-operator-reducer.cc |
+++ b/src/compiler/machine-operator-reducer.cc |
@@ -608,31 +608,52 @@ Reduction MachineOperatorReducer::ReduceUint32Mod(Node* node) { |
} |
-Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32(Node* node) { |
- Float64Matcher m(node->InputAt(0)); |
+Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32Input( |
+ Node* input) { |
+ Float64Matcher m(input); |
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::ReduceTruncateFloat64ToInt32(Node* node) { |
+ // Try to reduce the input first. |
+ Node* const input = node->InputAt(0); |
+ Reduction reduction = ReduceTruncateFloat64ToInt32Input(input); |
+ if (reduction.Changed()) return reduction; |
+ if (input->opcode() == IrOpcode::kPhi) { |
+ DCHECK_EQ(kRepFloat64, RepresentationOf(OpParameter<MachineType>(input))); |
+ // TruncateFloat64ToInt32(Phi[Float64](x1,...,xn)) |
+ // => Phi[Int32](TruncateFloat64ToInt32(x1), |
+ // ..., |
+ // TruncateFloat64ToInt32(xn)) |
+ int const input_count = input->InputCount() - 1; |
+ Node* const control = input->InputAt(input_count); |
+ DCHECK_LE(0, input_count); |
+ node->set_op(common()->Phi(kMachInt32, input_count)); |
+ for (int i = 0; i < input_count; ++i) { |
+ Node* value = input->InputAt(i); |
+ // Recursively try to reduce the value first. |
+ Reduction const reduction = ReduceTruncateFloat64ToInt32Input(value); |
+ if (reduction.Changed()) { |
+ value = reduction.replacement(); |
+ } else { |
+ value = graph()->NewNode(machine()->TruncateFloat64ToInt32(), value); |
+ } |
+ if (i < node->InputCount()) { |
+ node->ReplaceInput(i, value); |
+ } else { |
+ node->AppendInput(graph()->zone(), value); |
+ } |
+ } |
+ if (input_count < node->InputCount()) { |
+ node->ReplaceInput(input_count, control); |
+ } else { |
+ node->AppendInput(graph()->zone(), control); |
} |
+ node->TrimInputCount(input_count + 1); |
+ return Changed(node); |
} |
return NoChange(); |
} |