| Index: test/unittests/compiler/typer-unittest.cc
|
| diff --git a/test/unittests/compiler/typer-unittest.cc b/test/unittests/compiler/typer-unittest.cc
|
| index 5fc2945abe5c0b6074a0df5fffa0bce177fd7039..d164ee3423e63b24602160122217aed897e40c75 100644
|
| --- a/test/unittests/compiler/typer-unittest.cc
|
| +++ b/test/unittests/compiler/typer-unittest.cc
|
| @@ -22,6 +22,7 @@ class TyperTest : public TypedGraphTest {
|
| public:
|
| TyperTest()
|
| : TypedGraphTest(3),
|
| + operation_typer_(isolate(), zone()),
|
| types_(zone(), isolate(), random_number_generator()),
|
| javascript_(zone()),
|
| simplified_(zone()) {
|
| @@ -52,6 +53,9 @@ class TyperTest : public TypedGraphTest {
|
| }
|
| }
|
|
|
| + const int kRepetitions = 50;
|
| +
|
| + OperationTyper operation_typer_;
|
| Types types_;
|
| JSOperatorBuilder javascript_;
|
| SimplifiedOperatorBuilder simplified_;
|
| @@ -123,6 +127,14 @@ class TyperTest : public TypedGraphTest {
|
| return RandomInt(range->Min(), range->Max());
|
| }
|
|
|
| + Type* RandomSubtype(Type* type) {
|
| + Type* subtype;
|
| + do {
|
| + subtype = types_.Fuzz();
|
| + } while (!subtype->Is(type));
|
| + return subtype;
|
| + }
|
| +
|
| // Careful, this function runs O(max_width^5) trials.
|
| template <class BinaryFunction>
|
| void TestBinaryArithOpCloseToZero(const Operator* op, BinaryFunction opfun,
|
| @@ -213,23 +225,42 @@ class TyperTest : public TypedGraphTest {
|
| }
|
| }
|
|
|
| - Type* RandomSubtype(Type* type) {
|
| - Type* subtype;
|
| - do {
|
| - subtype = types_.Fuzz();
|
| - } while (!subtype->Is(type));
|
| - return subtype;
|
| + typedef std::function<Type*(Type*)> UnaryTyper;
|
| + typedef std::function<Type*(Type*, Type*)> BinaryTyper;
|
| +
|
| + void TestUnaryMonotonicity(UnaryTyper typer, Type* upper1 = Type::Any()) {
|
| + Type* type1 = Type::Intersect(types_.Fuzz(), upper1, zone());
|
| + DCHECK(type1->Is(upper1));
|
| + Type* type = typer(type1);
|
| +
|
| + Type* subtype1 = RandomSubtype(type1);
|
| + Type* subtype = typer(subtype1);
|
| +
|
| + EXPECT_TRUE(subtype->Is(type));
|
| }
|
|
|
| - void TestBinaryMonotonicity(const Operator* op) {
|
| - for (int i = 0; i < 50; ++i) {
|
| - Type* type1 = types_.Fuzz();
|
| - Type* type2 = types_.Fuzz();
|
| - Type* type = TypeBinaryOp(op, type1, type2);
|
| - Type* subtype1 = RandomSubtype(type1);
|
| - Type* subtype2 = RandomSubtype(type2);
|
| - Type* subtype = TypeBinaryOp(op, subtype1, subtype2);
|
| - EXPECT_TRUE(subtype->Is(type));
|
| + void TestBinaryMonotonicity(BinaryTyper typer, Type* upper1 = Type::Any(),
|
| + Type* upper2 = Type::Any()) {
|
| + Type* type1 = Type::Intersect(types_.Fuzz(), upper1, zone());
|
| + DCHECK(type1->Is(upper1));
|
| + Type* type2 = Type::Intersect(types_.Fuzz(), upper2, zone());
|
| + DCHECK(type2->Is(upper2));
|
| + Type* type = typer(type1, type2);
|
| +
|
| + Type* subtype1 = RandomSubtype(type1);
|
| + Type* subtype2 = RandomSubtype(type2);
|
| + Type* subtype = typer(subtype1, subtype2);
|
| +
|
| + EXPECT_TRUE(subtype->Is(type));
|
| + }
|
| +
|
| + void TestBinaryMonotonicity(const Operator* op, Type* upper1 = Type::Any(),
|
| + Type* upper2 = Type::Any()) {
|
| + BinaryTyper typer = [&](Type* type1, Type* type2) {
|
| + return TypeBinaryOp(op, type1, type2);
|
| + };
|
| + for (int i = 0; i < kRepetitions; ++i) {
|
| + TestBinaryMonotonicity(typer, upper1, upper2);
|
| }
|
| }
|
| };
|
| @@ -252,57 +283,46 @@ int32_t bit_xor(int32_t x, int32_t y) { return x ^ y; }
|
| // that have a direct equivalent in C++. Also, testing is currently limited
|
| // to ranges as input types.
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSAdd) {
|
| TestBinaryArithOp(javascript_.Add(hints_), std::plus<double>());
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSSubtract) {
|
| TestBinaryArithOp(javascript_.Subtract(), std::minus<double>());
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSMultiply) {
|
| TestBinaryArithOp(javascript_.Multiply(), std::multiplies<double>());
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSDivide) {
|
| TestBinaryArithOp(javascript_.Divide(), std::divides<double>());
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSModulus) {
|
| TestBinaryArithOp(javascript_.Modulus(), modulo);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSBitwiseOr) {
|
| TestBinaryBitOp(javascript_.BitwiseOr(), bit_or);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSBitwiseAnd) {
|
| TestBinaryBitOp(javascript_.BitwiseAnd(), bit_and);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSBitwiseXor) {
|
| TestBinaryBitOp(javascript_.BitwiseXor(), bit_xor);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSShiftLeft) {
|
| TestBinaryBitOp(javascript_.ShiftLeft(), shift_left);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSShiftRight) {
|
| TestBinaryBitOp(javascript_.ShiftRight(), shift_right);
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSLessThan) {
|
| TestBinaryCompareOp(javascript_.LessThan(CompareOperationHint::kAny),
|
| std::less<double>());
|
| @@ -346,7 +366,6 @@ TEST_F(TyperTest, TypeJSGreaterThanOrEqual) {
|
| std::greater_equal<double>());
|
| }
|
|
|
| -
|
| TEST_F(TyperTest, TypeJSEqual) {
|
| TestBinaryCompareOp(javascript_.Equal(CompareOperationHint::kAny),
|
| std::equal_to<double>());
|
| @@ -368,44 +387,125 @@ TEST_F(TyperTest, TypeJSStrictEqual) {
|
| std::equal_to<double>());
|
| }
|
|
|
| -
|
| //------------------------------------------------------------------------------
|
| -// Monotonicity
|
| +// Typer Monotonicity
|
|
|
| -#define TEST_BINARY_MONOTONICITY(name) \
|
| +// JS BINOPs with CompareOperationHint
|
| +#define TEST_MONOTONICITY(name) \
|
| TEST_F(TyperTest, Monotonicity_##name) { \
|
| TestBinaryMonotonicity(javascript_.name(CompareOperationHint::kAny)); \
|
| }
|
| -TEST_BINARY_MONOTONICITY(Equal)
|
| -TEST_BINARY_MONOTONICITY(StrictEqual)
|
| -TEST_BINARY_MONOTONICITY(LessThan)
|
| -TEST_BINARY_MONOTONICITY(GreaterThan)
|
| -TEST_BINARY_MONOTONICITY(LessThanOrEqual)
|
| -TEST_BINARY_MONOTONICITY(GreaterThanOrEqual)
|
| -#undef TEST_BINARY_MONOTONICITY
|
| -
|
| -#define TEST_BINARY_MONOTONICITY(name) \
|
| +TEST_MONOTONICITY(Equal)
|
| +TEST_MONOTONICITY(StrictEqual)
|
| +TEST_MONOTONICITY(LessThan)
|
| +TEST_MONOTONICITY(GreaterThan)
|
| +TEST_MONOTONICITY(LessThanOrEqual)
|
| +TEST_MONOTONICITY(GreaterThanOrEqual)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// JS BINOPs with BinaryOperationHint
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_##name) { \
|
| + TestBinaryMonotonicity(javascript_.name(BinaryOperationHint::kAny)); \
|
| + }
|
| +TEST_MONOTONICITY(Add)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// JS BINOPS without hint
|
| +#define TEST_MONOTONICITY(name) \
|
| TEST_F(TyperTest, Monotonicity_##name) { \
|
| TestBinaryMonotonicity(javascript_.name()); \
|
| }
|
| -TEST_BINARY_MONOTONICITY(BitwiseOr)
|
| -TEST_BINARY_MONOTONICITY(BitwiseXor)
|
| -TEST_BINARY_MONOTONICITY(BitwiseAnd)
|
| -TEST_BINARY_MONOTONICITY(ShiftLeft)
|
| -TEST_BINARY_MONOTONICITY(ShiftRight)
|
| -TEST_BINARY_MONOTONICITY(ShiftRightLogical)
|
| -TEST_BINARY_MONOTONICITY(Subtract)
|
| -TEST_BINARY_MONOTONICITY(Multiply)
|
| -TEST_BINARY_MONOTONICITY(Divide)
|
| -TEST_BINARY_MONOTONICITY(Modulus)
|
| -#undef TEST_BINARY_MONOTONICITY
|
| -
|
| -#define TEST_BINARY_MONOTONICITY(name) \
|
| - TEST_F(TyperTest, Monotonicity_##name) { \
|
| - TestBinaryMonotonicity(javascript_.name(BinaryOperationHint::kAny)); \
|
| +TEST_MONOTONICITY(BitwiseOr)
|
| +TEST_MONOTONICITY(BitwiseXor)
|
| +TEST_MONOTONICITY(BitwiseAnd)
|
| +TEST_MONOTONICITY(ShiftLeft)
|
| +TEST_MONOTONICITY(ShiftRight)
|
| +TEST_MONOTONICITY(ShiftRightLogical)
|
| +TEST_MONOTONICITY(Subtract)
|
| +TEST_MONOTONICITY(Multiply)
|
| +TEST_MONOTONICITY(Divide)
|
| +TEST_MONOTONICITY(Modulus)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs without hint, with Number input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_##name) { \
|
| + TestBinaryMonotonicity(simplified_.name(), Type::Number(), \
|
| + Type::Number()); \
|
| + }
|
| +SIMPLIFIED_NUMBER_BINOP_LIST(TEST_MONOTONICITY);
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs without hint, without input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_##name) { \
|
| + TestBinaryMonotonicity(simplified_.name()); \
|
| + }
|
| +TEST_MONOTONICITY(NumberLessThan)
|
| +TEST_MONOTONICITY(NumberLessThanOrEqual)
|
| +TEST_MONOTONICITY(NumberEqual)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs with NumberOperationHint, without input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_##name) { \
|
| + TestBinaryMonotonicity(simplified_.name(NumberOperationHint::kNumber)); \
|
| + }
|
| +TEST_MONOTONICITY(SpeculativeNumberEqual)
|
| +TEST_MONOTONICITY(SpeculativeNumberLessThan)
|
| +TEST_MONOTONICITY(SpeculativeNumberLessThanOrEqual)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs with NumberOperationHint, without input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_##name) { \
|
| + TestBinaryMonotonicity(simplified_.name(NumberOperationHint::kNumber)); \
|
| + }
|
| +SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(TEST_MONOTONICITY)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +//------------------------------------------------------------------------------
|
| +// OperationTyper Monotonicity
|
| +
|
| +// SIMPLIFIED UNOPs with Number input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_Operation_##name) { \
|
| + UnaryTyper typer = [&](Type* type1) { \
|
| + return operation_typer_.name(type1); \
|
| + }; \
|
| + for (int i = 0; i < kRepetitions; ++i) { \
|
| + TestUnaryMonotonicity(typer, Type::Number()); \
|
| + } \
|
| + }
|
| +SIMPLIFIED_NUMBER_UNOP_LIST(TEST_MONOTONICITY)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs with Number input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_Operation_##name) { \
|
| + BinaryTyper typer = [&](Type* type1, Type* type2) { \
|
| + return operation_typer_.name(type1, type2); \
|
| + }; \
|
| + for (int i = 0; i < kRepetitions; ++i) { \
|
| + TestBinaryMonotonicity(typer, Type::Number(), Type::Number()); \
|
| + } \
|
| + }
|
| +SIMPLIFIED_NUMBER_BINOP_LIST(TEST_MONOTONICITY)
|
| +#undef TEST_MONOTONICITY
|
| +
|
| +// SIMPLIFIED BINOPs without input restriction
|
| +#define TEST_MONOTONICITY(name) \
|
| + TEST_F(TyperTest, Monotonicity_Operation_##name) { \
|
| + BinaryTyper typer = [&](Type* type1, Type* type2) { \
|
| + return operation_typer_.name(type1, type2); \
|
| + }; \
|
| + for (int i = 0; i < kRepetitions; ++i) { \
|
| + TestBinaryMonotonicity(typer); \
|
| + } \
|
| }
|
| -TEST_BINARY_MONOTONICITY(Add)
|
| -#undef TEST_BINARY_MONOTONICITY
|
| +SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(TEST_MONOTONICITY)
|
| +#undef TEST_MONOTONICITY
|
|
|
| } // namespace compiler
|
| } // namespace internal
|
|
|