diff options
author | Jay Foad <jay.foad@amd.com> | 2021-09-28 17:27:28 +0100 |
---|---|---|
committer | Jay Foad <jay.foad@amd.com> | 2021-11-11 12:24:59 +0000 |
commit | 491beae71d69960a3bb0298b17d4ef1f3119b767 (patch) | |
tree | ea17acc2bcd0d3a2dedbeb2e7787af564bad42c9 /llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | |
parent | 6abbc3a420c6d928541e8d5c35d8a8d55b52e3eb (diff) | |
download | llvm-491beae71d69960a3bb0298b17d4ef1f3119b767.zip llvm-491beae71d69960a3bb0298b17d4ef1f3119b767.tar.gz llvm-491beae71d69960a3bb0298b17d4ef1f3119b767.tar.bz2 |
[TwoAddressInstruction] Update LiveIntervals after rewriting INSERT_SUBREG to COPY
Also add subranges to an existing live interval when introducing a new
subreg def.
Differential Revision: https://reviews.llvm.org/D113044
Diffstat (limited to 'llvm/lib/CodeGen/TwoAddressInstructionPass.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 9c9636c..6673de5 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -1757,6 +1757,34 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &Func) { mi->RemoveOperand(1); mi->setDesc(TII->get(TargetOpcode::COPY)); LLVM_DEBUG(dbgs() << "\t\tconvert to:\t" << *mi); + + // Update LiveIntervals. + if (LIS) { + Register Reg = mi->getOperand(0).getReg(); + LiveInterval &LI = LIS->getInterval(Reg); + if (LI.hasSubRanges()) { + // The COPY no longer defines subregs of %reg except for + // %reg.subidx. + LaneBitmask LaneMask = + TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg()); + SlotIndex Idx = LIS->getInstructionIndex(*mi); + for (auto &S : LI.subranges()) { + if ((S.LaneMask & LaneMask).none()) { + LiveRange::iterator UseSeg = S.FindSegmentContaining(Idx); + LiveRange::iterator DefSeg = std::next(UseSeg); + S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno); + } + } + + // The COPY no longer has a use of %reg. + LIS->shrinkToUses(&LI); + } else { + // The live interval for Reg did not have subranges but now it needs + // them because we have introduced a subreg def. Recompute it. + LIS->removeInterval(Reg); + LIS->createAndComputeVirtRegInterval(Reg); + } + } } // Clear TiedOperands here instead of at the top of the loop |