diff --git a/tests/compiler/checks_elimination_ecma_test.cpp b/tests/compiler/checks_elimination_ecma_test.cpp index 57ab18329321df98929f464db8abbdeacfe0af31..6413ed98e8247843d43f02d22580945f055ad1e1 100644 --- a/tests/compiler/checks_elimination_ecma_test.cpp +++ b/tests/compiler/checks_elimination_ecma_test.cpp @@ -74,6 +74,67 @@ TEST_F(CheckEliminationEcmaTest, EliminateAnyTypeCheckAfterCastValueToAnyType) EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); } +TEST_F(CheckEliminationEcmaTest, EliminateAnyTypeCheckAfterCastIntToAnyType) +{ + for (auto int_was_seen : {true, false}) { + auto graph = CreateGraphDynStubWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).s32(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::SaveState).Inputs(1).SrcVregs({0}); + INST(2, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(1, 5) + .IntegerWasSeen(int_was_seen); + INST(3, Opcode::CastAnyTypeValue) + .f64() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(2) + .IntegerWasSeen(int_was_seen); + INST(4, Opcode::Return).f64().Inputs(3); + } + } + + auto graph_opt = CreateGraphDynStubWithDefaultRuntime(); + + if (int_was_seen) { + GRAPH(graph_opt) + { + PARAMETER(0, 0).s32(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(3, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(1); + INST(4, Opcode::Return).f64().Inputs(3); + } + } + } else { + GRAPH(graph_opt) + { + PARAMETER(0, 0).s32(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::SaveState).Inputs(1).SrcVregs({0}); + INST(6, Opcode::Deoptimize).DeoptimizeType(DeoptimizeType::ANY_TYPE_CHECK).Inputs(5); + } + } + } + + EXPECT_TRUE(graph->RunPass()); + graph->RunPass(); + GraphChecker(graph).Check(); + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); + } +} + TEST_F(CheckEliminationEcmaTest, EliminateDuplicateAnyTypeCheck) { auto graph = CreateGraphDynWithDefaultRuntime(); @@ -215,6 +276,110 @@ TEST_F(CheckEliminationEcmaTest, EliminateDuplicateAnyTypeCheckCase4) EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); } +TEST_F(CheckEliminationEcmaTest, EliminateDuplicateAnyTypeCheckIntWasSeen) +{ + auto graph = CreateGraphDynWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).any(); + PARAMETER(1, 1).any(); + + BASIC_BLOCK(2, -1) + { + INST(2, Opcode::SaveState).Inputs(0).SrcVregs({0}); + + INST(3, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0, 2); + INST(4, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(0, 2) + .IntegerWasSeen(true); + + INST(5, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(1, 2); + INST(6, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(1, 2) + .IntegerWasSeen(true); + + INST(7, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(4); + INST(8, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(6); + INST(9, Opcode::Add).f64().Inputs(7, 8); + INST(10, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(9); + INST(11, Opcode::Return).any().Inputs(10); + } + } + + ASSERT_TRUE(graph->RunPass()); + ASSERT_TRUE(graph->RunPass()); + GraphChecker(graph).Check(); + + auto graph_opt = CreateGraphDynWithDefaultRuntime(); + + GRAPH(graph_opt) + { + PARAMETER(0, 0).any(); + PARAMETER(1, 1).any(); + + BASIC_BLOCK(2, -1) + { + INST(2, Opcode::SaveState).Inputs(0).SrcVregs({0}); + + INST(3, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0, 2); + INST(5, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(1, 2); + + INST(7, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(3); + INST(8, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(5); + INST(9, Opcode::Add).f64().Inputs(7, 8); + INST(10, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(9); + INST(11, Opcode::Return).any().Inputs(10); + } + } + + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + +TEST_F(CheckEliminationEcmaTest, NotEliminateAnyTypeCheckIntWasSeen) +{ + auto graph = CreateGraphDynWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).any(); + PARAMETER(1, 1).any(); + + BASIC_BLOCK(2, -1) + { + INST(2, Opcode::SaveState).Inputs(0).SrcVregs({0}); + + INST(3, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(0, 2) + .IntegerWasSeen(true); + INST(4, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0, 2); + + INST(5, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(1, 2) + .IntegerWasSeen(true); + INST(6, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(1, 2); + + INST(7, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(3); + INST(8, Opcode::CastAnyTypeValue).f64().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(6); + INST(9, Opcode::Add).f64().Inputs(7, 8); + INST(10, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(9); + INST(11, Opcode::Return).any().Inputs(10); + } + } + + auto graph_opt = GraphCloner(graph, graph->GetAllocator(), graph->GetLocalAllocator()).CloneGraph(); + + ASSERT_FALSE(graph->RunPass()); + GraphChecker(graph).Check(); + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + TEST_F(CheckEliminationEcmaTest, NotEliminateAnyTypeCheck) { auto graph = CreateGraphDynWithDefaultRuntime(); diff --git a/tests/compiler/peepholes_ecma_test.cpp b/tests/compiler/peepholes_ecma_test.cpp index da1cb9788e6e4aded6af646f09aa0656df066b3b..c580e094ba74ff5c086325e24ac9968bcab75d6a 100644 --- a/tests/compiler/peepholes_ecma_test.cpp +++ b/tests/compiler/peepholes_ecma_test.cpp @@ -171,6 +171,87 @@ TEST_F(PeepholesTest, CastFalse) EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); } +TEST_F(PeepholesTest, CastIntToAnyToDouble) +{ + auto graph = CreateGraphDynStubWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).s32(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::SaveState).Inputs(1).SrcVregs({0}); + INST(2, Opcode::AnyTypeCheck) + .any() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(1, 5) + .IntegerWasSeen(true); + INST(3, Opcode::CastAnyTypeValue) + .f64() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .Inputs(2) + .IntegerWasSeen(true); + INST(4, Opcode::Return).f64().Inputs(3); + } + } + + ASSERT_TRUE(graph->RunPass()); + ASSERT_TRUE(graph->RunPass()); + GraphChecker(graph).Check(); + + auto graph_opt = CreateGraphDynStubWithDefaultRuntime(); + GRAPH(graph_opt) + { + PARAMETER(0, 0).s32(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::SaveState).Inputs(1).SrcVregs({0}); + INST(2, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE).Inputs(1, 5); + INST(6, Opcode::Cast).f64().SrcType(DataType::INT32).Inputs(0); + INST(4, Opcode::Return).f64().Inputs(6); + } + } + + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + +TEST_F(PeepholesTest, CastBoolToAnyToInt) +{ + auto graph = CreateGraphDynStubWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).b(); + + BASIC_BLOCK(2, -1) + { + INST(1, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_BOOLEAN_TYPE).Inputs(0); + INST(2, Opcode::CastAnyTypeValue).s32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); + INST(3, Opcode::Return).s32().Inputs(2); + } + } + + ASSERT_TRUE(graph->RunPass()); + ASSERT_TRUE(graph->RunPass()); + GraphChecker(graph).Check(); + + auto graph_opt = CreateGraphDynStubWithDefaultRuntime(); + GRAPH(graph_opt) + { + PARAMETER(0, 0).b(); + + BASIC_BLOCK(2, -1) + { + INST(4, Opcode::Cast).s32().SrcType(DataType::BOOL).Inputs(0); + INST(3, Opcode::Return).s32().Inputs(4); + } + } + + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + TEST_F(PeepholesTest, CompareCastToAnyAndCastToAny) { auto graph = CreateGraphDynWithDefaultRuntime();