Skip to content

Commit

Permalink
[MIPatternMatch] Add m_GUMin and m_GUMax (#121068)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mshockwave authored Dec 26, 2024
1 parent d21f300 commit 831e1ac
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 4 deletions.
20 changes: 16 additions & 4 deletions llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -538,15 +538,27 @@ m_GAShr(const LHS &L, const RHS &R) {
}

template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_SMAX, false>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_SMAX, true>
m_GSMax(const LHS &L, const RHS &R) {
return BinaryOp_match<LHS, RHS, TargetOpcode::G_SMAX, false>(L, R);
return BinaryOp_match<LHS, RHS, TargetOpcode::G_SMAX, true>(L, R);
}

template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_SMIN, false>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_SMIN, true>
m_GSMin(const LHS &L, const RHS &R) {
return BinaryOp_match<LHS, RHS, TargetOpcode::G_SMIN, false>(L, R);
return BinaryOp_match<LHS, RHS, TargetOpcode::G_SMIN, true>(L, R);
}

template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_UMAX, true>
m_GUMax(const LHS &L, const RHS &R) {
return BinaryOp_match<LHS, RHS, TargetOpcode::G_UMAX, true>(L, R);
}

template <typename LHS, typename RHS>
inline BinaryOp_match<LHS, RHS, TargetOpcode::G_UMIN, true>
m_GUMin(const LHS &L, const RHS &R) {
return BinaryOp_match<LHS, RHS, TargetOpcode::G_UMIN, true>(L, R);
}

// Helper for unary instructions (G_[ZSA]EXT/G_TRUNC) etc
Expand Down
26 changes: 26 additions & 0 deletions llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 831e1ac

Please sign in to comment.