| Index: test/cctest/compiler/test-branch-combine.cc
|
| diff --git a/test/cctest/compiler/test-branch-combine.cc b/test/cctest/compiler/test-branch-combine.cc
|
| index c5c41667a02f76c4ac2f4f9b415e10afe3971533..edaf7b6ac133fede4eee9cf6d39e8dd17f9fe9c9 100644
|
| --- a/test/cctest/compiler/test-branch-combine.cc
|
| +++ b/test/cctest/compiler/test-branch-combine.cc
|
| @@ -478,6 +478,454 @@ TEST(BranchCombineEffectLevel) {
|
| CHECK_EQ(42, m.Call());
|
| }
|
|
|
| +TEST(BranchCombineInt32AddLessThanZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Int32LessThan(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (a + b < 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineInt32AddGreaterThanOrEqualZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Int32GreaterThanOrEqual(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (a + b >= 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineInt32ZeroGreaterThanAdd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Int32GreaterThan(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (0 > a + b) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineInt32ZeroLessThanOrEqualAdd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Int32LessThanOrEqual(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (0 <= a + b) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32AddLessThanOrEqualZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Uint32LessThanOrEqual(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (a + b <= 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32AddGreaterThanZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Uint32GreaterThan(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (a + b > 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32ZeroGreaterThanOrEqualAdd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Uint32GreaterThanOrEqual(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (0 >= a + b) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32ZeroLessThanAdd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Int32Add(a, b);
|
| + Node* compare = m.Uint32LessThan(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (0 < a + b) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineWord32AndLessThanZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Int32LessThan(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = ((a & b) < 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineWord32AndGreaterThanOrEqualZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Int32GreaterThanOrEqual(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = ((a & b) >= 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineInt32ZeroGreaterThanAnd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Int32GreaterThan(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (0 > (a & b)) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineInt32ZeroLessThanOrEqualAnd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
|
| + MachineType::Int32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Int32LessThanOrEqual(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + int32_t a = *i;
|
| + int32_t b = *j;
|
| + int32_t expect = (0 <= (a & b)) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32AndLessThanOrEqualZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Uint32LessThanOrEqual(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = ((a & b) <= 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32AndGreaterThanZero) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Uint32GreaterThan(add, m.Int32Constant(0));
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = ((a & b) > 0) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32ZeroGreaterThanOrEqualAnd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Uint32GreaterThanOrEqual(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (0 >= (a & b)) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| +TEST(BranchCombineUint32ZeroLessThanAnd) {
|
| + int32_t t_constant = -1033;
|
| + int32_t f_constant = 825118;
|
| +
|
| + RawMachineAssemblerTester<int32_t> m(MachineType::Uint32(),
|
| + MachineType::Uint32());
|
| + Node* a = m.Parameter(0);
|
| + Node* b = m.Parameter(1);
|
| + Node* add = m.Word32And(a, b);
|
| + Node* compare = m.Uint32LessThan(m.Int32Constant(0), add);
|
| +
|
| + RawMachineLabel blocka, blockb;
|
| + m.Branch(compare, &blocka, &blockb);
|
| + m.Bind(&blocka);
|
| + m.Return(m.Int32Constant(t_constant));
|
| + m.Bind(&blockb);
|
| + m.Return(m.Int32Constant(f_constant));
|
| +
|
| + FOR_INT32_INPUTS(i) {
|
| + FOR_INT32_INPUTS(j) {
|
| + uint32_t a = *i;
|
| + uint32_t b = *j;
|
| + int32_t expect = (0 < (a & b)) ? t_constant : f_constant;
|
| + CHECK_EQ(expect, m.Call(a, b));
|
| + }
|
| + }
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|