1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[GISel]: Fix pattern matcher for m_OneUse

https://reviews.llvm.org/D63302

llvm-svn: 363424
This commit is contained in:
Aditya Nandakumar 2019-06-14 17:19:37 +00:00
parent 260a68cd92
commit ef9c0ca2f7
2 changed files with 26 additions and 2 deletions

View File

@ -30,8 +30,7 @@ template <typename SubPatternT> struct OneUse_match {
SubPatternT SubPat;
OneUse_match(const SubPatternT &SP) : SubPat(SP) {}
template <typename OpTy>
bool match(const MachineRegisterInfo &MRI, unsigned Reg) {
bool match(MachineRegisterInfo &MRI, unsigned Reg) {
return MRI.hasOneUse(Reg) && SubPat.match(MRI, Reg);
}
};

View File

@ -484,6 +484,31 @@ TEST(PatternMatchInstr, MatchCombinators) {
m_any_of(m_SpecificType(LLT::scalar(16)), m_GSub(m_Reg(), m_Reg())));
EXPECT_FALSE(match);
}
TEST(PatternMatchInstr, MatchMiscellaneous) {
LLVMContext Context;
std::unique_ptr<LLVMTargetMachine> TM = createTargetMachine();
if (!TM)
return;
auto ModuleMMIPair = createDummyModule(Context, *TM, "");
MachineFunction *MF =
getMFFromMMI(ModuleMMIPair.first.get(), ModuleMMIPair.second.get());
SmallVector<unsigned, 4> Copies;
collectCopies(Copies, MF);
MachineBasicBlock *EntryMBB = &*MF->begin();
MachineIRBuilder B(*MF);
MachineRegisterInfo &MRI = MF->getRegInfo();
B.setInsertPt(*EntryMBB, EntryMBB->end());
LLT s64 = LLT::scalar(64);
auto MIBAdd = B.buildAdd(s64, Copies[0], Copies[1]);
// Make multiple uses of this add.
B.buildCast(LLT::pointer(0, 32), MIBAdd);
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);
}
} // namespace
int main(int argc, char **argv) {