diff options
author | Hendrik Greving <hgreving@google.com> | 2020-06-05 11:34:34 -0700 |
---|---|---|
committer | Hendrik Greving <hgreving@google.com> | 2020-06-08 11:43:59 -0700 |
commit | f3d8a9397003b6645f19a4dd11cc1165ce75bd7d (patch) | |
tree | b767b5413449b30d9a103ede42e605ed7721700c /llvm/lib/CodeGen/ModuloSchedule.cpp | |
parent | d50366d29f25fb2297b7561092132ecf74a391e9 (diff) | |
download | llvm-f3d8a9397003b6645f19a4dd11cc1165ce75bd7d.zip llvm-f3d8a9397003b6645f19a4dd11cc1165ce75bd7d.tar.gz llvm-f3d8a9397003b6645f19a4dd11cc1165ce75bd7d.tar.bz2 |
[ModuloSchedule] Support instructions with > 1 destination when walking canonical use.
Fixes a minor bug that led to finding the wrong register if the definition had more
than one register destination.
Diffstat (limited to 'llvm/lib/CodeGen/ModuloSchedule.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ModuloSchedule.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/ModuloSchedule.cpp b/llvm/lib/CodeGen/ModuloSchedule.cpp index a4b994b..a8088dc 100644 --- a/llvm/lib/CodeGen/ModuloSchedule.cpp +++ b/llvm/lib/CodeGen/ModuloSchedule.cpp @@ -1710,16 +1710,17 @@ PeelingModuloScheduleExpander::getPhiCanonicalReg(MachineInstr *CanonicalPhi, 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() { |