From: bmeurer Date: Wed, 17 Dec 2014 09:51:05 +0000 (-0800) Subject: Revert of [turbofan] Correctify TruncateFloat64ToInt32 reduction in MachineOperatorRe... X-Git-Tag: upstream/4.7.83~5181 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5a8be47d21f3abc857b26c4febf5255d936ba3b9;p=platform%2Fupstream%2Fv8.git Revert of [turbofan] Correctify TruncateFloat64ToInt32 reduction in MachineOperatorReducer. (patchset #1 id:1 of https://codereview.chromium.org/801263002/) Reason for revert: Can cause reduce cycles, needs more investigation Original issue's description: > [turbofan] Correctify TruncateFloat64ToInt32 reduction in MachineOperatorReducer. > > TEST=unittests > R=svenpanne@chromium.org > > Committed: https://chromium.googlesource.com/v8/v8/+/6e7ceee4d02a81f167d47d8c6dc57a226b8d98d4 TBR=svenpanne@chromium.org NOTREECHECKS=true NOTRY=true Review URL: https://codereview.chromium.org/794473003 Cr-Commit-Position: refs/heads/master@{#25859} --- diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc index 1c61529..f8555da 100644 --- a/src/compiler/machine-operator-reducer.cc +++ b/src/compiler/machine-operator-reducer.cc @@ -608,52 +608,31 @@ Reduction MachineOperatorReducer::ReduceUint32Mod(Node* node) { } -Reduction MachineOperatorReducer::ReduceTruncateFloat64ToInt32Input( - Node* input) { - Float64Matcher m(input); +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)); - 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(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); + if (m.IsPhi()) { + Node* const phi = m.node(); + DCHECK_EQ(kRepFloat64, RepresentationOf(OpParameter(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); } - node->TrimInputCount(input_count + 1); - return Changed(node); } return NoChange(); } diff --git a/src/compiler/machine-operator-reducer.h b/src/compiler/machine-operator-reducer.h index ba40f3f..11887f5 100644 --- a/src/compiler/machine-operator-reducer.h +++ b/src/compiler/machine-operator-reducer.h @@ -65,7 +65,6 @@ 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); diff --git a/test/unittests/compiler/machine-operator-reducer-unittest.cc b/test/unittests/compiler/machine-operator-reducer-unittest.cc index 558ad00..3e47ce8 100644 --- a/test/unittests/compiler/machine-operator-reducer-unittest.cc +++ b/test/unittests/compiler/machine-operator-reducer-unittest.cc @@ -469,25 +469,6 @@ 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 phi; - EXPECT_THAT( - reduction.replacement(), - AllOf(CaptureEq(&phi), IsPhi(kMachInt32, IsTruncateFloat64ToInt32(p0), - CaptureEq(&phi), merge))); -} - - // ----------------------------------------------------------------------------- // TruncateInt64ToInt32