| 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..6b57bac9cc4e782879ae86a490aa281de4ca9ae6 100644
|
| --- a/runtime/vm/intermediate_language_test.cc
|
| +++ b/runtime/vm/intermediate_language_test.cc
|
| @@ -122,4 +122,226 @@ TEST_CASE(RangeTestsInfinity) {
|
| EXPECT(unsatisfiable_left->IsUnsatisfiable());
|
| }
|
|
|
| +
|
| +TEST_CASE(RangeUtils) {
|
| + // NULL case for IncludesNegativeInfinity().
|
| + EXPECT(Range::IncludesNegativeInfinity(NULL));
|
| +
|
| + // [-inf, 0] case for IncludesNegativeInfinity().
|
| + EXPECT(Range::IncludesNegativeInfinity(
|
| + new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [0, inf] case for IncludesNegativeInfinity().
|
| + EXPECT(!Range::IncludesNegativeInfinity(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity())));
|
| +
|
| + // NULL case for IncludesPositiveInfinity().
|
| + EXPECT(Range::IncludesPositiveInfinity(NULL));
|
| +
|
| + // [-inf, 0] case for IncludesPositiveInfinity().
|
| + EXPECT(!Range::IncludesPositiveInfinity(
|
| + new Range(RangeBoundary::NegativeInfinity(),
|
| + RangeBoundary::FromConstant(0))));
|
| +
|
| + // [0, inf] case for IncludesPositiveInfinity().
|
| + EXPECT(Range::IncludesPositiveInfinity(
|
| + new Range(RangeBoundary::FromConstant(0),
|
| + RangeBoundary::PositiveInfinity())));
|
| +
|
| + // [-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) == -Smi::kMinValue);
|
| + 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().ConstantValue() == 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().ConstantValue() == 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().ConstantValue() == 5);
|
| + EXPECT(result->max().ConstantValue() == 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().ConstantValue() == 0x0);
|
| + EXPECT(result->max().ConstantValue() == 0xf);
|
| +}
|
| +
|
| +
|
| +TEST_CASE(RangeMinMax) {
|
| + // Constants.
|
| + // MIN(0, 1) == 0
|
| + EXPECT(RangeBoundary::Min(
|
| + RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(1)).ConstantValue() == 0);
|
| + // MIN(0, -1) == -1
|
| + EXPECT(RangeBoundary::Min(
|
| + RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
|
| +
|
| + // MIN(1, 0) == 0
|
| + EXPECT(RangeBoundary::Min(
|
| + RangeBoundary::FromConstant(1),
|
| + RangeBoundary::FromConstant(0)).ConstantValue() == 0);
|
| + // MIN(-1, 0) == -1
|
| + EXPECT(RangeBoundary::Min(
|
| + RangeBoundary::FromConstant(-1),
|
| + RangeBoundary::FromConstant(0)).ConstantValue() == -1);
|
| +
|
| + // MAX(0, 1) == 1
|
| + EXPECT(RangeBoundary::Max(
|
| + RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(1)).ConstantValue() == 1);
|
| + // MAX(0, -1) == 0
|
| + EXPECT(RangeBoundary::Max(
|
| + RangeBoundary::FromConstant(0),
|
| + RangeBoundary::FromConstant(-1)).ConstantValue() == 0);
|
| +
|
| + // MAX(1, 0) == 1
|
| + EXPECT(RangeBoundary::Max(
|
| + RangeBoundary::FromConstant(1),
|
| + RangeBoundary::FromConstant(0)).ConstantValue() == 1);
|
| + // MAX(-1, 0) == 0
|
| + EXPECT(RangeBoundary::Max(
|
| + RangeBoundary::FromConstant(-1),
|
| + RangeBoundary::FromConstant(0)).ConstantValue() == 0);
|
| +
|
| + // Infinities.
|
| + RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
|
| + RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
|
| +
|
| + // MIN(-inf, +inf) == -inf.
|
| + EXPECT(RangeBoundary::Min(n_infinity, p_infinity).Equals(n_infinity));
|
| +
|
| + // MIN(+inf, -inf) == -inf.
|
| + EXPECT(RangeBoundary::Min(p_infinity, n_infinity).Equals(n_infinity));
|
| +
|
| + // MAX(-inf, +inf) == +inf.
|
| + EXPECT(RangeBoundary::Max(n_infinity, p_infinity).Equals(p_infinity));
|
| +
|
| + // MAX(+inf, -inf) == +inf.
|
| + EXPECT(RangeBoundary::Max(p_infinity, n_infinity).Equals(p_infinity));
|
| +}
|
| +
|
| } // namespace dart
|
|
|