]> granicus.if.org Git - llvm/commitdiff
[GISel]: Fix pattern matcher for m_OneUse
authorAditya Nandakumar <aditya_nandakumar@apple.com>
Fri, 14 Jun 2019 17:19:37 +0000 (17:19 +0000)
committerAditya Nandakumar <aditya_nandakumar@apple.com>
Fri, 14 Jun 2019 17:19:37 +0000 (17:19 +0000)
https://reviews.llvm.org/D63302

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363424 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
unittests/CodeGen/GlobalISel/PatternMatchTest.cpp

index eff4838248c097979f1652774e42e3bfd236d21b..abc1f66850d43fc102553d39e50df5bb46ffaf70 100644 (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);
   }
 };
index 1bb07a9fa1e6b383d4bfa6e48c903b18b010300a..f7dda9607f881565bec447b167ea9b7ee4e891e1 100644 (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) {