1 //===- SplitKit.cpp - Toolkit for splitting live ranges -------------------===//
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 // This file contains the SplitAnalysis class as well as mutator functions for
10 // live range splitting.
12 //===----------------------------------------------------------------------===//
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/Analysis/AliasAnalysis.h"
18 #include "llvm/CodeGen/LiveRangeEdit.h"
19 #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
20 #include "llvm/CodeGen/MachineDominators.h"
21 #include "llvm/CodeGen/MachineInstr.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/MachineLoopInfo.h"
24 #include "llvm/CodeGen/MachineOperand.h"
25 #include "llvm/CodeGen/MachineRegisterInfo.h"
26 #include "llvm/CodeGen/TargetInstrInfo.h"
27 #include "llvm/CodeGen/TargetOpcodes.h"
28 #include "llvm/CodeGen/TargetRegisterInfo.h"
29 #include "llvm/CodeGen/TargetSubtargetInfo.h"
30 #include "llvm/CodeGen/VirtRegMap.h"
31 #include "llvm/Config/llvm-config.h"
32 #include "llvm/IR/DebugLoc.h"
33 #include "llvm/Support/Allocator.h"
34 #include "llvm/Support/BlockFrequency.h"
35 #include "llvm/Support/Debug.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include "llvm/Support/raw_ostream.h"
46 #define DEBUG_TYPE "regalloc"
48 STATISTIC(NumFinished
, "Number of splits finished");
49 STATISTIC(NumSimple
, "Number of splits that were simple");
50 STATISTIC(NumCopies
, "Number of copies inserted for splitting");
51 STATISTIC(NumRemats
, "Number of rematerialized defs for splitting");
53 //===----------------------------------------------------------------------===//
54 // Last Insert Point Analysis
55 //===----------------------------------------------------------------------===//
57 InsertPointAnalysis::InsertPointAnalysis(const LiveIntervals
&lis
,
59 : LIS(lis
), LastInsertPoint(BBNum
) {}
62 InsertPointAnalysis::computeLastInsertPoint(const LiveInterval
&CurLI
,
63 const MachineBasicBlock
&MBB
) {
64 unsigned Num
= MBB
.getNumber();
65 std::pair
<SlotIndex
, SlotIndex
> &LIP
= LastInsertPoint
[Num
];
66 SlotIndex MBBEnd
= LIS
.getMBBEndIdx(&MBB
);
68 SmallVector
<const MachineBasicBlock
*, 1> ExceptionalSuccessors
;
69 bool EHPadSuccessor
= false;
70 for (const MachineBasicBlock
*SMBB
: MBB
.successors()) {
71 if (SMBB
->isEHPad()) {
72 ExceptionalSuccessors
.push_back(SMBB
);
73 EHPadSuccessor
= true;
74 } else if (SMBB
->isInlineAsmBrIndirectTarget())
75 ExceptionalSuccessors
.push_back(SMBB
);
78 // Compute insert points on the first call. The pair is independent of the
79 // current live interval.
80 if (!LIP
.first
.isValid()) {
81 MachineBasicBlock::const_iterator FirstTerm
= MBB
.getFirstTerminator();
82 if (FirstTerm
== MBB
.end())
85 LIP
.first
= LIS
.getInstructionIndex(*FirstTerm
);
87 // If there is a landing pad or inlineasm_br successor, also find the
88 // instruction. If there is no such instruction, we don't need to do
89 // anything special. We assume there cannot be multiple instructions that
90 // are Calls with EHPad successors or INLINEASM_BR in a block. Further, we
91 // assume that if there are any, they will be after any other call
92 // instructions in the block.
93 if (ExceptionalSuccessors
.empty())
95 for (const MachineInstr
&MI
: llvm::reverse(MBB
)) {
96 if ((EHPadSuccessor
&& MI
.isCall()) ||
97 MI
.getOpcode() == TargetOpcode::INLINEASM_BR
) {
98 LIP
.second
= LIS
.getInstructionIndex(MI
);
104 // If CurLI is live into a landing pad successor, move the last insert point
105 // back to the call that may throw.
109 if (none_of(ExceptionalSuccessors
, [&](const MachineBasicBlock
*EHPad
) {
110 return LIS
.isLiveInToMBB(CurLI
, EHPad
);
114 // Find the value leaving MBB.
115 const VNInfo
*VNI
= CurLI
.getVNInfoBefore(MBBEnd
);
119 // The def of statepoint instruction is a gc relocation and it should be alive
120 // in landing pad. So we cannot split interval after statepoint instruction.
121 if (SlotIndex::isSameInstr(VNI
->def
, LIP
.second
))
122 if (auto *I
= LIS
.getInstructionFromIndex(LIP
.second
))
123 if (I
->getOpcode() == TargetOpcode::STATEPOINT
)
126 // If the value leaving MBB was defined after the call in MBB, it can't
127 // really be live-in to the landing pad. This can happen if the landing pad
128 // has a PHI, and this register is undef on the exceptional edge.
129 if (!SlotIndex::isEarlierInstr(VNI
->def
, LIP
.second
) && VNI
->def
< MBBEnd
)
132 // Value is properly live-in to the landing pad.
133 // Only allow inserts before the call.
137 MachineBasicBlock::iterator
138 InsertPointAnalysis::getLastInsertPointIter(const LiveInterval
&CurLI
,
139 MachineBasicBlock
&MBB
) {
140 SlotIndex LIP
= getLastInsertPoint(CurLI
, MBB
);
141 if (LIP
== LIS
.getMBBEndIdx(&MBB
))
143 return LIS
.getInstructionFromIndex(LIP
);
146 //===----------------------------------------------------------------------===//
148 //===----------------------------------------------------------------------===//
150 SplitAnalysis::SplitAnalysis(const VirtRegMap
&vrm
, const LiveIntervals
&lis
,
151 const MachineLoopInfo
&mli
)
152 : MF(vrm
.getMachineFunction()), VRM(vrm
), LIS(lis
), Loops(mli
),
153 TII(*MF
.getSubtarget().getInstrInfo()), IPA(lis
, MF
.getNumBlockIDs()) {}
155 void SplitAnalysis::clear() {
158 ThroughBlocks
.clear();
162 /// analyzeUses - Count instructions, basic blocks, and loops using CurLI.
163 void SplitAnalysis::analyzeUses() {
164 assert(UseSlots
.empty() && "Call clear first");
166 // First get all the defs from the interval values. This provides the correct
167 // slots for early clobbers.
168 for (const VNInfo
*VNI
: CurLI
->valnos
)
169 if (!VNI
->isPHIDef() && !VNI
->isUnused())
170 UseSlots
.push_back(VNI
->def
);
172 // Get use slots form the use-def chain.
173 const MachineRegisterInfo
&MRI
= MF
.getRegInfo();
174 for (MachineOperand
&MO
: MRI
.use_nodbg_operands(CurLI
->reg()))
176 UseSlots
.push_back(LIS
.getInstructionIndex(*MO
.getParent()).getRegSlot());
178 array_pod_sort(UseSlots
.begin(), UseSlots
.end());
180 // Remove duplicates, keeping the smaller slot for each instruction.
181 // That is what we want for early clobbers.
182 UseSlots
.erase(std::unique(UseSlots
.begin(), UseSlots
.end(),
183 SlotIndex::isSameInstr
),
186 // Compute per-live block info.
189 LLVM_DEBUG(dbgs() << "Analyze counted " << UseSlots
.size() << " instrs in "
190 << UseBlocks
.size() << " blocks, through "
191 << NumThroughBlocks
<< " blocks.\n");
194 /// calcLiveBlockInfo - Fill the LiveBlocks array with information about blocks
195 /// where CurLI is live.
196 void SplitAnalysis::calcLiveBlockInfo() {
197 ThroughBlocks
.resize(MF
.getNumBlockIDs());
198 NumThroughBlocks
= NumGapBlocks
= 0;
202 LiveInterval::const_iterator LVI
= CurLI
->begin();
203 LiveInterval::const_iterator LVE
= CurLI
->end();
205 SmallVectorImpl
<SlotIndex
>::const_iterator UseI
, UseE
;
206 UseI
= UseSlots
.begin();
207 UseE
= UseSlots
.end();
209 // Loop over basic blocks where CurLI is live.
210 MachineFunction::iterator MFI
=
211 LIS
.getMBBFromIndex(LVI
->start
)->getIterator();
215 SlotIndex Start
, Stop
;
216 std::tie(Start
, Stop
) = LIS
.getSlotIndexes()->getMBBRange(BI
.MBB
);
218 // If the block contains no uses, the range must be live through. At one
219 // point, RegisterCoalescer could create dangling ranges that ended
221 if (UseI
== UseE
|| *UseI
>= Stop
) {
223 ThroughBlocks
.set(BI
.MBB
->getNumber());
224 // The range shouldn't end mid-block if there are no uses. This shouldn't
226 assert(LVI
->end
>= Stop
&& "range ends mid block with no uses");
228 // This block has uses. Find the first and last uses in the block.
229 BI
.FirstInstr
= *UseI
;
230 assert(BI
.FirstInstr
>= Start
);
232 while (UseI
!= UseE
&& *UseI
< Stop
);
233 BI
.LastInstr
= UseI
[-1];
234 assert(BI
.LastInstr
< Stop
);
236 // LVI is the first live segment overlapping MBB.
237 BI
.LiveIn
= LVI
->start
<= Start
;
239 // When not live in, the first use should be a def.
241 assert(LVI
->start
== LVI
->valno
->def
&& "Dangling Segment start");
242 assert(LVI
->start
== BI
.FirstInstr
&& "First instr should be a def");
243 BI
.FirstDef
= BI
.FirstInstr
;
246 // Look for gaps in the live range.
248 while (LVI
->end
< Stop
) {
249 SlotIndex LastStop
= LVI
->end
;
250 if (++LVI
== LVE
|| LVI
->start
>= Stop
) {
252 BI
.LastInstr
= LastStop
;
256 if (LastStop
< LVI
->start
) {
257 // There is a gap in the live range. Create duplicate entries for the
258 // live-in snippet and the live-out snippet.
261 // Push the Live-in part.
263 UseBlocks
.push_back(BI
);
264 UseBlocks
.back().LastInstr
= LastStop
;
266 // Set up BI for the live-out part.
269 BI
.FirstInstr
= BI
.FirstDef
= LVI
->start
;
272 // A Segment that starts in the middle of the block must be a def.
273 assert(LVI
->start
== LVI
->valno
->def
&& "Dangling Segment start");
275 BI
.FirstDef
= LVI
->start
;
278 UseBlocks
.push_back(BI
);
280 // LVI is now at LVE or LVI->end >= Stop.
285 // Live segment ends exactly at Stop. Move to the next segment.
286 if (LVI
->end
== Stop
&& ++LVI
== LVE
)
289 // Pick the next basic block.
290 if (LVI
->start
< Stop
)
293 MFI
= LIS
.getMBBFromIndex(LVI
->start
)->getIterator();
296 assert(getNumLiveBlocks() == countLiveBlocks(CurLI
) && "Bad block count");
299 unsigned SplitAnalysis::countLiveBlocks(const LiveInterval
*cli
) const {
302 LiveInterval
*li
= const_cast<LiveInterval
*>(cli
);
303 LiveInterval::iterator LVI
= li
->begin();
304 LiveInterval::iterator LVE
= li
->end();
307 // Loop over basic blocks where li is live.
308 MachineFunction::const_iterator MFI
=
309 LIS
.getMBBFromIndex(LVI
->start
)->getIterator();
310 SlotIndex Stop
= LIS
.getMBBEndIdx(&*MFI
);
313 LVI
= li
->advanceTo(LVI
, Stop
);
318 Stop
= LIS
.getMBBEndIdx(&*MFI
);
319 } while (Stop
<= LVI
->start
);
323 bool SplitAnalysis::isOriginalEndpoint(SlotIndex Idx
) const {
324 Register OrigReg
= VRM
.getOriginal(CurLI
->reg());
325 const LiveInterval
&Orig
= LIS
.getInterval(OrigReg
);
326 assert(!Orig
.empty() && "Splitting empty interval?");
327 LiveInterval::const_iterator I
= Orig
.find(Idx
);
329 // Range containing Idx should begin at Idx.
330 if (I
!= Orig
.end() && I
->start
<= Idx
)
331 return I
->start
== Idx
;
333 // Range does not contain Idx, previous must end at Idx.
334 return I
!= Orig
.begin() && (--I
)->end
== Idx
;
337 void SplitAnalysis::analyze(const LiveInterval
*li
) {
343 //===----------------------------------------------------------------------===//
345 //===----------------------------------------------------------------------===//
347 /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
348 SplitEditor::SplitEditor(SplitAnalysis
&SA
, LiveIntervals
&LIS
, VirtRegMap
&VRM
,
349 MachineDominatorTree
&MDT
,
350 MachineBlockFrequencyInfo
&MBFI
, VirtRegAuxInfo
&VRAI
)
351 : SA(SA
), LIS(LIS
), VRM(VRM
), MRI(VRM
.getMachineFunction().getRegInfo()),
352 MDT(MDT
), TII(*VRM
.getMachineFunction().getSubtarget().getInstrInfo()),
353 TRI(*VRM
.getMachineFunction().getSubtarget().getRegisterInfo()),
354 MBFI(MBFI
), VRAI(VRAI
), RegAssign(Allocator
) {}
356 void SplitEditor::reset(LiveRangeEdit
&LRE
, ComplementSpillMode SM
) {
363 // Reset the LiveIntervalCalc instances needed for this spill mode.
364 LICalc
[0].reset(&VRM
.getMachineFunction(), LIS
.getSlotIndexes(), &MDT
,
365 &LIS
.getVNInfoAllocator());
367 LICalc
[1].reset(&VRM
.getMachineFunction(), LIS
.getSlotIndexes(), &MDT
,
368 &LIS
.getVNInfoAllocator());
370 Edit
->anyRematerializable();
373 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
374 LLVM_DUMP_METHOD
void SplitEditor::dump() const {
375 if (RegAssign
.empty()) {
376 dbgs() << " empty\n";
380 for (RegAssignMap::const_iterator I
= RegAssign
.begin(); I
.valid(); ++I
)
381 dbgs() << " [" << I
.start() << ';' << I
.stop() << "):" << I
.value();
386 /// Find a subrange corresponding to the exact lane mask @p LM in the live
387 /// interval @p LI. The interval @p LI is assumed to contain such a subrange.
388 /// This function is used to find corresponding subranges between the
389 /// original interval and the new intervals.
390 template <typename T
> auto &getSubrangeImpl(LaneBitmask LM
, T
&LI
) {
391 for (auto &S
: LI
.subranges())
392 if (S
.LaneMask
== LM
)
394 llvm_unreachable("SubRange for this mask not found");
397 LiveInterval::SubRange
&getSubRangeForMaskExact(LaneBitmask LM
,
399 return getSubrangeImpl(LM
, LI
);
402 const LiveInterval::SubRange
&getSubRangeForMaskExact(LaneBitmask LM
,
403 const LiveInterval
&LI
) {
404 return getSubrangeImpl(LM
, LI
);
407 /// Find a subrange corresponding to the lane mask @p LM, or a superset of it,
408 /// in the live interval @p LI. The interval @p LI is assumed to contain such
409 /// a subrange. This function is used to find corresponding subranges between
410 /// the original interval and the new intervals.
411 const LiveInterval::SubRange
&getSubRangeForMask(LaneBitmask LM
,
412 const LiveInterval
&LI
) {
413 for (const LiveInterval::SubRange
&S
: LI
.subranges())
414 if ((S
.LaneMask
& LM
) == LM
)
416 llvm_unreachable("SubRange for this mask not found");
419 void SplitEditor::addDeadDef(LiveInterval
&LI
, VNInfo
*VNI
, bool Original
) {
420 if (!LI
.hasSubRanges()) {
421 LI
.createDeadDef(VNI
);
425 SlotIndex Def
= VNI
->def
;
427 // If we are transferring a def from the original interval, make sure
428 // to only update the subranges for which the original subranges had
429 // a def at this location.
430 for (LiveInterval::SubRange
&S
: LI
.subranges()) {
431 auto &PS
= getSubRangeForMask(S
.LaneMask
, Edit
->getParent());
432 VNInfo
*PV
= PS
.getVNInfoAt(Def
);
433 if (PV
!= nullptr && PV
->def
== Def
)
434 S
.createDeadDef(Def
, LIS
.getVNInfoAllocator());
437 // This is a new def: either from rematerialization, or from an inserted
438 // copy. Since rematerialization can regenerate a definition of a sub-
439 // register, we need to check which subranges need to be updated.
440 const MachineInstr
*DefMI
= LIS
.getInstructionFromIndex(Def
);
441 assert(DefMI
!= nullptr);
443 for (const MachineOperand
&DefOp
: DefMI
->defs()) {
444 Register R
= DefOp
.getReg();
447 if (unsigned SR
= DefOp
.getSubReg())
448 LM
|= TRI
.getSubRegIndexLaneMask(SR
);
450 LM
= MRI
.getMaxLaneMaskForVReg(R
);
454 for (LiveInterval::SubRange
&S
: LI
.subranges())
455 if ((S
.LaneMask
& LM
).any())
456 S
.createDeadDef(Def
, LIS
.getVNInfoAllocator());
460 VNInfo
*SplitEditor::defValue(unsigned RegIdx
,
461 const VNInfo
*ParentVNI
,
464 assert(ParentVNI
&& "Mapping NULL value");
465 assert(Idx
.isValid() && "Invalid SlotIndex");
466 assert(Edit
->getParent().getVNInfoAt(Idx
) == ParentVNI
&& "Bad Parent VNI");
467 LiveInterval
*LI
= &LIS
.getInterval(Edit
->get(RegIdx
));
469 // Create a new value.
470 VNInfo
*VNI
= LI
->getNextValue(Idx
, LIS
.getVNInfoAllocator());
472 bool Force
= LI
->hasSubRanges();
473 ValueForcePair
FP(Force
? nullptr : VNI
, Force
);
474 // Use insert for lookup, so we can add missing values with a second lookup.
475 std::pair
<ValueMap::iterator
, bool> InsP
=
476 Values
.insert(std::make_pair(std::make_pair(RegIdx
, ParentVNI
->id
), FP
));
478 // This was the first time (RegIdx, ParentVNI) was mapped, and it is not
479 // forced. Keep it as a simple def without any liveness.
480 if (!Force
&& InsP
.second
)
483 // If the previous value was a simple mapping, add liveness for it now.
484 if (VNInfo
*OldVNI
= InsP
.first
->second
.getPointer()) {
485 addDeadDef(*LI
, OldVNI
, Original
);
487 // No longer a simple mapping. Switch to a complex mapping. If the
488 // interval has subranges, make it a forced mapping.
489 InsP
.first
->second
= ValueForcePair(nullptr, Force
);
492 // This is a complex mapping, add liveness for VNI
493 addDeadDef(*LI
, VNI
, Original
);
497 void SplitEditor::forceRecompute(unsigned RegIdx
, const VNInfo
&ParentVNI
) {
498 ValueForcePair
&VFP
= Values
[std::make_pair(RegIdx
, ParentVNI
.id
)];
499 VNInfo
*VNI
= VFP
.getPointer();
501 // ParentVNI was either unmapped or already complex mapped. Either way, just
502 // set the force bit.
508 // This was previously a single mapping. Make sure the old def is represented
509 // by a trivial live range.
510 addDeadDef(LIS
.getInterval(Edit
->get(RegIdx
)), VNI
, false);
512 // Mark as complex mapped, forced.
513 VFP
= ValueForcePair(nullptr, true);
516 SlotIndex
SplitEditor::buildSingleSubRegCopy(
517 Register FromReg
, Register ToReg
, MachineBasicBlock
&MBB
,
518 MachineBasicBlock::iterator InsertBefore
, unsigned SubIdx
,
519 LiveInterval
&DestLI
, bool Late
, SlotIndex Def
, const MCInstrDesc
&Desc
) {
520 bool FirstCopy
= !Def
.isValid();
521 MachineInstr
*CopyMI
= BuildMI(MBB
, InsertBefore
, DebugLoc(), Desc
)
522 .addReg(ToReg
, RegState::Define
| getUndefRegState(FirstCopy
)
523 | getInternalReadRegState(!FirstCopy
), SubIdx
)
524 .addReg(FromReg
, 0, SubIdx
);
526 SlotIndexes
&Indexes
= *LIS
.getSlotIndexes();
528 Def
= Indexes
.insertMachineInstrInMaps(*CopyMI
, Late
).getRegSlot();
530 CopyMI
->bundleWithPred();
535 SlotIndex
SplitEditor::buildCopy(Register FromReg
, Register ToReg
,
536 LaneBitmask LaneMask
, MachineBasicBlock
&MBB
,
537 MachineBasicBlock::iterator InsertBefore
, bool Late
, unsigned RegIdx
) {
538 const MCInstrDesc
&Desc
=
539 TII
.get(TII
.getLiveRangeSplitOpcode(FromReg
, *MBB
.getParent()));
540 SlotIndexes
&Indexes
= *LIS
.getSlotIndexes();
541 if (LaneMask
.all() || LaneMask
== MRI
.getMaxLaneMaskForVReg(FromReg
)) {
542 // The full vreg is copied.
543 MachineInstr
*CopyMI
=
544 BuildMI(MBB
, InsertBefore
, DebugLoc(), Desc
, ToReg
).addReg(FromReg
);
545 return Indexes
.insertMachineInstrInMaps(*CopyMI
, Late
).getRegSlot();
548 // Only a subset of lanes needs to be copied. The following is a simple
549 // heuristic to construct a sequence of COPYs. We could add a target
550 // specific callback if this turns out to be suboptimal.
551 LiveInterval
&DestLI
= LIS
.getInterval(Edit
->get(RegIdx
));
553 // First pass: Try to find a perfectly matching subregister index. If none
554 // exists find the one covering the most lanemask bits.
555 const TargetRegisterClass
*RC
= MRI
.getRegClass(FromReg
);
556 assert(RC
== MRI
.getRegClass(ToReg
) && "Should have same reg class");
558 SmallVector
<unsigned, 8> SubIndexes
;
560 // Abort if we cannot possibly implement the COPY with the given indexes.
561 if (!TRI
.getCoveringSubRegIndexes(MRI
, RC
, LaneMask
, SubIndexes
))
562 report_fatal_error("Impossible to implement partial COPY");
565 for (unsigned BestIdx
: SubIndexes
) {
566 Def
= buildSingleSubRegCopy(FromReg
, ToReg
, MBB
, InsertBefore
, BestIdx
,
567 DestLI
, Late
, Def
, Desc
);
570 BumpPtrAllocator
&Allocator
= LIS
.getVNInfoAllocator();
571 DestLI
.refineSubRanges(
573 [Def
, &Allocator
](LiveInterval::SubRange
&SR
) {
574 SR
.createDeadDef(Def
, Allocator
);
581 VNInfo
*SplitEditor::defFromParent(unsigned RegIdx
, const VNInfo
*ParentVNI
,
582 SlotIndex UseIdx
, MachineBasicBlock
&MBB
,
583 MachineBasicBlock::iterator I
) {
585 LiveInterval
*LI
= &LIS
.getInterval(Edit
->get(RegIdx
));
587 // We may be trying to avoid interference that ends at a deleted instruction,
588 // so always begin RegIdx 0 early and all others late.
589 bool Late
= RegIdx
!= 0;
591 // Attempt cheap-as-a-copy rematerialization.
592 Register Original
= VRM
.getOriginal(Edit
->get(RegIdx
));
593 LiveInterval
&OrigLI
= LIS
.getInterval(Original
);
594 VNInfo
*OrigVNI
= OrigLI
.getVNInfoAt(UseIdx
);
596 Register Reg
= LI
->reg();
597 bool DidRemat
= false;
599 LiveRangeEdit::Remat
RM(ParentVNI
);
600 RM
.OrigMI
= LIS
.getInstructionFromIndex(OrigVNI
->def
);
601 if (Edit
->canRematerializeAt(RM
, OrigVNI
, UseIdx
, true)) {
602 Def
= Edit
->rematerializeAt(MBB
, I
, Reg
, RM
, TRI
, Late
);
608 LaneBitmask LaneMask
;
609 if (OrigLI
.hasSubRanges()) {
610 LaneMask
= LaneBitmask::getNone();
611 for (LiveInterval::SubRange
&S
: OrigLI
.subranges()) {
612 if (S
.liveAt(UseIdx
))
613 LaneMask
|= S
.LaneMask
;
616 LaneMask
= LaneBitmask::getAll();
619 if (LaneMask
.none()) {
620 const MCInstrDesc
&Desc
= TII
.get(TargetOpcode::IMPLICIT_DEF
);
621 MachineInstr
*ImplicitDef
= BuildMI(MBB
, I
, DebugLoc(), Desc
, Reg
);
622 SlotIndexes
&Indexes
= *LIS
.getSlotIndexes();
623 Def
= Indexes
.insertMachineInstrInMaps(*ImplicitDef
, Late
).getRegSlot();
626 Def
= buildCopy(Edit
->getReg(), Reg
, LaneMask
, MBB
, I
, Late
, RegIdx
);
630 // Define the value in Reg.
631 return defValue(RegIdx
, ParentVNI
, Def
, false);
634 /// Create a new virtual register and live interval.
635 unsigned SplitEditor::openIntv() {
636 // Create the complement as index 0.
638 Edit
->createEmptyInterval();
640 // Create the open interval.
641 OpenIdx
= Edit
->size();
642 Edit
->createEmptyInterval();
646 void SplitEditor::selectIntv(unsigned Idx
) {
647 assert(Idx
!= 0 && "Cannot select the complement interval");
648 assert(Idx
< Edit
->size() && "Can only select previously opened interval");
649 LLVM_DEBUG(dbgs() << " selectIntv " << OpenIdx
<< " -> " << Idx
<< '\n');
653 SlotIndex
SplitEditor::enterIntvBefore(SlotIndex Idx
) {
654 assert(OpenIdx
&& "openIntv not called before enterIntvBefore");
655 LLVM_DEBUG(dbgs() << " enterIntvBefore " << Idx
);
656 Idx
= Idx
.getBaseIndex();
657 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Idx
);
659 LLVM_DEBUG(dbgs() << ": not live\n");
662 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI
->id
<< '\n');
663 MachineInstr
*MI
= LIS
.getInstructionFromIndex(Idx
);
664 assert(MI
&& "enterIntvBefore called with invalid index");
666 VNInfo
*VNI
= defFromParent(OpenIdx
, ParentVNI
, Idx
, *MI
->getParent(), MI
);
670 SlotIndex
SplitEditor::enterIntvAfter(SlotIndex Idx
) {
671 assert(OpenIdx
&& "openIntv not called before enterIntvAfter");
672 LLVM_DEBUG(dbgs() << " enterIntvAfter " << Idx
);
673 Idx
= Idx
.getBoundaryIndex();
674 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Idx
);
676 LLVM_DEBUG(dbgs() << ": not live\n");
679 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI
->id
<< '\n');
680 MachineInstr
*MI
= LIS
.getInstructionFromIndex(Idx
);
681 assert(MI
&& "enterIntvAfter called with invalid index");
683 VNInfo
*VNI
= defFromParent(OpenIdx
, ParentVNI
, Idx
, *MI
->getParent(),
684 std::next(MachineBasicBlock::iterator(MI
)));
688 SlotIndex
SplitEditor::enterIntvAtEnd(MachineBasicBlock
&MBB
) {
689 assert(OpenIdx
&& "openIntv not called before enterIntvAtEnd");
690 SlotIndex End
= LIS
.getMBBEndIdx(&MBB
);
691 SlotIndex Last
= End
.getPrevSlot();
692 LLVM_DEBUG(dbgs() << " enterIntvAtEnd " << printMBBReference(MBB
) << ", "
694 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Last
);
696 LLVM_DEBUG(dbgs() << ": not live\n");
699 SlotIndex LSP
= SA
.getLastSplitPoint(&MBB
);
701 // It could be that the use after LSP is a def, and thus the ParentVNI
702 // just selected starts at that def. For this case to exist, the def
703 // must be part of a tied def/use pair (as otherwise we'd have split
704 // distinct live ranges into individual live intervals), and thus we
705 // can insert the def into the VNI of the use and the tied def/use
706 // pair can live in the resulting interval.
708 ParentVNI
= Edit
->getParent().getVNInfoAt(Last
);
710 // undef use --> undef tied def
711 LLVM_DEBUG(dbgs() << ": tied use not live\n");
716 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI
->id
);
717 VNInfo
*VNI
= defFromParent(OpenIdx
, ParentVNI
, Last
, MBB
,
718 SA
.getLastSplitPointIter(&MBB
));
719 RegAssign
.insert(VNI
->def
, End
, OpenIdx
);
724 /// useIntv - indicate that all instructions in MBB should use OpenLI.
725 void SplitEditor::useIntv(const MachineBasicBlock
&MBB
) {
726 useIntv(LIS
.getMBBStartIdx(&MBB
), LIS
.getMBBEndIdx(&MBB
));
729 void SplitEditor::useIntv(SlotIndex Start
, SlotIndex End
) {
730 assert(OpenIdx
&& "openIntv not called before useIntv");
731 LLVM_DEBUG(dbgs() << " useIntv [" << Start
<< ';' << End
<< "):");
732 RegAssign
.insert(Start
, End
, OpenIdx
);
736 SlotIndex
SplitEditor::leaveIntvAfter(SlotIndex Idx
) {
737 assert(OpenIdx
&& "openIntv not called before leaveIntvAfter");
738 LLVM_DEBUG(dbgs() << " leaveIntvAfter " << Idx
);
740 // The interval must be live beyond the instruction at Idx.
741 SlotIndex Boundary
= Idx
.getBoundaryIndex();
742 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Boundary
);
744 LLVM_DEBUG(dbgs() << ": not live\n");
745 return Boundary
.getNextSlot();
747 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI
->id
<< '\n');
748 MachineInstr
*MI
= LIS
.getInstructionFromIndex(Boundary
);
749 assert(MI
&& "No instruction at index");
751 // In spill mode, make live ranges as short as possible by inserting the copy
752 // before MI. This is only possible if that instruction doesn't redefine the
753 // value. The inserted COPY is not a kill, and we don't need to recompute
754 // the source live range. The spiller also won't try to hoist this copy.
755 if (SpillMode
&& !SlotIndex::isSameInstr(ParentVNI
->def
, Idx
) &&
756 MI
->readsVirtualRegister(Edit
->getReg())) {
757 forceRecompute(0, *ParentVNI
);
758 defFromParent(0, ParentVNI
, Idx
, *MI
->getParent(), MI
);
762 VNInfo
*VNI
= defFromParent(0, ParentVNI
, Boundary
, *MI
->getParent(),
763 std::next(MachineBasicBlock::iterator(MI
)));
767 SlotIndex
SplitEditor::leaveIntvBefore(SlotIndex Idx
) {
768 assert(OpenIdx
&& "openIntv not called before leaveIntvBefore");
769 LLVM_DEBUG(dbgs() << " leaveIntvBefore " << Idx
);
771 // The interval must be live into the instruction at Idx.
772 Idx
= Idx
.getBaseIndex();
773 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Idx
);
775 LLVM_DEBUG(dbgs() << ": not live\n");
776 return Idx
.getNextSlot();
778 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI
->id
<< '\n');
780 MachineInstr
*MI
= LIS
.getInstructionFromIndex(Idx
);
781 assert(MI
&& "No instruction at index");
782 VNInfo
*VNI
= defFromParent(0, ParentVNI
, Idx
, *MI
->getParent(), MI
);
786 SlotIndex
SplitEditor::leaveIntvAtTop(MachineBasicBlock
&MBB
) {
787 assert(OpenIdx
&& "openIntv not called before leaveIntvAtTop");
788 SlotIndex Start
= LIS
.getMBBStartIdx(&MBB
);
789 LLVM_DEBUG(dbgs() << " leaveIntvAtTop " << printMBBReference(MBB
) << ", "
792 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Start
);
794 LLVM_DEBUG(dbgs() << ": not live\n");
798 VNInfo
*VNI
= defFromParent(0, ParentVNI
, Start
, MBB
,
799 MBB
.SkipPHIsLabelsAndDebug(MBB
.begin()));
800 RegAssign
.insert(Start
, VNI
->def
, OpenIdx
);
805 static bool hasTiedUseOf(MachineInstr
&MI
, unsigned Reg
) {
806 return any_of(MI
.defs(), [Reg
](const MachineOperand
&MO
) {
807 return MO
.isReg() && MO
.isTied() && MO
.getReg() == Reg
;
811 void SplitEditor::overlapIntv(SlotIndex Start
, SlotIndex End
) {
812 assert(OpenIdx
&& "openIntv not called before overlapIntv");
813 const VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(Start
);
814 assert(ParentVNI
== Edit
->getParent().getVNInfoBefore(End
) &&
815 "Parent changes value in extended range");
816 assert(LIS
.getMBBFromIndex(Start
) == LIS
.getMBBFromIndex(End
) &&
817 "Range cannot span basic blocks");
819 // The complement interval will be extended as needed by LICalc.extend().
821 forceRecompute(0, *ParentVNI
);
823 // If the last use is tied to a def, we can't mark it as live for the
824 // interval which includes only the use. That would cause the tied pair
825 // to end up in two different intervals.
826 if (auto *MI
= LIS
.getInstructionFromIndex(End
))
827 if (hasTiedUseOf(*MI
, Edit
->getReg())) {
828 LLVM_DEBUG(dbgs() << "skip overlap due to tied def at end\n");
832 LLVM_DEBUG(dbgs() << " overlapIntv [" << Start
<< ';' << End
<< "):");
833 RegAssign
.insert(Start
, End
, OpenIdx
);
837 //===----------------------------------------------------------------------===//
839 //===----------------------------------------------------------------------===//
841 void SplitEditor::removeBackCopies(SmallVectorImpl
<VNInfo
*> &Copies
) {
842 LiveInterval
*LI
= &LIS
.getInterval(Edit
->get(0));
843 LLVM_DEBUG(dbgs() << "Removing " << Copies
.size() << " back-copies.\n");
844 RegAssignMap::iterator AssignI
;
845 AssignI
.setMap(RegAssign
);
847 for (const VNInfo
*C
: Copies
) {
848 SlotIndex Def
= C
->def
;
849 MachineInstr
*MI
= LIS
.getInstructionFromIndex(Def
);
850 assert(MI
&& "No instruction for back-copy");
852 MachineBasicBlock
*MBB
= MI
->getParent();
853 MachineBasicBlock::iterator
MBBI(MI
);
855 do AtBegin
= MBBI
== MBB
->begin();
856 while (!AtBegin
&& (--MBBI
)->isDebugOrPseudoInstr());
858 LLVM_DEBUG(dbgs() << "Removing " << Def
<< '\t' << *MI
);
859 LIS
.removeVRegDefAt(*LI
, Def
);
860 LIS
.RemoveMachineInstrFromMaps(*MI
);
861 MI
->eraseFromParent();
863 // Adjust RegAssign if a register assignment is killed at Def. We want to
864 // avoid calculating the live range of the source register if possible.
865 AssignI
.find(Def
.getPrevSlot());
866 if (!AssignI
.valid() || AssignI
.start() >= Def
)
868 // If MI doesn't kill the assigned register, just leave it.
869 if (AssignI
.stop() != Def
)
871 unsigned RegIdx
= AssignI
.value();
872 // We could hoist back-copy right after another back-copy. As a result
873 // MMBI points to copy instruction which is actually dead now.
874 // We cannot set its stop to MBBI which will be the same as start and
875 // interval does not support that.
877 AtBegin
? SlotIndex() : LIS
.getInstructionIndex(*MBBI
).getRegSlot();
878 if (AtBegin
|| !MBBI
->readsVirtualRegister(Edit
->getReg()) ||
879 Kill
<= AssignI
.start()) {
880 LLVM_DEBUG(dbgs() << " cannot find simple kill of RegIdx " << RegIdx
882 forceRecompute(RegIdx
, *Edit
->getParent().getVNInfoAt(Def
));
884 LLVM_DEBUG(dbgs() << " move kill to " << Kill
<< '\t' << *MBBI
);
885 AssignI
.setStop(Kill
);
891 SplitEditor::findShallowDominator(MachineBasicBlock
*MBB
,
892 MachineBasicBlock
*DefMBB
) {
895 assert(MDT
.dominates(DefMBB
, MBB
) && "MBB must be dominated by the def.");
897 const MachineLoopInfo
&Loops
= SA
.Loops
;
898 const MachineLoop
*DefLoop
= Loops
.getLoopFor(DefMBB
);
899 MachineDomTreeNode
*DefDomNode
= MDT
[DefMBB
];
901 // Best candidate so far.
902 MachineBasicBlock
*BestMBB
= MBB
;
903 unsigned BestDepth
= std::numeric_limits
<unsigned>::max();
906 const MachineLoop
*Loop
= Loops
.getLoopFor(MBB
);
908 // MBB isn't in a loop, it doesn't get any better. All dominators have a
909 // higher frequency by definition.
911 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB
)
912 << " dominates " << printMBBReference(*MBB
)
917 // We'll never be able to exit the DefLoop.
918 if (Loop
== DefLoop
) {
919 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB
)
920 << " dominates " << printMBBReference(*MBB
)
921 << " in the same loop\n");
925 // Least busy dominator seen so far.
926 unsigned Depth
= Loop
->getLoopDepth();
927 if (Depth
< BestDepth
) {
930 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB
)
931 << " dominates " << printMBBReference(*MBB
)
932 << " at depth " << Depth
<< '\n');
935 // Leave loop by going to the immediate dominator of the loop header.
936 // This is a bigger stride than simply walking up the dominator tree.
937 MachineDomTreeNode
*IDom
= MDT
[Loop
->getHeader()]->getIDom();
939 // Too far up the dominator tree?
940 if (!IDom
|| !MDT
.dominates(DefDomNode
, IDom
))
943 MBB
= IDom
->getBlock();
947 void SplitEditor::computeRedundantBackCopies(
948 DenseSet
<unsigned> &NotToHoistSet
, SmallVectorImpl
<VNInfo
*> &BackCopies
) {
949 LiveInterval
*LI
= &LIS
.getInterval(Edit
->get(0));
950 const LiveInterval
*Parent
= &Edit
->getParent();
951 SmallVector
<SmallPtrSet
<VNInfo
*, 8>, 8> EqualVNs(Parent
->getNumValNums());
952 SmallPtrSet
<VNInfo
*, 8> DominatedVNIs
;
954 // Aggregate VNIs having the same value as ParentVNI.
955 for (VNInfo
*VNI
: LI
->valnos
) {
958 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(VNI
->def
);
959 EqualVNs
[ParentVNI
->id
].insert(VNI
);
962 // For VNI aggregation of each ParentVNI, collect dominated, i.e.,
963 // redundant VNIs to BackCopies.
964 for (unsigned i
= 0, e
= Parent
->getNumValNums(); i
!= e
; ++i
) {
965 const VNInfo
*ParentVNI
= Parent
->getValNumInfo(i
);
966 if (!NotToHoistSet
.count(ParentVNI
->id
))
968 SmallPtrSetIterator
<VNInfo
*> It1
= EqualVNs
[ParentVNI
->id
].begin();
969 SmallPtrSetIterator
<VNInfo
*> It2
= It1
;
970 for (; It1
!= EqualVNs
[ParentVNI
->id
].end(); ++It1
) {
972 for (++It2
; It2
!= EqualVNs
[ParentVNI
->id
].end(); ++It2
) {
973 if (DominatedVNIs
.count(*It1
) || DominatedVNIs
.count(*It2
))
976 MachineBasicBlock
*MBB1
= LIS
.getMBBFromIndex((*It1
)->def
);
977 MachineBasicBlock
*MBB2
= LIS
.getMBBFromIndex((*It2
)->def
);
979 DominatedVNIs
.insert((*It1
)->def
< (*It2
)->def
? (*It2
) : (*It1
));
980 } else if (MDT
.dominates(MBB1
, MBB2
)) {
981 DominatedVNIs
.insert(*It2
);
982 } else if (MDT
.dominates(MBB2
, MBB1
)) {
983 DominatedVNIs
.insert(*It1
);
987 if (!DominatedVNIs
.empty()) {
988 forceRecompute(0, *ParentVNI
);
989 append_range(BackCopies
, DominatedVNIs
);
990 DominatedVNIs
.clear();
995 /// For SM_Size mode, find a common dominator for all the back-copies for
996 /// the same ParentVNI and hoist the backcopies to the dominator BB.
997 /// For SM_Speed mode, if the common dominator is hot and it is not beneficial
998 /// to do the hoisting, simply remove the dominated backcopies for the same
1000 void SplitEditor::hoistCopies() {
1001 // Get the complement interval, always RegIdx 0.
1002 LiveInterval
*LI
= &LIS
.getInterval(Edit
->get(0));
1003 const LiveInterval
*Parent
= &Edit
->getParent();
1005 // Track the nearest common dominator for all back-copies for each ParentVNI,
1006 // indexed by ParentVNI->id.
1007 using DomPair
= std::pair
<MachineBasicBlock
*, SlotIndex
>;
1008 SmallVector
<DomPair
, 8> NearestDom(Parent
->getNumValNums());
1009 // The total cost of all the back-copies for each ParentVNI.
1010 SmallVector
<BlockFrequency
, 8> Costs(Parent
->getNumValNums());
1011 // The ParentVNI->id set for which hoisting back-copies are not beneficial
1013 DenseSet
<unsigned> NotToHoistSet
;
1015 // Find the nearest common dominator for parent values with multiple
1016 // back-copies. If a single back-copy dominates, put it in DomPair.second.
1017 for (VNInfo
*VNI
: LI
->valnos
) {
1018 if (VNI
->isUnused())
1020 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(VNI
->def
);
1021 assert(ParentVNI
&& "Parent not live at complement def");
1023 // Don't hoist remats. The complement is probably going to disappear
1024 // completely anyway.
1025 if (Edit
->didRematerialize(ParentVNI
))
1028 MachineBasicBlock
*ValMBB
= LIS
.getMBBFromIndex(VNI
->def
);
1030 DomPair
&Dom
= NearestDom
[ParentVNI
->id
];
1032 // Keep directly defined parent values. This is either a PHI or an
1033 // instruction in the complement range. All other copies of ParentVNI
1034 // should be eliminated.
1035 if (VNI
->def
== ParentVNI
->def
) {
1036 LLVM_DEBUG(dbgs() << "Direct complement def at " << VNI
->def
<< '\n');
1037 Dom
= DomPair(ValMBB
, VNI
->def
);
1040 // Skip the singly mapped values. There is nothing to gain from hoisting a
1041 // single back-copy.
1042 if (Values
.lookup(std::make_pair(0, ParentVNI
->id
)).getPointer()) {
1043 LLVM_DEBUG(dbgs() << "Single complement def at " << VNI
->def
<< '\n');
1048 // First time we see ParentVNI. VNI dominates itself.
1049 Dom
= DomPair(ValMBB
, VNI
->def
);
1050 } else if (Dom
.first
== ValMBB
) {
1051 // Two defs in the same block. Pick the earlier def.
1052 if (!Dom
.second
.isValid() || VNI
->def
< Dom
.second
)
1053 Dom
.second
= VNI
->def
;
1055 // Different basic blocks. Check if one dominates.
1056 MachineBasicBlock
*Near
=
1057 MDT
.findNearestCommonDominator(Dom
.first
, ValMBB
);
1059 // Def ValMBB dominates.
1060 Dom
= DomPair(ValMBB
, VNI
->def
);
1061 else if (Near
!= Dom
.first
)
1062 // None dominate. Hoist to common dominator, need new def.
1063 Dom
= DomPair(Near
, SlotIndex());
1064 Costs
[ParentVNI
->id
] += MBFI
.getBlockFreq(ValMBB
);
1067 LLVM_DEBUG(dbgs() << "Multi-mapped complement " << VNI
->id
<< '@'
1068 << VNI
->def
<< " for parent " << ParentVNI
->id
<< '@'
1069 << ParentVNI
->def
<< " hoist to "
1070 << printMBBReference(*Dom
.first
) << ' ' << Dom
.second
1074 // Insert the hoisted copies.
1075 for (unsigned i
= 0, e
= Parent
->getNumValNums(); i
!= e
; ++i
) {
1076 DomPair
&Dom
= NearestDom
[i
];
1077 if (!Dom
.first
|| Dom
.second
.isValid())
1079 // This value needs a hoisted copy inserted at the end of Dom.first.
1080 const VNInfo
*ParentVNI
= Parent
->getValNumInfo(i
);
1081 MachineBasicBlock
*DefMBB
= LIS
.getMBBFromIndex(ParentVNI
->def
);
1082 // Get a less loopy dominator than Dom.first.
1083 Dom
.first
= findShallowDominator(Dom
.first
, DefMBB
);
1084 if (SpillMode
== SM_Speed
&&
1085 MBFI
.getBlockFreq(Dom
.first
) > Costs
[ParentVNI
->id
]) {
1086 NotToHoistSet
.insert(ParentVNI
->id
);
1089 SlotIndex LSP
= SA
.getLastSplitPoint(Dom
.first
);
1090 if (LSP
<= ParentVNI
->def
) {
1091 NotToHoistSet
.insert(ParentVNI
->id
);
1094 Dom
.second
= defFromParent(0, ParentVNI
, LSP
, *Dom
.first
,
1095 SA
.getLastSplitPointIter(Dom
.first
))->def
;
1098 // Remove redundant back-copies that are now known to be dominated by another
1099 // def with the same value.
1100 SmallVector
<VNInfo
*, 8> BackCopies
;
1101 for (VNInfo
*VNI
: LI
->valnos
) {
1102 if (VNI
->isUnused())
1104 VNInfo
*ParentVNI
= Edit
->getParent().getVNInfoAt(VNI
->def
);
1105 const DomPair
&Dom
= NearestDom
[ParentVNI
->id
];
1106 if (!Dom
.first
|| Dom
.second
== VNI
->def
||
1107 NotToHoistSet
.count(ParentVNI
->id
))
1109 BackCopies
.push_back(VNI
);
1110 forceRecompute(0, *ParentVNI
);
1113 // If it is not beneficial to hoist all the BackCopies, simply remove
1114 // redundant BackCopies in speed mode.
1115 if (SpillMode
== SM_Speed
&& !NotToHoistSet
.empty())
1116 computeRedundantBackCopies(NotToHoistSet
, BackCopies
);
1118 removeBackCopies(BackCopies
);
1121 /// transferValues - Transfer all possible values to the new live ranges.
1122 /// Values that were rematerialized are left alone, they need LICalc.extend().
1123 bool SplitEditor::transferValues() {
1124 bool Skipped
= false;
1125 RegAssignMap::const_iterator AssignI
= RegAssign
.begin();
1126 for (const LiveRange::Segment
&S
: Edit
->getParent()) {
1127 LLVM_DEBUG(dbgs() << " blit " << S
<< ':');
1128 VNInfo
*ParentVNI
= S
.valno
;
1129 // RegAssign has holes where RegIdx 0 should be used.
1130 SlotIndex Start
= S
.start
;
1131 AssignI
.advanceTo(Start
);
1134 SlotIndex End
= S
.end
;
1135 if (!AssignI
.valid()) {
1137 } else if (AssignI
.start() <= Start
) {
1138 RegIdx
= AssignI
.value();
1139 if (AssignI
.stop() < End
) {
1140 End
= AssignI
.stop();
1145 End
= std::min(End
, AssignI
.start());
1148 // The interval [Start;End) is continuously mapped to RegIdx, ParentVNI.
1149 LLVM_DEBUG(dbgs() << " [" << Start
<< ';' << End
<< ")=" << RegIdx
<< '('
1150 << printReg(Edit
->get(RegIdx
)) << ')');
1151 LiveInterval
&LI
= LIS
.getInterval(Edit
->get(RegIdx
));
1153 // Check for a simply defined value that can be blitted directly.
1154 ValueForcePair VFP
= Values
.lookup(std::make_pair(RegIdx
, ParentVNI
->id
));
1155 if (VNInfo
*VNI
= VFP
.getPointer()) {
1156 LLVM_DEBUG(dbgs() << ':' << VNI
->id
);
1157 LI
.addSegment(LiveInterval::Segment(Start
, End
, VNI
));
1162 // Skip values with forced recomputation.
1164 LLVM_DEBUG(dbgs() << "(recalc)");
1170 LiveIntervalCalc
&LIC
= getLICalc(RegIdx
);
1172 // This value has multiple defs in RegIdx, but it wasn't rematerialized,
1173 // so the live range is accurate. Add live-in blocks in [Start;End) to the
1175 MachineFunction::iterator MBB
= LIS
.getMBBFromIndex(Start
)->getIterator();
1176 SlotIndex BlockStart
, BlockEnd
;
1177 std::tie(BlockStart
, BlockEnd
) = LIS
.getSlotIndexes()->getMBBRange(&*MBB
);
1179 // The first block may be live-in, or it may have its own def.
1180 if (Start
!= BlockStart
) {
1181 VNInfo
*VNI
= LI
.extendInBlock(BlockStart
, std::min(BlockEnd
, End
));
1182 assert(VNI
&& "Missing def for complex mapped value");
1183 LLVM_DEBUG(dbgs() << ':' << VNI
->id
<< "*" << printMBBReference(*MBB
));
1184 // MBB has its own def. Is it also live-out?
1185 if (BlockEnd
<= End
)
1186 LIC
.setLiveOutValue(&*MBB
, VNI
);
1188 // Skip to the next block for live-in.
1190 BlockStart
= BlockEnd
;
1193 // Handle the live-in blocks covered by [Start;End).
1194 assert(Start
<= BlockStart
&& "Expected live-in block");
1195 while (BlockStart
< End
) {
1196 LLVM_DEBUG(dbgs() << ">" << printMBBReference(*MBB
));
1197 BlockEnd
= LIS
.getMBBEndIdx(&*MBB
);
1198 if (BlockStart
== ParentVNI
->def
) {
1199 // This block has the def of a parent PHI, so it isn't live-in.
1200 assert(ParentVNI
->isPHIDef() && "Non-phi defined at block start?");
1201 VNInfo
*VNI
= LI
.extendInBlock(BlockStart
, std::min(BlockEnd
, End
));
1202 assert(VNI
&& "Missing def for complex mapped parent PHI");
1203 if (End
>= BlockEnd
)
1204 LIC
.setLiveOutValue(&*MBB
, VNI
); // Live-out as well.
1206 // This block needs a live-in value. The last block covered may not
1209 LIC
.addLiveInBlock(LI
, MDT
[&*MBB
], End
);
1211 // Live-through, and we don't know the value.
1212 LIC
.addLiveInBlock(LI
, MDT
[&*MBB
]);
1213 LIC
.setLiveOutValue(&*MBB
, nullptr);
1216 BlockStart
= BlockEnd
;
1220 } while (Start
!= S
.end
);
1221 LLVM_DEBUG(dbgs() << '\n');
1224 LICalc
[0].calculateValues();
1226 LICalc
[1].calculateValues();
1231 static bool removeDeadSegment(SlotIndex Def
, LiveRange
&LR
) {
1232 const LiveRange::Segment
*Seg
= LR
.getSegmentContaining(Def
);
1235 if (Seg
->end
!= Def
.getDeadSlot())
1237 // This is a dead PHI. Remove it.
1238 LR
.removeSegment(*Seg
, true);
1242 void SplitEditor::extendPHIRange(MachineBasicBlock
&B
, LiveIntervalCalc
&LIC
,
1243 LiveRange
&LR
, LaneBitmask LM
,
1244 ArrayRef
<SlotIndex
> Undefs
) {
1245 for (MachineBasicBlock
*P
: B
.predecessors()) {
1246 SlotIndex End
= LIS
.getMBBEndIdx(P
);
1247 SlotIndex LastUse
= End
.getPrevSlot();
1248 // The predecessor may not have a live-out value. That is OK, like an
1249 // undef PHI operand.
1250 const LiveInterval
&PLI
= Edit
->getParent();
1251 // Need the cast because the inputs to ?: would otherwise be deemed
1252 // "incompatible": SubRange vs LiveInterval.
1253 const LiveRange
&PSR
= !LM
.all() ? getSubRangeForMaskExact(LM
, PLI
)
1254 : static_cast<const LiveRange
&>(PLI
);
1255 if (PSR
.liveAt(LastUse
))
1256 LIC
.extend(LR
, End
, /*PhysReg=*/0, Undefs
);
1260 void SplitEditor::extendPHIKillRanges() {
1261 // Extend live ranges to be live-out for successor PHI values.
1263 // Visit each PHI def slot in the parent live interval. If the def is dead,
1264 // remove it. Otherwise, extend the live interval to reach the end indexes
1265 // of all predecessor blocks.
1267 const LiveInterval
&ParentLI
= Edit
->getParent();
1268 for (const VNInfo
*V
: ParentLI
.valnos
) {
1269 if (V
->isUnused() || !V
->isPHIDef())
1272 unsigned RegIdx
= RegAssign
.lookup(V
->def
);
1273 LiveInterval
&LI
= LIS
.getInterval(Edit
->get(RegIdx
));
1274 LiveIntervalCalc
&LIC
= getLICalc(RegIdx
);
1275 MachineBasicBlock
&B
= *LIS
.getMBBFromIndex(V
->def
);
1276 if (!removeDeadSegment(V
->def
, LI
))
1277 extendPHIRange(B
, LIC
, LI
, LaneBitmask::getAll(), /*Undefs=*/{});
1280 SmallVector
<SlotIndex
, 4> Undefs
;
1281 LiveIntervalCalc SubLIC
;
1283 for (const LiveInterval::SubRange
&PS
: ParentLI
.subranges()) {
1284 for (const VNInfo
*V
: PS
.valnos
) {
1285 if (V
->isUnused() || !V
->isPHIDef())
1287 unsigned RegIdx
= RegAssign
.lookup(V
->def
);
1288 LiveInterval
&LI
= LIS
.getInterval(Edit
->get(RegIdx
));
1289 LiveInterval::SubRange
&S
= getSubRangeForMaskExact(PS
.LaneMask
, LI
);
1290 if (removeDeadSegment(V
->def
, S
))
1293 MachineBasicBlock
&B
= *LIS
.getMBBFromIndex(V
->def
);
1294 SubLIC
.reset(&VRM
.getMachineFunction(), LIS
.getSlotIndexes(), &MDT
,
1295 &LIS
.getVNInfoAllocator());
1297 LI
.computeSubRangeUndefs(Undefs
, PS
.LaneMask
, MRI
, *LIS
.getSlotIndexes());
1298 extendPHIRange(B
, SubLIC
, S
, PS
.LaneMask
, Undefs
);
1303 /// rewriteAssigned - Rewrite all uses of Edit->getReg().
1304 void SplitEditor::rewriteAssigned(bool ExtendRanges
) {
1306 ExtPoint(const MachineOperand
&O
, unsigned R
, SlotIndex N
)
1307 : MO(O
), RegIdx(R
), Next(N
) {}
1314 SmallVector
<ExtPoint
,4> ExtPoints
;
1316 for (MachineOperand
&MO
:
1317 llvm::make_early_inc_range(MRI
.reg_operands(Edit
->getReg()))) {
1318 MachineInstr
*MI
= MO
.getParent();
1319 // LiveDebugVariables should have handled all DBG_VALUE instructions.
1320 if (MI
->isDebugValue()) {
1321 LLVM_DEBUG(dbgs() << "Zapping " << *MI
);
1326 // <undef> operands don't really read the register, so it doesn't matter
1327 // which register we choose. When the use operand is tied to a def, we must
1328 // use the same register as the def, so just do that always.
1329 SlotIndex Idx
= LIS
.getInstructionIndex(*MI
);
1330 if (MO
.isDef() || MO
.isUndef())
1331 Idx
= Idx
.getRegSlot(MO
.isEarlyClobber());
1333 // Rewrite to the mapped register at Idx.
1334 unsigned RegIdx
= RegAssign
.lookup(Idx
);
1335 LiveInterval
&LI
= LIS
.getInterval(Edit
->get(RegIdx
));
1336 MO
.setReg(LI
.reg());
1337 LLVM_DEBUG(dbgs() << " rewr " << printMBBReference(*MI
->getParent())
1338 << '\t' << Idx
<< ':' << RegIdx
<< '\t' << *MI
);
1340 // Extend liveness to Idx if the instruction reads reg.
1341 if (!ExtendRanges
|| MO
.isUndef())
1344 // Skip instructions that don't read Reg.
1346 if (!MO
.getSubReg() && !MO
.isEarlyClobber())
1348 // We may want to extend a live range for a partial redef, or for a use
1349 // tied to an early clobber.
1350 if (!Edit
->getParent().liveAt(Idx
.getPrevSlot()))
1354 bool IsEarlyClobber
= false;
1356 // We want to extend a live range into `e` slot rather than `r` slot if
1357 // tied-def is early clobber, because the `e` slot already contained
1358 // in the live range of early-clobber tied-def operand, give an example
1361 // 16 early-clobber %0 = Op %0 (tied-def 0), ...
1364 // %0 = [0r, 0d) [16e, 32d)
1365 // The point we want to extend is 0d to 16e not 16r in this case, but if
1366 // we use 16r here we will extend nothing because that already contained
1368 unsigned OpIdx
= MO
.getOperandNo();
1369 unsigned DefOpIdx
= MI
->findTiedOperandIdx(OpIdx
);
1370 const MachineOperand
&DefOp
= MI
->getOperand(DefOpIdx
);
1371 IsEarlyClobber
= DefOp
.isEarlyClobber();
1374 Idx
= Idx
.getRegSlot(IsEarlyClobber
);
1377 SlotIndex Next
= Idx
;
1378 if (LI
.hasSubRanges()) {
1379 // We have to delay extending subranges until we have seen all operands
1380 // defining the register. This is because a <def,read-undef> operand
1381 // will create an "undef" point, and we cannot extend any subranges
1382 // until all of them have been accounted for.
1384 ExtPoints
.push_back(ExtPoint(MO
, RegIdx
, Next
));
1386 LiveIntervalCalc
&LIC
= getLICalc(RegIdx
);
1387 LIC
.extend(LI
, Next
, 0, ArrayRef
<SlotIndex
>());
1391 for (ExtPoint
&EP
: ExtPoints
) {
1392 LiveInterval
&LI
= LIS
.getInterval(Edit
->get(EP
.RegIdx
));
1393 assert(LI
.hasSubRanges());
1395 LiveIntervalCalc SubLIC
;
1396 Register Reg
= EP
.MO
.getReg(), Sub
= EP
.MO
.getSubReg();
1397 LaneBitmask LM
= Sub
!= 0 ? TRI
.getSubRegIndexLaneMask(Sub
)
1398 : MRI
.getMaxLaneMaskForVReg(Reg
);
1399 for (LiveInterval::SubRange
&S
: LI
.subranges()) {
1400 if ((S
.LaneMask
& LM
).none())
1402 // The problem here can be that the new register may have been created
1403 // for a partially defined original register. For example:
1404 // %0:subreg_hireg<def,read-undef> = ...
1409 SubLIC
.reset(&VRM
.getMachineFunction(), LIS
.getSlotIndexes(), &MDT
,
1410 &LIS
.getVNInfoAllocator());
1411 SmallVector
<SlotIndex
, 4> Undefs
;
1412 LI
.computeSubRangeUndefs(Undefs
, S
.LaneMask
, MRI
, *LIS
.getSlotIndexes());
1413 SubLIC
.extend(S
, EP
.Next
, 0, Undefs
);
1417 for (Register R
: *Edit
) {
1418 LiveInterval
&LI
= LIS
.getInterval(R
);
1419 if (!LI
.hasSubRanges())
1422 LI
.removeEmptySubRanges();
1423 LIS
.constructMainRangeFromSubranges(LI
);
1427 void SplitEditor::deleteRematVictims() {
1428 SmallVector
<MachineInstr
*, 8> Dead
;
1429 for (const Register
&R
: *Edit
) {
1430 LiveInterval
*LI
= &LIS
.getInterval(R
);
1431 for (const LiveRange::Segment
&S
: LI
->segments
) {
1432 // Dead defs end at the dead slot.
1433 if (S
.end
!= S
.valno
->def
.getDeadSlot())
1435 if (S
.valno
->isPHIDef())
1437 MachineInstr
*MI
= LIS
.getInstructionFromIndex(S
.valno
->def
);
1438 assert(MI
&& "Missing instruction for dead def");
1439 MI
->addRegisterDead(LI
->reg(), &TRI
);
1441 if (!MI
->allDefsAreDead())
1444 LLVM_DEBUG(dbgs() << "All defs dead: " << *MI
);
1452 Edit
->eliminateDeadDefs(Dead
, std::nullopt
);
1455 void SplitEditor::forceRecomputeVNI(const VNInfo
&ParentVNI
) {
1456 // Fast-path for common case.
1457 if (!ParentVNI
.isPHIDef()) {
1458 for (unsigned I
= 0, E
= Edit
->size(); I
!= E
; ++I
)
1459 forceRecompute(I
, ParentVNI
);
1463 // Trace value through phis.
1464 SmallPtrSet
<const VNInfo
*, 8> Visited
; ///< whether VNI was/is in worklist.
1465 SmallVector
<const VNInfo
*, 4> WorkList
;
1466 Visited
.insert(&ParentVNI
);
1467 WorkList
.push_back(&ParentVNI
);
1469 const LiveInterval
&ParentLI
= Edit
->getParent();
1470 const SlotIndexes
&Indexes
= *LIS
.getSlotIndexes();
1472 const VNInfo
&VNI
= *WorkList
.back();
1473 WorkList
.pop_back();
1474 for (unsigned I
= 0, E
= Edit
->size(); I
!= E
; ++I
)
1475 forceRecompute(I
, VNI
);
1476 if (!VNI
.isPHIDef())
1479 MachineBasicBlock
&MBB
= *Indexes
.getMBBFromIndex(VNI
.def
);
1480 for (const MachineBasicBlock
*Pred
: MBB
.predecessors()) {
1481 SlotIndex PredEnd
= Indexes
.getMBBEndIdx(Pred
);
1482 VNInfo
*PredVNI
= ParentLI
.getVNInfoBefore(PredEnd
);
1483 assert(PredVNI
&& "Value available in PhiVNI predecessor");
1484 if (Visited
.insert(PredVNI
).second
)
1485 WorkList
.push_back(PredVNI
);
1487 } while(!WorkList
.empty());
1490 void SplitEditor::finish(SmallVectorImpl
<unsigned> *LRMap
) {
1493 // At this point, the live intervals in Edit contain VNInfos corresponding to
1494 // the inserted copies.
1496 // Add the original defs from the parent interval.
1497 for (const VNInfo
*ParentVNI
: Edit
->getParent().valnos
) {
1498 if (ParentVNI
->isUnused())
1500 unsigned RegIdx
= RegAssign
.lookup(ParentVNI
->def
);
1501 defValue(RegIdx
, ParentVNI
, ParentVNI
->def
, true);
1503 // Force rematted values to be recomputed everywhere.
1504 // The new live ranges may be truncated.
1505 if (Edit
->didRematerialize(ParentVNI
))
1506 forceRecomputeVNI(*ParentVNI
);
1509 // Hoist back-copies to the complement interval when in spill mode.
1510 switch (SpillMode
) {
1512 // Leave all back-copies as is.
1516 // hoistCopies will behave differently between size and speed.
1520 // Transfer the simply mapped values, check if any are skipped.
1521 bool Skipped
= transferValues();
1523 // Rewrite virtual registers, possibly extending ranges.
1524 rewriteAssigned(Skipped
);
1527 extendPHIKillRanges();
1531 // Delete defs that were rematted everywhere.
1533 deleteRematVictims();
1535 // Get rid of unused values and set phi-kill flags.
1536 for (Register Reg
: *Edit
) {
1537 LiveInterval
&LI
= LIS
.getInterval(Reg
);
1538 LI
.removeEmptySubRanges();
1539 LI
.RenumberValues();
1542 // Provide a reverse mapping from original indices to Edit ranges.
1544 auto Seq
= llvm::seq
<unsigned>(0, Edit
->size());
1545 LRMap
->assign(Seq
.begin(), Seq
.end());
1548 // Now check if any registers were separated into multiple components.
1549 ConnectedVNInfoEqClasses
ConEQ(LIS
);
1550 for (unsigned i
= 0, e
= Edit
->size(); i
!= e
; ++i
) {
1551 // Don't use iterators, they are invalidated by create() below.
1552 Register VReg
= Edit
->get(i
);
1553 LiveInterval
&LI
= LIS
.getInterval(VReg
);
1554 SmallVector
<LiveInterval
*, 8> SplitLIs
;
1555 LIS
.splitSeparateComponents(LI
, SplitLIs
);
1556 Register Original
= VRM
.getOriginal(VReg
);
1557 for (LiveInterval
*SplitLI
: SplitLIs
)
1558 VRM
.setIsSplitFromReg(SplitLI
->reg(), Original
);
1560 // The new intervals all map back to i.
1562 LRMap
->resize(Edit
->size(), i
);
1565 // Calculate spill weight and allocation hints for new intervals.
1566 Edit
->calculateRegClassAndHint(VRM
.getMachineFunction(), VRAI
);
1568 assert(!LRMap
|| LRMap
->size() == Edit
->size());
1571 //===----------------------------------------------------------------------===//
1572 // Single Block Splitting
1573 //===----------------------------------------------------------------------===//
1575 bool SplitAnalysis::shouldSplitSingleBlock(const BlockInfo
&BI
,
1576 bool SingleInstrs
) const {
1577 // Always split for multiple instructions.
1578 if (!BI
.isOneInstr())
1580 // Don't split for single instructions unless explicitly requested.
1583 // Splitting a live-through range always makes progress.
1584 if (BI
.LiveIn
&& BI
.LiveOut
)
1586 // No point in isolating a copy. It has no register class constraints.
1587 MachineInstr
*MI
= LIS
.getInstructionFromIndex(BI
.FirstInstr
);
1588 bool copyLike
= TII
.isCopyInstr(*MI
) || MI
->isSubregToReg();
1591 // Finally, don't isolate an end point that was created by earlier splits.
1592 return isOriginalEndpoint(BI
.FirstInstr
);
1595 void SplitEditor::splitSingleBlock(const SplitAnalysis::BlockInfo
&BI
) {
1597 SlotIndex LastSplitPoint
= SA
.getLastSplitPoint(BI
.MBB
);
1598 SlotIndex SegStart
= enterIntvBefore(std::min(BI
.FirstInstr
,
1600 if (!BI
.LiveOut
|| BI
.LastInstr
< LastSplitPoint
) {
1601 useIntv(SegStart
, leaveIntvAfter(BI
.LastInstr
));
1603 // The last use is after the last valid split point.
1604 SlotIndex SegStop
= leaveIntvBefore(LastSplitPoint
);
1605 useIntv(SegStart
, SegStop
);
1606 overlapIntv(SegStop
, BI
.LastInstr
);
1610 //===----------------------------------------------------------------------===//
1611 // Global Live Range Splitting Support
1612 //===----------------------------------------------------------------------===//
1614 // These methods support a method of global live range splitting that uses a
1615 // global algorithm to decide intervals for CFG edges. They will insert split
1616 // points and color intervals in basic blocks while avoiding interference.
1618 // Note that splitSingleBlock is also useful for blocks where both CFG edges
1619 // are on the stack.
1621 void SplitEditor::splitLiveThroughBlock(unsigned MBBNum
,
1622 unsigned IntvIn
, SlotIndex LeaveBefore
,
1623 unsigned IntvOut
, SlotIndex EnterAfter
){
1624 SlotIndex Start
, Stop
;
1625 std::tie(Start
, Stop
) = LIS
.getSlotIndexes()->getMBBRange(MBBNum
);
1627 LLVM_DEBUG(dbgs() << "%bb." << MBBNum
<< " [" << Start
<< ';' << Stop
1628 << ") intf " << LeaveBefore
<< '-' << EnterAfter
1629 << ", live-through " << IntvIn
<< " -> " << IntvOut
);
1631 assert((IntvIn
|| IntvOut
) && "Use splitSingleBlock for isolated blocks");
1633 assert((!LeaveBefore
|| LeaveBefore
< Stop
) && "Interference after block");
1634 assert((!IntvIn
|| !LeaveBefore
|| LeaveBefore
> Start
) && "Impossible intf");
1635 assert((!EnterAfter
|| EnterAfter
>= Start
) && "Interference before block");
1637 MachineBasicBlock
*MBB
= VRM
.getMachineFunction().getBlockNumbered(MBBNum
);
1640 LLVM_DEBUG(dbgs() << ", spill on entry.\n");
1642 // <<<<<<<<< Possible LeaveBefore interference.
1643 // |-----------| Live through.
1644 // -____________ Spill on entry.
1647 SlotIndex Idx
= leaveIntvAtTop(*MBB
);
1648 assert((!LeaveBefore
|| Idx
<= LeaveBefore
) && "Interference");
1654 LLVM_DEBUG(dbgs() << ", reload on exit.\n");
1656 // >>>>>>> Possible EnterAfter interference.
1657 // |-----------| Live through.
1658 // ___________-- Reload on exit.
1660 selectIntv(IntvOut
);
1661 SlotIndex Idx
= enterIntvAtEnd(*MBB
);
1662 assert((!EnterAfter
|| Idx
>= EnterAfter
) && "Interference");
1667 if (IntvIn
== IntvOut
&& !LeaveBefore
&& !EnterAfter
) {
1668 LLVM_DEBUG(dbgs() << ", straight through.\n");
1670 // |-----------| Live through.
1671 // ------------- Straight through, same intv, no interference.
1673 selectIntv(IntvOut
);
1674 useIntv(Start
, Stop
);
1678 // We cannot legally insert splits after LSP.
1679 SlotIndex LSP
= SA
.getLastSplitPoint(MBBNum
);
1680 assert((!IntvOut
|| !EnterAfter
|| EnterAfter
< LSP
) && "Impossible intf");
1682 if (IntvIn
!= IntvOut
&& (!LeaveBefore
|| !EnterAfter
||
1683 LeaveBefore
.getBaseIndex() > EnterAfter
.getBoundaryIndex())) {
1684 LLVM_DEBUG(dbgs() << ", switch avoiding interference.\n");
1686 // >>>> <<<< Non-overlapping EnterAfter/LeaveBefore interference.
1687 // |-----------| Live through.
1688 // ------======= Switch intervals between interference.
1690 selectIntv(IntvOut
);
1692 if (LeaveBefore
&& LeaveBefore
< LSP
) {
1693 Idx
= enterIntvBefore(LeaveBefore
);
1696 Idx
= enterIntvAtEnd(*MBB
);
1699 useIntv(Start
, Idx
);
1700 assert((!LeaveBefore
|| Idx
<= LeaveBefore
) && "Interference");
1701 assert((!EnterAfter
|| Idx
>= EnterAfter
) && "Interference");
1705 LLVM_DEBUG(dbgs() << ", create local intv for interference.\n");
1707 // >>><><><><<<< Overlapping EnterAfter/LeaveBefore interference.
1708 // |-----------| Live through.
1709 // ==---------== Switch intervals before/after interference.
1711 assert(LeaveBefore
<= EnterAfter
&& "Missed case");
1713 selectIntv(IntvOut
);
1714 SlotIndex Idx
= enterIntvAfter(EnterAfter
);
1716 assert((!EnterAfter
|| Idx
>= EnterAfter
) && "Interference");
1719 Idx
= leaveIntvBefore(LeaveBefore
);
1720 useIntv(Start
, Idx
);
1721 assert((!LeaveBefore
|| Idx
<= LeaveBefore
) && "Interference");
1724 void SplitEditor::splitRegInBlock(const SplitAnalysis::BlockInfo
&BI
,
1725 unsigned IntvIn
, SlotIndex LeaveBefore
) {
1726 SlotIndex Start
, Stop
;
1727 std::tie(Start
, Stop
) = LIS
.getSlotIndexes()->getMBBRange(BI
.MBB
);
1729 LLVM_DEBUG(dbgs() << printMBBReference(*BI
.MBB
) << " [" << Start
<< ';'
1730 << Stop
<< "), uses " << BI
.FirstInstr
<< '-'
1731 << BI
.LastInstr
<< ", reg-in " << IntvIn
1732 << ", leave before " << LeaveBefore
1733 << (BI
.LiveOut
? ", stack-out" : ", killed in block"));
1735 assert(IntvIn
&& "Must have register in");
1736 assert(BI
.LiveIn
&& "Must be live-in");
1737 assert((!LeaveBefore
|| LeaveBefore
> Start
) && "Bad interference");
1739 if (!BI
.LiveOut
&& (!LeaveBefore
|| LeaveBefore
>= BI
.LastInstr
)) {
1740 LLVM_DEBUG(dbgs() << " before interference.\n");
1742 // <<< Interference after kill.
1743 // |---o---x | Killed in block.
1744 // ========= Use IntvIn everywhere.
1747 useIntv(Start
, BI
.LastInstr
);
1751 SlotIndex LSP
= SA
.getLastSplitPoint(BI
.MBB
);
1753 if (!LeaveBefore
|| LeaveBefore
> BI
.LastInstr
.getBoundaryIndex()) {
1755 // <<< Possible interference after last use.
1756 // |---o---o---| Live-out on stack.
1757 // =========____ Leave IntvIn after last use.
1759 // < Interference after last use.
1760 // |---o---o--o| Live-out on stack, late last use.
1761 // ============ Copy to stack after LSP, overlap IntvIn.
1762 // \_____ Stack interval is live-out.
1764 if (BI
.LastInstr
< LSP
) {
1765 LLVM_DEBUG(dbgs() << ", spill after last use before interference.\n");
1767 SlotIndex Idx
= leaveIntvAfter(BI
.LastInstr
);
1768 useIntv(Start
, Idx
);
1769 assert((!LeaveBefore
|| Idx
<= LeaveBefore
) && "Interference");
1771 LLVM_DEBUG(dbgs() << ", spill before last split point.\n");
1773 SlotIndex Idx
= leaveIntvBefore(LSP
);
1774 overlapIntv(Idx
, BI
.LastInstr
);
1775 useIntv(Start
, Idx
);
1776 assert((!LeaveBefore
|| Idx
<= LeaveBefore
) && "Interference");
1781 // The interference is overlapping somewhere we wanted to use IntvIn. That
1782 // means we need to create a local interval that can be allocated a
1783 // different register.
1784 unsigned LocalIntv
= openIntv();
1786 LLVM_DEBUG(dbgs() << ", creating local interval " << LocalIntv
<< ".\n");
1788 if (!BI
.LiveOut
|| BI
.LastInstr
< LSP
) {
1790 // <<<<<<< Interference overlapping uses.
1791 // |---o---o---| Live-out on stack.
1792 // =====----____ Leave IntvIn before interference, then spill.
1794 SlotIndex To
= leaveIntvAfter(BI
.LastInstr
);
1795 SlotIndex From
= enterIntvBefore(LeaveBefore
);
1798 useIntv(Start
, From
);
1799 assert((!LeaveBefore
|| From
<= LeaveBefore
) && "Interference");
1803 // <<<<<<< Interference overlapping uses.
1804 // |---o---o--o| Live-out on stack, late last use.
1805 // =====------- Copy to stack before LSP, overlap LocalIntv.
1806 // \_____ Stack interval is live-out.
1808 SlotIndex To
= leaveIntvBefore(LSP
);
1809 overlapIntv(To
, BI
.LastInstr
);
1810 SlotIndex From
= enterIntvBefore(std::min(To
, LeaveBefore
));
1813 useIntv(Start
, From
);
1814 assert((!LeaveBefore
|| From
<= LeaveBefore
) && "Interference");
1817 void SplitEditor::splitRegOutBlock(const SplitAnalysis::BlockInfo
&BI
,
1818 unsigned IntvOut
, SlotIndex EnterAfter
) {
1819 SlotIndex Start
, Stop
;
1820 std::tie(Start
, Stop
) = LIS
.getSlotIndexes()->getMBBRange(BI
.MBB
);
1822 LLVM_DEBUG(dbgs() << printMBBReference(*BI
.MBB
) << " [" << Start
<< ';'
1823 << Stop
<< "), uses " << BI
.FirstInstr
<< '-'
1824 << BI
.LastInstr
<< ", reg-out " << IntvOut
1825 << ", enter after " << EnterAfter
1826 << (BI
.LiveIn
? ", stack-in" : ", defined in block"));
1828 SlotIndex LSP
= SA
.getLastSplitPoint(BI
.MBB
);
1830 assert(IntvOut
&& "Must have register out");
1831 assert(BI
.LiveOut
&& "Must be live-out");
1832 assert((!EnterAfter
|| EnterAfter
< LSP
) && "Bad interference");
1834 if (!BI
.LiveIn
&& (!EnterAfter
|| EnterAfter
<= BI
.FirstInstr
)) {
1835 LLVM_DEBUG(dbgs() << " after interference.\n");
1837 // >>>> Interference before def.
1838 // | o---o---| Defined in block.
1839 // ========= Use IntvOut everywhere.
1841 selectIntv(IntvOut
);
1842 useIntv(BI
.FirstInstr
, Stop
);
1846 if (!EnterAfter
|| EnterAfter
< BI
.FirstInstr
.getBaseIndex()) {
1847 LLVM_DEBUG(dbgs() << ", reload after interference.\n");
1849 // >>>> Interference before def.
1850 // |---o---o---| Live-through, stack-in.
1851 // ____========= Enter IntvOut before first use.
1853 selectIntv(IntvOut
);
1854 SlotIndex Idx
= enterIntvBefore(std::min(LSP
, BI
.FirstInstr
));
1856 assert((!EnterAfter
|| Idx
>= EnterAfter
) && "Interference");
1860 // The interference is overlapping somewhere we wanted to use IntvOut. That
1861 // means we need to create a local interval that can be allocated a
1862 // different register.
1863 LLVM_DEBUG(dbgs() << ", interference overlaps uses.\n");
1865 // >>>>>>> Interference overlapping uses.
1866 // |---o---o---| Live-through, stack-in.
1867 // ____---====== Create local interval for interference range.
1869 selectIntv(IntvOut
);
1870 SlotIndex Idx
= enterIntvAfter(EnterAfter
);
1872 assert((!EnterAfter
|| Idx
>= EnterAfter
) && "Interference");
1875 SlotIndex From
= enterIntvBefore(std::min(Idx
, BI
.FirstInstr
));
1879 void SplitAnalysis::BlockInfo::print(raw_ostream
&OS
) const {
1880 OS
<< "{" << printMBBReference(*MBB
) << ", "
1881 << "uses " << FirstInstr
<< " to " << LastInstr
<< ", "
1882 << "1st def " << FirstDef
<< ", "
1883 << (LiveIn
? "live in" : "dead in") << ", "
1884 << (LiveOut
? "live out" : "dead out") << "}";
1887 void SplitAnalysis::BlockInfo::dump() const {