From 9ba545089deb26db0148b1622eddbf04908066f7 Mon Sep 17 00:00:00 2001 From: Aditya Nandakumar Date: Fri, 14 Jun 2019 17:19:37 +0000 Subject: [PATCH] [GISel]: Fix pattern matcher for m_OneUse https://reviews.llvm.org/D63302 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363424 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/CodeGen/GlobalISel/MIPatternMatch.h | 3 +-- .../CodeGen/GlobalISel/PatternMatchTest.cpp | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h b/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h index eff4838248c..abc1f66850d 100644 --- a/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h +++ b/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h @@ -30,8 +30,7 @@ template struct OneUse_match { 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); } }; diff --git a/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp index 1bb07a9fa1e..f7dda9607f8 100644 --- a/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ b/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -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 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) { -- 2.40.0