aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
diff options
context:
space:
mode:
authorJessica Paquette <jpaquette@apple.com>2020-11-13 11:28:55 -0800
committerJessica Paquette <jpaquette@apple.com>2020-11-13 13:54:08 -0800
commitd6a88e7e194dab3b71d7cb560b73835df69d1737 (patch)
tree98db83f90f40023a49d72d701628ae35ff9ff64f /llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
parent6e098189db7da11bc9c32dd483cd81765804c241 (diff)
downloadllvm-d6a88e7e194dab3b71d7cb560b73835df69d1737.zip
llvm-d6a88e7e194dab3b71d7cb560b73835df69d1737.tar.gz
llvm-d6a88e7e194dab3b71d7cb560b73835df69d1737.tar.bz2
[GlobalISel] Add convenience matchers for nots and all-ones constants
Add a convenience matcher which handles ``` G_XOR %not_reg, -1 ``` And a convenience matcher which returns true if an integer constant is all-ones. Differential Revision: https://reviews.llvm.org/D91459
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp')
-rw-r--r--llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
index c6a7f8e..f95b19f 100644
--- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
@@ -426,6 +426,17 @@ TEST_F(AArch64GISelMITest, MatchZeroInt) {
EXPECT_FALSE(mi_match(FortyTwo.getReg(0), *MRI, m_ZeroInt()));
}
+TEST_F(AArch64GISelMITest, MatchAllOnesInt) {
+ setUp();
+ if (!TM)
+ return;
+ auto AllOnes = B.buildConstant(LLT::scalar(64), -1);
+ EXPECT_TRUE(mi_match(AllOnes.getReg(0), *MRI, m_AllOnesInt()));
+
+ auto FortyTwo = B.buildConstant(LLT::scalar(64), 42);
+ EXPECT_FALSE(mi_match(FortyTwo.getReg(0), *MRI, m_AllOnesInt()));
+}
+
TEST_F(AArch64GISelMITest, MatchNeg) {
setUp();
if (!TM)
@@ -457,6 +468,39 @@ TEST_F(AArch64GISelMITest, MatchNeg) {
EXPECT_TRUE(mi_match(AddInst.getReg(2), *MRI, m_Neg(m_Reg(NegatedReg))));
EXPECT_EQ(NegatedReg, Copies[0]);
}
+
+TEST_F(AArch64GISelMITest, MatchNot) {
+ setUp();
+ if (!TM)
+ return;
+
+ LLT s64 = LLT::scalar(64);
+ auto AllOnes = B.buildConstant(LLT::scalar(64), -1);
+ auto NotInst1 = B.buildXor(s64, Copies[0], AllOnes);
+ Register NotReg;
+
+ // Match: G_XOR %NotReg, -1
+ EXPECT_TRUE(mi_match(NotInst1.getReg(0), *MRI, m_Not(m_Reg(NotReg))));
+ EXPECT_EQ(NotReg, Copies[0]);
+
+ // Match: G_XOR -1, %NotReg
+ auto NotInst2 = B.buildXor(s64, AllOnes, Copies[1]);
+ EXPECT_TRUE(mi_match(NotInst2.getReg(0), *MRI, m_Not(m_Reg(NotReg))));
+ EXPECT_EQ(NotReg, Copies[1]);
+
+ // Don't match: G_XOR %NotReg, 42
+ auto FortyTwo = B.buildConstant(LLT::scalar(64), 42);
+ auto WrongCst = B.buildXor(s64, Copies[0], FortyTwo);
+ EXPECT_FALSE(mi_match(WrongCst.getReg(0), *MRI, m_Not(m_Reg(NotReg))));
+
+ // Complex testcase.
+ // %xor = G_XOR %NotReg, -1
+ // %add = G_ADD %x, %xor
+ auto AddInst = B.buildAdd(s64, Copies[1], NotInst1);
+ NotReg = Register();
+ EXPECT_TRUE(mi_match(AddInst.getReg(2), *MRI, m_Not(m_Reg(NotReg))));
+ EXPECT_EQ(NotReg, Copies[0]);
+}
} // namespace
int main(int argc, char **argv) {