Reviewers: Sven Panne,

Message:
PTAL

Description:
[turbofan] Correctify TruncateFloat64ToInt32 reduction in
MachineOperatorReducer.

TEST=unittests

Please review this at https://codereview.chromium.org/801263002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+63, -22 lines):
  M src/compiler/machine-operator-reducer.h
  M src/compiler/machine-operator-reducer.cc
  M test/unittests/compiler/machine-operator-reducer-unittest.cc


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();
 }
Index: src/compiler/machine-operator-reducer.h
diff --git a/src/compiler/machine-operator-reducer.h b/src/compiler/machine-operator-reducer.h index 11887f52004b0d4a00810fedbbeb1a49b68826d2..ba40f3fca9a0cb5648d9a8db31b6c1768844d06e 100644
--- a/src/compiler/machine-operator-reducer.h
+++ b/src/compiler/machine-operator-reducer.h
@@ -65,6 +65,7 @@ class MachineOperatorReducer FINAL : public Reducer {
   Reduction ReduceUint32Div(Node* node);
   Reduction ReduceInt32Mod(Node* node);
   Reduction ReduceUint32Mod(Node* node);
+  Reduction ReduceTruncateFloat64ToInt32Input(Node* input);
   Reduction ReduceTruncateFloat64ToInt32(Node* node);
   Reduction ReduceStore(Node* node);
   Reduction ReduceProjection(size_t index, Node* node);
Index: test/unittests/compiler/machine-operator-reducer-unittest.cc
diff --git a/test/unittests/compiler/machine-operator-reducer-unittest.cc b/test/unittests/compiler/machine-operator-reducer-unittest.cc index 3e47ce8d95d8bda7333a295a895e8a00f8769fe2..558ad0070db5dcd8636e9938022d5787697ee6e4 100644
--- a/test/unittests/compiler/machine-operator-reducer-unittest.cc
+++ b/test/unittests/compiler/machine-operator-reducer-unittest.cc
@@ -469,6 +469,25 @@ TEST_F(MachineOperatorReducerTest, TruncateFloat64ToInt32WithPhi) {
 }


+TEST_F(MachineOperatorReducerTest,
+       TruncateFloat64ToInt32WithPhiAndChangeInt32ToFloat64) {
+  Node* const p0 = Parameter(0);
+  Node* const merge = graph()->start();
+  Node* const truncate = graph()->NewNode(
+      machine()->TruncateFloat64ToInt32(),
+      graph()->NewNode(common()->Phi(kMachFloat64, 2), p0, p0, merge));
+  truncate->InputAt(0)->ReplaceInput(
+      1, graph()->NewNode(machine()->ChangeInt32ToFloat64(), truncate));
+  Reduction reduction = Reduce(truncate);
+  ASSERT_TRUE(reduction.Changed());
+  Capture<Node*> phi;
+  EXPECT_THAT(
+      reduction.replacement(),
+ AllOf(CaptureEq(&phi), IsPhi(kMachInt32, IsTruncateFloat64ToInt32(p0),
+                                   CaptureEq(&phi), merge)));
+}
+
+
// -----------------------------------------------------------------------------
 // TruncateInt64ToInt32



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to