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 |