1 //===-- LiveRangeEdit.cpp - Basic tools for editing a register live range -===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // The LiveRangeEdit class represents changes done to a virtual register when it
10 // is spilled or split.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/CodeGen/LiveRangeEdit.h"
14 #include "llvm/ADT/Statistic.h"
15 #include "llvm/CodeGen/CalcSpillWeights.h"
16 #include "llvm/CodeGen/LiveIntervals.h"
17 #include "llvm/CodeGen/MachineRegisterInfo.h"
18 #include "llvm/CodeGen/TargetInstrInfo.h"
19 #include "llvm/CodeGen/VirtRegMap.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/raw_ostream.h"
25 #define DEBUG_TYPE "regalloc"
27 STATISTIC(NumDCEDeleted
, "Number of instructions deleted by DCE");
28 STATISTIC(NumDCEFoldedLoads
, "Number of single use loads folded after DCE");
29 STATISTIC(NumFracRanges
, "Number of live ranges fractured by DCE");
31 void LiveRangeEdit::Delegate::anchor() { }
33 LiveInterval
&LiveRangeEdit::createEmptyIntervalFrom(unsigned OldReg
,
34 bool createSubRanges
) {
35 unsigned VReg
= MRI
.createVirtualRegister(MRI
.getRegClass(OldReg
));
37 VRM
->setIsSplitFromReg(VReg
, VRM
->getOriginal(OldReg
));
39 LiveInterval
&LI
= LIS
.createEmptyInterval(VReg
);
40 if (Parent
&& !Parent
->isSpillable())
41 LI
.markNotSpillable();
42 if (createSubRanges
) {
43 // Create empty subranges if the OldReg's interval has them. Do not create
44 // the main range here---it will be constructed later after the subranges
45 // have been finalized.
46 LiveInterval
&OldLI
= LIS
.getInterval(OldReg
);
47 VNInfo::Allocator
&Alloc
= LIS
.getVNInfoAllocator();
48 for (LiveInterval::SubRange
&S
: OldLI
.subranges())
49 LI
.createSubRange(Alloc
, S
.LaneMask
);
54 unsigned LiveRangeEdit::createFrom(unsigned OldReg
) {
55 unsigned VReg
= MRI
.createVirtualRegister(MRI
.getRegClass(OldReg
));
57 VRM
->setIsSplitFromReg(VReg
, VRM
->getOriginal(OldReg
));
59 // FIXME: Getting the interval here actually computes it.
60 // In theory, this may not be what we want, but in practice
61 // the createEmptyIntervalFrom API is used when this is not
62 // the case. Generally speaking we just want to annotate the
63 // LiveInterval when it gets created but we cannot do that at
65 if (Parent
&& !Parent
->isSpillable())
66 LIS
.getInterval(VReg
).markNotSpillable();
70 bool LiveRangeEdit::checkRematerializable(VNInfo
*VNI
,
71 const MachineInstr
*DefMI
,
73 assert(DefMI
&& "Missing instruction");
74 ScannedRemattable
= true;
75 if (!TII
.isTriviallyReMaterializable(*DefMI
, aa
))
77 Remattable
.insert(VNI
);
81 void LiveRangeEdit::scanRemattable(AliasAnalysis
*aa
) {
82 for (VNInfo
*VNI
: getParent().valnos
) {
85 unsigned Original
= VRM
->getOriginal(getReg());
86 LiveInterval
&OrigLI
= LIS
.getInterval(Original
);
87 VNInfo
*OrigVNI
= OrigLI
.getVNInfoAt(VNI
->def
);
90 MachineInstr
*DefMI
= LIS
.getInstructionFromIndex(OrigVNI
->def
);
93 checkRematerializable(OrigVNI
, DefMI
, aa
);
95 ScannedRemattable
= true;
98 bool LiveRangeEdit::anyRematerializable(AliasAnalysis
*aa
) {
99 if (!ScannedRemattable
)
101 return !Remattable
.empty();
104 /// allUsesAvailableAt - Return true if all registers used by OrigMI at
105 /// OrigIdx are also available with the same value at UseIdx.
106 bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr
*OrigMI
,
108 SlotIndex UseIdx
) const {
109 OrigIdx
= OrigIdx
.getRegSlot(true);
110 UseIdx
= UseIdx
.getRegSlot(true);
111 for (unsigned i
= 0, e
= OrigMI
->getNumOperands(); i
!= e
; ++i
) {
112 const MachineOperand
&MO
= OrigMI
->getOperand(i
);
113 if (!MO
.isReg() || !MO
.getReg() || !MO
.readsReg())
116 // We can't remat physreg uses, unless it is a constant.
117 if (TargetRegisterInfo::isPhysicalRegister(MO
.getReg())) {
118 if (MRI
.isConstantPhysReg(MO
.getReg()))
123 LiveInterval
&li
= LIS
.getInterval(MO
.getReg());
124 const VNInfo
*OVNI
= li
.getVNInfoAt(OrigIdx
);
128 // Don't allow rematerialization immediately after the original def.
129 // It would be incorrect if OrigMI redefines the register.
131 if (SlotIndex::isSameInstr(OrigIdx
, UseIdx
))
134 if (OVNI
!= li
.getVNInfoAt(UseIdx
))
140 bool LiveRangeEdit::canRematerializeAt(Remat
&RM
, VNInfo
*OrigVNI
,
141 SlotIndex UseIdx
, bool cheapAsAMove
) {
142 assert(ScannedRemattable
&& "Call anyRematerializable first");
144 // Use scanRemattable info.
145 if (!Remattable
.count(OrigVNI
))
148 // No defining instruction provided.
150 assert(RM
.OrigMI
&& "No defining instruction for remattable value");
151 DefIdx
= LIS
.getInstructionIndex(*RM
.OrigMI
);
153 // If only cheap remats were requested, bail out early.
154 if (cheapAsAMove
&& !TII
.isAsCheapAsAMove(*RM
.OrigMI
))
157 // Verify that all used registers are available with the same values.
158 if (!allUsesAvailableAt(RM
.OrigMI
, DefIdx
, UseIdx
))
164 SlotIndex
LiveRangeEdit::rematerializeAt(MachineBasicBlock
&MBB
,
165 MachineBasicBlock::iterator MI
,
168 const TargetRegisterInfo
&tri
,
170 assert(RM
.OrigMI
&& "Invalid remat");
171 TII
.reMaterialize(MBB
, MI
, DestReg
, 0, *RM
.OrigMI
, tri
);
172 // DestReg of the cloned instruction cannot be Dead. Set isDead of DestReg
173 // to false anyway in case the isDead flag of RM.OrigMI's dest register
175 (*--MI
).getOperand(0).setIsDead(false);
176 Rematted
.insert(RM
.ParentVNI
);
177 return LIS
.getSlotIndexes()->insertMachineInstrInMaps(*MI
, Late
).getRegSlot();
180 void LiveRangeEdit::eraseVirtReg(unsigned Reg
) {
181 if (TheDelegate
&& TheDelegate
->LRE_CanEraseVirtReg(Reg
))
182 LIS
.removeInterval(Reg
);
185 bool LiveRangeEdit::foldAsLoad(LiveInterval
*LI
,
186 SmallVectorImpl
<MachineInstr
*> &Dead
) {
187 MachineInstr
*DefMI
= nullptr, *UseMI
= nullptr;
189 // Check that there is a single def and a single use.
190 for (MachineOperand
&MO
: MRI
.reg_nodbg_operands(LI
->reg
)) {
191 MachineInstr
*MI
= MO
.getParent();
193 if (DefMI
&& DefMI
!= MI
)
195 if (!MI
->canFoldAsLoad())
198 } else if (!MO
.isUndef()) {
199 if (UseMI
&& UseMI
!= MI
)
201 // FIXME: Targets don't know how to fold subreg uses.
207 if (!DefMI
|| !UseMI
)
210 // Since we're moving the DefMI load, make sure we're not extending any live
212 if (!allUsesAvailableAt(DefMI
, LIS
.getInstructionIndex(*DefMI
),
213 LIS
.getInstructionIndex(*UseMI
)))
216 // We also need to make sure it is safe to move the load.
217 // Assume there are stores between DefMI and UseMI.
218 bool SawStore
= true;
219 if (!DefMI
->isSafeToMove(nullptr, SawStore
))
222 LLVM_DEBUG(dbgs() << "Try to fold single def: " << *DefMI
223 << " into single use: " << *UseMI
);
225 SmallVector
<unsigned, 8> Ops
;
226 if (UseMI
->readsWritesVirtualRegister(LI
->reg
, &Ops
).second
)
229 MachineInstr
*FoldMI
= TII
.foldMemoryOperand(*UseMI
, Ops
, *DefMI
, &LIS
);
232 LLVM_DEBUG(dbgs() << " folded: " << *FoldMI
);
233 LIS
.ReplaceMachineInstrInMaps(*UseMI
, *FoldMI
);
234 UseMI
->eraseFromParent();
235 DefMI
->addRegisterDead(LI
->reg
, nullptr);
236 Dead
.push_back(DefMI
);
241 bool LiveRangeEdit::useIsKill(const LiveInterval
&LI
,
242 const MachineOperand
&MO
) const {
243 const MachineInstr
&MI
= *MO
.getParent();
244 SlotIndex Idx
= LIS
.getInstructionIndex(MI
).getRegSlot();
245 if (LI
.Query(Idx
).isKill())
247 const TargetRegisterInfo
&TRI
= *MRI
.getTargetRegisterInfo();
248 unsigned SubReg
= MO
.getSubReg();
249 LaneBitmask LaneMask
= TRI
.getSubRegIndexLaneMask(SubReg
);
250 for (const LiveInterval::SubRange
&S
: LI
.subranges()) {
251 if ((S
.LaneMask
& LaneMask
).any() && S
.Query(Idx
).isKill())
257 /// Find all live intervals that need to shrink, then remove the instruction.
258 void LiveRangeEdit::eliminateDeadDef(MachineInstr
*MI
, ToShrinkSet
&ToShrink
,
260 assert(MI
->allDefsAreDead() && "Def isn't really dead");
261 SlotIndex Idx
= LIS
.getInstructionIndex(*MI
).getRegSlot();
263 // Never delete a bundled instruction.
264 if (MI
->isBundled()) {
267 // Never delete inline asm.
268 if (MI
->isInlineAsm()) {
269 LLVM_DEBUG(dbgs() << "Won't delete: " << Idx
<< '\t' << *MI
);
273 // Use the same criteria as DeadMachineInstructionElim.
274 bool SawStore
= false;
275 if (!MI
->isSafeToMove(nullptr, SawStore
)) {
276 LLVM_DEBUG(dbgs() << "Can't delete: " << Idx
<< '\t' << *MI
);
280 LLVM_DEBUG(dbgs() << "Deleting dead def " << Idx
<< '\t' << *MI
);
282 // Collect virtual registers to be erased after MI is gone.
283 SmallVector
<unsigned, 8> RegsToErase
;
284 bool ReadsPhysRegs
= false;
285 bool isOrigDef
= false;
287 // Only optimize rematerialize case when the instruction has one def, since
288 // otherwise we could leave some dead defs in the code. This case is
290 if (VRM
&& MI
->getOperand(0).isReg() && MI
->getOperand(0).isDef() &&
291 MI
->getDesc().getNumDefs() == 1) {
292 Dest
= MI
->getOperand(0).getReg();
293 unsigned Original
= VRM
->getOriginal(Dest
);
294 LiveInterval
&OrigLI
= LIS
.getInterval(Original
);
295 VNInfo
*OrigVNI
= OrigLI
.getVNInfoAt(Idx
);
296 // The original live-range may have been shrunk to
297 // an empty live-range. It happens when it is dead, but
298 // we still keep it around to be able to rematerialize
299 // other values that depend on it.
301 isOrigDef
= SlotIndex::isSameInstr(OrigVNI
->def
, Idx
);
304 // Check for live intervals that may shrink
305 for (MachineInstr::mop_iterator MOI
= MI
->operands_begin(),
306 MOE
= MI
->operands_end(); MOI
!= MOE
; ++MOI
) {
309 unsigned Reg
= MOI
->getReg();
310 if (!TargetRegisterInfo::isVirtualRegister(Reg
)) {
311 // Check if MI reads any unreserved physregs.
312 if (Reg
&& MOI
->readsReg() && !MRI
.isReserved(Reg
))
313 ReadsPhysRegs
= true;
314 else if (MOI
->isDef())
315 LIS
.removePhysRegDefAt(Reg
, Idx
);
318 LiveInterval
&LI
= LIS
.getInterval(Reg
);
320 // Shrink read registers, unless it is likely to be expensive and
321 // unlikely to change anything. We typically don't want to shrink the
322 // PIC base register that has lots of uses everywhere.
323 // Always shrink COPY uses that probably come from live range splitting.
324 if ((MI
->readsVirtualRegister(Reg
) && (MI
->isCopy() || MOI
->isDef())) ||
325 (MOI
->readsReg() && (MRI
.hasOneNonDBGUse(Reg
) || useIsKill(LI
, *MOI
))))
326 ToShrink
.insert(&LI
);
328 // Remove defined value.
330 if (TheDelegate
&& LI
.getVNInfoAt(Idx
) != nullptr)
331 TheDelegate
->LRE_WillShrinkVirtReg(LI
.reg
);
332 LIS
.removeVRegDefAt(LI
, Idx
);
334 RegsToErase
.push_back(Reg
);
338 // Currently, we don't support DCE of physreg live ranges. If MI reads
339 // any unreserved physregs, don't erase the instruction, but turn it into
340 // a KILL instead. This way, the physreg live ranges don't end up
342 // FIXME: It would be better to have something like shrinkToUses() for
343 // physregs. That could potentially enable more DCE and it would free up
344 // the physreg. It would not happen often, though.
346 MI
->setDesc(TII
.get(TargetOpcode::KILL
));
347 // Remove all operands that aren't physregs.
348 for (unsigned i
= MI
->getNumOperands(); i
; --i
) {
349 const MachineOperand
&MO
= MI
->getOperand(i
-1);
350 if (MO
.isReg() && TargetRegisterInfo::isPhysicalRegister(MO
.getReg()))
352 MI
->RemoveOperand(i
-1);
354 LLVM_DEBUG(dbgs() << "Converted physregs to:\t" << *MI
);
356 // If the dest of MI is an original reg and MI is reMaterializable,
357 // don't delete the inst. Replace the dest with a new reg, and keep
358 // the inst for remat of other siblings. The inst is saved in
359 // LiveRangeEdit::DeadRemats and will be deleted after all the
360 // allocations of the func are done.
361 if (isOrigDef
&& DeadRemats
&& TII
.isTriviallyReMaterializable(*MI
, AA
)) {
362 LiveInterval
&NewLI
= createEmptyIntervalFrom(Dest
, false);
363 VNInfo
*VNI
= NewLI
.getNextValue(Idx
, LIS
.getVNInfoAllocator());
364 NewLI
.addSegment(LiveInterval::Segment(Idx
, Idx
.getDeadSlot(), VNI
));
366 DeadRemats
->insert(MI
);
367 const TargetRegisterInfo
&TRI
= *MRI
.getTargetRegisterInfo();
368 MI
->substituteRegister(Dest
, NewLI
.reg
, 0, TRI
);
369 MI
->getOperand(0).setIsDead(true);
372 TheDelegate
->LRE_WillEraseInstruction(MI
);
373 LIS
.RemoveMachineInstrFromMaps(*MI
);
374 MI
->eraseFromParent();
379 // Erase any virtregs that are now empty and unused. There may be <undef>
380 // uses around. Keep the empty live range in that case.
381 for (unsigned i
= 0, e
= RegsToErase
.size(); i
!= e
; ++i
) {
382 unsigned Reg
= RegsToErase
[i
];
383 if (LIS
.hasInterval(Reg
) && MRI
.reg_nodbg_empty(Reg
)) {
384 ToShrink
.remove(&LIS
.getInterval(Reg
));
390 void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl
<MachineInstr
*> &Dead
,
391 ArrayRef
<unsigned> RegsBeingSpilled
,
393 ToShrinkSet ToShrink
;
396 // Erase all dead defs.
397 while (!Dead
.empty())
398 eliminateDeadDef(Dead
.pop_back_val(), ToShrink
, AA
);
400 if (ToShrink
.empty())
403 // Shrink just one live interval. Then delete new dead defs.
404 LiveInterval
*LI
= ToShrink
.back();
406 if (foldAsLoad(LI
, Dead
))
408 unsigned VReg
= LI
->reg
;
410 TheDelegate
->LRE_WillShrinkVirtReg(VReg
);
411 if (!LIS
.shrinkToUses(LI
, &Dead
))
414 // Don't create new intervals for a register being spilled.
415 // The new intervals would have to be spilled anyway so its not worth it.
416 // Also they currently aren't spilled so creating them and not spilling
417 // them results in incorrect code.
418 bool BeingSpilled
= false;
419 for (unsigned i
= 0, e
= RegsBeingSpilled
.size(); i
!= e
; ++i
) {
420 if (VReg
== RegsBeingSpilled
[i
]) {
426 if (BeingSpilled
) continue;
428 // LI may have been separated, create new intervals.
429 LI
->RenumberValues();
430 SmallVector
<LiveInterval
*, 8> SplitLIs
;
431 LIS
.splitSeparateComponents(*LI
, SplitLIs
);
432 if (!SplitLIs
.empty())
435 unsigned Original
= VRM
? VRM
->getOriginal(VReg
) : 0;
436 for (const LiveInterval
*SplitLI
: SplitLIs
) {
437 // If LI is an original interval that hasn't been split yet, make the new
438 // intervals their own originals instead of referring to LI. The original
439 // interval must contain all the split products, and LI doesn't.
440 if (Original
!= VReg
&& Original
!= 0)
441 VRM
->setIsSplitFromReg(SplitLI
->reg
, Original
);
443 TheDelegate
->LRE_DidCloneVirtReg(SplitLI
->reg
, VReg
);
448 // Keep track of new virtual registers created via
449 // MachineRegisterInfo::createVirtualRegister.
451 LiveRangeEdit::MRI_NoteNewVirtualRegister(unsigned VReg
)
456 NewRegs
.push_back(VReg
);
460 LiveRangeEdit::calculateRegClassAndHint(MachineFunction
&MF
,
461 const MachineLoopInfo
&Loops
,
462 const MachineBlockFrequencyInfo
&MBFI
) {
463 VirtRegAuxInfo
VRAI(MF
, LIS
, VRM
, Loops
, MBFI
);
464 for (unsigned I
= 0, Size
= size(); I
< Size
; ++I
) {
465 LiveInterval
&LI
= LIS
.getInterval(get(I
));
466 if (MRI
.recomputeRegClass(LI
.reg
))
468 const TargetRegisterInfo
*TRI
= MF
.getSubtarget().getRegisterInfo();
469 dbgs() << "Inflated " << printReg(LI
.reg
) << " to "
470 << TRI
->getRegClassName(MRI
.getRegClass(LI
.reg
)) << '\n';
472 VRAI
.calculateSpillWeightAndHint(LI
);