| Index: runtime/vm/intermediate_language_test.cc
|
| diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc
|
| index 5d42bcbef96d411fc62e83e7610601e0a76d56e9..4f836772d8ce2d88d04012d9bfca9513c621ccc3 100644
|
| --- a/runtime/vm/intermediate_language_test.cc
|
| +++ b/runtime/vm/intermediate_language_test.cc
|
| @@ -122,4 +122,207 @@ TEST_CASE(RangeTestsInfinity) {
|
| EXPECT(unsatisfiable_left->IsUnsatisfiable());
|
| }
|
|
|
| +
|
| +TEST_CASE(RangeUtils) {
|
| + // NULL case for IsSmiMinOrUnderflow().
|
| + EXPECT(Range::IsSmiMinimumOrUnderflow(NULL));
|
| +
|
| + // Unknown case for IsSmiMinOrUnderflow().
|
| + EXPECT(Range::IsSmiMinimumOrUnderflow(Range::Unknown()));
|
| +
|
| + // [-inf, 0] case for IsSmiMinOrUnderflow().
|
| + EXPECT(Range::IsSmiMinimumOrUnderflow(
|
| + new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [0, inf] case for IsSmiMinOrUnderflow().
|
| + EXPECT(!Range::IsSmiMinimumOrUnderflow(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity())));
|
| +
|
| + // [kSmiMin - 1, 0] case for IsSmiMinOrUnderflow().
|
| + EXPECT(Range::IsSmiMinimumOrUnderflow(
|
| + new Range(RangeBoundary::FromConstant(kSmiMin - 1),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [kSmiMin, 0] case for IsSmiMinOrUnderflow().
|
| + EXPECT(Range::IsSmiMinimumOrUnderflow(
|
| + new Range(RangeBoundary::FromConstant(kSmiMin),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [kSmiMin + 1, 0] case for IsSmiMinOrUnderflow().
|
| + EXPECT(!Range::IsSmiMinimumOrUnderflow(
|
| + new Range(RangeBoundary::FromConstant(kSmiMin + 1),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // NULL case for IsSmiMaximumOrOverflow().
|
| + EXPECT(Range::IsSmiMaximumOrOverflow(NULL));
|
| +
|
| + // Unknown case for IsSmiMaximumOrOverflow().
|
| + EXPECT(Range::IsSmiMaximumOrOverflow(Range::Unknown()));
|
| +
|
| + // [-inf, 0] case for IsSmiMaxOrOverflow().
|
| + EXPECT(!Range::IsSmiMaximumOrOverflow(
|
| + new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [0, inf] case for IsSmiMaxOrOverflow().
|
| + EXPECT(Range::IsSmiMaximumOrOverflow(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity())));
|
| +
|
| + // [0, kSmiMax - 1] case for IsSmiMaxOrOverflow().
|
| + EXPECT(!Range::IsSmiMaximumOrOverflow(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(kSmiMax - 1))));
|
| +
|
| + // [0, kSmiMax] case for IsSmiMaxOrOverflow().
|
| + EXPECT(Range::IsSmiMaximumOrOverflow(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(kSmiMax))));
|
| +
|
| + // [0, kSmiMax + 1] case for IsSmiMaxOrOverflow().
|
| + EXPECT(Range::IsSmiMaximumOrOverflow(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(kSmiMax + 1))));
|
| +
|
| + // [-inf, +inf].
|
| + const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::PositiveInfinity()));
|
| + // [-inf, -1].
|
| + const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(-1)));
|
| + // [-inf, 0].
|
| + const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0)));
|
| + // [-inf, 1].
|
| + const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(1)));
|
| + // [-1, +inf]
|
| + const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1),
|
| + RangeBoundary::PositiveInfinity()));
|
| + // [0, +inf]
|
| + const Range& range_e = *(new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity()));
|
| + // [1, +inf].
|
| + const Range& range_f = *(new Range(RangeBoundary::FromConstant(1),
|
| + RangeBoundary::PositiveInfinity()));
|
| + // [1, 2].
|
| + const Range& range_g = *(new Range(RangeBoundary::FromConstant(1),
|
| + RangeBoundary::FromConstant(2)));
|
| + // [-1, -2].
|
| + const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1),
|
| + RangeBoundary::FromConstant(-2)));
|
| + // [-1, 1].
|
| + const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1),
|
| + RangeBoundary::FromConstant(1)));
|
| +
|
| + // OnlyPositiveOrZero.
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e));
|
| + EXPECT(Range::OnlyPositiveOrZero(range_e, range_f));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d));
|
| + EXPECT(Range::OnlyPositiveOrZero(range_e, range_e));
|
| + EXPECT(Range::OnlyPositiveOrZero(range_f, range_g));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i));
|
| +
|
| + // OnlyNegativeOrZero.
|
| + EXPECT(Range::OnlyNegativeOrZero(range_a, range_b));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c));
|
| + EXPECT(Range::OnlyNegativeOrZero(range_b, range_b));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h));
|
| + EXPECT(Range::OnlyNegativeOrZero(range_h, range_h));
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i));
|
| +
|
| + // [-inf, +inf].
|
| + EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0));
|
| + EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0));
|
| +
|
| + EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax);
|
| + EXPECT(Range::ConstantAbsMax(&range_h) == 2);
|
| + EXPECT(Range::ConstantAbsMax(&range_i) == 1);
|
| +
|
| + // RangeBOundary.Equals.
|
| + EXPECT(RangeBoundary::FromConstant(1).Equals(
|
| + RangeBoundary::FromConstant(1)));
|
| + EXPECT(!RangeBoundary::FromConstant(2).Equals(
|
| + RangeBoundary::FromConstant(1)));
|
| + EXPECT(RangeBoundary::PositiveInfinity().Equals(
|
| + RangeBoundary::PositiveInfinity()));
|
| + EXPECT(!RangeBoundary::PositiveInfinity().Equals(
|
| + RangeBoundary::NegativeInfinity()));
|
| + EXPECT(RangeBoundary::NegativeInfinity().Equals(
|
| + RangeBoundary::NegativeInfinity()));
|
| + EXPECT(!RangeBoundary::NegativeInfinity().Equals(
|
| + RangeBoundary::PositiveInfinity()));
|
| + EXPECT(!RangeBoundary::FromConstant(1).Equals(
|
| + RangeBoundary::NegativeInfinity()));
|
| + EXPECT(!RangeBoundary::FromConstant(1).Equals(
|
| + RangeBoundary::NegativeInfinity()));
|
| + EXPECT(!RangeBoundary::FromConstant(2).Equals(
|
| + RangeBoundary::PositiveInfinity()));
|
| +}
|
| +
|
| +
|
| +TEST_CASE(RangeBinaryOp) {
|
| + // Test that [0, +inf] + [-inf, 0] = [-inf, +inf].
|
| + Range* range_a = new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity());
|
| + EXPECT(range_a->min().Value() == 0);
|
| + EXPECT(range_a->max().IsPositiveInfinity());
|
| + Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0));
|
| + EXPECT(range_b->min().IsNegativeInfinity());
|
| + EXPECT(range_b->max().Value() == 0);
|
| + Range* result = Range::BinaryOp(Token::kADD,
|
| + range_a->min(),
|
| + range_a->max(),
|
| + range_a,
|
| + range_b,
|
| + NULL);
|
| + ASSERT(result != NULL);
|
| + EXPECT(result->min().IsNegativeInfinity());
|
| + EXPECT(result->max().IsPositiveInfinity());
|
| +
|
| + // Test that [5, 10] + [0, 5] = [5, 15].
|
| + Range* range_c = new Range(RangeBoundary::FromConstant(5),
|
| + RangeBoundary::FromConstant(10));
|
| + Range* range_d = new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(5));
|
| + result = Range::BinaryOp(Token::kADD,
|
| + range_c->min(),
|
| + range_c->max(),
|
| + range_c,
|
| + range_d,
|
| + NULL);
|
| + ASSERT(result != NULL);
|
| + EXPECT(result->min().Value() == 5);
|
| + EXPECT(result->max().Value() == 15);
|
| +
|
| +
|
| + // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
|
| + Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
|
| + RangeBoundary::FromConstant(0xfff));
|
| + Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
|
| + RangeBoundary::FromConstant(0xf));
|
| + result = Range::BinaryOp(Token::kBIT_AND,
|
| + range_e->min(),
|
| + range_e->max(),
|
| + range_e,
|
| + range_f,
|
| + Range::Unknown());
|
| + ASSERT(result != NULL);
|
| + EXPECT(result->min().Value() == 0x0);
|
| + EXPECT(result->max().Value() == 0xf);
|
| +}
|
| +
|
| +
|
| } // namespace dart
|
|
|