aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
diff options
context:
space:
mode:
authorPetar Avramovic <Petar.Avramovic@amd.com>2021-04-27 11:37:42 +0200
committerPetar Avramovic <Petar.Avramovic@amd.com>2021-04-27 11:37:42 +0200
commit4c6eb3886c50ac11d23251625bd12e79cd56a1dd (patch)
treea4ebeca5fd0e030842307c7e7e84be2e2ea676d0 /llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
parent39662abf720fc195b549246f32719d313f05a67f (diff)
downloadllvm-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.cpp58
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) {