mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +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:
parent
652806af9c
commit
2d7fe6a565
@ -39,6 +39,20 @@ inline OneUse_match<SubPat> m_OneUse(const SubPat &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 {
|
||||
int64_t &CR;
|
||||
ConstantMatch(int64_t &C) : CR(C) {}
|
||||
|
@ -392,13 +392,24 @@ TEST_F(AArch64GISelMITest, MatchMiscellaneous) {
|
||||
|
||||
LLT s64 = LLT::scalar(64);
|
||||
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);
|
||||
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);
|
||||
bool match = mi_match(MIBAdd.getReg(0), *MRI, m_GAdd(m_Reg(), m_Reg()));
|
||||
EXPECT_TRUE(match);
|
||||
match = mi_match(MIBAdd.getReg(0), *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg())));
|
||||
EXPECT_FALSE(match);
|
||||
EXPECT_FALSE(mi_match(Reg, *MRI, m_OneUse(m_GAdd(m_Reg(), m_Reg()))));
|
||||
EXPECT_FALSE(mi_match(Reg, *MRI, m_OneNonDBGUse(m_GAdd(m_Reg(), m_Reg()))));
|
||||
}
|
||||
|
||||
TEST_F(AArch64GISelMITest, MatchSpecificConstant) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user