| 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 a5b1cfe19b87e2485c8a64af63092914c2bfb629..461c2bef84f59089b6c0814baaccc33fe260284e 100644
|
| --- a/test/unittests/compiler/machine-operator-reducer-unittest.cc
|
| +++ b/test/unittests/compiler/machine-operator-reducer-unittest.cc
|
| @@ -731,19 +731,111 @@ TEST_F(MachineOperatorReducerTest, Int32DivWithConstant) {
|
| }
|
|
|
|
|
| +TEST_F(MachineOperatorReducerTest, Int32DivWithParameters) {
|
| + Node* const p0 = Parameter(0);
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Int32Div(), p0, p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(
|
| + r.replacement(),
|
| + IsWord32Equal(IsWord32Equal(p0, IsInt32Constant(0)), IsInt32Constant(0)));
|
| +}
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Uint32Div
|
| +
|
| +
|
| +TEST_F(MachineOperatorReducerTest, Uint32DivWithConstant) {
|
| + Node* const p0 = Parameter(0);
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Div(), Int32Constant(0), p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Div(), p0, Int32Constant(0)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Div(), p0, Int32Constant(1)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_EQ(r.replacement(), p0);
|
| + }
|
| + TRACED_FOREACH(uint32_t, dividend, kUint32Values) {
|
| + TRACED_FOREACH(uint32_t, divisor, kUint32Values) {
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Div(),
|
| + Uint32Constant(dividend),
|
| + Uint32Constant(divisor)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(),
|
| + IsInt32Constant(bit_cast<int32_t>(
|
| + base::bits::UnsignedDiv32(dividend, divisor))));
|
| + }
|
| + }
|
| + TRACED_FORRANGE(uint32_t, shift, 1, 31) {
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Div(), p0,
|
| + Uint32Constant(1u << shift)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(),
|
| + IsWord32Shr(p0, IsInt32Constant(bit_cast<int32_t>(shift))));
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_F(MachineOperatorReducerTest, Uint32DivWithParameters) {
|
| + Node* const p0 = Parameter(0);
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Div(), p0, p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(
|
| + r.replacement(),
|
| + IsWord32Equal(IsWord32Equal(p0, IsInt32Constant(0)), IsInt32Constant(0)));
|
| +}
|
| +
|
| +
|
| // -----------------------------------------------------------------------------
|
| // Int32Mod
|
|
|
|
|
| TEST_F(MachineOperatorReducerTest, Int32ModWithConstant) {
|
| Node* const p0 = Parameter(0);
|
| - static const int32_t kOnes[] = {-1, 1};
|
| - TRACED_FOREACH(int32_t, one, kOnes) {
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Int32Mod(), Int32Constant(0), p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Int32Mod(), p0, Int32Constant(0)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| Reduction const r =
|
| - Reduce(graph()->NewNode(machine()->Int32Mod(), p0, Int32Constant(one)));
|
| + Reduce(graph()->NewNode(machine()->Int32Mod(), p0, Int32Constant(1)));
|
| ASSERT_TRUE(r.Changed());
|
| EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Int32Mod(), p0, Int32Constant(-1)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + TRACED_FOREACH(int32_t, dividend, kInt32Values) {
|
| + TRACED_FOREACH(int32_t, divisor, kInt32Values) {
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Int32Mod(),
|
| + Int32Constant(dividend),
|
| + Int32Constant(divisor)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(),
|
| + IsInt32Constant(base::bits::SignedMod32(dividend, divisor)));
|
| + }
|
| + }
|
| TRACED_FORRANGE(int32_t, shift, 1, 30) {
|
| Reduction const r = Reduce(
|
| graph()->NewNode(machine()->Int32Mod(), p0, Int32Constant(1 << shift)));
|
| @@ -797,6 +889,68 @@ TEST_F(MachineOperatorReducerTest, Int32ModWithConstant) {
|
| }
|
|
|
|
|
| +TEST_F(MachineOperatorReducerTest, Int32ModWithParameters) {
|
| + Node* const p0 = Parameter(0);
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Int32Mod(), p0, p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| +}
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Uint32Mod
|
| +
|
| +
|
| +TEST_F(MachineOperatorReducerTest, Uint32ModWithConstant) {
|
| + Node* const p0 = Parameter(0);
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Mod(), p0, Int32Constant(0)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Mod(), Int32Constant(0), p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + {
|
| + Reduction const r =
|
| + Reduce(graph()->NewNode(machine()->Uint32Mod(), p0, Int32Constant(1)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| + }
|
| + TRACED_FOREACH(uint32_t, dividend, kUint32Values) {
|
| + TRACED_FOREACH(uint32_t, divisor, kUint32Values) {
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Mod(),
|
| + Uint32Constant(dividend),
|
| + Uint32Constant(divisor)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(),
|
| + IsInt32Constant(bit_cast<int32_t>(
|
| + base::bits::UnsignedMod32(dividend, divisor))));
|
| + }
|
| + }
|
| + TRACED_FORRANGE(uint32_t, shift, 1, 31) {
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Mod(), p0,
|
| + Uint32Constant(1u << shift)));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(),
|
| + IsWord32And(p0, IsInt32Constant(
|
| + bit_cast<int32_t>((1u << shift) - 1u))));
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_F(MachineOperatorReducerTest, Uint32ModWithParameters) {
|
| + Node* const p0 = Parameter(0);
|
| + Reduction const r = Reduce(graph()->NewNode(machine()->Uint32Mod(), p0, p0));
|
| + ASSERT_TRUE(r.Changed());
|
| + EXPECT_THAT(r.replacement(), IsInt32Constant(0));
|
| +}
|
| +
|
| +
|
| // -----------------------------------------------------------------------------
|
| // Int32AddWithOverflow
|
|
|
|
|