diff options
author | Petar Avramovic <Petar.Avramovic@amd.com> | 2021-04-27 11:37:42 +0200 |
---|---|---|
committer | Petar Avramovic <Petar.Avramovic@amd.com> | 2021-04-27 11:37:42 +0200 |
commit | 4c6eb3886c50ac11d23251625bd12e79cd56a1dd (patch) | |
tree | a4ebeca5fd0e030842307c7e7e84be2e2ea676d0 /llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | |
parent | 39662abf720fc195b549246f32719d313f05a67f (diff) | |
download | llvm-4c6eb3886c50ac11d23251625bd12e79cd56a1dd.zip llvm-4c6eb3886c50ac11d23251625bd12e79cd56a1dd.tar.gz llvm-4c6eb3886c50ac11d23251625bd12e79cd56a1dd.tar.bz2 |
[MIPatternMatch]: Add matchers for binary instructions
Add matchers that support commutative and non-commutative binary opcodes.
Differential Revision: https://reviews.llvm.org/D99736
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp')
-rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp index c978b9e..676c7ee 100644 --- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -194,6 +194,64 @@ TEST_F(AArch64GISelMITest, MatchBinaryOp) { EXPECT_TRUE(match); EXPECT_EQ(Src0, PtrAdd->getOperand(1).getReg()); EXPECT_EQ(Src1, Copies[0]); + + auto MIBCst = B.buildConstant(s64, 42); + auto MIBAddCst = B.buildAdd(s64, MIBCst, Copies[0]); + auto MIBUnmerge = B.buildUnmerge({s32, s32}, B.buildConstant(s64, 42)); + + // m_BinOp with opcode. + // Match binary instruction, opcode and its non-commutative operands. + match = mi_match(MIBAddCst, *MRI, + m_BinOp(TargetOpcode::G_ADD, m_ICst(Cst), m_Reg(Src0))); + EXPECT_TRUE(match); + EXPECT_EQ(Src0, Copies[0]); + EXPECT_EQ(Cst, 42); + + // Opcode doesn't match. + match = mi_match(MIBAddCst, *MRI, + m_BinOp(TargetOpcode::G_MUL, m_ICst(Cst), m_Reg(Src0))); + EXPECT_FALSE(match); + + match = mi_match(MIBAddCst, *MRI, + m_BinOp(TargetOpcode::G_ADD, m_Reg(Src0), m_ICst(Cst))); + EXPECT_FALSE(match); + + // Instruction is not binary. + match = mi_match(MIBCst, *MRI, + m_BinOp(TargetOpcode::G_MUL, m_Reg(Src0), m_Reg(Src1))); + EXPECT_FALSE(match); + match = mi_match(MIBUnmerge, *MRI, + m_BinOp(TargetOpcode::G_MUL, m_Reg(Src0), m_Reg(Src1))); + EXPECT_FALSE(match); + + // m_CommutativeBinOp with opcode. + match = mi_match( + MIBAddCst, *MRI, + m_CommutativeBinOp(TargetOpcode::G_ADD, m_ICst(Cst), m_Reg(Src0))); + EXPECT_TRUE(match); + EXPECT_EQ(Src0, Copies[0]); + EXPECT_EQ(Cst, 42); + + match = mi_match( + MIBAddCst, *MRI, + m_CommutativeBinOp(TargetOpcode::G_MUL, m_ICst(Cst), m_Reg(Src0))); + EXPECT_FALSE(match); + + match = mi_match( + MIBAddCst, *MRI, + m_CommutativeBinOp(TargetOpcode::G_ADD, m_Reg(Src0), m_ICst(Cst))); + EXPECT_TRUE(match); + EXPECT_EQ(Src0, Copies[0]); + EXPECT_EQ(Cst, 42); + + match = mi_match( + MIBCst, *MRI, + m_CommutativeBinOp(TargetOpcode::G_MUL, m_Reg(Src0), m_Reg(Src1))); + EXPECT_FALSE(match); + match = mi_match( + MIBUnmerge, *MRI, + m_CommutativeBinOp(TargetOpcode::G_MUL, m_Reg(Src0), m_Reg(Src1))); + EXPECT_FALSE(match); } TEST_F(AArch64GISelMITest, MatchICmp) { |