Index: include/llvm/CodeGen/GlobalISel/MIPatternMatch.h =================================================================== --- include/llvm/CodeGen/GlobalISel/MIPatternMatch.h +++ include/llvm/CodeGen/GlobalISel/MIPatternMatch.h @@ -30,8 +30,7 @@ SubPatternT SubPat; OneUse_match(const SubPatternT &SP) : SubPat(SP) {} - template - bool match(const MachineRegisterInfo &MRI, unsigned Reg) { + bool match(MachineRegisterInfo &MRI, unsigned Reg) { return MRI.hasOneUse(Reg) && SubPat.match(MRI, Reg); } }; Index: unittests/CodeGen/GlobalISel/PatternMatchTest.cpp =================================================================== --- unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -484,6 +484,31 @@ 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 TM = createTargetMachine(); + if (!TM) + return; + auto ModuleMMIPair = createDummyModule(Context, *TM, ""); + MachineFunction *MF = + getMFFromMMI(ModuleMMIPair.first.get(), ModuleMMIPair.second.get()); + SmallVector 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) {