diff options
author | Min-Yih Hsu <min.hsu@sifive.com> | 2024-12-26 09:28:17 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-26 09:28:17 -0800 |
commit | 831e1ac12e766ae8c94d8d735d8f32c8d319e576 (patch) | |
tree | d74f42ce9d3992d72c9958b2d484eb010e629fe7 /llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | |
parent | d21f300f06d56a46e96d1e594522ab0ac362f074 (diff) | |
download | llvm-831e1ac12e766ae8c94d8d735d8f32c8d319e576.zip llvm-831e1ac12e766ae8c94d8d735d8f32c8d319e576.tar.gz llvm-831e1ac12e766ae8c94d8d735d8f32c8d319e576.tar.bz2 |
[MIPatternMatch] Add m_GUMin and m_GUMax (#121068)
And make all unsigned and signed versions of min/max matchers
commutative, since we already made a precedent of m_GAdd that is
commutative by default.
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp')
-rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp index bcaa321..fc76d40 100644 --- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -224,6 +224,32 @@ TEST_F(AArch64GISelMITest, MatchBinaryOp) { auto MIBAddCst = B.buildAdd(s64, MIBCst, Copies[0]); auto MIBUnmerge = B.buildUnmerge({s32, s32}, B.buildConstant(s64, 42)); + // Match min/max, and make sure they're commutative. + auto SMin = B.buildSMin(s64, Copies[2], MIBAdd); + EXPECT_TRUE(mi_match(SMin.getReg(0), *MRI, + m_GSMin(m_GAdd(m_Reg(Src1), m_Reg(Src2)), m_Reg(Src0)))); + EXPECT_EQ(Src0, Copies[2]); + EXPECT_EQ(Src1, Copies[0]); + EXPECT_EQ(Src2, Copies[1]); + auto SMax = B.buildSMax(s64, Copies[2], MIBAdd); + EXPECT_TRUE(mi_match(SMax.getReg(0), *MRI, + m_GSMax(m_GAdd(m_Reg(Src1), m_Reg(Src2)), m_Reg(Src0)))); + EXPECT_EQ(Src0, Copies[2]); + EXPECT_EQ(Src1, Copies[0]); + EXPECT_EQ(Src2, Copies[1]); + auto UMin = B.buildUMin(s64, Copies[2], MIBAdd); + EXPECT_TRUE(mi_match(UMin.getReg(0), *MRI, + m_GUMin(m_GAdd(m_Reg(Src1), m_Reg(Src2)), m_Reg(Src0)))); + EXPECT_EQ(Src0, Copies[2]); + EXPECT_EQ(Src1, Copies[0]); + EXPECT_EQ(Src2, Copies[1]); + auto UMax = B.buildUMax(s64, Copies[2], MIBAdd); + EXPECT_TRUE(mi_match(UMax.getReg(0), *MRI, + m_GUMax(m_GAdd(m_Reg(Src1), m_Reg(Src2)), m_Reg(Src0)))); + EXPECT_EQ(Src0, Copies[2]); + EXPECT_EQ(Src1, Copies[0]); + EXPECT_EQ(Src2, Copies[1]); + // m_BinOp with opcode. // Match binary instruction, opcode and its non-commutative operands. match = mi_match(MIBAddCst, *MRI, |