From 6c1c6e35b65791a79731ec3ef361b8dc7c664218 Mon Sep 17 00:00:00 2001 From: Andrey Efremov Date: Fri, 21 Apr 2023 19:53:30 +0300 Subject: [PATCH] Remove overflow checks which are inputs of bitwise operations Signed-off-by: Andrey Efremov --- tests/compiler/peepholes_ecma_test.cpp | 98 ++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/tests/compiler/peepholes_ecma_test.cpp b/tests/compiler/peepholes_ecma_test.cpp index c5f7ef780..5a28f92cb 100644 --- a/tests/compiler/peepholes_ecma_test.cpp +++ b/tests/compiler/peepholes_ecma_test.cpp @@ -518,6 +518,57 @@ TEST_F(PeepholesTest, CompareAnyTypeAfterCastValueToAny) EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); } +TEST_F(PeepholesTest, AddOverflowCheckXor) +{ + auto graph = CreateGraphDynWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).any(); + PARAMETER(1, 1).any(); + CONSTANT(2, 1); + + BASIC_BLOCK(2, -1) + { + INST(3, Opcode::SaveState).Inputs(0, 1, 2).SrcVregs({0, 1, 2}); + INST(4, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); + INST(6, Opcode::AddOverflowCheck).i32().Inputs(4, 5, 3); + INST(7, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(6); + INST(8, Opcode::SaveState).Inputs(0, 1, 2, 6).SrcVregs({0, 1, 2, 3}); + INST(9, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(7, 8); + INST(10, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(9); + INST(11, Opcode::Xor).i32().Inputs(10, 2); + INST(12, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(11); + INST(13, Opcode::Return).any().Inputs(12); + } + } + 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(); + CONSTANT(2, 1); + + BASIC_BLOCK(2, -1) + { + INST(4, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); + INST(6, Opcode::Add).i32().Inputs(4, 5); + INST(7, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(6); + INST(8, Opcode::SaveState).Inputs(0, 1, 2, 6).SrcVregs({0, 1, 2, 3}); + INST(9, Opcode::AnyTypeCheck).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(7, 8); + INST(11, Opcode::Xor).i32().Inputs(6, 2); + INST(12, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(11); + INST(13, Opcode::Return).any().Inputs(12); + } + } + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + TEST_F(PeepholesTest, CompareAnyTypeAfterAnyTypeCheck) { auto graph = CreateGraphDynStubWithDefaultRuntime(); @@ -656,6 +707,53 @@ TEST_F(PeepholesTest, CompareAnyTypeAfterAnyTypeCheckSpecial) INST(15, Opcode::Return).any().Inputs(14); } } + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); +} + +TEST_F(PeepholesTest, SubOverflowCheckDynCast) +{ + auto graph = CreateGraphDynWithDefaultRuntime(); + GRAPH(graph) + { + PARAMETER(0, 0).any(); + PARAMETER(1, 1).any(); + + BASIC_BLOCK(2, -1) + { + INST(3, Opcode::SaveState).Inputs(0, 1).SrcVregs({0, 1}); + INST(4, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); + INST(6, Opcode::AddOverflowCheck).i32().Inputs(4, 5, 3); + INST(7, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(6); + INST(8, Opcode::CastAnyTypeValue) + .f64() + .AnyType(AnyBaseType::ECMASCRIPT_DOUBLE_TYPE) + .AllowedInputType(profiling::AnyInputType::INTEGER) + .Inputs(7); + INST(9, Opcode::Cast).i32().Inputs(8); + INST(10, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_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(4, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(0); + INST(5, Opcode::CastAnyTypeValue).i32().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(1); + INST(6, Opcode::Add).i32().Inputs(4, 5); + INST(10, Opcode::CastValueToAnyType).any().AnyType(AnyBaseType::ECMASCRIPT_INT_TYPE).Inputs(6); + INST(11, Opcode::Return).any().Inputs(10); + } + } + EXPECT_TRUE(GraphComparator().Compare(graph, graph_opt)); } // NOLINTEND(readability-magic-numbers) -- Gitee