diff options
author | Jessica Paquette <jpaquette@apple.com> | 2020-11-13 11:28:55 -0800 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2020-11-13 13:54:08 -0800 |
commit | d6a88e7e194dab3b71d7cb560b73835df69d1737 (patch) | |
tree | 98db83f90f40023a49d72d701628ae35ff9ff64f /llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | |
parent | 6e098189db7da11bc9c32dd483cd81765804c241 (diff) | |
download | llvm-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.cpp | 44 |
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) { |