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:
parent
652806af9c
commit
2d7fe6a565
@ -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) {}
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user