1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[MIPatternMatch] Add m_OneNonDBGUse

Add a matcher that checks if the given subpattern has only one non-debug use.

Also improve existing m_OneUse testcase.

Differential Revision: https://reviews.llvm.org/D94705
This commit is contained in:
Jessica Paquette 2021-01-14 11:09:46 -08:00
parent 652806af9c
commit 2d7fe6a565
2 changed files with 30 additions and 5 deletions

View File

@ -39,6 +39,20 @@ inline OneUse_match<SubPat> m_OneUse(const SubPat &SP) {
return SP; return SP;
} }
template <typename SubPatternT> struct OneNonDBGUse_match {
SubPatternT SubPat;
OneNonDBGUse_match(const SubPatternT &SP) : SubPat(SP) {}
bool match(const MachineRegisterInfo &MRI, Register Reg) {
return MRI.hasOneNonDBGUse(Reg) && SubPat.match(MRI, Reg);
}
};
template <typename SubPat>
inline OneNonDBGUse_match<SubPat> m_OneNonDBGUse(const SubPat &SP) {
return SP;
}
struct ConstantMatch { struct ConstantMatch {
int64_t &CR; int64_t &CR;
ConstantMatch(int64_t &C) : CR(C) {} ConstantMatch(int64_t &C) : CR(C) {}

View File

@ -392,13 +392,24 @@ TEST_F(AArch64GISelMITest, MatchMiscellaneous) {
LLT s64 = LLT::scalar(64); LLT s64 = LLT::scalar(64);
auto MIBAdd = B.buildAdd(s64, Copies[0], Copies[1]); auto MIBAdd = B.buildAdd(s64, Copies[0], Copies[1]);
// Make multiple uses of this add. Register Reg = MIBAdd.getReg(0);
// Only one use of Reg.
B.buildCast(LLT::pointer(0, 32), MIBAdd); B.buildCast(LLT::pointer(0, 32), MIBAdd);
EXPECT_TRUE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
EXPECT_TRUE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
// Add multiple debug uses of Reg.
B.buildInstr(TargetOpcode::DBG_VALUE, {}, {Reg})->getOperand(0).setIsDebug();
B.buildInstr(TargetOpcode::DBG_VALUE, {}, {Reg})->getOperand(0).setIsDebug();
EXPECT_FALSE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
EXPECT_TRUE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
// Multiple non-debug uses of Reg.
B.buildCast(LLT::pointer(1, 32), MIBAdd); B.buildCast(LLT::pointer(1, 32), MIBAdd);
bool match = mi_match(MIBAdd.getReg(0), *MRI, m_GAdd(m_Reg(), m_Reg())); EXPECT_FALSE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
EXPECT_TRUE(match); EXPECT_FALSE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
match = mi_match(MIBAdd.getReg(0), *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg())));
EXPECT_FALSE(match);
} }
TEST_F(AArch64GISelMITest, MatchSpecificConstant) { TEST_F(AArch64GISelMITest, MatchSpecificConstant) {