106f32e7eSjoerg //===-- LiveRangeEdit.cpp - Basic tools for editing a register live range -===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // The LiveRangeEdit class represents changes done to a virtual register when it
1006f32e7eSjoerg // is spilled or split.
1106f32e7eSjoerg //===----------------------------------------------------------------------===//
1206f32e7eSjoerg 
1306f32e7eSjoerg #include "llvm/CodeGen/LiveRangeEdit.h"
1406f32e7eSjoerg #include "llvm/ADT/Statistic.h"
1506f32e7eSjoerg #include "llvm/CodeGen/CalcSpillWeights.h"
1606f32e7eSjoerg #include "llvm/CodeGen/LiveIntervals.h"
1706f32e7eSjoerg #include "llvm/CodeGen/MachineRegisterInfo.h"
1806f32e7eSjoerg #include "llvm/CodeGen/TargetInstrInfo.h"
1906f32e7eSjoerg #include "llvm/CodeGen/VirtRegMap.h"
2006f32e7eSjoerg #include "llvm/Support/Debug.h"
2106f32e7eSjoerg #include "llvm/Support/raw_ostream.h"
2206f32e7eSjoerg 
2306f32e7eSjoerg using namespace llvm;
2406f32e7eSjoerg 
2506f32e7eSjoerg #define DEBUG_TYPE "regalloc"
2606f32e7eSjoerg 
2706f32e7eSjoerg STATISTIC(NumDCEDeleted,     "Number of instructions deleted by DCE");
2806f32e7eSjoerg STATISTIC(NumDCEFoldedLoads, "Number of single use loads folded after DCE");
2906f32e7eSjoerg STATISTIC(NumFracRanges,     "Number of live ranges fractured by DCE");
3006f32e7eSjoerg 
anchor()3106f32e7eSjoerg void LiveRangeEdit::Delegate::anchor() { }
3206f32e7eSjoerg 
createEmptyIntervalFrom(Register OldReg,bool createSubRanges)33*da58b97aSjoerg LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(Register OldReg,
3406f32e7eSjoerg                                                      bool createSubRanges) {
3506f32e7eSjoerg   Register VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
3606f32e7eSjoerg   if (VRM)
3706f32e7eSjoerg     VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
3806f32e7eSjoerg 
3906f32e7eSjoerg   LiveInterval &LI = LIS.createEmptyInterval(VReg);
4006f32e7eSjoerg   if (Parent && !Parent->isSpillable())
4106f32e7eSjoerg     LI.markNotSpillable();
4206f32e7eSjoerg   if (createSubRanges) {
4306f32e7eSjoerg     // Create empty subranges if the OldReg's interval has them. Do not create
4406f32e7eSjoerg     // the main range here---it will be constructed later after the subranges
4506f32e7eSjoerg     // have been finalized.
4606f32e7eSjoerg     LiveInterval &OldLI = LIS.getInterval(OldReg);
4706f32e7eSjoerg     VNInfo::Allocator &Alloc = LIS.getVNInfoAllocator();
4806f32e7eSjoerg     for (LiveInterval::SubRange &S : OldLI.subranges())
4906f32e7eSjoerg       LI.createSubRange(Alloc, S.LaneMask);
5006f32e7eSjoerg   }
5106f32e7eSjoerg   return LI;
5206f32e7eSjoerg }
5306f32e7eSjoerg 
createFrom(Register OldReg)54*da58b97aSjoerg Register LiveRangeEdit::createFrom(Register OldReg) {
5506f32e7eSjoerg   Register VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
5606f32e7eSjoerg   if (VRM) {
5706f32e7eSjoerg     VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
5806f32e7eSjoerg   }
5906f32e7eSjoerg   // FIXME: Getting the interval here actually computes it.
6006f32e7eSjoerg   // In theory, this may not be what we want, but in practice
6106f32e7eSjoerg   // the createEmptyIntervalFrom API is used when this is not
6206f32e7eSjoerg   // the case. Generally speaking we just want to annotate the
6306f32e7eSjoerg   // LiveInterval when it gets created but we cannot do that at
6406f32e7eSjoerg   // the moment.
6506f32e7eSjoerg   if (Parent && !Parent->isSpillable())
6606f32e7eSjoerg     LIS.getInterval(VReg).markNotSpillable();
6706f32e7eSjoerg   return VReg;
6806f32e7eSjoerg }
6906f32e7eSjoerg 
checkRematerializable(VNInfo * VNI,const MachineInstr * DefMI,AAResults * aa)7006f32e7eSjoerg bool LiveRangeEdit::checkRematerializable(VNInfo *VNI,
7106f32e7eSjoerg                                           const MachineInstr *DefMI,
72*da58b97aSjoerg                                           AAResults *aa) {
7306f32e7eSjoerg   assert(DefMI && "Missing instruction");
7406f32e7eSjoerg   ScannedRemattable = true;
7506f32e7eSjoerg   if (!TII.isTriviallyReMaterializable(*DefMI, aa))
7606f32e7eSjoerg     return false;
7706f32e7eSjoerg   Remattable.insert(VNI);
7806f32e7eSjoerg   return true;
7906f32e7eSjoerg }
8006f32e7eSjoerg 
scanRemattable(AAResults * aa)81*da58b97aSjoerg void LiveRangeEdit::scanRemattable(AAResults *aa) {
8206f32e7eSjoerg   for (VNInfo *VNI : getParent().valnos) {
8306f32e7eSjoerg     if (VNI->isUnused())
8406f32e7eSjoerg       continue;
8506f32e7eSjoerg     unsigned Original = VRM->getOriginal(getReg());
8606f32e7eSjoerg     LiveInterval &OrigLI = LIS.getInterval(Original);
8706f32e7eSjoerg     VNInfo *OrigVNI = OrigLI.getVNInfoAt(VNI->def);
8806f32e7eSjoerg     if (!OrigVNI)
8906f32e7eSjoerg       continue;
9006f32e7eSjoerg     MachineInstr *DefMI = LIS.getInstructionFromIndex(OrigVNI->def);
9106f32e7eSjoerg     if (!DefMI)
9206f32e7eSjoerg       continue;
9306f32e7eSjoerg     checkRematerializable(OrigVNI, DefMI, aa);
9406f32e7eSjoerg   }
9506f32e7eSjoerg   ScannedRemattable = true;
9606f32e7eSjoerg }
9706f32e7eSjoerg 
anyRematerializable(AAResults * aa)98*da58b97aSjoerg bool LiveRangeEdit::anyRematerializable(AAResults *aa) {
9906f32e7eSjoerg   if (!ScannedRemattable)
10006f32e7eSjoerg     scanRemattable(aa);
10106f32e7eSjoerg   return !Remattable.empty();
10206f32e7eSjoerg }
10306f32e7eSjoerg 
10406f32e7eSjoerg /// allUsesAvailableAt - Return true if all registers used by OrigMI at
10506f32e7eSjoerg /// OrigIdx are also available with the same value at UseIdx.
allUsesAvailableAt(const MachineInstr * OrigMI,SlotIndex OrigIdx,SlotIndex UseIdx) const10606f32e7eSjoerg bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
10706f32e7eSjoerg                                        SlotIndex OrigIdx,
10806f32e7eSjoerg                                        SlotIndex UseIdx) const {
10906f32e7eSjoerg   OrigIdx = OrigIdx.getRegSlot(true);
11006f32e7eSjoerg   UseIdx = UseIdx.getRegSlot(true);
11106f32e7eSjoerg   for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
11206f32e7eSjoerg     const MachineOperand &MO = OrigMI->getOperand(i);
11306f32e7eSjoerg     if (!MO.isReg() || !MO.getReg() || !MO.readsReg())
11406f32e7eSjoerg       continue;
11506f32e7eSjoerg 
11606f32e7eSjoerg     // We can't remat physreg uses, unless it is a constant.
11706f32e7eSjoerg     if (Register::isPhysicalRegister(MO.getReg())) {
11806f32e7eSjoerg       if (MRI.isConstantPhysReg(MO.getReg()))
11906f32e7eSjoerg         continue;
12006f32e7eSjoerg       return false;
12106f32e7eSjoerg     }
12206f32e7eSjoerg 
12306f32e7eSjoerg     LiveInterval &li = LIS.getInterval(MO.getReg());
12406f32e7eSjoerg     const VNInfo *OVNI = li.getVNInfoAt(OrigIdx);
12506f32e7eSjoerg     if (!OVNI)
12606f32e7eSjoerg       continue;
12706f32e7eSjoerg 
12806f32e7eSjoerg     // Don't allow rematerialization immediately after the original def.
12906f32e7eSjoerg     // It would be incorrect if OrigMI redefines the register.
13006f32e7eSjoerg     // See PR14098.
13106f32e7eSjoerg     if (SlotIndex::isSameInstr(OrigIdx, UseIdx))
13206f32e7eSjoerg       return false;
13306f32e7eSjoerg 
13406f32e7eSjoerg     if (OVNI != li.getVNInfoAt(UseIdx))
13506f32e7eSjoerg       return false;
13606f32e7eSjoerg   }
13706f32e7eSjoerg   return true;
13806f32e7eSjoerg }
13906f32e7eSjoerg 
canRematerializeAt(Remat & RM,VNInfo * OrigVNI,SlotIndex UseIdx,bool cheapAsAMove)14006f32e7eSjoerg bool LiveRangeEdit::canRematerializeAt(Remat &RM, VNInfo *OrigVNI,
14106f32e7eSjoerg                                        SlotIndex UseIdx, bool cheapAsAMove) {
14206f32e7eSjoerg   assert(ScannedRemattable && "Call anyRematerializable first");
14306f32e7eSjoerg 
14406f32e7eSjoerg   // Use scanRemattable info.
14506f32e7eSjoerg   if (!Remattable.count(OrigVNI))
14606f32e7eSjoerg     return false;
14706f32e7eSjoerg 
14806f32e7eSjoerg   // No defining instruction provided.
14906f32e7eSjoerg   SlotIndex DefIdx;
15006f32e7eSjoerg   assert(RM.OrigMI && "No defining instruction for remattable value");
15106f32e7eSjoerg   DefIdx = LIS.getInstructionIndex(*RM.OrigMI);
15206f32e7eSjoerg 
15306f32e7eSjoerg   // If only cheap remats were requested, bail out early.
15406f32e7eSjoerg   if (cheapAsAMove && !TII.isAsCheapAsAMove(*RM.OrigMI))
15506f32e7eSjoerg     return false;
15606f32e7eSjoerg 
15706f32e7eSjoerg   // Verify that all used registers are available with the same values.
15806f32e7eSjoerg   if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx))
15906f32e7eSjoerg     return false;
16006f32e7eSjoerg 
16106f32e7eSjoerg   return true;
16206f32e7eSjoerg }
16306f32e7eSjoerg 
rematerializeAt(MachineBasicBlock & MBB,MachineBasicBlock::iterator MI,unsigned DestReg,const Remat & RM,const TargetRegisterInfo & tri,bool Late)16406f32e7eSjoerg SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
16506f32e7eSjoerg                                          MachineBasicBlock::iterator MI,
16606f32e7eSjoerg                                          unsigned DestReg,
16706f32e7eSjoerg                                          const Remat &RM,
16806f32e7eSjoerg                                          const TargetRegisterInfo &tri,
16906f32e7eSjoerg                                          bool Late) {
17006f32e7eSjoerg   assert(RM.OrigMI && "Invalid remat");
17106f32e7eSjoerg   TII.reMaterialize(MBB, MI, DestReg, 0, *RM.OrigMI, tri);
17206f32e7eSjoerg   // DestReg of the cloned instruction cannot be Dead. Set isDead of DestReg
17306f32e7eSjoerg   // to false anyway in case the isDead flag of RM.OrigMI's dest register
17406f32e7eSjoerg   // is true.
17506f32e7eSjoerg   (*--MI).getOperand(0).setIsDead(false);
17606f32e7eSjoerg   Rematted.insert(RM.ParentVNI);
17706f32e7eSjoerg   return LIS.getSlotIndexes()->insertMachineInstrInMaps(*MI, Late).getRegSlot();
17806f32e7eSjoerg }
17906f32e7eSjoerg 
eraseVirtReg(Register Reg)180*da58b97aSjoerg void LiveRangeEdit::eraseVirtReg(Register Reg) {
18106f32e7eSjoerg   if (TheDelegate && TheDelegate->LRE_CanEraseVirtReg(Reg))
18206f32e7eSjoerg     LIS.removeInterval(Reg);
18306f32e7eSjoerg }
18406f32e7eSjoerg 
foldAsLoad(LiveInterval * LI,SmallVectorImpl<MachineInstr * > & Dead)18506f32e7eSjoerg bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
18606f32e7eSjoerg                                SmallVectorImpl<MachineInstr*> &Dead) {
18706f32e7eSjoerg   MachineInstr *DefMI = nullptr, *UseMI = nullptr;
18806f32e7eSjoerg 
18906f32e7eSjoerg   // Check that there is a single def and a single use.
190*da58b97aSjoerg   for (MachineOperand &MO : MRI.reg_nodbg_operands(LI->reg())) {
19106f32e7eSjoerg     MachineInstr *MI = MO.getParent();
19206f32e7eSjoerg     if (MO.isDef()) {
19306f32e7eSjoerg       if (DefMI && DefMI != MI)
19406f32e7eSjoerg         return false;
19506f32e7eSjoerg       if (!MI->canFoldAsLoad())
19606f32e7eSjoerg         return false;
19706f32e7eSjoerg       DefMI = MI;
19806f32e7eSjoerg     } else if (!MO.isUndef()) {
19906f32e7eSjoerg       if (UseMI && UseMI != MI)
20006f32e7eSjoerg         return false;
20106f32e7eSjoerg       // FIXME: Targets don't know how to fold subreg uses.
20206f32e7eSjoerg       if (MO.getSubReg())
20306f32e7eSjoerg         return false;
20406f32e7eSjoerg       UseMI = MI;
20506f32e7eSjoerg     }
20606f32e7eSjoerg   }
20706f32e7eSjoerg   if (!DefMI || !UseMI)
20806f32e7eSjoerg     return false;
20906f32e7eSjoerg 
21006f32e7eSjoerg   // Since we're moving the DefMI load, make sure we're not extending any live
21106f32e7eSjoerg   // ranges.
21206f32e7eSjoerg   if (!allUsesAvailableAt(DefMI, LIS.getInstructionIndex(*DefMI),
21306f32e7eSjoerg                           LIS.getInstructionIndex(*UseMI)))
21406f32e7eSjoerg     return false;
21506f32e7eSjoerg 
21606f32e7eSjoerg   // We also need to make sure it is safe to move the load.
21706f32e7eSjoerg   // Assume there are stores between DefMI and UseMI.
21806f32e7eSjoerg   bool SawStore = true;
21906f32e7eSjoerg   if (!DefMI->isSafeToMove(nullptr, SawStore))
22006f32e7eSjoerg     return false;
22106f32e7eSjoerg 
22206f32e7eSjoerg   LLVM_DEBUG(dbgs() << "Try to fold single def: " << *DefMI
22306f32e7eSjoerg                     << "       into single use: " << *UseMI);
22406f32e7eSjoerg 
22506f32e7eSjoerg   SmallVector<unsigned, 8> Ops;
226*da58b97aSjoerg   if (UseMI->readsWritesVirtualRegister(LI->reg(), &Ops).second)
22706f32e7eSjoerg     return false;
22806f32e7eSjoerg 
22906f32e7eSjoerg   MachineInstr *FoldMI = TII.foldMemoryOperand(*UseMI, Ops, *DefMI, &LIS);
23006f32e7eSjoerg   if (!FoldMI)
23106f32e7eSjoerg     return false;
23206f32e7eSjoerg   LLVM_DEBUG(dbgs() << "                folded: " << *FoldMI);
23306f32e7eSjoerg   LIS.ReplaceMachineInstrInMaps(*UseMI, *FoldMI);
234*da58b97aSjoerg   // Update the call site info.
235*da58b97aSjoerg   if (UseMI->shouldUpdateCallSiteInfo())
23606f32e7eSjoerg     UseMI->getMF()->moveCallSiteInfo(UseMI, FoldMI);
23706f32e7eSjoerg   UseMI->eraseFromParent();
238*da58b97aSjoerg   DefMI->addRegisterDead(LI->reg(), nullptr);
23906f32e7eSjoerg   Dead.push_back(DefMI);
24006f32e7eSjoerg   ++NumDCEFoldedLoads;
24106f32e7eSjoerg   return true;
24206f32e7eSjoerg }
24306f32e7eSjoerg 
useIsKill(const LiveInterval & LI,const MachineOperand & MO) const24406f32e7eSjoerg bool LiveRangeEdit::useIsKill(const LiveInterval &LI,
24506f32e7eSjoerg                               const MachineOperand &MO) const {
24606f32e7eSjoerg   const MachineInstr &MI = *MO.getParent();
24706f32e7eSjoerg   SlotIndex Idx = LIS.getInstructionIndex(MI).getRegSlot();
24806f32e7eSjoerg   if (LI.Query(Idx).isKill())
24906f32e7eSjoerg     return true;
25006f32e7eSjoerg   const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
25106f32e7eSjoerg   unsigned SubReg = MO.getSubReg();
25206f32e7eSjoerg   LaneBitmask LaneMask = TRI.getSubRegIndexLaneMask(SubReg);
25306f32e7eSjoerg   for (const LiveInterval::SubRange &S : LI.subranges()) {
25406f32e7eSjoerg     if ((S.LaneMask & LaneMask).any() && S.Query(Idx).isKill())
25506f32e7eSjoerg       return true;
25606f32e7eSjoerg   }
25706f32e7eSjoerg   return false;
25806f32e7eSjoerg }
25906f32e7eSjoerg 
26006f32e7eSjoerg /// Find all live intervals that need to shrink, then remove the instruction.
eliminateDeadDef(MachineInstr * MI,ToShrinkSet & ToShrink,AAResults * AA)26106f32e7eSjoerg void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink,
262*da58b97aSjoerg                                      AAResults *AA) {
26306f32e7eSjoerg   assert(MI->allDefsAreDead() && "Def isn't really dead");
26406f32e7eSjoerg   SlotIndex Idx = LIS.getInstructionIndex(*MI).getRegSlot();
26506f32e7eSjoerg 
26606f32e7eSjoerg   // Never delete a bundled instruction.
26706f32e7eSjoerg   if (MI->isBundled()) {
26806f32e7eSjoerg     return;
26906f32e7eSjoerg   }
27006f32e7eSjoerg   // Never delete inline asm.
27106f32e7eSjoerg   if (MI->isInlineAsm()) {
27206f32e7eSjoerg     LLVM_DEBUG(dbgs() << "Won't delete: " << Idx << '\t' << *MI);
27306f32e7eSjoerg     return;
27406f32e7eSjoerg   }
27506f32e7eSjoerg 
27606f32e7eSjoerg   // Use the same criteria as DeadMachineInstructionElim.
27706f32e7eSjoerg   bool SawStore = false;
27806f32e7eSjoerg   if (!MI->isSafeToMove(nullptr, SawStore)) {
27906f32e7eSjoerg     LLVM_DEBUG(dbgs() << "Can't delete: " << Idx << '\t' << *MI);
28006f32e7eSjoerg     return;
28106f32e7eSjoerg   }
28206f32e7eSjoerg 
28306f32e7eSjoerg   LLVM_DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI);
28406f32e7eSjoerg 
28506f32e7eSjoerg   // Collect virtual registers to be erased after MI is gone.
28606f32e7eSjoerg   SmallVector<unsigned, 8> RegsToErase;
28706f32e7eSjoerg   bool ReadsPhysRegs = false;
28806f32e7eSjoerg   bool isOrigDef = false;
28906f32e7eSjoerg   unsigned Dest;
29006f32e7eSjoerg   // Only optimize rematerialize case when the instruction has one def, since
29106f32e7eSjoerg   // otherwise we could leave some dead defs in the code.  This case is
29206f32e7eSjoerg   // extremely rare.
29306f32e7eSjoerg   if (VRM && MI->getOperand(0).isReg() && MI->getOperand(0).isDef() &&
29406f32e7eSjoerg       MI->getDesc().getNumDefs() == 1) {
29506f32e7eSjoerg     Dest = MI->getOperand(0).getReg();
29606f32e7eSjoerg     unsigned Original = VRM->getOriginal(Dest);
29706f32e7eSjoerg     LiveInterval &OrigLI = LIS.getInterval(Original);
29806f32e7eSjoerg     VNInfo *OrigVNI = OrigLI.getVNInfoAt(Idx);
29906f32e7eSjoerg     // The original live-range may have been shrunk to
30006f32e7eSjoerg     // an empty live-range. It happens when it is dead, but
30106f32e7eSjoerg     // we still keep it around to be able to rematerialize
30206f32e7eSjoerg     // other values that depend on it.
30306f32e7eSjoerg     if (OrigVNI)
30406f32e7eSjoerg       isOrigDef = SlotIndex::isSameInstr(OrigVNI->def, Idx);
30506f32e7eSjoerg   }
30606f32e7eSjoerg 
30706f32e7eSjoerg   // Check for live intervals that may shrink
30806f32e7eSjoerg   for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
30906f32e7eSjoerg          MOE = MI->operands_end(); MOI != MOE; ++MOI) {
31006f32e7eSjoerg     if (!MOI->isReg())
31106f32e7eSjoerg       continue;
31206f32e7eSjoerg     Register Reg = MOI->getReg();
31306f32e7eSjoerg     if (!Register::isVirtualRegister(Reg)) {
31406f32e7eSjoerg       // Check if MI reads any unreserved physregs.
31506f32e7eSjoerg       if (Reg && MOI->readsReg() && !MRI.isReserved(Reg))
31606f32e7eSjoerg         ReadsPhysRegs = true;
31706f32e7eSjoerg       else if (MOI->isDef())
318*da58b97aSjoerg         LIS.removePhysRegDefAt(Reg.asMCReg(), Idx);
31906f32e7eSjoerg       continue;
32006f32e7eSjoerg     }
32106f32e7eSjoerg     LiveInterval &LI = LIS.getInterval(Reg);
32206f32e7eSjoerg 
32306f32e7eSjoerg     // Shrink read registers, unless it is likely to be expensive and
32406f32e7eSjoerg     // unlikely to change anything. We typically don't want to shrink the
32506f32e7eSjoerg     // PIC base register that has lots of uses everywhere.
32606f32e7eSjoerg     // Always shrink COPY uses that probably come from live range splitting.
32706f32e7eSjoerg     if ((MI->readsVirtualRegister(Reg) && (MI->isCopy() || MOI->isDef())) ||
32806f32e7eSjoerg         (MOI->readsReg() && (MRI.hasOneNonDBGUse(Reg) || useIsKill(LI, *MOI))))
32906f32e7eSjoerg       ToShrink.insert(&LI);
33006f32e7eSjoerg 
33106f32e7eSjoerg     // Remove defined value.
33206f32e7eSjoerg     if (MOI->isDef()) {
33306f32e7eSjoerg       if (TheDelegate && LI.getVNInfoAt(Idx) != nullptr)
334*da58b97aSjoerg         TheDelegate->LRE_WillShrinkVirtReg(LI.reg());
33506f32e7eSjoerg       LIS.removeVRegDefAt(LI, Idx);
33606f32e7eSjoerg       if (LI.empty())
33706f32e7eSjoerg         RegsToErase.push_back(Reg);
33806f32e7eSjoerg     }
33906f32e7eSjoerg   }
34006f32e7eSjoerg 
34106f32e7eSjoerg   // Currently, we don't support DCE of physreg live ranges. If MI reads
34206f32e7eSjoerg   // any unreserved physregs, don't erase the instruction, but turn it into
34306f32e7eSjoerg   // a KILL instead. This way, the physreg live ranges don't end up
34406f32e7eSjoerg   // dangling.
34506f32e7eSjoerg   // FIXME: It would be better to have something like shrinkToUses() for
34606f32e7eSjoerg   // physregs. That could potentially enable more DCE and it would free up
34706f32e7eSjoerg   // the physreg. It would not happen often, though.
34806f32e7eSjoerg   if (ReadsPhysRegs) {
34906f32e7eSjoerg     MI->setDesc(TII.get(TargetOpcode::KILL));
35006f32e7eSjoerg     // Remove all operands that aren't physregs.
35106f32e7eSjoerg     for (unsigned i = MI->getNumOperands(); i; --i) {
35206f32e7eSjoerg       const MachineOperand &MO = MI->getOperand(i-1);
35306f32e7eSjoerg       if (MO.isReg() && Register::isPhysicalRegister(MO.getReg()))
35406f32e7eSjoerg         continue;
35506f32e7eSjoerg       MI->RemoveOperand(i-1);
35606f32e7eSjoerg     }
35706f32e7eSjoerg     LLVM_DEBUG(dbgs() << "Converted physregs to:\t" << *MI);
35806f32e7eSjoerg   } else {
35906f32e7eSjoerg     // If the dest of MI is an original reg and MI is reMaterializable,
36006f32e7eSjoerg     // don't delete the inst. Replace the dest with a new reg, and keep
36106f32e7eSjoerg     // the inst for remat of other siblings. The inst is saved in
36206f32e7eSjoerg     // LiveRangeEdit::DeadRemats and will be deleted after all the
36306f32e7eSjoerg     // allocations of the func are done.
36406f32e7eSjoerg     if (isOrigDef && DeadRemats && TII.isTriviallyReMaterializable(*MI, AA)) {
36506f32e7eSjoerg       LiveInterval &NewLI = createEmptyIntervalFrom(Dest, false);
36606f32e7eSjoerg       VNInfo *VNI = NewLI.getNextValue(Idx, LIS.getVNInfoAllocator());
36706f32e7eSjoerg       NewLI.addSegment(LiveInterval::Segment(Idx, Idx.getDeadSlot(), VNI));
36806f32e7eSjoerg       pop_back();
36906f32e7eSjoerg       DeadRemats->insert(MI);
37006f32e7eSjoerg       const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
371*da58b97aSjoerg       MI->substituteRegister(Dest, NewLI.reg(), 0, TRI);
37206f32e7eSjoerg       MI->getOperand(0).setIsDead(true);
37306f32e7eSjoerg     } else {
37406f32e7eSjoerg       if (TheDelegate)
37506f32e7eSjoerg         TheDelegate->LRE_WillEraseInstruction(MI);
37606f32e7eSjoerg       LIS.RemoveMachineInstrFromMaps(*MI);
37706f32e7eSjoerg       MI->eraseFromParent();
37806f32e7eSjoerg       ++NumDCEDeleted;
37906f32e7eSjoerg     }
38006f32e7eSjoerg   }
38106f32e7eSjoerg 
38206f32e7eSjoerg   // Erase any virtregs that are now empty and unused. There may be <undef>
38306f32e7eSjoerg   // uses around. Keep the empty live range in that case.
38406f32e7eSjoerg   for (unsigned i = 0, e = RegsToErase.size(); i != e; ++i) {
385*da58b97aSjoerg     Register Reg = RegsToErase[i];
38606f32e7eSjoerg     if (LIS.hasInterval(Reg) && MRI.reg_nodbg_empty(Reg)) {
38706f32e7eSjoerg       ToShrink.remove(&LIS.getInterval(Reg));
38806f32e7eSjoerg       eraseVirtReg(Reg);
38906f32e7eSjoerg     }
39006f32e7eSjoerg   }
39106f32e7eSjoerg }
39206f32e7eSjoerg 
eliminateDeadDefs(SmallVectorImpl<MachineInstr * > & Dead,ArrayRef<Register> RegsBeingSpilled,AAResults * AA)39306f32e7eSjoerg void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
394*da58b97aSjoerg                                       ArrayRef<Register> RegsBeingSpilled,
395*da58b97aSjoerg                                       AAResults *AA) {
39606f32e7eSjoerg   ToShrinkSet ToShrink;
39706f32e7eSjoerg 
39806f32e7eSjoerg   for (;;) {
39906f32e7eSjoerg     // Erase all dead defs.
40006f32e7eSjoerg     while (!Dead.empty())
40106f32e7eSjoerg       eliminateDeadDef(Dead.pop_back_val(), ToShrink, AA);
40206f32e7eSjoerg 
40306f32e7eSjoerg     if (ToShrink.empty())
40406f32e7eSjoerg       break;
40506f32e7eSjoerg 
40606f32e7eSjoerg     // Shrink just one live interval. Then delete new dead defs.
40706f32e7eSjoerg     LiveInterval *LI = ToShrink.back();
40806f32e7eSjoerg     ToShrink.pop_back();
40906f32e7eSjoerg     if (foldAsLoad(LI, Dead))
41006f32e7eSjoerg       continue;
411*da58b97aSjoerg     unsigned VReg = LI->reg();
41206f32e7eSjoerg     if (TheDelegate)
41306f32e7eSjoerg       TheDelegate->LRE_WillShrinkVirtReg(VReg);
41406f32e7eSjoerg     if (!LIS.shrinkToUses(LI, &Dead))
41506f32e7eSjoerg       continue;
41606f32e7eSjoerg 
41706f32e7eSjoerg     // Don't create new intervals for a register being spilled.
41806f32e7eSjoerg     // The new intervals would have to be spilled anyway so its not worth it.
41906f32e7eSjoerg     // Also they currently aren't spilled so creating them and not spilling
42006f32e7eSjoerg     // them results in incorrect code.
42106f32e7eSjoerg     bool BeingSpilled = false;
42206f32e7eSjoerg     for (unsigned i = 0, e = RegsBeingSpilled.size(); i != e; ++i) {
42306f32e7eSjoerg       if (VReg == RegsBeingSpilled[i]) {
42406f32e7eSjoerg         BeingSpilled = true;
42506f32e7eSjoerg         break;
42606f32e7eSjoerg       }
42706f32e7eSjoerg     }
42806f32e7eSjoerg 
42906f32e7eSjoerg     if (BeingSpilled) continue;
43006f32e7eSjoerg 
43106f32e7eSjoerg     // LI may have been separated, create new intervals.
43206f32e7eSjoerg     LI->RenumberValues();
43306f32e7eSjoerg     SmallVector<LiveInterval*, 8> SplitLIs;
43406f32e7eSjoerg     LIS.splitSeparateComponents(*LI, SplitLIs);
43506f32e7eSjoerg     if (!SplitLIs.empty())
43606f32e7eSjoerg       ++NumFracRanges;
43706f32e7eSjoerg 
438*da58b97aSjoerg     Register Original = VRM ? VRM->getOriginal(VReg) : Register();
43906f32e7eSjoerg     for (const LiveInterval *SplitLI : SplitLIs) {
44006f32e7eSjoerg       // If LI is an original interval that hasn't been split yet, make the new
44106f32e7eSjoerg       // intervals their own originals instead of referring to LI. The original
44206f32e7eSjoerg       // interval must contain all the split products, and LI doesn't.
44306f32e7eSjoerg       if (Original != VReg && Original != 0)
444*da58b97aSjoerg         VRM->setIsSplitFromReg(SplitLI->reg(), Original);
44506f32e7eSjoerg       if (TheDelegate)
446*da58b97aSjoerg         TheDelegate->LRE_DidCloneVirtReg(SplitLI->reg(), VReg);
44706f32e7eSjoerg     }
44806f32e7eSjoerg   }
44906f32e7eSjoerg }
45006f32e7eSjoerg 
45106f32e7eSjoerg // Keep track of new virtual registers created via
45206f32e7eSjoerg // MachineRegisterInfo::createVirtualRegister.
45306f32e7eSjoerg void
MRI_NoteNewVirtualRegister(Register VReg)454*da58b97aSjoerg LiveRangeEdit::MRI_NoteNewVirtualRegister(Register VReg) {
45506f32e7eSjoerg   if (VRM)
45606f32e7eSjoerg     VRM->grow();
45706f32e7eSjoerg 
45806f32e7eSjoerg   NewRegs.push_back(VReg);
45906f32e7eSjoerg }
46006f32e7eSjoerg 
calculateRegClassAndHint(MachineFunction & MF,VirtRegAuxInfo & VRAI)461*da58b97aSjoerg void LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
462*da58b97aSjoerg                                              VirtRegAuxInfo &VRAI) {
46306f32e7eSjoerg   for (unsigned I = 0, Size = size(); I < Size; ++I) {
46406f32e7eSjoerg     LiveInterval &LI = LIS.getInterval(get(I));
465*da58b97aSjoerg     if (MRI.recomputeRegClass(LI.reg()))
46606f32e7eSjoerg       LLVM_DEBUG({
46706f32e7eSjoerg         const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
468*da58b97aSjoerg         dbgs() << "Inflated " << printReg(LI.reg()) << " to "
469*da58b97aSjoerg                << TRI->getRegClassName(MRI.getRegClass(LI.reg())) << '\n';
47006f32e7eSjoerg       });
47106f32e7eSjoerg     VRAI.calculateSpillWeightAndHint(LI);
47206f32e7eSjoerg   }
47306f32e7eSjoerg }
474