[PATCH] D81291: [ModuloSchedule] Support instructions with > 1 destination when walking canonical use.

Hendrik Greving via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 5 11:47:16 PDT 2020


hgreving created this revision.
hgreving added reviewers: ThomasRaoux, kariddi.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

Fixes a minor bug that led to finding the wrong register if the definition had more
than one register destination.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D81291

Files:
  llvm/lib/CodeGen/ModuloSchedule.cpp


Index: llvm/lib/CodeGen/ModuloSchedule.cpp
===================================================================
--- llvm/lib/CodeGen/ModuloSchedule.cpp
+++ llvm/lib/CodeGen/ModuloSchedule.cpp
@@ -1710,16 +1710,17 @@
                                                   MachineInstr *Phi) {
   unsigned distance = PhiNodeLoopIteration[Phi];
   MachineInstr *CanonicalUse = CanonicalPhi;
+  Register CanonicalUseReg = CanonicalUse->getOperand(0).getReg();
   for (unsigned I = 0; I < distance; ++I) {
     assert(CanonicalUse->isPHI());
     assert(CanonicalUse->getNumOperands() == 5);
     unsigned LoopRegIdx = 3, InitRegIdx = 1;
     if (CanonicalUse->getOperand(2).getMBB() == CanonicalUse->getParent())
       std::swap(LoopRegIdx, InitRegIdx);
-    CanonicalUse =
-        MRI.getVRegDef(CanonicalUse->getOperand(LoopRegIdx).getReg());
+    CanonicalUseReg = CanonicalUse->getOperand(LoopRegIdx).getReg();
+    CanonicalUse = MRI.getVRegDef(CanonicalUseReg);
   }
-  return CanonicalUse->getOperand(0).getReg();
+  return CanonicalUseReg;
 }
 
 void PeelingModuloScheduleExpander::peelPrologAndEpilogs() {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81291.268897.patch
Type: text/x-patch
Size: 1108 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200605/ae18480f/attachment.bin>


More information about the llvm-commits mailing list