LLVM 22.0.0git
RegisterCoalescer.cpp
Go to the documentation of this file.
1//===- RegisterCoalescer.cpp - Generic Register Coalescing Interface ------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the generic RegisterCoalescer interface which
10// is used as the common interface used by all clients and
11// implementations of register coalescing.
12//
13//===----------------------------------------------------------------------===//
14
15#include "RegisterCoalescer.h"
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/BitVector.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/Statistic.h"
36#include "llvm/CodeGen/Passes.h"
44#include "llvm/IR/DebugLoc.h"
46#include "llvm/MC/LaneBitmask.h"
47#include "llvm/MC/MCInstrDesc.h"
49#include "llvm/Pass.h"
52#include "llvm/Support/Debug.h"
55#include <algorithm>
56#include <cassert>
57#include <iterator>
58#include <limits>
59#include <tuple>
60#include <utility>
61#include <vector>
62
63using namespace llvm;
64
65#define DEBUG_TYPE "regalloc"
66
67STATISTIC(numJoins, "Number of interval joins performed");
68STATISTIC(numCrossRCs, "Number of cross class joins performed");
69STATISTIC(numCommutes, "Number of instruction commuting performed");
70STATISTIC(numExtends, "Number of copies extended");
71STATISTIC(NumReMats, "Number of instructions re-materialized");
72STATISTIC(NumInflated, "Number of register classes inflated");
73STATISTIC(NumLaneConflicts, "Number of dead lane conflicts tested");
74STATISTIC(NumLaneResolves, "Number of dead lane conflicts resolved");
75STATISTIC(NumShrinkToUses, "Number of shrinkToUses called");
76
77static cl::opt<bool> EnableJoining("join-liveintervals",
78 cl::desc("Coalesce copies (default=true)"),
79 cl::init(true), cl::Hidden);
80
81static cl::opt<bool> UseTerminalRule("terminal-rule",
82 cl::desc("Apply the terminal rule"),
83 cl::init(false), cl::Hidden);
84
85/// Temporary flag to test critical edge unsplitting.
87 "join-splitedges",
88 cl::desc("Coalesce copies on split edges (default=subtarget)"), cl::Hidden);
89
90/// Temporary flag to test global copy optimization.
92 "join-globalcopies",
93 cl::desc("Coalesce copies that span blocks (default=subtarget)"),
95
97 "verify-coalescing",
98 cl::desc("Verify machine instrs before and after register coalescing"),
100
102 "late-remat-update-threshold", cl::Hidden,
103 cl::desc("During rematerialization for a copy, if the def instruction has "
104 "many other copy uses to be rematerialized, delay the multiple "
105 "separate live interval update work and do them all at once after "
106 "all those rematerialization are done. It will save a lot of "
107 "repeated work. "),
108 cl::init(100));
109
111 "large-interval-size-threshold", cl::Hidden,
112 cl::desc("If the valnos size of an interval is larger than the threshold, "
113 "it is regarded as a large interval. "),
114 cl::init(100));
115
117 "large-interval-freq-threshold", cl::Hidden,
118 cl::desc("For a large interval, if it is coalesced with other live "
119 "intervals many times more than the threshold, stop its "
120 "coalescing to control the compile time. "),
121 cl::init(256));
122
123namespace {
124
125class JoinVals;
126
127class RegisterCoalescer : private LiveRangeEdit::Delegate {
128 MachineFunction *MF = nullptr;
129 MachineRegisterInfo *MRI = nullptr;
130 const TargetRegisterInfo *TRI = nullptr;
131 const TargetInstrInfo *TII = nullptr;
132 LiveIntervals *LIS = nullptr;
133 SlotIndexes *SI = nullptr;
134 const MachineLoopInfo *Loops = nullptr;
135 RegisterClassInfo RegClassInfo;
136
137 /// Position and VReg of a PHI instruction during coalescing.
138 struct PHIValPos {
139 SlotIndex SI; ///< Slot where this PHI occurs.
140 Register Reg; ///< VReg the PHI occurs in.
141 unsigned SubReg; ///< Qualifying subregister for Reg.
142 };
143
144 /// Map from debug instruction number to PHI position during coalescing.
145 DenseMap<unsigned, PHIValPos> PHIValToPos;
146 /// Index of, for each VReg, which debug instruction numbers and
147 /// corresponding PHIs are sensitive to coalescing. Each VReg may have
148 /// multiple PHI defs, at different positions.
149 DenseMap<Register, SmallVector<unsigned, 2>> RegToPHIIdx;
150
151 /// Debug variable location tracking -- for each VReg, maintain an
152 /// ordered-by-slot-index set of DBG_VALUEs, to help quick
153 /// identification of whether coalescing may change location validity.
154 using DbgValueLoc = std::pair<SlotIndex, MachineInstr *>;
155 DenseMap<Register, std::vector<DbgValueLoc>> DbgVRegToValues;
156
157 /// A LaneMask to remember on which subregister live ranges we need to call
158 /// shrinkToUses() later.
159 LaneBitmask ShrinkMask;
160
161 /// True if the main range of the currently coalesced intervals should be
162 /// checked for smaller live intervals.
163 bool ShrinkMainRange = false;
164
165 /// True if the coalescer should aggressively coalesce global copies
166 /// in favor of keeping local copies.
167 bool JoinGlobalCopies = false;
168
169 /// True if the coalescer should aggressively coalesce fall-thru
170 /// blocks exclusively containing copies.
171 bool JoinSplitEdges = false;
172
173 /// Copy instructions yet to be coalesced.
174 SmallVector<MachineInstr *, 8> WorkList;
175 SmallVector<MachineInstr *, 8> LocalWorkList;
176
177 /// Set of instruction pointers that have been erased, and
178 /// that may be present in WorkList.
179 SmallPtrSet<MachineInstr *, 8> ErasedInstrs;
180
181 /// Dead instructions that are about to be deleted.
182 SmallVector<MachineInstr *, 8> DeadDefs;
183
184 /// Virtual registers to be considered for register class inflation.
185 SmallVector<Register, 8> InflateRegs;
186
187 /// The collection of live intervals which should have been updated
188 /// immediately after rematerialiation but delayed until
189 /// lateLiveIntervalUpdate is called.
190 DenseSet<Register> ToBeUpdated;
191
192 /// Record how many times the large live interval with many valnos
193 /// has been tried to join with other live interval.
194 DenseMap<Register, unsigned long> LargeLIVisitCounter;
195
196 /// Recursively eliminate dead defs in DeadDefs.
197 void eliminateDeadDefs(LiveRangeEdit *Edit = nullptr);
198
199 /// LiveRangeEdit callback for eliminateDeadDefs().
200 void LRE_WillEraseInstruction(MachineInstr *MI) override;
201
202 /// Coalesce the LocalWorkList.
203 void coalesceLocals();
204
205 /// Join compatible live intervals
206 void joinAllIntervals();
207
208 /// Coalesce copies in the specified MBB, putting
209 /// copies that cannot yet be coalesced into WorkList.
210 void copyCoalesceInMBB(MachineBasicBlock *MBB);
211
212 /// Tries to coalesce all copies in CurrList. Returns true if any progress
213 /// was made.
214 bool copyCoalesceWorkList(MutableArrayRef<MachineInstr *> CurrList);
215
216 /// If one def has many copy like uses, and those copy uses are all
217 /// rematerialized, the live interval update needed for those
218 /// rematerializations will be delayed and done all at once instead
219 /// of being done multiple times. This is to save compile cost because
220 /// live interval update is costly.
221 void lateLiveIntervalUpdate();
222
223 /// Check if the incoming value defined by a COPY at \p SLRQ in the subrange
224 /// has no value defined in the predecessors. If the incoming value is the
225 /// same as defined by the copy itself, the value is considered undefined.
226 bool copyValueUndefInPredecessors(LiveRange &S, const MachineBasicBlock *MBB,
227 LiveQueryResult SLRQ);
228
229 /// Set necessary undef flags on subregister uses after pruning out undef
230 /// lane segments from the subrange.
231 void setUndefOnPrunedSubRegUses(LiveInterval &LI, Register Reg,
232 LaneBitmask PrunedLanes);
233
234 /// Attempt to join intervals corresponding to SrcReg/DstReg, which are the
235 /// src/dst of the copy instruction CopyMI. This returns true if the copy
236 /// was successfully coalesced away. If it is not currently possible to
237 /// coalesce this interval, but it may be possible if other things get
238 /// coalesced, then it returns true by reference in 'Again'.
239 bool joinCopy(MachineInstr *CopyMI, bool &Again,
240 SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs);
241
242 /// Attempt to join these two intervals. On failure, this
243 /// returns false. The output "SrcInt" will not have been modified, so we
244 /// can use this information below to update aliases.
245 bool joinIntervals(CoalescerPair &CP);
246
247 /// Attempt joining two virtual registers. Return true on success.
248 bool joinVirtRegs(CoalescerPair &CP);
249
250 /// If a live interval has many valnos and is coalesced with other
251 /// live intervals many times, we regard such live interval as having
252 /// high compile time cost.
253 bool isHighCostLiveInterval(LiveInterval &LI);
254
255 /// Attempt joining with a reserved physreg.
256 bool joinReservedPhysReg(CoalescerPair &CP);
257
258 /// Add the LiveRange @p ToMerge as a subregister liverange of @p LI.
259 /// Subranges in @p LI which only partially interfere with the desired
260 /// LaneMask are split as necessary. @p LaneMask are the lanes that
261 /// @p ToMerge will occupy in the coalescer register. @p LI has its subrange
262 /// lanemasks already adjusted to the coalesced register.
263 void mergeSubRangeInto(LiveInterval &LI, const LiveRange &ToMerge,
264 LaneBitmask LaneMask, CoalescerPair &CP,
265 unsigned DstIdx);
266
267 /// Join the liveranges of two subregisters. Joins @p RRange into
268 /// @p LRange, @p RRange may be invalid afterwards.
269 void joinSubRegRanges(LiveRange &LRange, LiveRange &RRange,
270 LaneBitmask LaneMask, const CoalescerPair &CP);
271
272 /// We found a non-trivially-coalescable copy. If the source value number is
273 /// defined by a copy from the destination reg see if we can merge these two
274 /// destination reg valno# into a single value number, eliminating a copy.
275 /// This returns true if an interval was modified.
276 bool adjustCopiesBackFrom(const CoalescerPair &CP, MachineInstr *CopyMI);
277
278 /// Return true if there are definitions of IntB
279 /// other than BValNo val# that can reach uses of AValno val# of IntA.
280 bool hasOtherReachingDefs(LiveInterval &IntA, LiveInterval &IntB,
281 VNInfo *AValNo, VNInfo *BValNo);
282
283 /// We found a non-trivially-coalescable copy.
284 /// If the source value number is defined by a commutable instruction and
285 /// its other operand is coalesced to the copy dest register, see if we
286 /// can transform the copy into a noop by commuting the definition.
287 /// This returns a pair of two flags:
288 /// - the first element is true if an interval was modified,
289 /// - the second element is true if the destination interval needs
290 /// to be shrunk after deleting the copy.
291 std::pair<bool, bool> removeCopyByCommutingDef(const CoalescerPair &CP,
292 MachineInstr *CopyMI);
293
294 /// We found a copy which can be moved to its less frequent predecessor.
295 bool removePartialRedundancy(const CoalescerPair &CP, MachineInstr &CopyMI);
296
297 /// If the source of a copy is defined by a
298 /// trivial computation, replace the copy by rematerialize the definition.
299 bool reMaterializeTrivialDef(const CoalescerPair &CP, MachineInstr *CopyMI,
300 bool &IsDefCopy);
301
302 /// Return true if a copy involving a physreg should be joined.
303 bool canJoinPhys(const CoalescerPair &CP);
304
305 /// Replace all defs and uses of SrcReg to DstReg and update the subregister
306 /// number if it is not zero. If DstReg is a physical register and the
307 /// existing subregister number of the def / use being updated is not zero,
308 /// make sure to set it to the correct physical subregister.
309 void updateRegDefsUses(Register SrcReg, Register DstReg, unsigned SubIdx);
310
311 /// If the given machine operand reads only undefined lanes add an undef
312 /// flag.
313 /// This can happen when undef uses were previously concealed by a copy
314 /// which we coalesced. Example:
315 /// %0:sub0<def,read-undef> = ...
316 /// %1 = COPY %0 <-- Coalescing COPY reveals undef
317 /// = use %1:sub1 <-- hidden undef use
318 void addUndefFlag(const LiveInterval &Int, SlotIndex UseIdx,
319 MachineOperand &MO, unsigned SubRegIdx);
320
321 /// Handle copies of undef values. If the undef value is an incoming
322 /// PHI value, it will convert @p CopyMI to an IMPLICIT_DEF.
323 /// Returns nullptr if @p CopyMI was not in any way eliminable. Otherwise,
324 /// it returns @p CopyMI (which could be an IMPLICIT_DEF at this point).
325 MachineInstr *eliminateUndefCopy(MachineInstr *CopyMI);
326
327 /// Check whether or not we should apply the terminal rule on the
328 /// destination (Dst) of \p Copy.
329 /// When the terminal rule applies, Copy is not profitable to
330 /// coalesce.
331 /// Dst is terminal if it has exactly one affinity (Dst, Src) and
332 /// at least one interference (Dst, Dst2). If Dst is terminal, the
333 /// terminal rule consists in checking that at least one of
334 /// interfering node, say Dst2, has an affinity of equal or greater
335 /// weight with Src.
336 /// In that case, Dst2 and Dst will not be able to be both coalesced
337 /// with Src. Since Dst2 exposes more coalescing opportunities than
338 /// Dst, we can drop \p Copy.
339 bool applyTerminalRule(const MachineInstr &Copy) const;
340
341 /// Wrapper method for \see LiveIntervals::shrinkToUses.
342 /// This method does the proper fixing of the live-ranges when the afore
343 /// mentioned method returns true.
344 void shrinkToUses(LiveInterval *LI,
345 SmallVectorImpl<MachineInstr *> *Dead = nullptr) {
346 NumShrinkToUses++;
347 if (LIS->shrinkToUses(LI, Dead)) {
348 /// Check whether or not \p LI is composed by multiple connected
349 /// components and if that is the case, fix that.
351 LIS->splitSeparateComponents(*LI, SplitLIs);
352 }
353 }
354
355 /// Wrapper Method to do all the necessary work when an Instruction is
356 /// deleted.
357 /// Optimizations should use this to make sure that deleted instructions
358 /// are always accounted for.
359 void deleteInstr(MachineInstr *MI) {
360 ErasedInstrs.insert(MI);
361 LIS->RemoveMachineInstrFromMaps(*MI);
362 MI->eraseFromParent();
363 }
364
365 /// Walk over function and initialize the DbgVRegToValues map.
366 void buildVRegToDbgValueMap(MachineFunction &MF);
367
368 /// Test whether, after merging, any DBG_VALUEs would refer to a
369 /// different value number than before merging, and whether this can
370 /// be resolved. If not, mark the DBG_VALUE as being undef.
371 void checkMergingChangesDbgValues(CoalescerPair &CP, LiveRange &LHS,
372 JoinVals &LHSVals, LiveRange &RHS,
373 JoinVals &RHSVals);
374
375 void checkMergingChangesDbgValuesImpl(Register Reg, LiveRange &OtherRange,
376 LiveRange &RegRange, JoinVals &Vals2);
377
378public:
379 // For legacy pass only.
380 RegisterCoalescer() {}
381 RegisterCoalescer &operator=(RegisterCoalescer &&Other) = default;
382
383 RegisterCoalescer(LiveIntervals *LIS, SlotIndexes *SI,
384 const MachineLoopInfo *Loops)
385 : LIS(LIS), SI(SI), Loops(Loops) {}
386
387 bool run(MachineFunction &MF);
388};
389
390class RegisterCoalescerLegacy : public MachineFunctionPass {
391public:
392 static char ID; ///< Class identification, replacement for typeinfo
393
394 RegisterCoalescerLegacy() : MachineFunctionPass(ID) {
396 }
397
398 void getAnalysisUsage(AnalysisUsage &AU) const override;
399
400 MachineFunctionProperties getClearedProperties() const override {
401 return MachineFunctionProperties().setIsSSA();
402 }
403
404 /// This is the pass entry point.
405 bool runOnMachineFunction(MachineFunction &) override;
406};
407
408} // end anonymous namespace
409
410char RegisterCoalescerLegacy::ID = 0;
411
412char &llvm::RegisterCoalescerID = RegisterCoalescerLegacy::ID;
413
414INITIALIZE_PASS_BEGIN(RegisterCoalescerLegacy, "register-coalescer",
415 "Register Coalescer", false, false)
419INITIALIZE_PASS_END(RegisterCoalescerLegacy, "register-coalescer",
420 "Register Coalescer", false, false)
421
422[[nodiscard]] static bool isMoveInstr(const TargetRegisterInfo &tri,
424 Register &Dst, unsigned &SrcSub,
425 unsigned &DstSub) {
426 if (MI->isCopy()) {
427 Dst = MI->getOperand(0).getReg();
428 DstSub = MI->getOperand(0).getSubReg();
429 Src = MI->getOperand(1).getReg();
430 SrcSub = MI->getOperand(1).getSubReg();
431 } else if (MI->isSubregToReg()) {
432 Dst = MI->getOperand(0).getReg();
433 DstSub = tri.composeSubRegIndices(MI->getOperand(0).getSubReg(),
434 MI->getOperand(3).getImm());
435 Src = MI->getOperand(2).getReg();
436 SrcSub = MI->getOperand(2).getSubReg();
437 } else
438 return false;
439 return true;
440}
441
442/// Return true if this block should be vacated by the coalescer to eliminate
443/// branches. The important cases to handle in the coalescer are critical edges
444/// split during phi elimination which contain only copies. Simple blocks that
445/// contain non-branches should also be vacated, but this can be handled by an
446/// earlier pass similar to early if-conversion.
447static bool isSplitEdge(const MachineBasicBlock *MBB) {
448 if (MBB->pred_size() != 1 || MBB->succ_size() != 1)
449 return false;
450
451 for (const auto &MI : *MBB) {
452 if (!MI.isCopyLike() && !MI.isUnconditionalBranch())
453 return false;
454 }
455 return true;
456}
457
459 SrcReg = DstReg = Register();
460 SrcIdx = DstIdx = 0;
461 NewRC = nullptr;
462 Flipped = CrossClass = false;
463
464 Register Src, Dst;
465 unsigned SrcSub = 0, DstSub = 0;
466 if (!isMoveInstr(TRI, MI, Src, Dst, SrcSub, DstSub))
467 return false;
468 Partial = SrcSub || DstSub;
469
470 // If one register is a physreg, it must be Dst.
471 if (Src.isPhysical()) {
472 if (Dst.isPhysical())
473 return false;
474 std::swap(Src, Dst);
475 std::swap(SrcSub, DstSub);
476 Flipped = true;
477 }
478
479 const MachineRegisterInfo &MRI = MI->getMF()->getRegInfo();
480 const TargetRegisterClass *SrcRC = MRI.getRegClass(Src);
481
482 if (Dst.isPhysical()) {
483 // Eliminate DstSub on a physreg.
484 if (DstSub) {
485 Dst = TRI.getSubReg(Dst, DstSub);
486 if (!Dst)
487 return false;
488 DstSub = 0;
489 }
490
491 // Eliminate SrcSub by picking a corresponding Dst superregister.
492 if (SrcSub) {
493 Dst = TRI.getMatchingSuperReg(Dst, SrcSub, SrcRC);
494 if (!Dst)
495 return false;
496 } else if (!SrcRC->contains(Dst)) {
497 return false;
498 }
499 } else {
500 // Both registers are virtual.
501 const TargetRegisterClass *DstRC = MRI.getRegClass(Dst);
502
503 // Both registers have subreg indices.
504 if (SrcSub && DstSub) {
505 // Copies between different sub-registers are never coalescable.
506 if (Src == Dst && SrcSub != DstSub)
507 return false;
508
509 NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
510 DstIdx);
511 if (!NewRC)
512 return false;
513 } else if (DstSub) {
514 // SrcReg will be merged with a sub-register of DstReg.
515 SrcIdx = DstSub;
516 NewRC = TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
517 } else if (SrcSub) {
518 // DstReg will be merged with a sub-register of SrcReg.
519 DstIdx = SrcSub;
520 NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
521 } else {
522 // This is a straight copy without sub-registers.
523 NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
524 }
525
526 // The combined constraint may be impossible to satisfy.
527 if (!NewRC)
528 return false;
529
530 // Prefer SrcReg to be a sub-register of DstReg.
531 // FIXME: Coalescer should support subregs symmetrically.
532 if (DstIdx && !SrcIdx) {
533 std::swap(Src, Dst);
534 std::swap(SrcIdx, DstIdx);
535 Flipped = !Flipped;
536 }
537
538 CrossClass = NewRC != DstRC || NewRC != SrcRC;
539 }
540 // Check our invariants
541 assert(Src.isVirtual() && "Src must be virtual");
542 assert(!(Dst.isPhysical() && DstSub) && "Cannot have a physical SubIdx");
543 SrcReg = Src;
544 DstReg = Dst;
545 return true;
546}
547
549 if (DstReg.isPhysical())
550 return false;
551 std::swap(SrcReg, DstReg);
552 std::swap(SrcIdx, DstIdx);
553 Flipped = !Flipped;
554 return true;
555}
556
558 if (!MI)
559 return false;
560 Register Src, Dst;
561 unsigned SrcSub = 0, DstSub = 0;
562 if (!isMoveInstr(TRI, MI, Src, Dst, SrcSub, DstSub))
563 return false;
564
565 // Find the virtual register that is SrcReg.
566 if (Dst == SrcReg) {
567 std::swap(Src, Dst);
568 std::swap(SrcSub, DstSub);
569 } else if (Src != SrcReg) {
570 return false;
571 }
572
573 // Now check that Dst matches DstReg.
574 if (DstReg.isPhysical()) {
575 if (!Dst.isPhysical())
576 return false;
577 assert(!DstIdx && !SrcIdx && "Inconsistent CoalescerPair state.");
578 // DstSub could be set for a physreg from INSERT_SUBREG.
579 if (DstSub)
580 Dst = TRI.getSubReg(Dst, DstSub);
581 // Full copy of Src.
582 if (!SrcSub)
583 return DstReg == Dst;
584 // This is a partial register copy. Check that the parts match.
585 return Register(TRI.getSubReg(DstReg, SrcSub)) == Dst;
586 } else {
587 // DstReg is virtual.
588 if (DstReg != Dst)
589 return false;
590 // Registers match, do the subregisters line up?
591 return TRI.composeSubRegIndices(SrcIdx, SrcSub) ==
592 TRI.composeSubRegIndices(DstIdx, DstSub);
593 }
594}
595
596void RegisterCoalescerLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
597 AU.setPreservesCFG();
606}
607
608void RegisterCoalescer::eliminateDeadDefs(LiveRangeEdit *Edit) {
609 if (Edit) {
610 Edit->eliminateDeadDefs(DeadDefs);
611 return;
612 }
614 LiveRangeEdit(nullptr, NewRegs, *MF, *LIS, nullptr, this)
615 .eliminateDeadDefs(DeadDefs);
616}
617
618void RegisterCoalescer::LRE_WillEraseInstruction(MachineInstr *MI) {
619 // MI may be in WorkList. Make sure we don't visit it.
620 ErasedInstrs.insert(MI);
621}
622
623bool RegisterCoalescer::adjustCopiesBackFrom(const CoalescerPair &CP,
624 MachineInstr *CopyMI) {
625 assert(!CP.isPartial() && "This doesn't work for partial copies.");
626 assert(!CP.isPhys() && "This doesn't work for physreg copies.");
627
628 LiveInterval &IntA =
629 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
630 LiveInterval &IntB =
631 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
632 SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI).getRegSlot();
633
634 // We have a non-trivially-coalescable copy with IntA being the source and
635 // IntB being the dest, thus this defines a value number in IntB. If the
636 // source value number (in IntA) is defined by a copy from B, see if we can
637 // merge these two pieces of B into a single value number, eliminating a copy.
638 // For example:
639 //
640 // A3 = B0
641 // ...
642 // B1 = A3 <- this copy
643 //
644 // In this case, B0 can be extended to where the B1 copy lives, allowing the
645 // B1 value number to be replaced with B0 (which simplifies the B
646 // liveinterval).
647
648 // BValNo is a value number in B that is defined by a copy from A. 'B1' in
649 // the example above.
651 if (BS == IntB.end())
652 return false;
653 VNInfo *BValNo = BS->valno;
654
655 // Get the location that B is defined at. Two options: either this value has
656 // an unknown definition point or it is defined at CopyIdx. If unknown, we
657 // can't process it.
658 if (BValNo->def != CopyIdx)
659 return false;
660
661 // AValNo is the value number in A that defines the copy, A3 in the example.
662 SlotIndex CopyUseIdx = CopyIdx.getRegSlot(true);
663 LiveInterval::iterator AS = IntA.FindSegmentContaining(CopyUseIdx);
664 // The live segment might not exist after fun with physreg coalescing.
665 if (AS == IntA.end())
666 return false;
667 VNInfo *AValNo = AS->valno;
668
669 // If AValNo is defined as a copy from IntB, we can potentially process this.
670 // Get the instruction that defines this value number.
671 MachineInstr *ACopyMI = LIS->getInstructionFromIndex(AValNo->def);
672 // Don't allow any partial copies, even if isCoalescable() allows them.
673 if (!CP.isCoalescable(ACopyMI) || !ACopyMI->isFullCopy())
674 return false;
675
676 // Get the Segment in IntB that this value number starts with.
678 IntB.FindSegmentContaining(AValNo->def.getPrevSlot());
679 if (ValS == IntB.end())
680 return false;
681
682 // Make sure that the end of the live segment is inside the same block as
683 // CopyMI.
684 MachineInstr *ValSEndInst =
685 LIS->getInstructionFromIndex(ValS->end.getPrevSlot());
686 if (!ValSEndInst || ValSEndInst->getParent() != CopyMI->getParent())
687 return false;
688
689 // Okay, we now know that ValS ends in the same block that the CopyMI
690 // live-range starts. If there are no intervening live segments between them
691 // in IntB, we can merge them.
692 if (ValS + 1 != BS)
693 return false;
694
695 LLVM_DEBUG(dbgs() << "Extending: " << printReg(IntB.reg(), TRI));
696
697 SlotIndex FillerStart = ValS->end, FillerEnd = BS->start;
698 // We are about to delete CopyMI, so need to remove it as the 'instruction
699 // that defines this value #'. Update the valnum with the new defining
700 // instruction #.
701 BValNo->def = FillerStart;
702
703 // Okay, we can merge them. We need to insert a new liverange:
704 // [ValS.end, BS.begin) of either value number, then we merge the
705 // two value numbers.
706 IntB.addSegment(LiveInterval::Segment(FillerStart, FillerEnd, BValNo));
707
708 // Okay, merge "B1" into the same value number as "B0".
709 if (BValNo != ValS->valno)
710 IntB.MergeValueNumberInto(BValNo, ValS->valno);
711
712 // Do the same for the subregister segments.
713 for (LiveInterval::SubRange &S : IntB.subranges()) {
714 // Check for SubRange Segments of the form [1234r,1234d:0) which can be
715 // removed to prevent creating bogus SubRange Segments.
716 LiveInterval::iterator SS = S.FindSegmentContaining(CopyIdx);
717 if (SS != S.end() && SlotIndex::isSameInstr(SS->start, SS->end)) {
718 S.removeSegment(*SS, true);
719 continue;
720 }
721 // The subrange may have ended before FillerStart. If so, extend it.
722 if (!S.getVNInfoAt(FillerStart)) {
723 SlotIndex BBStart =
724 LIS->getMBBStartIdx(LIS->getMBBFromIndex(FillerStart));
725 S.extendInBlock(BBStart, FillerStart);
726 }
727 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
728 S.addSegment(LiveInterval::Segment(FillerStart, FillerEnd, SubBValNo));
729 VNInfo *SubValSNo = S.getVNInfoAt(AValNo->def.getPrevSlot());
730 if (SubBValNo != SubValSNo)
731 S.MergeValueNumberInto(SubBValNo, SubValSNo);
732 }
733
734 LLVM_DEBUG(dbgs() << " result = " << IntB << '\n');
735
736 // If the source instruction was killing the source register before the
737 // merge, unset the isKill marker given the live range has been extended.
738 int UIdx =
739 ValSEndInst->findRegisterUseOperandIdx(IntB.reg(), /*TRI=*/nullptr, true);
740 if (UIdx != -1) {
741 ValSEndInst->getOperand(UIdx).setIsKill(false);
742 }
743
744 // Rewrite the copy.
745 CopyMI->substituteRegister(IntA.reg(), IntB.reg(), 0, *TRI);
746 // If the copy instruction was killing the destination register or any
747 // subrange before the merge trim the live range.
748 bool RecomputeLiveRange = AS->end == CopyIdx;
749 if (!RecomputeLiveRange) {
750 for (LiveInterval::SubRange &S : IntA.subranges()) {
751 LiveInterval::iterator SS = S.FindSegmentContaining(CopyUseIdx);
752 if (SS != S.end() && SS->end == CopyIdx) {
753 RecomputeLiveRange = true;
754 break;
755 }
756 }
757 }
758 if (RecomputeLiveRange)
759 shrinkToUses(&IntA);
760
761 ++numExtends;
762 return true;
763}
764
765bool RegisterCoalescer::hasOtherReachingDefs(LiveInterval &IntA,
766 LiveInterval &IntB, VNInfo *AValNo,
767 VNInfo *BValNo) {
768 // If AValNo has PHI kills, conservatively assume that IntB defs can reach
769 // the PHI values.
770 if (LIS->hasPHIKill(IntA, AValNo))
771 return true;
772
773 for (LiveRange::Segment &ASeg : IntA.segments) {
774 if (ASeg.valno != AValNo)
775 continue;
777 if (BI != IntB.begin())
778 --BI;
779 for (; BI != IntB.end() && ASeg.end >= BI->start; ++BI) {
780 if (BI->valno == BValNo)
781 continue;
782 if (BI->start <= ASeg.start && BI->end > ASeg.start)
783 return true;
784 if (BI->start > ASeg.start && BI->start < ASeg.end)
785 return true;
786 }
787 }
788 return false;
789}
790
791/// Copy segments with value number @p SrcValNo from liverange @p Src to live
792/// range @Dst and use value number @p DstValNo there.
793static std::pair<bool, bool> addSegmentsWithValNo(LiveRange &Dst,
794 VNInfo *DstValNo,
795 const LiveRange &Src,
796 const VNInfo *SrcValNo) {
797 bool Changed = false;
798 bool MergedWithDead = false;
799 for (const LiveRange::Segment &S : Src.segments) {
800 if (S.valno != SrcValNo)
801 continue;
802 // This is adding a segment from Src that ends in a copy that is about
803 // to be removed. This segment is going to be merged with a pre-existing
804 // segment in Dst. This works, except in cases when the corresponding
805 // segment in Dst is dead. For example: adding [192r,208r:1) from Src
806 // to [208r,208d:1) in Dst would create [192r,208d:1) in Dst.
807 // Recognized such cases, so that the segments can be shrunk.
808 LiveRange::Segment Added = LiveRange::Segment(S.start, S.end, DstValNo);
809 LiveRange::Segment &Merged = *Dst.addSegment(Added);
810 if (Merged.end.isDead())
811 MergedWithDead = true;
812 Changed = true;
813 }
814 return std::make_pair(Changed, MergedWithDead);
815}
816
817std::pair<bool, bool>
818RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
819 MachineInstr *CopyMI) {
820 assert(!CP.isPhys());
821
822 LiveInterval &IntA =
823 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
824 LiveInterval &IntB =
825 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
826
827 // We found a non-trivially-coalescable copy with IntA being the source and
828 // IntB being the dest, thus this defines a value number in IntB. If the
829 // source value number (in IntA) is defined by a commutable instruction and
830 // its other operand is coalesced to the copy dest register, see if we can
831 // transform the copy into a noop by commuting the definition. For example,
832 //
833 // A3 = op A2 killed B0
834 // ...
835 // B1 = A3 <- this copy
836 // ...
837 // = op A3 <- more uses
838 //
839 // ==>
840 //
841 // B2 = op B0 killed A2
842 // ...
843 // B1 = B2 <- now an identity copy
844 // ...
845 // = op B2 <- more uses
846
847 // BValNo is a value number in B that is defined by a copy from A. 'B1' in
848 // the example above.
849 SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI).getRegSlot();
850 VNInfo *BValNo = IntB.getVNInfoAt(CopyIdx);
851 assert(BValNo != nullptr && BValNo->def == CopyIdx);
852
853 // AValNo is the value number in A that defines the copy, A3 in the example.
854 VNInfo *AValNo = IntA.getVNInfoAt(CopyIdx.getRegSlot(true));
855 assert(AValNo && !AValNo->isUnused() && "COPY source not live");
856 if (AValNo->isPHIDef())
857 return {false, false};
859 if (!DefMI)
860 return {false, false};
861 if (!DefMI->isCommutable())
862 return {false, false};
863 // If DefMI is a two-address instruction then commuting it will change the
864 // destination register.
865 int DefIdx = DefMI->findRegisterDefOperandIdx(IntA.reg(), /*TRI=*/nullptr);
866 assert(DefIdx != -1);
867 unsigned UseOpIdx;
868 if (!DefMI->isRegTiedToUseOperand(DefIdx, &UseOpIdx))
869 return {false, false};
870
871 // FIXME: The code below tries to commute 'UseOpIdx' operand with some other
872 // commutable operand which is expressed by 'CommuteAnyOperandIndex'value
873 // passed to the method. That _other_ operand is chosen by
874 // the findCommutedOpIndices() method.
875 //
876 // That is obviously an area for improvement in case of instructions having
877 // more than 2 operands. For example, if some instruction has 3 commutable
878 // operands then all possible variants (i.e. op#1<->op#2, op#1<->op#3,
879 // op#2<->op#3) of commute transformation should be considered/tried here.
880 unsigned NewDstIdx = TargetInstrInfo::CommuteAnyOperandIndex;
881 if (!TII->findCommutedOpIndices(*DefMI, UseOpIdx, NewDstIdx))
882 return {false, false};
883
884 MachineOperand &NewDstMO = DefMI->getOperand(NewDstIdx);
885 Register NewReg = NewDstMO.getReg();
886 if (NewReg != IntB.reg() || !IntB.Query(AValNo->def).isKill())
887 return {false, false};
888
889 // Make sure there are no other definitions of IntB that would reach the
890 // uses which the new definition can reach.
891 if (hasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
892 return {false, false};
893
894 // If some of the uses of IntA.reg is already coalesced away, return false.
895 // It's not possible to determine whether it's safe to perform the coalescing.
896 for (MachineOperand &MO : MRI->use_nodbg_operands(IntA.reg())) {
897 MachineInstr *UseMI = MO.getParent();
898 unsigned OpNo = &MO - &UseMI->getOperand(0);
899 SlotIndex UseIdx = LIS->getInstructionIndex(*UseMI);
901 if (US == IntA.end() || US->valno != AValNo)
902 continue;
903 // If this use is tied to a def, we can't rewrite the register.
904 if (UseMI->isRegTiedToDefOperand(OpNo))
905 return {false, false};
906 }
907
908 LLVM_DEBUG(dbgs() << "\tremoveCopyByCommutingDef: " << AValNo->def << '\t'
909 << *DefMI);
910
911 // At this point we have decided that it is legal to do this
912 // transformation. Start by commuting the instruction.
914 MachineInstr *NewMI =
915 TII->commuteInstruction(*DefMI, false, UseOpIdx, NewDstIdx);
916 if (!NewMI)
917 return {false, false};
918 if (IntA.reg().isVirtual() && IntB.reg().isVirtual() &&
919 !MRI->constrainRegClass(IntB.reg(), MRI->getRegClass(IntA.reg())))
920 return {false, false};
921 if (NewMI != DefMI) {
922 LIS->ReplaceMachineInstrInMaps(*DefMI, *NewMI);
924 MBB->insert(Pos, NewMI);
925 MBB->erase(DefMI);
926 }
927
928 // If ALR and BLR overlaps and end of BLR extends beyond end of ALR, e.g.
929 // A = or A, B
930 // ...
931 // B = A
932 // ...
933 // C = killed A
934 // ...
935 // = B
936
937 // Update uses of IntA of the specific Val# with IntB.
938 for (MachineOperand &UseMO :
939 llvm::make_early_inc_range(MRI->use_operands(IntA.reg()))) {
940 if (UseMO.isUndef())
941 continue;
942 MachineInstr *UseMI = UseMO.getParent();
943 if (UseMI->isDebugInstr()) {
944 // FIXME These don't have an instruction index. Not clear we have enough
945 // info to decide whether to do this replacement or not. For now do it.
946 UseMO.setReg(NewReg);
947 continue;
948 }
949 SlotIndex UseIdx = LIS->getInstructionIndex(*UseMI).getRegSlot(true);
951 assert(US != IntA.end() && "Use must be live");
952 if (US->valno != AValNo)
953 continue;
954 // Kill flags are no longer accurate. They are recomputed after RA.
955 UseMO.setIsKill(false);
956 if (NewReg.isPhysical())
957 UseMO.substPhysReg(NewReg, *TRI);
958 else
959 UseMO.setReg(NewReg);
960 if (UseMI == CopyMI)
961 continue;
962 if (!UseMI->isCopy())
963 continue;
964 if (UseMI->getOperand(0).getReg() != IntB.reg() ||
966 continue;
967
968 // This copy will become a noop. If it's defining a new val#, merge it into
969 // BValNo.
970 SlotIndex DefIdx = UseIdx.getRegSlot();
971 VNInfo *DVNI = IntB.getVNInfoAt(DefIdx);
972 if (!DVNI)
973 continue;
974 LLVM_DEBUG(dbgs() << "\t\tnoop: " << DefIdx << '\t' << *UseMI);
975 assert(DVNI->def == DefIdx);
976 BValNo = IntB.MergeValueNumberInto(DVNI, BValNo);
977 for (LiveInterval::SubRange &S : IntB.subranges()) {
978 VNInfo *SubDVNI = S.getVNInfoAt(DefIdx);
979 if (!SubDVNI)
980 continue;
981 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
982 assert(SubBValNo->def == CopyIdx);
983 S.MergeValueNumberInto(SubDVNI, SubBValNo);
984 }
985
986 deleteInstr(UseMI);
987 }
988
989 // Extend BValNo by merging in IntA live segments of AValNo. Val# definition
990 // is updated.
991 bool ShrinkB = false;
993 if (IntA.hasSubRanges() || IntB.hasSubRanges()) {
994 if (!IntA.hasSubRanges()) {
995 LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntA.reg());
996 IntA.createSubRangeFrom(Allocator, Mask, IntA);
997 } else if (!IntB.hasSubRanges()) {
998 LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntB.reg());
999 IntB.createSubRangeFrom(Allocator, Mask, IntB);
1000 }
1001 SlotIndex AIdx = CopyIdx.getRegSlot(true);
1002 LaneBitmask MaskA;
1003 const SlotIndexes &Indexes = *LIS->getSlotIndexes();
1004 for (LiveInterval::SubRange &SA : IntA.subranges()) {
1005 VNInfo *ASubValNo = SA.getVNInfoAt(AIdx);
1006 // Even if we are dealing with a full copy, some lanes can
1007 // still be undefined.
1008 // E.g.,
1009 // undef A.subLow = ...
1010 // B = COPY A <== A.subHigh is undefined here and does
1011 // not have a value number.
1012 if (!ASubValNo)
1013 continue;
1014 MaskA |= SA.LaneMask;
1015
1016 IntB.refineSubRanges(
1017 Allocator, SA.LaneMask,
1018 [&Allocator, &SA, CopyIdx, ASubValNo,
1019 &ShrinkB](LiveInterval::SubRange &SR) {
1020 VNInfo *BSubValNo = SR.empty() ? SR.getNextValue(CopyIdx, Allocator)
1021 : SR.getVNInfoAt(CopyIdx);
1022 assert(BSubValNo != nullptr);
1023 auto P = addSegmentsWithValNo(SR, BSubValNo, SA, ASubValNo);
1024 ShrinkB |= P.second;
1025 if (P.first)
1026 BSubValNo->def = ASubValNo->def;
1027 },
1028 Indexes, *TRI);
1029 }
1030 // Go over all subranges of IntB that have not been covered by IntA,
1031 // and delete the segments starting at CopyIdx. This can happen if
1032 // IntA has undef lanes that are defined in IntB.
1033 for (LiveInterval::SubRange &SB : IntB.subranges()) {
1034 if ((SB.LaneMask & MaskA).any())
1035 continue;
1036 if (LiveRange::Segment *S = SB.getSegmentContaining(CopyIdx))
1037 if (S->start.getBaseIndex() == CopyIdx.getBaseIndex())
1038 SB.removeSegment(*S, true);
1039 }
1040 }
1041
1042 BValNo->def = AValNo->def;
1043 auto P = addSegmentsWithValNo(IntB, BValNo, IntA, AValNo);
1044 ShrinkB |= P.second;
1045 LLVM_DEBUG(dbgs() << "\t\textended: " << IntB << '\n');
1046
1047 LIS->removeVRegDefAt(IntA, AValNo->def);
1048
1049 LLVM_DEBUG(dbgs() << "\t\ttrimmed: " << IntA << '\n');
1050 ++numCommutes;
1051 return {true, ShrinkB};
1052}
1053
1054/// For copy B = A in BB2, if A is defined by A = B in BB0 which is a
1055/// predecessor of BB2, and if B is not redefined on the way from A = B
1056/// in BB0 to B = A in BB2, B = A in BB2 is partially redundant if the
1057/// execution goes through the path from BB0 to BB2. We may move B = A
1058/// to the predecessor without such reversed copy.
1059/// So we will transform the program from:
1060/// BB0:
1061/// A = B; BB1:
1062/// ... ...
1063/// / \ /
1064/// BB2:
1065/// ...
1066/// B = A;
1067///
1068/// to:
1069///
1070/// BB0: BB1:
1071/// A = B; ...
1072/// ... B = A;
1073/// / \ /
1074/// BB2:
1075/// ...
1076///
1077/// A special case is when BB0 and BB2 are the same BB which is the only
1078/// BB in a loop:
1079/// BB1:
1080/// ...
1081/// BB0/BB2: ----
1082/// B = A; |
1083/// ... |
1084/// A = B; |
1085/// |-------
1086/// |
1087/// We may hoist B = A from BB0/BB2 to BB1.
1088///
1089/// The major preconditions for correctness to remove such partial
1090/// redundancy include:
1091/// 1. A in B = A in BB2 is defined by a PHI in BB2, and one operand of
1092/// the PHI is defined by the reversed copy A = B in BB0.
1093/// 2. No B is referenced from the start of BB2 to B = A.
1094/// 3. No B is defined from A = B to the end of BB0.
1095/// 4. BB1 has only one successor.
1096///
1097/// 2 and 4 implicitly ensure B is not live at the end of BB1.
1098/// 4 guarantees BB2 is hotter than BB1, so we can only move a copy to a
1099/// colder place, which not only prevent endless loop, but also make sure
1100/// the movement of copy is beneficial.
1101bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP,
1102 MachineInstr &CopyMI) {
1103 assert(!CP.isPhys());
1104 if (!CopyMI.isFullCopy())
1105 return false;
1106
1107 MachineBasicBlock &MBB = *CopyMI.getParent();
1108 // If this block is the target of an invoke/inlineasm_br, moving the copy into
1109 // the predecessor is tricker, and we don't handle it.
1111 return false;
1112
1113 if (MBB.pred_size() != 2)
1114 return false;
1115
1116 LiveInterval &IntA =
1117 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
1118 LiveInterval &IntB =
1119 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
1120
1121 // A is defined by PHI at the entry of MBB.
1122 SlotIndex CopyIdx = LIS->getInstructionIndex(CopyMI).getRegSlot(true);
1123 VNInfo *AValNo = IntA.getVNInfoAt(CopyIdx);
1124 assert(AValNo && !AValNo->isUnused() && "COPY source not live");
1125 if (!AValNo->isPHIDef())
1126 return false;
1127
1128 // No B is referenced before CopyMI in MBB.
1129 if (IntB.overlaps(LIS->getMBBStartIdx(&MBB), CopyIdx))
1130 return false;
1131
1132 // MBB has two predecessors: one contains A = B so no copy will be inserted
1133 // for it. The other one will have a copy moved from MBB.
1134 bool FoundReverseCopy = false;
1135 MachineBasicBlock *CopyLeftBB = nullptr;
1136 for (MachineBasicBlock *Pred : MBB.predecessors()) {
1137 VNInfo *PVal = IntA.getVNInfoBefore(LIS->getMBBEndIdx(Pred));
1139 if (!DefMI || !DefMI->isFullCopy()) {
1140 CopyLeftBB = Pred;
1141 continue;
1142 }
1143 // Check DefMI is a reverse copy and it is in BB Pred.
1144 if (DefMI->getOperand(0).getReg() != IntA.reg() ||
1145 DefMI->getOperand(1).getReg() != IntB.reg() ||
1146 DefMI->getParent() != Pred) {
1147 CopyLeftBB = Pred;
1148 continue;
1149 }
1150 // If there is any other def of B after DefMI and before the end of Pred,
1151 // we need to keep the copy of B = A at the end of Pred if we remove
1152 // B = A from MBB.
1153 bool ValB_Changed = false;
1154 for (auto *VNI : IntB.valnos) {
1155 if (VNI->isUnused())
1156 continue;
1157 if (PVal->def < VNI->def && VNI->def < LIS->getMBBEndIdx(Pred)) {
1158 ValB_Changed = true;
1159 break;
1160 }
1161 }
1162 if (ValB_Changed) {
1163 CopyLeftBB = Pred;
1164 continue;
1165 }
1166 FoundReverseCopy = true;
1167 }
1168
1169 // If no reverse copy is found in predecessors, nothing to do.
1170 if (!FoundReverseCopy)
1171 return false;
1172
1173 // If CopyLeftBB is nullptr, it means every predecessor of MBB contains
1174 // reverse copy, CopyMI can be removed trivially if only IntA/IntB is updated.
1175 // If CopyLeftBB is not nullptr, move CopyMI from MBB to CopyLeftBB and
1176 // update IntA/IntB.
1177 //
1178 // If CopyLeftBB is not nullptr, ensure CopyLeftBB has a single succ so
1179 // MBB is hotter than CopyLeftBB.
1180 if (CopyLeftBB && CopyLeftBB->succ_size() > 1)
1181 return false;
1182
1183 // Now (almost sure it's) ok to move copy.
1184 if (CopyLeftBB) {
1185 // Position in CopyLeftBB where we should insert new copy.
1186 auto InsPos = CopyLeftBB->getFirstTerminator();
1187
1188 // Make sure that B isn't referenced in the terminators (if any) at the end
1189 // of the predecessor since we're about to insert a new definition of B
1190 // before them.
1191 if (InsPos != CopyLeftBB->end()) {
1192 SlotIndex InsPosIdx = LIS->getInstructionIndex(*InsPos).getRegSlot(true);
1193 if (IntB.overlaps(InsPosIdx, LIS->getMBBEndIdx(CopyLeftBB)))
1194 return false;
1195 }
1196
1197 LLVM_DEBUG(dbgs() << "\tremovePartialRedundancy: Move the copy to "
1198 << printMBBReference(*CopyLeftBB) << '\t' << CopyMI);
1199
1200 // Insert new copy to CopyLeftBB.
1201 MachineInstr *NewCopyMI = BuildMI(*CopyLeftBB, InsPos, CopyMI.getDebugLoc(),
1202 TII->get(TargetOpcode::COPY), IntB.reg())
1203 .addReg(IntA.reg());
1204 SlotIndex NewCopyIdx =
1205 LIS->InsertMachineInstrInMaps(*NewCopyMI).getRegSlot();
1206 IntB.createDeadDef(NewCopyIdx, LIS->getVNInfoAllocator());
1207 for (LiveInterval::SubRange &SR : IntB.subranges())
1208 SR.createDeadDef(NewCopyIdx, LIS->getVNInfoAllocator());
1209
1210 // If the newly created Instruction has an address of an instruction that
1211 // was deleted before (object recycled by the allocator) it needs to be
1212 // removed from the deleted list.
1213 ErasedInstrs.erase(NewCopyMI);
1214 } else {
1215 LLVM_DEBUG(dbgs() << "\tremovePartialRedundancy: Remove the copy from "
1216 << printMBBReference(MBB) << '\t' << CopyMI);
1217 }
1218
1219 const bool IsUndefCopy = CopyMI.getOperand(1).isUndef();
1220
1221 // Remove CopyMI.
1222 // Note: This is fine to remove the copy before updating the live-ranges.
1223 // While updating the live-ranges, we only look at slot indices and
1224 // never go back to the instruction.
1225 // Mark instructions as deleted.
1226 deleteInstr(&CopyMI);
1227
1228 // Update the liveness.
1229 SmallVector<SlotIndex, 8> EndPoints;
1230 VNInfo *BValNo = IntB.Query(CopyIdx).valueOutOrDead();
1231 LIS->pruneValue(*static_cast<LiveRange *>(&IntB), CopyIdx.getRegSlot(),
1232 &EndPoints);
1233 BValNo->markUnused();
1234
1235 if (IsUndefCopy) {
1236 // We're introducing an undef phi def, and need to set undef on any users of
1237 // the previously local def to avoid artifically extending the lifetime
1238 // through the block.
1239 for (MachineOperand &MO : MRI->use_nodbg_operands(IntB.reg())) {
1240 const MachineInstr &MI = *MO.getParent();
1241 SlotIndex UseIdx = LIS->getInstructionIndex(MI);
1242 if (!IntB.liveAt(UseIdx))
1243 MO.setIsUndef(true);
1244 }
1245 }
1246
1247 // Extend IntB to the EndPoints of its original live interval.
1248 LIS->extendToIndices(IntB, EndPoints);
1249
1250 // Now, do the same for its subranges.
1251 for (LiveInterval::SubRange &SR : IntB.subranges()) {
1252 EndPoints.clear();
1253 VNInfo *BValNo = SR.Query(CopyIdx).valueOutOrDead();
1254 assert(BValNo && "All sublanes should be live");
1255 LIS->pruneValue(SR, CopyIdx.getRegSlot(), &EndPoints);
1256 BValNo->markUnused();
1257 // We can have a situation where the result of the original copy is live,
1258 // but is immediately dead in this subrange, e.g. [336r,336d:0). That makes
1259 // the copy appear as an endpoint from pruneValue(), but we don't want it
1260 // to because the copy has been removed. We can go ahead and remove that
1261 // endpoint; there is no other situation here that there could be a use at
1262 // the same place as we know that the copy is a full copy.
1263 for (unsigned I = 0; I != EndPoints.size();) {
1264 if (SlotIndex::isSameInstr(EndPoints[I], CopyIdx)) {
1265 EndPoints[I] = EndPoints.back();
1266 EndPoints.pop_back();
1267 continue;
1268 }
1269 ++I;
1270 }
1272 IntB.computeSubRangeUndefs(Undefs, SR.LaneMask, *MRI,
1273 *LIS->getSlotIndexes());
1274 LIS->extendToIndices(SR, EndPoints, Undefs);
1275 }
1276 // If any dead defs were extended, truncate them.
1277 shrinkToUses(&IntB);
1278
1279 // Finally, update the live-range of IntA.
1280 shrinkToUses(&IntA);
1281 return true;
1282}
1283
1284/// Returns true if @p MI defines the full vreg @p Reg, as opposed to just
1285/// defining a subregister.
1287 assert(!Reg.isPhysical() && "This code cannot handle physreg aliasing");
1288
1289 for (const MachineOperand &Op : MI.all_defs()) {
1290 if (Op.getReg() != Reg)
1291 continue;
1292 // Return true if we define the full register or don't care about the value
1293 // inside other subregisters.
1294 if (Op.getSubReg() == 0 || Op.isUndef())
1295 return true;
1296 }
1297 return false;
1298}
1299
1300bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1301 MachineInstr *CopyMI,
1302 bool &IsDefCopy) {
1303 IsDefCopy = false;
1304 Register SrcReg = CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg();
1305 unsigned SrcIdx = CP.isFlipped() ? CP.getDstIdx() : CP.getSrcIdx();
1306 Register DstReg = CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg();
1307 unsigned DstIdx = CP.isFlipped() ? CP.getSrcIdx() : CP.getDstIdx();
1308 if (SrcReg.isPhysical())
1309 return false;
1310
1311 LiveInterval &SrcInt = LIS->getInterval(SrcReg);
1312 SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI);
1313 VNInfo *ValNo = SrcInt.Query(CopyIdx).valueIn();
1314 if (!ValNo)
1315 return false;
1316 if (ValNo->isPHIDef() || ValNo->isUnused())
1317 return false;
1319 if (!DefMI)
1320 return false;
1321 if (DefMI->isCopyLike()) {
1322 IsDefCopy = true;
1323 return false;
1324 }
1325 if (!TII->isAsCheapAsAMove(*DefMI))
1326 return false;
1327
1328 if (!TII->isTriviallyReMaterializable(*DefMI))
1329 return false;
1330
1331 if (!definesFullReg(*DefMI, SrcReg))
1332 return false;
1333 bool SawStore = false;
1334 if (!DefMI->isSafeToMove(SawStore))
1335 return false;
1336 const MCInstrDesc &MCID = DefMI->getDesc();
1337 if (MCID.getNumDefs() != 1)
1338 return false;
1339
1340 // If both SrcIdx and DstIdx are set, correct rematerialization would widen
1341 // the register substantially (beyond both source and dest size). This is bad
1342 // for performance since it can cascade through a function, introducing many
1343 // extra spills and fills (e.g. ARM can easily end up copying QQQQPR registers
1344 // around after a few subreg copies).
1345 if (SrcIdx && DstIdx)
1346 return false;
1347
1348 // Only support subregister destinations when the def is read-undef.
1349 MachineOperand &DstOperand = CopyMI->getOperand(0);
1350 Register CopyDstReg = DstOperand.getReg();
1351 if (DstOperand.getSubReg() && !DstOperand.isUndef())
1352 return false;
1353
1354 // In the physical register case, checking that the def is read-undef is not
1355 // enough. We're widening the def and need to avoid clobbering other live
1356 // values in the unused register pieces.
1357 //
1358 // TODO: Targets may support rewriting the rematerialized instruction to only
1359 // touch relevant lanes, in which case we don't need any liveness check.
1360 if (CopyDstReg.isPhysical() && CP.isPartial()) {
1361 for (MCRegUnit Unit : TRI->regunits(DstReg)) {
1362 // Ignore the register units we are writing anyway.
1363 if (is_contained(TRI->regunits(CopyDstReg), Unit))
1364 continue;
1365
1366 // Check if the other lanes we are defining are live at the
1367 // rematerialization point.
1368 LiveRange &LR = LIS->getRegUnit(Unit);
1369 if (LR.liveAt(CopyIdx))
1370 return false;
1371 }
1372 }
1373
1374 const unsigned DefSubIdx = DefMI->getOperand(0).getSubReg();
1375 const TargetRegisterClass *DefRC = TII->getRegClass(MCID, 0, TRI);
1376 if (!DefMI->isImplicitDef()) {
1377 if (DstReg.isPhysical()) {
1378 Register NewDstReg = DstReg;
1379
1380 unsigned NewDstIdx = TRI->composeSubRegIndices(CP.getSrcIdx(), DefSubIdx);
1381 if (NewDstIdx)
1382 NewDstReg = TRI->getSubReg(DstReg, NewDstIdx);
1383
1384 // Finally, make sure that the physical subregister that will be
1385 // constructed later is permitted for the instruction.
1386 if (!DefRC->contains(NewDstReg))
1387 return false;
1388 } else {
1389 // Theoretically, some stack frame reference could exist. Just make sure
1390 // it hasn't actually happened.
1391 assert(DstReg.isVirtual() &&
1392 "Only expect to deal with virtual or physical registers");
1393 }
1394 }
1395
1397 LiveRangeEdit Edit(&SrcInt, NewRegs, *MF, *LIS, nullptr, this);
1398 SlotIndex DefIdx = LIS->getInstructionIndex(*DefMI);
1399 if (!Edit.allUsesAvailableAt(DefMI, DefIdx, CopyIdx))
1400 return false;
1401
1402 DebugLoc DL = CopyMI->getDebugLoc();
1403 MachineBasicBlock *MBB = CopyMI->getParent();
1405 std::next(MachineBasicBlock::iterator(CopyMI));
1406 LiveRangeEdit::Remat RM(ValNo);
1407 RM.OrigMI = DefMI;
1408 Edit.rematerializeAt(*MBB, MII, DstReg, RM, *TRI, false, SrcIdx, CopyMI);
1409 MachineInstr &NewMI = *std::prev(MII);
1410 NewMI.setDebugLoc(DL);
1411
1412 // In a situation like the following:
1413 // %0:subreg = instr ; DefMI, subreg = DstIdx
1414 // %1 = copy %0:subreg ; CopyMI, SrcIdx = 0
1415 // instead of widening %1 to the register class of %0 simply do:
1416 // %1 = instr
1417 const TargetRegisterClass *NewRC = CP.getNewRC();
1418 if (DstIdx != 0) {
1419 MachineOperand &DefMO = NewMI.getOperand(0);
1420 if (DefMO.getSubReg() == DstIdx) {
1421 assert(SrcIdx == 0 && CP.isFlipped() &&
1422 "Shouldn't have SrcIdx+DstIdx at this point");
1423 const TargetRegisterClass *DstRC = MRI->getRegClass(DstReg);
1424 const TargetRegisterClass *CommonRC =
1425 TRI->getCommonSubClass(DefRC, DstRC);
1426 if (CommonRC != nullptr) {
1427 NewRC = CommonRC;
1428
1429 // Instruction might contain "undef %0:subreg" as use operand:
1430 // %0:subreg = instr op_1, ..., op_N, undef %0:subreg, op_N+2, ...
1431 //
1432 // Need to check all operands.
1433 for (MachineOperand &MO : NewMI.operands()) {
1434 if (MO.isReg() && MO.getReg() == DstReg && MO.getSubReg() == DstIdx) {
1435 MO.setSubReg(0);
1436 }
1437 }
1438
1439 DstIdx = 0;
1440 DefMO.setIsUndef(false); // Only subregs can have def+undef.
1441 }
1442 }
1443 }
1444
1445 // CopyMI may have implicit operands, save them so that we can transfer them
1446 // over to the newly materialized instruction after CopyMI is removed.
1448 ImplicitOps.reserve(CopyMI->getNumOperands() -
1449 CopyMI->getDesc().getNumOperands());
1450 for (unsigned I = CopyMI->getDesc().getNumOperands(),
1451 E = CopyMI->getNumOperands();
1452 I != E; ++I) {
1453 MachineOperand &MO = CopyMI->getOperand(I);
1454 if (MO.isReg()) {
1455 assert(MO.isImplicit() &&
1456 "No explicit operands after implicit operands.");
1457 assert((MO.getReg().isPhysical() ||
1458 (MO.getSubReg() == 0 && MO.getReg() == DstOperand.getReg())) &&
1459 "unexpected implicit virtual register def");
1460 ImplicitOps.push_back(MO);
1461 }
1462 }
1463
1464 CopyMI->eraseFromParent();
1465 ErasedInstrs.insert(CopyMI);
1466
1467 // NewMI may have dead implicit defs (E.g. EFLAGS for MOV<bits>r0 on X86).
1468 // We need to remember these so we can add intervals once we insert
1469 // NewMI into SlotIndexes.
1470 //
1471 // We also expect to have tied implicit-defs of super registers originating
1472 // from SUBREG_TO_REG, such as:
1473 // $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi
1474 // undef %0.sub_32bit = MOV32r0 implicit-def dead $eflags, implicit-def %0
1475 //
1476 // The implicit-def of the super register may have been reduced to
1477 // subregisters depending on the uses.
1478
1479 bool NewMIDefinesFullReg = false;
1480
1481 SmallVector<MCRegister, 4> NewMIImplDefs;
1482 for (unsigned i = NewMI.getDesc().getNumOperands(),
1483 e = NewMI.getNumOperands();
1484 i != e; ++i) {
1485 MachineOperand &MO = NewMI.getOperand(i);
1486 if (MO.isReg() && MO.isDef()) {
1487 assert(MO.isImplicit());
1488 if (MO.getReg().isPhysical()) {
1489 if (MO.getReg() == DstReg)
1490 NewMIDefinesFullReg = true;
1491
1492 assert(MO.isImplicit() && MO.getReg().isPhysical() &&
1493 (MO.isDead() ||
1494 (DefSubIdx &&
1495 ((TRI->getSubReg(MO.getReg(), DefSubIdx) ==
1496 MCRegister((unsigned)NewMI.getOperand(0).getReg())) ||
1497 TRI->isSubRegisterEq(NewMI.getOperand(0).getReg(),
1498 MO.getReg())))));
1499 NewMIImplDefs.push_back(MO.getReg().asMCReg());
1500 } else {
1501 assert(MO.getReg() == NewMI.getOperand(0).getReg());
1502
1503 // We're only expecting another def of the main output, so the range
1504 // should get updated with the regular output range.
1505 //
1506 // FIXME: The range updating below probably needs updating to look at
1507 // the super register if subranges are tracked.
1508 assert(!MRI->shouldTrackSubRegLiveness(DstReg) &&
1509 "subrange update for implicit-def of super register may not be "
1510 "properly handled");
1511 }
1512 }
1513 }
1514
1515 if (DstReg.isVirtual()) {
1516 unsigned NewIdx = NewMI.getOperand(0).getSubReg();
1517
1518 if (DefRC != nullptr) {
1519 if (NewIdx)
1520 NewRC = TRI->getMatchingSuperRegClass(NewRC, DefRC, NewIdx);
1521 else
1522 NewRC = TRI->getCommonSubClass(NewRC, DefRC);
1523 assert(NewRC && "subreg chosen for remat incompatible with instruction");
1524 }
1525
1526 // Remap subranges to new lanemask and change register class.
1527 LiveInterval &DstInt = LIS->getInterval(DstReg);
1528 for (LiveInterval::SubRange &SR : DstInt.subranges()) {
1529 SR.LaneMask = TRI->composeSubRegIndexLaneMask(DstIdx, SR.LaneMask);
1530 }
1531 MRI->setRegClass(DstReg, NewRC);
1532
1533 // Update machine operands and add flags.
1534 updateRegDefsUses(DstReg, DstReg, DstIdx);
1535 NewMI.getOperand(0).setSubReg(NewIdx);
1536 // updateRegDefUses can add an "undef" flag to the definition, since
1537 // it will replace DstReg with DstReg.DstIdx. If NewIdx is 0, make
1538 // sure that "undef" is not set.
1539 if (NewIdx == 0)
1540 NewMI.getOperand(0).setIsUndef(false);
1541
1542 // In a situation like the following:
1543 //
1544 // undef %2.subreg:reg = INST %1:reg ; DefMI (rematerializable),
1545 // ; Defines only some of lanes,
1546 // ; so DefSubIdx = NewIdx = subreg
1547 // %3:reg = COPY %2 ; Copy full reg
1548 // .... = SOMEINSTR %3:reg ; Use full reg
1549 //
1550 // there are no subranges for %3 so after rematerialization we need
1551 // to explicitly create them. Undefined subranges are removed later on.
1552 if (NewIdx && !DstInt.hasSubRanges() &&
1553 MRI->shouldTrackSubRegLiveness(DstReg)) {
1554 LaneBitmask FullMask = MRI->getMaxLaneMaskForVReg(DstReg);
1555 LaneBitmask UsedLanes = TRI->getSubRegIndexLaneMask(NewIdx);
1556 LaneBitmask UnusedLanes = FullMask & ~UsedLanes;
1558 DstInt.createSubRangeFrom(Alloc, UsedLanes, DstInt);
1559 DstInt.createSubRangeFrom(Alloc, UnusedLanes, DstInt);
1560 }
1561
1562 // Add dead subregister definitions if we are defining the whole register
1563 // but only part of it is live.
1564 // This could happen if the rematerialization instruction is rematerializing
1565 // more than actually is used in the register.
1566 // An example would be:
1567 // %1 = LOAD CONSTANTS 5, 8 ; Loading both 5 and 8 in different subregs
1568 // ; Copying only part of the register here, but the rest is undef.
1569 // %2:sub_16bit<def, read-undef> = COPY %1:sub_16bit
1570 // ==>
1571 // ; Materialize all the constants but only using one
1572 // %2 = LOAD_CONSTANTS 5, 8
1573 //
1574 // at this point for the part that wasn't defined before we could have
1575 // subranges missing the definition.
1576 if (NewIdx == 0 && DstInt.hasSubRanges()) {
1577 SlotIndex CurrIdx = LIS->getInstructionIndex(NewMI);
1578 SlotIndex DefIndex =
1579 CurrIdx.getRegSlot(NewMI.getOperand(0).isEarlyClobber());
1580 LaneBitmask MaxMask = MRI->getMaxLaneMaskForVReg(DstReg);
1582 for (LiveInterval::SubRange &SR : DstInt.subranges()) {
1583 if (!SR.liveAt(DefIndex))
1584 SR.createDeadDef(DefIndex, Alloc);
1585 MaxMask &= ~SR.LaneMask;
1586 }
1587 if (MaxMask.any()) {
1588 LiveInterval::SubRange *SR = DstInt.createSubRange(Alloc, MaxMask);
1589 SR->createDeadDef(DefIndex, Alloc);
1590 }
1591 }
1592
1593 // Make sure that the subrange for resultant undef is removed
1594 // For example:
1595 // %1:sub1<def,read-undef> = LOAD CONSTANT 1
1596 // %2 = COPY %1
1597 // ==>
1598 // %2:sub1<def, read-undef> = LOAD CONSTANT 1
1599 // ; Correct but need to remove the subrange for %2:sub0
1600 // ; as it is now undef
1601 if (NewIdx != 0 && DstInt.hasSubRanges()) {
1602 // The affected subregister segments can be removed.
1603 SlotIndex CurrIdx = LIS->getInstructionIndex(NewMI);
1604 LaneBitmask DstMask = TRI->getSubRegIndexLaneMask(NewIdx);
1605 bool UpdatedSubRanges = false;
1606 SlotIndex DefIndex =
1607 CurrIdx.getRegSlot(NewMI.getOperand(0).isEarlyClobber());
1609 for (LiveInterval::SubRange &SR : DstInt.subranges()) {
1610 if ((SR.LaneMask & DstMask).none()) {
1612 << "Removing undefined SubRange "
1613 << PrintLaneMask(SR.LaneMask) << " : " << SR << "\n");
1614
1615 if (VNInfo *RmValNo = SR.getVNInfoAt(CurrIdx.getRegSlot())) {
1616 // VNI is in ValNo - remove any segments in this SubRange that have
1617 // this ValNo
1618 SR.removeValNo(RmValNo);
1619 }
1620
1621 // We may not have a defined value at this point, but still need to
1622 // clear out any empty subranges tentatively created by
1623 // updateRegDefUses. The original subrange def may have only undefed
1624 // some lanes.
1625 UpdatedSubRanges = true;
1626 } else {
1627 // We know that this lane is defined by this instruction,
1628 // but at this point it might not be live because it was not defined
1629 // by the original instruction. This happens when the
1630 // rematerialization widens the defined register. Assign that lane a
1631 // dead def so that the interferences are properly modeled.
1632 if (!SR.liveAt(DefIndex))
1633 SR.createDeadDef(DefIndex, Alloc);
1634 }
1635 }
1636 if (UpdatedSubRanges)
1637 DstInt.removeEmptySubRanges();
1638 }
1639 } else if (NewMI.getOperand(0).getReg() != CopyDstReg) {
1640 // The New instruction may be defining a sub-register of what's actually
1641 // been asked for. If so it must implicitly define the whole thing.
1642 assert(DstReg.isPhysical() &&
1643 "Only expect virtual or physical registers in remat");
1644 NewMI.getOperand(0).setIsDead(true);
1645
1646 if (!NewMIDefinesFullReg) {
1648 CopyDstReg, true /*IsDef*/, true /*IsImp*/, false /*IsKill*/));
1649 }
1650
1651 // Record small dead def live-ranges for all the subregisters
1652 // of the destination register.
1653 // Otherwise, variables that live through may miss some
1654 // interferences, thus creating invalid allocation.
1655 // E.g., i386 code:
1656 // %1 = somedef ; %1 GR8
1657 // %2 = remat ; %2 GR32
1658 // CL = COPY %2.sub_8bit
1659 // = somedef %1 ; %1 GR8
1660 // =>
1661 // %1 = somedef ; %1 GR8
1662 // dead ECX = remat ; implicit-def CL
1663 // = somedef %1 ; %1 GR8
1664 // %1 will see the interferences with CL but not with CH since
1665 // no live-ranges would have been created for ECX.
1666 // Fix that!
1667 SlotIndex NewMIIdx = LIS->getInstructionIndex(NewMI);
1668 for (MCRegUnit Unit : TRI->regunits(NewMI.getOperand(0).getReg()))
1669 if (LiveRange *LR = LIS->getCachedRegUnit(Unit))
1670 LR->createDeadDef(NewMIIdx.getRegSlot(), LIS->getVNInfoAllocator());
1671 }
1672
1673 NewMI.setRegisterDefReadUndef(NewMI.getOperand(0).getReg());
1674
1675 // Transfer over implicit operands to the rematerialized instruction.
1676 for (MachineOperand &MO : ImplicitOps)
1677 NewMI.addOperand(MO);
1678
1679 SlotIndex NewMIIdx = LIS->getInstructionIndex(NewMI);
1680 for (MCRegister Reg : NewMIImplDefs) {
1681 for (MCRegUnit Unit : TRI->regunits(Reg))
1682 if (LiveRange *LR = LIS->getCachedRegUnit(Unit))
1683 LR->createDeadDef(NewMIIdx.getRegSlot(), LIS->getVNInfoAllocator());
1684 }
1685
1686 LLVM_DEBUG(dbgs() << "Remat: " << NewMI);
1687 ++NumReMats;
1688
1689 // If the virtual SrcReg is completely eliminated, update all DBG_VALUEs
1690 // to describe DstReg instead.
1691 if (MRI->use_nodbg_empty(SrcReg)) {
1692 for (MachineOperand &UseMO :
1693 llvm::make_early_inc_range(MRI->use_operands(SrcReg))) {
1694 MachineInstr *UseMI = UseMO.getParent();
1695 if (UseMI->isDebugInstr()) {
1696 if (DstReg.isPhysical())
1697 UseMO.substPhysReg(DstReg, *TRI);
1698 else
1699 UseMO.setReg(DstReg);
1700 // Move the debug value directly after the def of the rematerialized
1701 // value in DstReg.
1702 MBB->splice(std::next(NewMI.getIterator()), UseMI->getParent(), UseMI);
1703 LLVM_DEBUG(dbgs() << "\t\tupdated: " << *UseMI);
1704 }
1705 }
1706 }
1707
1708 if (ToBeUpdated.count(SrcReg))
1709 return true;
1710
1711 unsigned NumCopyUses = 0;
1712 for (MachineOperand &UseMO : MRI->use_nodbg_operands(SrcReg)) {
1713 if (UseMO.getParent()->isCopyLike())
1714 NumCopyUses++;
1715 }
1716 if (NumCopyUses < LateRematUpdateThreshold) {
1717 // The source interval can become smaller because we removed a use.
1718 shrinkToUses(&SrcInt, &DeadDefs);
1719 if (!DeadDefs.empty())
1720 eliminateDeadDefs(&Edit);
1721 } else {
1722 ToBeUpdated.insert(SrcReg);
1723 }
1724 return true;
1725}
1726
1727MachineInstr *RegisterCoalescer::eliminateUndefCopy(MachineInstr *CopyMI) {
1728 // ProcessImplicitDefs may leave some copies of <undef> values, it only
1729 // removes local variables. When we have a copy like:
1730 //
1731 // %1 = COPY undef %2
1732 //
1733 // We delete the copy and remove the corresponding value number from %1.
1734 // Any uses of that value number are marked as <undef>.
1735
1736 // Note that we do not query CoalescerPair here but redo isMoveInstr as the
1737 // CoalescerPair may have a new register class with adjusted subreg indices
1738 // at this point.
1739 Register SrcReg, DstReg;
1740 unsigned SrcSubIdx = 0, DstSubIdx = 0;
1741 if (!isMoveInstr(*TRI, CopyMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx))
1742 return nullptr;
1743
1744 SlotIndex Idx = LIS->getInstructionIndex(*CopyMI);
1745 const LiveInterval &SrcLI = LIS->getInterval(SrcReg);
1746 // CopyMI is undef iff SrcReg is not live before the instruction.
1747 if (SrcSubIdx != 0 && SrcLI.hasSubRanges()) {
1748 LaneBitmask SrcMask = TRI->getSubRegIndexLaneMask(SrcSubIdx);
1749 for (const LiveInterval::SubRange &SR : SrcLI.subranges()) {
1750 if ((SR.LaneMask & SrcMask).none())
1751 continue;
1752 if (SR.liveAt(Idx))
1753 return nullptr;
1754 }
1755 } else if (SrcLI.liveAt(Idx))
1756 return nullptr;
1757
1758 // If the undef copy defines a live-out value (i.e. an input to a PHI def),
1759 // then replace it with an IMPLICIT_DEF.
1760 LiveInterval &DstLI = LIS->getInterval(DstReg);
1761 SlotIndex RegIndex = Idx.getRegSlot();
1762 LiveRange::Segment *Seg = DstLI.getSegmentContaining(RegIndex);
1763 assert(Seg != nullptr && "No segment for defining instruction");
1764 VNInfo *V = DstLI.getVNInfoAt(Seg->end);
1765
1766 // The source interval may also have been on an undef use, in which case the
1767 // copy introduced a live value.
1768 if (((V && V->isPHIDef()) || (!V && !DstLI.liveAt(Idx)))) {
1769 for (unsigned i = CopyMI->getNumOperands(); i != 0; --i) {
1770 MachineOperand &MO = CopyMI->getOperand(i - 1);
1771 if (MO.isReg()) {
1772 if (MO.isUse())
1773 CopyMI->removeOperand(i - 1);
1774 } else {
1775 assert(MO.isImm() &&
1776 CopyMI->getOpcode() == TargetOpcode::SUBREG_TO_REG);
1777 CopyMI->removeOperand(i - 1);
1778 }
1779 }
1780
1781 CopyMI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
1782 LLVM_DEBUG(dbgs() << "\tReplaced copy of <undef> value with an "
1783 "implicit def\n");
1784 return CopyMI;
1785 }
1786
1787 // Remove any DstReg segments starting at the instruction.
1788 LLVM_DEBUG(dbgs() << "\tEliminating copy of <undef> value\n");
1789
1790 // Remove value or merge with previous one in case of a subregister def.
1791 if (VNInfo *PrevVNI = DstLI.getVNInfoAt(Idx)) {
1792 VNInfo *VNI = DstLI.getVNInfoAt(RegIndex);
1793 DstLI.MergeValueNumberInto(VNI, PrevVNI);
1794
1795 // The affected subregister segments can be removed.
1796 LaneBitmask DstMask = TRI->getSubRegIndexLaneMask(DstSubIdx);
1797 for (LiveInterval::SubRange &SR : DstLI.subranges()) {
1798 if ((SR.LaneMask & DstMask).none())
1799 continue;
1800
1801 VNInfo *SVNI = SR.getVNInfoAt(RegIndex);
1802 assert(SVNI != nullptr && SlotIndex::isSameInstr(SVNI->def, RegIndex));
1803 SR.removeValNo(SVNI);
1804 }
1805 DstLI.removeEmptySubRanges();
1806 } else
1807 LIS->removeVRegDefAt(DstLI, RegIndex);
1808
1809 // Mark uses as undef.
1810 for (MachineOperand &MO : MRI->reg_nodbg_operands(DstReg)) {
1811 if (MO.isDef() /*|| MO.isUndef()*/)
1812 continue;
1813 const MachineInstr &MI = *MO.getParent();
1814 SlotIndex UseIdx = LIS->getInstructionIndex(MI);
1815 LaneBitmask UseMask = TRI->getSubRegIndexLaneMask(MO.getSubReg());
1816 bool isLive;
1817 if (!UseMask.all() && DstLI.hasSubRanges()) {
1818 isLive = false;
1819 for (const LiveInterval::SubRange &SR : DstLI.subranges()) {
1820 if ((SR.LaneMask & UseMask).none())
1821 continue;
1822 if (SR.liveAt(UseIdx)) {
1823 isLive = true;
1824 break;
1825 }
1826 }
1827 } else
1828 isLive = DstLI.liveAt(UseIdx);
1829 if (isLive)
1830 continue;
1831 MO.setIsUndef(true);
1832 LLVM_DEBUG(dbgs() << "\tnew undef: " << UseIdx << '\t' << MI);
1833 }
1834
1835 // A def of a subregister may be a use of the other subregisters, so
1836 // deleting a def of a subregister may also remove uses. Since CopyMI
1837 // is still part of the function (but about to be erased), mark all
1838 // defs of DstReg in it as <undef>, so that shrinkToUses would
1839 // ignore them.
1840 for (MachineOperand &MO : CopyMI->all_defs())
1841 if (MO.getReg() == DstReg)
1842 MO.setIsUndef(true);
1843 LIS->shrinkToUses(&DstLI);
1844
1845 return CopyMI;
1846}
1847
1848void RegisterCoalescer::addUndefFlag(const LiveInterval &Int, SlotIndex UseIdx,
1849 MachineOperand &MO, unsigned SubRegIdx) {
1850 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubRegIdx);
1851 if (MO.isDef())
1852 Mask = ~Mask;
1853 bool IsUndef = true;
1854 for (const LiveInterval::SubRange &S : Int.subranges()) {
1855 if ((S.LaneMask & Mask).none())
1856 continue;
1857 if (S.liveAt(UseIdx)) {
1858 IsUndef = false;
1859 break;
1860 }
1861 }
1862 if (IsUndef) {
1863 MO.setIsUndef(true);
1864 // We found out some subregister use is actually reading an undefined
1865 // value. In some cases the whole vreg has become undefined at this
1866 // point so we have to potentially shrink the main range if the
1867 // use was ending a live segment there.
1868 LiveQueryResult Q = Int.Query(UseIdx);
1869 if (Q.valueOut() == nullptr)
1870 ShrinkMainRange = true;
1871 }
1872}
1873
1874void RegisterCoalescer::updateRegDefsUses(Register SrcReg, Register DstReg,
1875 unsigned SubIdx) {
1876 bool DstIsPhys = DstReg.isPhysical();
1877 LiveInterval *DstInt = DstIsPhys ? nullptr : &LIS->getInterval(DstReg);
1878
1879 if (DstInt && DstInt->hasSubRanges() && DstReg != SrcReg) {
1880 for (MachineOperand &MO : MRI->reg_operands(DstReg)) {
1881 if (MO.isUndef())
1882 continue;
1883 unsigned SubReg = MO.getSubReg();
1884 if (SubReg == 0 && MO.isDef())
1885 continue;
1886
1887 MachineInstr &MI = *MO.getParent();
1888 if (MI.isDebugInstr())
1889 continue;
1890 SlotIndex UseIdx = LIS->getInstructionIndex(MI).getRegSlot(true);
1891 addUndefFlag(*DstInt, UseIdx, MO, SubReg);
1892 }
1893 }
1894
1896 for (MachineRegisterInfo::reg_instr_iterator I = MRI->reg_instr_begin(SrcReg),
1897 E = MRI->reg_instr_end();
1898 I != E;) {
1899 MachineInstr *UseMI = &*(I++);
1900
1901 // Each instruction can only be rewritten once because sub-register
1902 // composition is not always idempotent. When SrcReg != DstReg, rewriting
1903 // the UseMI operands removes them from the SrcReg use-def chain, but when
1904 // SrcReg is DstReg we could encounter UseMI twice if it has multiple
1905 // operands mentioning the virtual register.
1906 if (SrcReg == DstReg && !Visited.insert(UseMI).second)
1907 continue;
1908
1910 bool Reads, Writes;
1911 std::tie(Reads, Writes) = UseMI->readsWritesVirtualRegister(SrcReg, &Ops);
1912
1913 // If SrcReg wasn't read, it may still be the case that DstReg is live-in
1914 // because SrcReg is a sub-register.
1915 if (DstInt && !Reads && SubIdx && !UseMI->isDebugInstr())
1916 Reads = DstInt->liveAt(LIS->getInstructionIndex(*UseMI));
1917
1918 // Replace SrcReg with DstReg in all UseMI operands.
1919 for (unsigned Op : Ops) {
1921
1922 // Adjust <undef> flags in case of sub-register joins. We don't want to
1923 // turn a full def into a read-modify-write sub-register def and vice
1924 // versa.
1925 if (SubIdx && MO.isDef())
1926 MO.setIsUndef(!Reads);
1927
1928 // A subreg use of a partially undef (super) register may be a complete
1929 // undef use now and then has to be marked that way.
1930 if (MO.isUse() && !MO.isUndef() && !DstIsPhys) {
1931 unsigned SubUseIdx = TRI->composeSubRegIndices(SubIdx, MO.getSubReg());
1932 if (SubUseIdx != 0 && MRI->shouldTrackSubRegLiveness(DstReg)) {
1933 if (!DstInt->hasSubRanges()) {
1935 LaneBitmask FullMask = MRI->getMaxLaneMaskForVReg(DstInt->reg());
1936 LaneBitmask UsedLanes = TRI->getSubRegIndexLaneMask(SubIdx);
1937 LaneBitmask UnusedLanes = FullMask & ~UsedLanes;
1938 DstInt->createSubRangeFrom(Allocator, UsedLanes, *DstInt);
1939 // The unused lanes are just empty live-ranges at this point.
1940 // It is the caller responsibility to set the proper
1941 // dead segments if there is an actual dead def of the
1942 // unused lanes. This may happen with rematerialization.
1943 DstInt->createSubRange(Allocator, UnusedLanes);
1944 }
1945 SlotIndex MIIdx = UseMI->isDebugInstr()
1947 : LIS->getInstructionIndex(*UseMI);
1948 SlotIndex UseIdx = MIIdx.getRegSlot(true);
1949 addUndefFlag(*DstInt, UseIdx, MO, SubUseIdx);
1950 }
1951 }
1952
1953 if (DstIsPhys)
1954 MO.substPhysReg(DstReg, *TRI);
1955 else
1956 MO.substVirtReg(DstReg, SubIdx, *TRI);
1957 }
1958
1959 LLVM_DEBUG({
1960 dbgs() << "\t\tupdated: ";
1961 if (!UseMI->isDebugInstr())
1962 dbgs() << LIS->getInstructionIndex(*UseMI) << "\t";
1963 dbgs() << *UseMI;
1964 });
1965 }
1966}
1967
1968bool RegisterCoalescer::canJoinPhys(const CoalescerPair &CP) {
1969 // Always join simple intervals that are defined by a single copy from a
1970 // reserved register. This doesn't increase register pressure, so it is
1971 // always beneficial.
1972 if (!MRI->isReserved(CP.getDstReg())) {
1973 LLVM_DEBUG(dbgs() << "\tCan only merge into reserved registers.\n");
1974 return false;
1975 }
1976
1977 LiveInterval &JoinVInt = LIS->getInterval(CP.getSrcReg());
1978 if (JoinVInt.containsOneValue())
1979 return true;
1980
1981 LLVM_DEBUG(
1982 dbgs() << "\tCannot join complex intervals into reserved register.\n");
1983 return false;
1984}
1985
1986bool RegisterCoalescer::copyValueUndefInPredecessors(
1988 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
1989 SlotIndex PredEnd = LIS->getMBBEndIdx(Pred);
1990 if (VNInfo *V = S.getVNInfoAt(PredEnd.getPrevSlot())) {
1991 // If this is a self loop, we may be reading the same value.
1992 if (V->id != SLRQ.valueOutOrDead()->id)
1993 return false;
1994 }
1995 }
1996
1997 return true;
1998}
1999
2000void RegisterCoalescer::setUndefOnPrunedSubRegUses(LiveInterval &LI,
2001 Register Reg,
2002 LaneBitmask PrunedLanes) {
2003 // If we had other instructions in the segment reading the undef sublane
2004 // value, we need to mark them with undef.
2005 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
2006 unsigned SubRegIdx = MO.getSubReg();
2007 if (SubRegIdx == 0 || MO.isUndef())
2008 continue;
2009
2010 LaneBitmask SubRegMask = TRI->getSubRegIndexLaneMask(SubRegIdx);
2011 SlotIndex Pos = LIS->getInstructionIndex(*MO.getParent());
2012 for (LiveInterval::SubRange &S : LI.subranges()) {
2013 if (!S.liveAt(Pos) && (PrunedLanes & SubRegMask).any()) {
2014 MO.setIsUndef();
2015 break;
2016 }
2017 }
2018 }
2019
2021
2022 // A def of a subregister may be a use of other register lanes. Replacing
2023 // such a def with a def of a different register will eliminate the use,
2024 // and may cause the recorded live range to be larger than the actual
2025 // liveness in the program IR.
2026 LIS->shrinkToUses(&LI);
2027}
2028
2029bool RegisterCoalescer::joinCopy(
2030 MachineInstr *CopyMI, bool &Again,
2031 SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs) {
2032 Again = false;
2033 LLVM_DEBUG(dbgs() << LIS->getInstructionIndex(*CopyMI) << '\t' << *CopyMI);
2034
2036 if (!CP.setRegisters(CopyMI)) {
2037 LLVM_DEBUG(dbgs() << "\tNot coalescable.\n");
2038 return false;
2039 }
2040
2041 if (CP.getNewRC()) {
2042 auto SrcRC = MRI->getRegClass(CP.getSrcReg());
2043 auto DstRC = MRI->getRegClass(CP.getDstReg());
2044 unsigned SrcIdx = CP.getSrcIdx();
2045 unsigned DstIdx = CP.getDstIdx();
2046 if (CP.isFlipped()) {
2047 std::swap(SrcIdx, DstIdx);
2048 std::swap(SrcRC, DstRC);
2049 }
2050 if (!TRI->shouldCoalesce(CopyMI, SrcRC, SrcIdx, DstRC, DstIdx,
2051 CP.getNewRC(), *LIS)) {
2052 LLVM_DEBUG(dbgs() << "\tSubtarget bailed on coalescing.\n");
2053 return false;
2054 }
2055 }
2056
2057 // Dead code elimination. This really should be handled by MachineDCE, but
2058 // sometimes dead copies slip through, and we can't generate invalid live
2059 // ranges.
2060 if (!CP.isPhys() && CopyMI->allDefsAreDead()) {
2061 LLVM_DEBUG(dbgs() << "\tCopy is dead.\n");
2062 DeadDefs.push_back(CopyMI);
2063 eliminateDeadDefs();
2064 return true;
2065 }
2066
2067 // Eliminate undefs.
2068 if (!CP.isPhys()) {
2069 // If this is an IMPLICIT_DEF, leave it alone, but don't try to coalesce.
2070 if (MachineInstr *UndefMI = eliminateUndefCopy(CopyMI)) {
2071 if (UndefMI->isImplicitDef())
2072 return false;
2073 deleteInstr(CopyMI);
2074 return false; // Not coalescable.
2075 }
2076 }
2077
2078 // Coalesced copies are normally removed immediately, but transformations
2079 // like removeCopyByCommutingDef() can inadvertently create identity copies.
2080 // When that happens, just join the values and remove the copy.
2081 if (CP.getSrcReg() == CP.getDstReg()) {
2082 LiveInterval &LI = LIS->getInterval(CP.getSrcReg());
2083 LLVM_DEBUG(dbgs() << "\tCopy already coalesced: " << LI << '\n');
2084 const SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI);
2085 LiveQueryResult LRQ = LI.Query(CopyIdx);
2086 if (VNInfo *DefVNI = LRQ.valueDefined()) {
2087 VNInfo *ReadVNI = LRQ.valueIn();
2088 assert(ReadVNI && "No value before copy and no <undef> flag.");
2089 assert(ReadVNI != DefVNI && "Cannot read and define the same value.");
2090
2091 // Track incoming undef lanes we need to eliminate from the subrange.
2092 LaneBitmask PrunedLanes;
2093 MachineBasicBlock *MBB = CopyMI->getParent();
2094
2095 // Process subregister liveranges.
2096 for (LiveInterval::SubRange &S : LI.subranges()) {
2097 LiveQueryResult SLRQ = S.Query(CopyIdx);
2098 if (VNInfo *SDefVNI = SLRQ.valueDefined()) {
2099 if (VNInfo *SReadVNI = SLRQ.valueIn())
2100 SDefVNI = S.MergeValueNumberInto(SDefVNI, SReadVNI);
2101
2102 // If this copy introduced an undef subrange from an incoming value,
2103 // we need to eliminate the undef live in values from the subrange.
2104 if (copyValueUndefInPredecessors(S, MBB, SLRQ)) {
2105 LLVM_DEBUG(dbgs() << "Incoming sublane value is undef at copy\n");
2106 PrunedLanes |= S.LaneMask;
2107 S.removeValNo(SDefVNI);
2108 }
2109 }
2110 }
2111
2112 LI.MergeValueNumberInto(DefVNI, ReadVNI);
2113 if (PrunedLanes.any()) {
2114 LLVM_DEBUG(dbgs() << "Pruning undef incoming lanes: " << PrunedLanes
2115 << '\n');
2116 setUndefOnPrunedSubRegUses(LI, CP.getSrcReg(), PrunedLanes);
2117 }
2118
2119 LLVM_DEBUG(dbgs() << "\tMerged values: " << LI << '\n');
2120 }
2121 deleteInstr(CopyMI);
2122 return true;
2123 }
2124
2125 // Enforce policies.
2126 if (CP.isPhys()) {
2127 LLVM_DEBUG(dbgs() << "\tConsidering merging "
2128 << printReg(CP.getSrcReg(), TRI) << " with "
2129 << printReg(CP.getDstReg(), TRI, CP.getSrcIdx()) << '\n');
2130 if (!canJoinPhys(CP)) {
2131 // Before giving up coalescing, if definition of source is defined by
2132 // trivial computation, try rematerializing it.
2133 bool IsDefCopy = false;
2134 if (reMaterializeTrivialDef(CP, CopyMI, IsDefCopy))
2135 return true;
2136 if (IsDefCopy)
2137 Again = true; // May be possible to coalesce later.
2138 return false;
2139 }
2140 } else {
2141 // When possible, let DstReg be the larger interval.
2142 if (!CP.isPartial() && LIS->getInterval(CP.getSrcReg()).size() >
2143 LIS->getInterval(CP.getDstReg()).size())
2144 CP.flip();
2145
2146 LLVM_DEBUG({
2147 dbgs() << "\tConsidering merging to "
2148 << TRI->getRegClassName(CP.getNewRC()) << " with ";
2149 if (CP.getDstIdx() && CP.getSrcIdx())
2150 dbgs() << printReg(CP.getDstReg()) << " in "
2151 << TRI->getSubRegIndexName(CP.getDstIdx()) << " and "
2152 << printReg(CP.getSrcReg()) << " in "
2153 << TRI->getSubRegIndexName(CP.getSrcIdx()) << '\n';
2154 else
2155 dbgs() << printReg(CP.getSrcReg(), TRI) << " in "
2156 << printReg(CP.getDstReg(), TRI, CP.getSrcIdx()) << '\n';
2157 });
2158 }
2159
2160 ShrinkMask = LaneBitmask::getNone();
2161 ShrinkMainRange = false;
2162
2163 // Okay, attempt to join these two intervals. On failure, this returns false.
2164 // Otherwise, if one of the intervals being joined is a physreg, this method
2165 // always canonicalizes DstInt to be it. The output "SrcInt" will not have
2166 // been modified, so we can use this information below to update aliases.
2167 if (!joinIntervals(CP)) {
2168 // Coalescing failed.
2169
2170 // If definition of source is defined by trivial computation, try
2171 // rematerializing it.
2172 bool IsDefCopy = false;
2173 if (reMaterializeTrivialDef(CP, CopyMI, IsDefCopy))
2174 return true;
2175
2176 // If we can eliminate the copy without merging the live segments, do so
2177 // now.
2178 if (!CP.isPartial() && !CP.isPhys()) {
2179 bool Changed = adjustCopiesBackFrom(CP, CopyMI);
2180 bool Shrink = false;
2181 if (!Changed)
2182 std::tie(Changed, Shrink) = removeCopyByCommutingDef(CP, CopyMI);
2183 if (Changed) {
2184 deleteInstr(CopyMI);
2185 if (Shrink) {
2186 Register DstReg = CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg();
2187 LiveInterval &DstLI = LIS->getInterval(DstReg);
2188 shrinkToUses(&DstLI);
2189 LLVM_DEBUG(dbgs() << "\t\tshrunk: " << DstLI << '\n');
2190 }
2191 LLVM_DEBUG(dbgs() << "\tTrivial!\n");
2192 return true;
2193 }
2194 }
2195
2196 // Try and see if we can partially eliminate the copy by moving the copy to
2197 // its predecessor.
2198 if (!CP.isPartial() && !CP.isPhys())
2199 if (removePartialRedundancy(CP, *CopyMI))
2200 return true;
2201
2202 // Otherwise, we are unable to join the intervals.
2203 LLVM_DEBUG(dbgs() << "\tInterference!\n");
2204 Again = true; // May be possible to coalesce later.
2205 return false;
2206 }
2207
2208 // Coalescing to a virtual register that is of a sub-register class of the
2209 // other. Make sure the resulting register is set to the right register class.
2210 if (CP.isCrossClass()) {
2211 ++numCrossRCs;
2212 MRI->setRegClass(CP.getDstReg(), CP.getNewRC());
2213 }
2214
2215 // Removing sub-register copies can ease the register class constraints.
2216 // Make sure we attempt to inflate the register class of DstReg.
2217 if (!CP.isPhys() && RegClassInfo.isProperSubClass(CP.getNewRC()))
2218 InflateRegs.push_back(CP.getDstReg());
2219
2220 // CopyMI has been erased by joinIntervals at this point. Remove it from
2221 // ErasedInstrs since copyCoalesceWorkList() won't add a successful join back
2222 // to the work list. This keeps ErasedInstrs from growing needlessly.
2223 if (ErasedInstrs.erase(CopyMI))
2224 // But we may encounter the instruction again in this iteration.
2225 CurrentErasedInstrs.insert(CopyMI);
2226
2227 // Rewrite all SrcReg operands to DstReg.
2228 // Also update DstReg operands to include DstIdx if it is set.
2229 if (CP.getDstIdx())
2230 updateRegDefsUses(CP.getDstReg(), CP.getDstReg(), CP.getDstIdx());
2231 updateRegDefsUses(CP.getSrcReg(), CP.getDstReg(), CP.getSrcIdx());
2232
2233 // Shrink subregister ranges if necessary.
2234 if (ShrinkMask.any()) {
2235 LiveInterval &LI = LIS->getInterval(CP.getDstReg());
2236 for (LiveInterval::SubRange &S : LI.subranges()) {
2237 if ((S.LaneMask & ShrinkMask).none())
2238 continue;
2239 LLVM_DEBUG(dbgs() << "Shrink LaneUses (Lane " << PrintLaneMask(S.LaneMask)
2240 << ")\n");
2241 LIS->shrinkToUses(S, LI.reg());
2242 ShrinkMainRange = true;
2243 }
2245 }
2246
2247 // CP.getSrcReg()'s live interval has been merged into CP.getDstReg's live
2248 // interval. Since CP.getSrcReg() is in ToBeUpdated set and its live interval
2249 // is not up-to-date, need to update the merged live interval here.
2250 if (ToBeUpdated.count(CP.getSrcReg()))
2251 ShrinkMainRange = true;
2252
2253 if (ShrinkMainRange) {
2254 LiveInterval &LI = LIS->getInterval(CP.getDstReg());
2255 shrinkToUses(&LI);
2256 }
2257
2258 // SrcReg is guaranteed to be the register whose live interval that is
2259 // being merged.
2260 LIS->removeInterval(CP.getSrcReg());
2261
2262 // Update regalloc hint.
2263 TRI->updateRegAllocHint(CP.getSrcReg(), CP.getDstReg(), *MF);
2264
2265 LLVM_DEBUG({
2266 dbgs() << "\tSuccess: " << printReg(CP.getSrcReg(), TRI, CP.getSrcIdx())
2267 << " -> " << printReg(CP.getDstReg(), TRI, CP.getDstIdx()) << '\n';
2268 dbgs() << "\tResult = ";
2269 if (CP.isPhys())
2270 dbgs() << printReg(CP.getDstReg(), TRI);
2271 else
2272 dbgs() << LIS->getInterval(CP.getDstReg());
2273 dbgs() << '\n';
2274 });
2275
2276 ++numJoins;
2277 return true;
2278}
2279
2280bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
2281 Register DstReg = CP.getDstReg();
2282 Register SrcReg = CP.getSrcReg();
2283 assert(CP.isPhys() && "Must be a physreg copy");
2284 assert(MRI->isReserved(DstReg) && "Not a reserved register");
2285 LiveInterval &RHS = LIS->getInterval(SrcReg);
2286 LLVM_DEBUG(dbgs() << "\t\tRHS = " << RHS << '\n');
2287
2288 assert(RHS.containsOneValue() && "Invalid join with reserved register");
2289
2290 // Optimization for reserved registers like ESP. We can only merge with a
2291 // reserved physreg if RHS has a single value that is a copy of DstReg.
2292 // The live range of the reserved register will look like a set of dead defs
2293 // - we don't properly track the live range of reserved registers.
2294
2295 // Deny any overlapping intervals. This depends on all the reserved
2296 // register live ranges to look like dead defs.
2297 if (!MRI->isConstantPhysReg(DstReg)) {
2298 for (MCRegUnit Unit : TRI->regunits(DstReg)) {
2299 // Abort if not all the regunits are reserved.
2300 for (MCRegUnitRootIterator RI(Unit, TRI); RI.isValid(); ++RI) {
2301 if (!MRI->isReserved(*RI))
2302 return false;
2303 }
2304 if (RHS.overlaps(LIS->getRegUnit(Unit))) {
2305 LLVM_DEBUG(dbgs() << "\t\tInterference: " << printRegUnit(Unit, TRI)
2306 << '\n');
2307 return false;
2308 }
2309 }
2310
2311 // We must also check for overlaps with regmask clobbers.
2312 BitVector RegMaskUsable;
2313 if (LIS->checkRegMaskInterference(RHS, RegMaskUsable) &&
2314 !RegMaskUsable.test(DstReg.id())) {
2315 LLVM_DEBUG(dbgs() << "\t\tRegMask interference\n");
2316 return false;
2317 }
2318 }
2319
2320 // Skip any value computations, we are not adding new values to the
2321 // reserved register. Also skip merging the live ranges, the reserved
2322 // register live range doesn't need to be accurate as long as all the
2323 // defs are there.
2324
2325 // Delete the identity copy.
2326 MachineInstr *CopyMI;
2327 if (CP.isFlipped()) {
2328 // Physreg is copied into vreg
2329 // %y = COPY %physreg_x
2330 // ... //< no other def of %physreg_x here
2331 // use %y
2332 // =>
2333 // ...
2334 // use %physreg_x
2335 CopyMI = MRI->getVRegDef(SrcReg);
2336 deleteInstr(CopyMI);
2337 } else {
2338 // VReg is copied into physreg:
2339 // %y = def
2340 // ... //< no other def or use of %physreg_x here
2341 // %physreg_x = COPY %y
2342 // =>
2343 // %physreg_x = def
2344 // ...
2345 if (!MRI->hasOneNonDBGUse(SrcReg)) {
2346 LLVM_DEBUG(dbgs() << "\t\tMultiple vreg uses!\n");
2347 return false;
2348 }
2349
2350 if (!LIS->intervalIsInOneMBB(RHS)) {
2351 LLVM_DEBUG(dbgs() << "\t\tComplex control flow!\n");
2352 return false;
2353 }
2354
2355 MachineInstr &DestMI = *MRI->getVRegDef(SrcReg);
2356 CopyMI = &*MRI->use_instr_nodbg_begin(SrcReg);
2357 SlotIndex CopyRegIdx = LIS->getInstructionIndex(*CopyMI).getRegSlot();
2358 SlotIndex DestRegIdx = LIS->getInstructionIndex(DestMI).getRegSlot();
2359
2360 if (!MRI->isConstantPhysReg(DstReg)) {
2361 // We checked above that there are no interfering defs of the physical
2362 // register. However, for this case, where we intend to move up the def of
2363 // the physical register, we also need to check for interfering uses.
2364 SlotIndexes *Indexes = LIS->getSlotIndexes();
2365 for (SlotIndex SI = Indexes->getNextNonNullIndex(DestRegIdx);
2366 SI != CopyRegIdx; SI = Indexes->getNextNonNullIndex(SI)) {
2368 if (MI->readsRegister(DstReg, TRI)) {
2369 LLVM_DEBUG(dbgs() << "\t\tInterference (read): " << *MI);
2370 return false;
2371 }
2372 }
2373 }
2374
2375 // We're going to remove the copy which defines a physical reserved
2376 // register, so remove its valno, etc.
2377 LLVM_DEBUG(dbgs() << "\t\tRemoving phys reg def of "
2378 << printReg(DstReg, TRI) << " at " << CopyRegIdx << "\n");
2379
2380 LIS->removePhysRegDefAt(DstReg.asMCReg(), CopyRegIdx);
2381 deleteInstr(CopyMI);
2382
2383 // Create a new dead def at the new def location.
2384 for (MCRegUnit Unit : TRI->regunits(DstReg)) {
2385 LiveRange &LR = LIS->getRegUnit(Unit);
2386 LR.createDeadDef(DestRegIdx, LIS->getVNInfoAllocator());
2387 }
2388 }
2389
2390 // We don't track kills for reserved registers.
2391 MRI->clearKillFlags(CP.getSrcReg());
2392
2393 return true;
2394}
2395
2396//===----------------------------------------------------------------------===//
2397// Interference checking and interval joining
2398//===----------------------------------------------------------------------===//
2399//
2400// In the easiest case, the two live ranges being joined are disjoint, and
2401// there is no interference to consider. It is quite common, though, to have
2402// overlapping live ranges, and we need to check if the interference can be
2403// resolved.
2404//
2405// The live range of a single SSA value forms a sub-tree of the dominator tree.
2406// This means that two SSA values overlap if and only if the def of one value
2407// is contained in the live range of the other value. As a special case, the
2408// overlapping values can be defined at the same index.
2409//
2410// The interference from an overlapping def can be resolved in these cases:
2411//
2412// 1. Coalescable copies. The value is defined by a copy that would become an
2413// identity copy after joining SrcReg and DstReg. The copy instruction will
2414// be removed, and the value will be merged with the source value.
2415//
2416// There can be several copies back and forth, causing many values to be
2417// merged into one. We compute a list of ultimate values in the joined live
2418// range as well as a mappings from the old value numbers.
2419//
2420// 2. IMPLICIT_DEF. This instruction is only inserted to ensure all PHI
2421// predecessors have a live out value. It doesn't cause real interference,
2422// and can be merged into the value it overlaps. Like a coalescable copy, it
2423// can be erased after joining.
2424//
2425// 3. Copy of external value. The overlapping def may be a copy of a value that
2426// is already in the other register. This is like a coalescable copy, but
2427// the live range of the source register must be trimmed after erasing the
2428// copy instruction:
2429//
2430// %src = COPY %ext
2431// %dst = COPY %ext <-- Remove this COPY, trim the live range of %ext.
2432//
2433// 4. Clobbering undefined lanes. Vector registers are sometimes built by
2434// defining one lane at a time:
2435//
2436// %dst:ssub0<def,read-undef> = FOO
2437// %src = BAR
2438// %dst:ssub1 = COPY %src
2439//
2440// The live range of %src overlaps the %dst value defined by FOO, but
2441// merging %src into %dst:ssub1 is only going to clobber the ssub1 lane
2442// which was undef anyway.
2443//
2444// The value mapping is more complicated in this case. The final live range
2445// will have different value numbers for both FOO and BAR, but there is no
2446// simple mapping from old to new values. It may even be necessary to add
2447// new PHI values.
2448//
2449// 5. Clobbering dead lanes. A def may clobber a lane of a vector register that
2450// is live, but never read. This can happen because we don't compute
2451// individual live ranges per lane.
2452//
2453// %dst = FOO
2454// %src = BAR
2455// %dst:ssub1 = COPY %src
2456//
2457// This kind of interference is only resolved locally. If the clobbered
2458// lane value escapes the block, the join is aborted.
2459
2460namespace {
2461
2462/// Track information about values in a single virtual register about to be
2463/// joined. Objects of this class are always created in pairs - one for each
2464/// side of the CoalescerPair (or one for each lane of a side of the coalescer
2465/// pair)
2466class JoinVals {
2467 /// Live range we work on.
2468 LiveRange &LR;
2469
2470 /// (Main) register we work on.
2471 const Register Reg;
2472
2473 /// Reg (and therefore the values in this liverange) will end up as
2474 /// subregister SubIdx in the coalesced register. Either CP.DstIdx or
2475 /// CP.SrcIdx.
2476 const unsigned SubIdx;
2477
2478 /// The LaneMask that this liverange will occupy the coalesced register. May
2479 /// be smaller than the lanemask produced by SubIdx when merging subranges.
2480 const LaneBitmask LaneMask;
2481
2482 /// This is true when joining sub register ranges, false when joining main
2483 /// ranges.
2484 const bool SubRangeJoin;
2485
2486 /// Whether the current LiveInterval tracks subregister liveness.
2487 const bool TrackSubRegLiveness;
2488
2489 /// Values that will be present in the final live range.
2490 SmallVectorImpl<VNInfo *> &NewVNInfo;
2491
2492 const CoalescerPair &CP;
2493 LiveIntervals *LIS;
2494 SlotIndexes *Indexes;
2495 const TargetRegisterInfo *TRI;
2496
2497 /// Value number assignments. Maps value numbers in LI to entries in
2498 /// NewVNInfo. This is suitable for passing to LiveInterval::join().
2499 SmallVector<int, 8> Assignments;
2500
2501public:
2502 /// Conflict resolution for overlapping values.
2503 enum ConflictResolution {
2504 /// No overlap, simply keep this value.
2505 CR_Keep,
2506
2507 /// Merge this value into OtherVNI and erase the defining instruction.
2508 /// Used for IMPLICIT_DEF, coalescable copies, and copies from external
2509 /// values.
2510 CR_Erase,
2511
2512 /// Merge this value into OtherVNI but keep the defining instruction.
2513 /// This is for the special case where OtherVNI is defined by the same
2514 /// instruction.
2515 CR_Merge,
2516
2517 /// Keep this value, and have it replace OtherVNI where possible. This
2518 /// complicates value mapping since OtherVNI maps to two different values
2519 /// before and after this def.
2520 /// Used when clobbering undefined or dead lanes.
2521 CR_Replace,
2522
2523 /// Unresolved conflict. Visit later when all values have been mapped.
2524 CR_Unresolved,
2525
2526 /// Unresolvable conflict. Abort the join.
2527 CR_Impossible
2528 };
2529
2530private:
2531 /// Per-value info for LI. The lane bit masks are all relative to the final
2532 /// joined register, so they can be compared directly between SrcReg and
2533 /// DstReg.
2534 struct Val {
2535 ConflictResolution Resolution = CR_Keep;
2536
2537 /// Lanes written by this def, 0 for unanalyzed values.
2538 LaneBitmask WriteLanes;
2539
2540 /// Lanes with defined values in this register. Other lanes are undef and
2541 /// safe to clobber.
2542 LaneBitmask ValidLanes;
2543
2544 /// Value in LI being redefined by this def.
2545 VNInfo *RedefVNI = nullptr;
2546
2547 /// Value in the other live range that overlaps this def, if any.
2548 VNInfo *OtherVNI = nullptr;
2549
2550 /// Is this value an IMPLICIT_DEF that can be erased?
2551 ///
2552 /// IMPLICIT_DEF values should only exist at the end of a basic block that
2553 /// is a predecessor to a phi-value. These IMPLICIT_DEF instructions can be
2554 /// safely erased if they are overlapping a live value in the other live
2555 /// interval.
2556 ///
2557 /// Weird control flow graphs and incomplete PHI handling in
2558 /// ProcessImplicitDefs can very rarely create IMPLICIT_DEF values with
2559 /// longer live ranges. Such IMPLICIT_DEF values should be treated like
2560 /// normal values.
2561 bool ErasableImplicitDef = false;
2562
2563 /// True when the live range of this value will be pruned because of an
2564 /// overlapping CR_Replace value in the other live range.
2565 bool Pruned = false;
2566
2567 /// True once Pruned above has been computed.
2568 bool PrunedComputed = false;
2569
2570 /// True if this value is determined to be identical to OtherVNI
2571 /// (in valuesIdentical). This is used with CR_Erase where the erased
2572 /// copy is redundant, i.e. the source value is already the same as
2573 /// the destination. In such cases the subranges need to be updated
2574 /// properly. See comment at pruneSubRegValues for more info.
2575 bool Identical = false;
2576
2577 Val() = default;
2578
2579 bool isAnalyzed() const { return WriteLanes.any(); }
2580
2581 /// Mark this value as an IMPLICIT_DEF which must be kept as if it were an
2582 /// ordinary value.
2583 void mustKeepImplicitDef(const TargetRegisterInfo &TRI,
2584 const MachineInstr &ImpDef) {
2585 assert(ImpDef.isImplicitDef());
2586 ErasableImplicitDef = false;
2587 ValidLanes = TRI.getSubRegIndexLaneMask(ImpDef.getOperand(0).getSubReg());
2588 }
2589 };
2590
2591 /// One entry per value number in LI.
2593
2594 /// Compute the bitmask of lanes actually written by DefMI.
2595 /// Set Redef if there are any partial register definitions that depend on the
2596 /// previous value of the register.
2597 LaneBitmask computeWriteLanes(const MachineInstr *DefMI, bool &Redef) const;
2598
2599 /// Find the ultimate value that VNI was copied from.
2600 std::pair<const VNInfo *, Register> followCopyChain(const VNInfo *VNI) const;
2601
2602 bool valuesIdentical(VNInfo *Value0, VNInfo *Value1,
2603 const JoinVals &Other) const;
2604
2605 /// Analyze ValNo in this live range, and set all fields of Vals[ValNo].
2606 /// Return a conflict resolution when possible, but leave the hard cases as
2607 /// CR_Unresolved.
2608 /// Recursively calls computeAssignment() on this and Other, guaranteeing that
2609 /// both OtherVNI and RedefVNI have been analyzed and mapped before returning.
2610 /// The recursion always goes upwards in the dominator tree, making loops
2611 /// impossible.
2612 ConflictResolution analyzeValue(unsigned ValNo, JoinVals &Other);
2613
2614 /// Compute the value assignment for ValNo in RI.
2615 /// This may be called recursively by analyzeValue(), but never for a ValNo on
2616 /// the stack.
2617 void computeAssignment(unsigned ValNo, JoinVals &Other);
2618
2619 /// Assuming ValNo is going to clobber some valid lanes in Other.LR, compute
2620 /// the extent of the tainted lanes in the block.
2621 ///
2622 /// Multiple values in Other.LR can be affected since partial redefinitions
2623 /// can preserve previously tainted lanes.
2624 ///
2625 /// 1 %dst = VLOAD <-- Define all lanes in %dst
2626 /// 2 %src = FOO <-- ValNo to be joined with %dst:ssub0
2627 /// 3 %dst:ssub1 = BAR <-- Partial redef doesn't clear taint in ssub0
2628 /// 4 %dst:ssub0 = COPY %src <-- Conflict resolved, ssub0 wasn't read
2629 ///
2630 /// For each ValNo in Other that is affected, add an (EndIndex, TaintedLanes)
2631 /// entry to TaintedVals.
2632 ///
2633 /// Returns false if the tainted lanes extend beyond the basic block.
2634 bool
2635 taintExtent(unsigned ValNo, LaneBitmask TaintedLanes, JoinVals &Other,
2636 SmallVectorImpl<std::pair<SlotIndex, LaneBitmask>> &TaintExtent);
2637
2638 /// Return true if MI uses any of the given Lanes from Reg.
2639 /// This does not include partial redefinitions of Reg.
2640 bool usesLanes(const MachineInstr &MI, Register, unsigned, LaneBitmask) const;
2641
2642 /// Determine if ValNo is a copy of a value number in LR or Other.LR that will
2643 /// be pruned:
2644 ///
2645 /// %dst = COPY %src
2646 /// %src = COPY %dst <-- This value to be pruned.
2647 /// %dst = COPY %src <-- This value is a copy of a pruned value.
2648 bool isPrunedValue(unsigned ValNo, JoinVals &Other);
2649
2650public:
2651 JoinVals(LiveRange &LR, Register Reg, unsigned SubIdx, LaneBitmask LaneMask,
2652 SmallVectorImpl<VNInfo *> &newVNInfo, const CoalescerPair &cp,
2653 LiveIntervals *lis, const TargetRegisterInfo *TRI, bool SubRangeJoin,
2654 bool TrackSubRegLiveness)
2655 : LR(LR), Reg(Reg), SubIdx(SubIdx), LaneMask(LaneMask),
2656 SubRangeJoin(SubRangeJoin), TrackSubRegLiveness(TrackSubRegLiveness),
2657 NewVNInfo(newVNInfo), CP(cp), LIS(lis), Indexes(LIS->getSlotIndexes()),
2658 TRI(TRI), Assignments(LR.getNumValNums(), -1),
2659 Vals(LR.getNumValNums()) {}
2660
2661 /// Analyze defs in LR and compute a value mapping in NewVNInfo.
2662 /// Returns false if any conflicts were impossible to resolve.
2663 bool mapValues(JoinVals &Other);
2664
2665 /// Try to resolve conflicts that require all values to be mapped.
2666 /// Returns false if any conflicts were impossible to resolve.
2667 bool resolveConflicts(JoinVals &Other);
2668
2669 /// Prune the live range of values in Other.LR where they would conflict with
2670 /// CR_Replace values in LR. Collect end points for restoring the live range
2671 /// after joining.
2672 void pruneValues(JoinVals &Other, SmallVectorImpl<SlotIndex> &EndPoints,
2673 bool changeInstrs);
2674
2675 /// Removes subranges starting at copies that get removed. This sometimes
2676 /// happens when undefined subranges are copied around. These ranges contain
2677 /// no useful information and can be removed.
2678 void pruneSubRegValues(LiveInterval &LI, LaneBitmask &ShrinkMask);
2679
2680 /// Pruning values in subranges can lead to removing segments in these
2681 /// subranges started by IMPLICIT_DEFs. The corresponding segments in
2682 /// the main range also need to be removed. This function will mark
2683 /// the corresponding values in the main range as pruned, so that
2684 /// eraseInstrs can do the final cleanup.
2685 /// The parameter @p LI must be the interval whose main range is the
2686 /// live range LR.
2687 void pruneMainSegments(LiveInterval &LI, bool &ShrinkMainRange);
2688
2689 /// Erase any machine instructions that have been coalesced away.
2690 /// Add erased instructions to ErasedInstrs.
2691 /// Add foreign virtual registers to ShrinkRegs if their live range ended at
2692 /// the erased instrs.
2693 void eraseInstrs(SmallPtrSetImpl<MachineInstr *> &ErasedInstrs,
2694 SmallVectorImpl<Register> &ShrinkRegs,
2695 LiveInterval *LI = nullptr);
2696
2697 /// Remove liverange defs at places where implicit defs will be removed.
2698 void removeImplicitDefs();
2699
2700 /// Get the value assignments suitable for passing to LiveInterval::join.
2701 const int *getAssignments() const { return Assignments.data(); }
2702
2703 /// Get the conflict resolution for a value number.
2704 ConflictResolution getResolution(unsigned Num) const {
2705 return Vals[Num].Resolution;
2706 }
2707};
2708
2709} // end anonymous namespace
2710
2711LaneBitmask JoinVals::computeWriteLanes(const MachineInstr *DefMI,
2712 bool &Redef) const {
2713 LaneBitmask L;
2714 for (const MachineOperand &MO : DefMI->all_defs()) {
2715 if (MO.getReg() != Reg)
2716 continue;
2717 L |= TRI->getSubRegIndexLaneMask(
2718 TRI->composeSubRegIndices(SubIdx, MO.getSubReg()));
2719 if (MO.readsReg())
2720 Redef = true;
2721 }
2722 return L;
2723}
2724
2725std::pair<const VNInfo *, Register>
2726JoinVals::followCopyChain(const VNInfo *VNI) const {
2727 Register TrackReg = Reg;
2728
2729 while (!VNI->isPHIDef()) {
2730 SlotIndex Def = VNI->def;
2731 MachineInstr *MI = Indexes->getInstructionFromIndex(Def);
2732 assert(MI && "No defining instruction");
2733 if (!MI->isFullCopy())
2734 return std::make_pair(VNI, TrackReg);
2735 Register SrcReg = MI->getOperand(1).getReg();
2736 if (!SrcReg.isVirtual())
2737 return std::make_pair(VNI, TrackReg);
2738
2739 const LiveInterval &LI = LIS->getInterval(SrcReg);
2740 const VNInfo *ValueIn;
2741 // No subrange involved.
2742 if (!SubRangeJoin || !LI.hasSubRanges()) {
2743 LiveQueryResult LRQ = LI.Query(Def);
2744 ValueIn = LRQ.valueIn();
2745 } else {
2746 // Query subranges. Ensure that all matching ones take us to the same def
2747 // (allowing some of them to be undef).
2748 ValueIn = nullptr;
2749 for (const LiveInterval::SubRange &S : LI.subranges()) {
2750 // Transform lanemask to a mask in the joined live interval.
2751 LaneBitmask SMask = TRI->composeSubRegIndexLaneMask(SubIdx, S.LaneMask);
2752 if ((SMask & LaneMask).none())
2753 continue;
2754 LiveQueryResult LRQ = S.Query(Def);
2755 if (!ValueIn) {
2756 ValueIn = LRQ.valueIn();
2757 continue;
2758 }
2759 if (LRQ.valueIn() && ValueIn != LRQ.valueIn())
2760 return std::make_pair(VNI, TrackReg);
2761 }
2762 }
2763 if (ValueIn == nullptr) {
2764 // Reaching an undefined value is legitimate, for example:
2765 //
2766 // 1 undef %0.sub1 = ... ;; %0.sub0 == undef
2767 // 2 %1 = COPY %0 ;; %1 is defined here.
2768 // 3 %0 = COPY %1 ;; Now %0.sub0 has a definition,
2769 // ;; but it's equivalent to "undef".
2770 return std::make_pair(nullptr, SrcReg);
2771 }
2772 VNI = ValueIn;
2773 TrackReg = SrcReg;
2774 }
2775 return std::make_pair(VNI, TrackReg);
2776}
2777
2778bool JoinVals::valuesIdentical(VNInfo *Value0, VNInfo *Value1,
2779 const JoinVals &Other) const {
2780 const VNInfo *Orig0;
2781 Register Reg0;
2782 std::tie(Orig0, Reg0) = followCopyChain(Value0);
2783 if (Orig0 == Value1 && Reg0 == Other.Reg)
2784 return true;
2785
2786 const VNInfo *Orig1;
2787 Register Reg1;
2788 std::tie(Orig1, Reg1) = Other.followCopyChain(Value1);
2789 // If both values are undefined, and the source registers are the same
2790 // register, the values are identical. Filter out cases where only one
2791 // value is defined.
2792 if (Orig0 == nullptr || Orig1 == nullptr)
2793 return Orig0 == Orig1 && Reg0 == Reg1;
2794
2795 // The values are equal if they are defined at the same place and use the
2796 // same register. Note that we cannot compare VNInfos directly as some of
2797 // them might be from a copy created in mergeSubRangeInto() while the other
2798 // is from the original LiveInterval.
2799 return Orig0->def == Orig1->def && Reg0 == Reg1;
2800}
2801
2802JoinVals::ConflictResolution JoinVals::analyzeValue(unsigned ValNo,
2803 JoinVals &Other) {
2804 Val &V = Vals[ValNo];
2805 assert(!V.isAnalyzed() && "Value has already been analyzed!");
2806 VNInfo *VNI = LR.getValNumInfo(ValNo);
2807 if (VNI->isUnused()) {
2808 V.WriteLanes = LaneBitmask::getAll();
2809 return CR_Keep;
2810 }
2811
2812 // Get the instruction defining this value, compute the lanes written.
2813 const MachineInstr *DefMI = nullptr;
2814 if (VNI->isPHIDef()) {
2815 // Conservatively assume that all lanes in a PHI are valid.
2816 LaneBitmask Lanes = SubRangeJoin ? LaneBitmask::getLane(0)
2817 : TRI->getSubRegIndexLaneMask(SubIdx);
2818 V.ValidLanes = V.WriteLanes = Lanes;
2819 } else {
2820 DefMI = Indexes->getInstructionFromIndex(VNI->def);
2821 assert(DefMI != nullptr);
2822 if (SubRangeJoin) {
2823 // We don't care about the lanes when joining subregister ranges.
2824 V.WriteLanes = V.ValidLanes = LaneBitmask::getLane(0);
2825 if (DefMI->isImplicitDef()) {
2826 V.ValidLanes = LaneBitmask::getNone();
2827 V.ErasableImplicitDef = true;
2828 }
2829 } else {
2830 bool Redef = false;
2831 V.ValidLanes = V.WriteLanes = computeWriteLanes(DefMI, Redef);
2832
2833 // If this is a read-modify-write instruction, there may be more valid
2834 // lanes than the ones written by this instruction.
2835 // This only covers partial redef operands. DefMI may have normal use
2836 // operands reading the register. They don't contribute valid lanes.
2837 //
2838 // This adds ssub1 to the set of valid lanes in %src:
2839 //
2840 // %src:ssub1 = FOO
2841 //
2842 // This leaves only ssub1 valid, making any other lanes undef:
2843 //
2844 // %src:ssub1<def,read-undef> = FOO %src:ssub2
2845 //
2846 // The <read-undef> flag on the def operand means that old lane values are
2847 // not important.
2848 if (Redef) {
2849 V.RedefVNI = LR.Query(VNI->def).valueIn();
2850 assert((TrackSubRegLiveness || V.RedefVNI) &&
2851 "Instruction is reading nonexistent value");
2852 if (V.RedefVNI != nullptr) {
2853 computeAssignment(V.RedefVNI->id, Other);
2854 V.ValidLanes |= Vals[V.RedefVNI->id].ValidLanes;
2855 }
2856 }
2857
2858 // An IMPLICIT_DEF writes undef values.
2859 if (DefMI->isImplicitDef()) {
2860 // We normally expect IMPLICIT_DEF values to be live only until the end
2861 // of their block. If the value is really live longer and gets pruned in
2862 // another block, this flag is cleared again.
2863 //
2864 // Clearing the valid lanes is deferred until it is sure this can be
2865 // erased.
2866 V.ErasableImplicitDef = true;
2867 }
2868 }
2869 }
2870
2871 // Find the value in Other that overlaps VNI->def, if any.
2872 LiveQueryResult OtherLRQ = Other.LR.Query(VNI->def);
2873
2874 // It is possible that both values are defined by the same instruction, or
2875 // the values are PHIs defined in the same block. When that happens, the two
2876 // values should be merged into one, but not into any preceding value.
2877 // The first value defined or visited gets CR_Keep, the other gets CR_Merge.
2878 if (VNInfo *OtherVNI = OtherLRQ.valueDefined()) {
2879 assert(SlotIndex::isSameInstr(VNI->def, OtherVNI->def) && "Broken LRQ");
2880
2881 // One value stays, the other is merged. Keep the earlier one, or the first
2882 // one we see.
2883 if (OtherVNI->def < VNI->def)
2884 Other.computeAssignment(OtherVNI->id, *this);
2885 else if (VNI->def < OtherVNI->def && OtherLRQ.valueIn()) {
2886 // This is an early-clobber def overlapping a live-in value in the other
2887 // register. Not mergeable.
2888 V.OtherVNI = OtherLRQ.valueIn();
2889 return CR_Impossible;
2890 }
2891 V.OtherVNI = OtherVNI;
2892 Val &OtherV = Other.Vals[OtherVNI->id];
2893 // Keep this value, check for conflicts when analyzing OtherVNI. Avoid
2894 // revisiting OtherVNI->id in JoinVals::computeAssignment() below before it
2895 // is assigned.
2896 if (!OtherV.isAnalyzed() || Other.Assignments[OtherVNI->id] == -1)
2897 return CR_Keep;
2898 // Both sides have been analyzed now.
2899 // Allow overlapping PHI values. Any real interference would show up in a
2900 // predecessor, the PHI itself can't introduce any conflicts.
2901 if (VNI->isPHIDef())
2902 return CR_Merge;
2903 if ((V.ValidLanes & OtherV.ValidLanes).any())
2904 // Overlapping lanes can't be resolved.
2905 return CR_Impossible;
2906 else
2907 return CR_Merge;
2908 }
2909
2910 // No simultaneous def. Is Other live at the def?
2911 V.OtherVNI = OtherLRQ.valueIn();
2912 if (!V.OtherVNI)
2913 // No overlap, no conflict.
2914 return CR_Keep;
2915
2916 assert(!SlotIndex::isSameInstr(VNI->def, V.OtherVNI->def) && "Broken LRQ");
2917
2918 // We have overlapping values, or possibly a kill of Other.
2919 // Recursively compute assignments up the dominator tree.
2920 Other.computeAssignment(V.OtherVNI->id, *this);
2921 Val &OtherV = Other.Vals[V.OtherVNI->id];
2922
2923 if (OtherV.ErasableImplicitDef) {
2924 // Check if OtherV is an IMPLICIT_DEF that extends beyond its basic block.
2925 // This shouldn't normally happen, but ProcessImplicitDefs can leave such
2926 // IMPLICIT_DEF instructions behind, and there is nothing wrong with it
2927 // technically.
2928 //
2929 // When it happens, treat that IMPLICIT_DEF as a normal value, and don't try
2930 // to erase the IMPLICIT_DEF instruction.
2931 //
2932 // Additionally we must keep an IMPLICIT_DEF if we're redefining an incoming
2933 // value.
2934
2935 MachineInstr *OtherImpDef =
2936 Indexes->getInstructionFromIndex(V.OtherVNI->def);
2937 MachineBasicBlock *OtherMBB = OtherImpDef->getParent();
2938 if (DefMI &&
2939 (DefMI->getParent() != OtherMBB || LIS->isLiveInToMBB(LR, OtherMBB))) {
2940 LLVM_DEBUG(dbgs() << "IMPLICIT_DEF defined at " << V.OtherVNI->def
2941 << " extends into "
2943 << ", keeping it.\n");
2944 OtherV.mustKeepImplicitDef(*TRI, *OtherImpDef);
2945 } else if (OtherMBB->hasEHPadSuccessor()) {
2946 // If OtherV is defined in a basic block that has EH pad successors then
2947 // we get the same problem not just if OtherV is live beyond its basic
2948 // block, but beyond the last call instruction in its basic block. Handle
2949 // this case conservatively.
2950 LLVM_DEBUG(
2951 dbgs() << "IMPLICIT_DEF defined at " << V.OtherVNI->def
2952 << " may be live into EH pad successors, keeping it.\n");
2953 OtherV.mustKeepImplicitDef(*TRI, *OtherImpDef);
2954 } else {
2955 // We deferred clearing these lanes in case we needed to save them
2956 OtherV.ValidLanes &= ~OtherV.WriteLanes;
2957 }
2958 }
2959
2960 // Allow overlapping PHI values. Any real interference would show up in a
2961 // predecessor, the PHI itself can't introduce any conflicts.
2962 if (VNI->isPHIDef())
2963 return CR_Replace;
2964
2965 // Check for simple erasable conflicts.
2966 if (DefMI->isImplicitDef())
2967 return CR_Erase;
2968
2969 // Include the non-conflict where DefMI is a coalescable copy that kills
2970 // OtherVNI. We still want the copy erased and value numbers merged.
2971 if (CP.isCoalescable(DefMI)) {
2972 // Some of the lanes copied from OtherVNI may be undef, making them undef
2973 // here too.
2974 V.ValidLanes &= ~V.WriteLanes | OtherV.ValidLanes;
2975 return CR_Erase;
2976 }
2977
2978 // This may not be a real conflict if DefMI simply kills Other and defines
2979 // VNI.
2980 if (OtherLRQ.isKill() && OtherLRQ.endPoint() <= VNI->def)
2981 return CR_Keep;
2982
2983 // Handle the case where VNI and OtherVNI can be proven to be identical:
2984 //
2985 // %other = COPY %ext
2986 // %this = COPY %ext <-- Erase this copy
2987 //
2988 if (DefMI->isFullCopy() && !CP.isPartial() &&
2989 valuesIdentical(VNI, V.OtherVNI, Other)) {
2990 V.Identical = true;
2991 return CR_Erase;
2992 }
2993
2994 // The remaining checks apply to the lanes, which aren't tracked here. This
2995 // was already decided to be OK via the following CR_Replace condition.
2996 // CR_Replace.
2997 if (SubRangeJoin)
2998 return CR_Replace;
2999
3000 // If the lanes written by this instruction were all undef in OtherVNI, it is
3001 // still safe to join the live ranges. This can't be done with a simple value
3002 // mapping, though - OtherVNI will map to multiple values:
3003 //
3004 // 1 %dst:ssub0 = FOO <-- OtherVNI
3005 // 2 %src = BAR <-- VNI
3006 // 3 %dst:ssub1 = COPY killed %src <-- Eliminate this copy.
3007 // 4 BAZ killed %dst
3008 // 5 QUUX killed %src
3009 //
3010 // Here OtherVNI will map to itself in [1;2), but to VNI in [2;5). CR_Replace
3011 // handles this complex value mapping.
3012 if ((V.WriteLanes & OtherV.ValidLanes).none())
3013 return CR_Replace;
3014
3015 // If the other live range is killed by DefMI and the live ranges are still
3016 // overlapping, it must be because we're looking at an early clobber def:
3017 //
3018 // %dst<def,early-clobber> = ASM killed %src
3019 //
3020 // In this case, it is illegal to merge the two live ranges since the early
3021 // clobber def would clobber %src before it was read.
3022 if (OtherLRQ.isKill()) {
3023 // This case where the def doesn't overlap the kill is handled above.
3024 assert(VNI->def.isEarlyClobber() &&
3025 "Only early clobber defs can overlap a kill");
3026 return CR_Impossible;
3027 }
3028
3029 // VNI is clobbering live lanes in OtherVNI, but there is still the
3030 // possibility that no instructions actually read the clobbered lanes.
3031 // If we're clobbering all the lanes in OtherVNI, at least one must be read.
3032 // Otherwise Other.RI wouldn't be live here.
3033 if ((TRI->getSubRegIndexLaneMask(Other.SubIdx) & ~V.WriteLanes).none())
3034 return CR_Impossible;
3035
3036 if (TrackSubRegLiveness) {
3037 auto &OtherLI = LIS->getInterval(Other.Reg);
3038 // If OtherVNI does not have subranges, it means all the lanes of OtherVNI
3039 // share the same live range, so we just need to check whether they have
3040 // any conflict bit in their LaneMask.
3041 if (!OtherLI.hasSubRanges()) {
3042 LaneBitmask OtherMask = TRI->getSubRegIndexLaneMask(Other.SubIdx);
3043 return (OtherMask & V.WriteLanes).none() ? CR_Replace : CR_Impossible;
3044 }
3045
3046 // If we are clobbering some active lanes of OtherVNI at VNI->def, it is
3047 // impossible to resolve the conflict. Otherwise, we can just replace
3048 // OtherVNI because of no real conflict.
3049 for (LiveInterval::SubRange &OtherSR : OtherLI.subranges()) {
3050 LaneBitmask OtherMask =
3051 TRI->composeSubRegIndexLaneMask(Other.SubIdx, OtherSR.LaneMask);
3052 if ((OtherMask & V.WriteLanes).none())
3053 continue;
3054
3055 auto OtherSRQ = OtherSR.Query(VNI->def);
3056 if (OtherSRQ.valueIn() && OtherSRQ.endPoint() > VNI->def) {
3057 // VNI is clobbering some lanes of OtherVNI, they have real conflict.
3058 return CR_Impossible;
3059 }
3060 }
3061
3062 // VNI is NOT clobbering any lane of OtherVNI, just replace OtherVNI.
3063 return CR_Replace;
3064 }
3065
3066 // We need to verify that no instructions are reading the clobbered lanes.
3067 // To save compile time, we'll only check that locally. Don't allow the
3068 // tainted value to escape the basic block.
3069 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(VNI->def);
3070 if (OtherLRQ.endPoint() >= Indexes->getMBBEndIdx(MBB))
3071 return CR_Impossible;
3072
3073 // There are still some things that could go wrong besides clobbered lanes
3074 // being read, for example OtherVNI may be only partially redefined in MBB,
3075 // and some clobbered lanes could escape the block. Save this analysis for
3076 // resolveConflicts() when all values have been mapped. We need to know
3077 // RedefVNI and WriteLanes for any later defs in MBB, and we can't compute
3078 // that now - the recursive analyzeValue() calls must go upwards in the
3079 // dominator tree.
3080 return CR_Unresolved;
3081}
3082
3083void JoinVals::computeAssignment(unsigned ValNo, JoinVals &Other) {
3084 Val &V = Vals[ValNo];
3085 if (V.isAnalyzed()) {
3086 // Recursion should always move up the dominator tree, so ValNo is not
3087 // supposed to reappear before it has been assigned.
3088 assert(Assignments[ValNo] != -1 && "Bad recursion?");
3089 return;
3090 }
3091 switch ((V.Resolution = analyzeValue(ValNo, Other))) {
3092 case CR_Erase:
3093 case CR_Merge:
3094 // Merge this ValNo into OtherVNI.
3095 assert(V.OtherVNI && "OtherVNI not assigned, can't merge.");
3096 assert(Other.Vals[V.OtherVNI->id].isAnalyzed() && "Missing recursion");
3097 Assignments[ValNo] = Other.Assignments[V.OtherVNI->id];
3098 LLVM_DEBUG(dbgs() << "\t\tmerge " << printReg(Reg) << ':' << ValNo << '@'
3099 << LR.getValNumInfo(ValNo)->def << " into "
3100 << printReg(Other.Reg) << ':' << V.OtherVNI->id << '@'
3101 << V.OtherVNI->def << " --> @"
3102 << NewVNInfo[Assignments[ValNo]]->def << '\n');
3103 break;
3104 case CR_Replace:
3105 case CR_Unresolved: {
3106 // The other value is going to be pruned if this join is successful.
3107 assert(V.OtherVNI && "OtherVNI not assigned, can't prune");
3108 Val &OtherV = Other.Vals[V.OtherVNI->id];
3109 OtherV.Pruned = true;
3110 [[fallthrough]];
3111 }
3112 default:
3113 // This value number needs to go in the final joined live range.
3114 Assignments[ValNo] = NewVNInfo.size();
3115 NewVNInfo.push_back(LR.getValNumInfo(ValNo));
3116 break;
3117 }
3118}
3119
3120bool JoinVals::mapValues(JoinVals &Other) {
3121 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3122 computeAssignment(i, Other);
3123 if (Vals[i].Resolution == CR_Impossible) {
3124 LLVM_DEBUG(dbgs() << "\t\tinterference at " << printReg(Reg) << ':' << i
3125 << '@' << LR.getValNumInfo(i)->def << '\n');
3126 return false;
3127 }
3128 }
3129 return true;
3130}
3131
3132bool JoinVals::taintExtent(
3133 unsigned ValNo, LaneBitmask TaintedLanes, JoinVals &Other,
3134 SmallVectorImpl<std::pair<SlotIndex, LaneBitmask>> &TaintExtent) {
3135 VNInfo *VNI = LR.getValNumInfo(ValNo);
3136 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(VNI->def);
3137 SlotIndex MBBEnd = Indexes->getMBBEndIdx(MBB);
3138
3139 // Scan Other.LR from VNI.def to MBBEnd.
3140 LiveInterval::iterator OtherI = Other.LR.find(VNI->def);
3141 assert(OtherI != Other.LR.end() && "No conflict?");
3142 do {
3143 // OtherI is pointing to a tainted value. Abort the join if the tainted
3144 // lanes escape the block.
3145 SlotIndex End = OtherI->end;
3146 if (End >= MBBEnd) {
3147 LLVM_DEBUG(dbgs() << "\t\ttaints global " << printReg(Other.Reg) << ':'
3148 << OtherI->valno->id << '@' << OtherI->start << '\n');
3149 return false;
3150 }
3151 LLVM_DEBUG(dbgs() << "\t\ttaints local " << printReg(Other.Reg) << ':'
3152 << OtherI->valno->id << '@' << OtherI->start << " to "
3153 << End << '\n');
3154 // A dead def is not a problem.
3155 if (End.isDead())
3156 break;
3157 TaintExtent.push_back(std::make_pair(End, TaintedLanes));
3158
3159 // Check for another def in the MBB.
3160 if (++OtherI == Other.LR.end() || OtherI->start >= MBBEnd)
3161 break;
3162
3163 // Lanes written by the new def are no longer tainted.
3164 const Val &OV = Other.Vals[OtherI->valno->id];
3165 TaintedLanes &= ~OV.WriteLanes;
3166 if (!OV.RedefVNI)
3167 break;
3168 } while (TaintedLanes.any());
3169 return true;
3170}
3171
3172bool JoinVals::usesLanes(const MachineInstr &MI, Register Reg, unsigned SubIdx,
3173 LaneBitmask Lanes) const {
3174 if (MI.isDebugOrPseudoInstr())
3175 return false;
3176 for (const MachineOperand &MO : MI.all_uses()) {
3177 if (MO.getReg() != Reg)
3178 continue;
3179 if (!MO.readsReg())
3180 continue;
3181 unsigned S = TRI->composeSubRegIndices(SubIdx, MO.getSubReg());
3182 if ((Lanes & TRI->getSubRegIndexLaneMask(S)).any())
3183 return true;
3184 }
3185 return false;
3186}
3187
3188bool JoinVals::resolveConflicts(JoinVals &Other) {
3189 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3190 Val &V = Vals[i];
3191 assert(V.Resolution != CR_Impossible && "Unresolvable conflict");
3192 if (V.Resolution != CR_Unresolved)
3193 continue;
3194 LLVM_DEBUG(dbgs() << "\t\tconflict at " << printReg(Reg) << ':' << i << '@'
3195 << LR.getValNumInfo(i)->def << ' '
3196 << PrintLaneMask(LaneMask) << '\n');
3197 if (SubRangeJoin)
3198 return false;
3199
3200 ++NumLaneConflicts;
3201 assert(V.OtherVNI && "Inconsistent conflict resolution.");
3202 VNInfo *VNI = LR.getValNumInfo(i);
3203 const Val &OtherV = Other.Vals[V.OtherVNI->id];
3204
3205 // VNI is known to clobber some lanes in OtherVNI. If we go ahead with the
3206 // join, those lanes will be tainted with a wrong value. Get the extent of
3207 // the tainted lanes.
3208 LaneBitmask TaintedLanes = V.WriteLanes & OtherV.ValidLanes;
3210 if (!taintExtent(i, TaintedLanes, Other, TaintExtent))
3211 // Tainted lanes would extend beyond the basic block.
3212 return false;
3213
3214 assert(!TaintExtent.empty() && "There should be at least one conflict.");
3215
3216 // Now look at the instructions from VNI->def to TaintExtent (inclusive).
3217 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(VNI->def);
3219 if (!VNI->isPHIDef()) {
3220 MI = Indexes->getInstructionFromIndex(VNI->def);
3221 if (!VNI->def.isEarlyClobber()) {
3222 // No need to check the instruction defining VNI for reads.
3223 ++MI;
3224 }
3225 }
3226 assert(!SlotIndex::isSameInstr(VNI->def, TaintExtent.front().first) &&
3227 "Interference ends on VNI->def. Should have been handled earlier");
3228 MachineInstr *LastMI =
3229 Indexes->getInstructionFromIndex(TaintExtent.front().first);
3230 assert(LastMI && "Range must end at a proper instruction");
3231 unsigned TaintNum = 0;
3232 while (true) {
3233 assert(MI != MBB->end() && "Bad LastMI");
3234 if (usesLanes(*MI, Other.Reg, Other.SubIdx, TaintedLanes)) {
3235 LLVM_DEBUG(dbgs() << "\t\ttainted lanes used by: " << *MI);
3236 return false;
3237 }
3238 // LastMI is the last instruction to use the current value.
3239 if (&*MI == LastMI) {
3240 if (++TaintNum == TaintExtent.size())
3241 break;
3242 LastMI = Indexes->getInstructionFromIndex(TaintExtent[TaintNum].first);
3243 assert(LastMI && "Range must end at a proper instruction");
3244 TaintedLanes = TaintExtent[TaintNum].second;
3245 }
3246 ++MI;
3247 }
3248
3249 // The tainted lanes are unused.
3250 V.Resolution = CR_Replace;
3251 ++NumLaneResolves;
3252 }
3253 return true;
3254}
3255
3256bool JoinVals::isPrunedValue(unsigned ValNo, JoinVals &Other) {
3257 Val &V = Vals[ValNo];
3258 if (V.Pruned || V.PrunedComputed)
3259 return V.Pruned;
3260
3261 if (V.Resolution != CR_Erase && V.Resolution != CR_Merge)
3262 return V.Pruned;
3263
3264 // Follow copies up the dominator tree and check if any intermediate value
3265 // has been pruned.
3266 V.PrunedComputed = true;
3267 V.Pruned = Other.isPrunedValue(V.OtherVNI->id, *this);
3268 return V.Pruned;
3269}
3270
3271void JoinVals::pruneValues(JoinVals &Other,
3272 SmallVectorImpl<SlotIndex> &EndPoints,
3273 bool changeInstrs) {
3274 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3275 SlotIndex Def = LR.getValNumInfo(i)->def;
3276 switch (Vals[i].Resolution) {
3277 case CR_Keep:
3278 break;
3279 case CR_Replace: {
3280 // This value takes precedence over the value in Other.LR.
3281 LIS->pruneValue(Other.LR, Def, &EndPoints);
3282 // Check if we're replacing an IMPLICIT_DEF value. The IMPLICIT_DEF
3283 // instructions are only inserted to provide a live-out value for PHI
3284 // predecessors, so the instruction should simply go away once its value
3285 // has been replaced.
3286 Val &OtherV = Other.Vals[Vals[i].OtherVNI->id];
3287 bool EraseImpDef =
3288 OtherV.ErasableImplicitDef && OtherV.Resolution == CR_Keep;
3289 if (!Def.isBlock()) {
3290 if (changeInstrs) {
3291 // Remove <def,read-undef> flags. This def is now a partial redef.
3292 // Also remove dead flags since the joined live range will
3293 // continue past this instruction.
3294 for (MachineOperand &MO :
3295 Indexes->getInstructionFromIndex(Def)->all_defs()) {
3296 if (MO.getReg() == Reg) {
3297 if (MO.getSubReg() != 0 && MO.isUndef() && !EraseImpDef)
3298 MO.setIsUndef(false);
3299 MO.setIsDead(false);
3300 }
3301 }
3302 }
3303 // This value will reach instructions below, but we need to make sure
3304 // the live range also reaches the instruction at Def.
3305 if (!EraseImpDef)
3306 EndPoints.push_back(Def);
3307 }
3308 LLVM_DEBUG(dbgs() << "\t\tpruned " << printReg(Other.Reg) << " at " << Def
3309 << ": " << Other.LR << '\n');
3310 break;
3311 }
3312 case CR_Erase:
3313 case CR_Merge:
3314 if (isPrunedValue(i, Other)) {
3315 // This value is ultimately a copy of a pruned value in LR or Other.LR.
3316 // We can no longer trust the value mapping computed by
3317 // computeAssignment(), the value that was originally copied could have
3318 // been replaced.
3319 LIS->pruneValue(LR, Def, &EndPoints);
3320 LLVM_DEBUG(dbgs() << "\t\tpruned all of " << printReg(Reg) << " at "
3321 << Def << ": " << LR << '\n');
3322 }
3323 break;
3324 case CR_Unresolved:
3325 case CR_Impossible:
3326 llvm_unreachable("Unresolved conflicts");
3327 }
3328 }
3329}
3330
3331// Check if the segment consists of a copied live-through value (i.e. the copy
3332// in the block only extended the liveness, of an undef value which we may need
3333// to handle).
3334static bool isLiveThrough(const LiveQueryResult Q) {
3335 return Q.valueIn() && Q.valueIn()->isPHIDef() && Q.valueIn() == Q.valueOut();
3336}
3337
3338/// Consider the following situation when coalescing the copy between
3339/// %31 and %45 at 800. (The vertical lines represent live range segments.)
3340///
3341/// Main range Subrange 0004 (sub2)
3342/// %31 %45 %31 %45
3343/// 544 %45 = COPY %28 + +
3344/// | v1 | v1
3345/// 560B bb.1: + +
3346/// 624 = %45.sub2 | v2 | v2
3347/// 800 %31 = COPY %45 + + + +
3348/// | v0 | v0
3349/// 816 %31.sub1 = ... + |
3350/// 880 %30 = COPY %31 | v1 +
3351/// 928 %45 = COPY %30 | + +
3352/// | | v0 | v0 <--+
3353/// 992B ; backedge -> bb.1 | + + |
3354/// 1040 = %31.sub0 + |
3355/// This value must remain
3356/// live-out!
3357///
3358/// Assuming that %31 is coalesced into %45, the copy at 928 becomes
3359/// redundant, since it copies the value from %45 back into it. The
3360/// conflict resolution for the main range determines that %45.v0 is
3361/// to be erased, which is ok since %31.v1 is identical to it.
3362/// The problem happens with the subrange for sub2: it has to be live
3363/// on exit from the block, but since 928 was actually a point of
3364/// definition of %45.sub2, %45.sub2 was not live immediately prior
3365/// to that definition. As a result, when 928 was erased, the value v0
3366/// for %45.sub2 was pruned in pruneSubRegValues. Consequently, an
3367/// IMPLICIT_DEF was inserted as a "backedge" definition for %45.sub2,
3368/// providing an incorrect value to the use at 624.
3369///
3370/// Since the main-range values %31.v1 and %45.v0 were proved to be
3371/// identical, the corresponding values in subranges must also be the
3372/// same. A redundant copy is removed because it's not needed, and not
3373/// because it copied an undefined value, so any liveness that originated
3374/// from that copy cannot disappear. When pruning a value that started
3375/// at the removed copy, the corresponding identical value must be
3376/// extended to replace it.
3377void JoinVals::pruneSubRegValues(LiveInterval &LI, LaneBitmask &ShrinkMask) {
3378 // Look for values being erased.
3379 bool DidPrune = false;
3380 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3381 Val &V = Vals[i];
3382 // We should trigger in all cases in which eraseInstrs() does something.
3383 // match what eraseInstrs() is doing, print a message so
3384 if (V.Resolution != CR_Erase &&
3385 (V.Resolution != CR_Keep || !V.ErasableImplicitDef || !V.Pruned))
3386 continue;
3387
3388 // Check subranges at the point where the copy will be removed.
3389 SlotIndex Def = LR.getValNumInfo(i)->def;
3390 SlotIndex OtherDef;
3391 if (V.Identical)
3392 OtherDef = V.OtherVNI->def;
3393
3394 // Print message so mismatches with eraseInstrs() can be diagnosed.
3395 LLVM_DEBUG(dbgs() << "\t\tExpecting instruction removal at " << Def
3396 << '\n');
3397 for (LiveInterval::SubRange &S : LI.subranges()) {
3398 LiveQueryResult Q = S.Query(Def);
3399
3400 // If a subrange starts at the copy then an undefined value has been
3401 // copied and we must remove that subrange value as well.
3402 VNInfo *ValueOut = Q.valueOutOrDead();
3403 if (ValueOut != nullptr &&
3404 (Q.valueIn() == nullptr ||
3405 (V.Identical && V.Resolution == CR_Erase && ValueOut->def == Def))) {
3406 LLVM_DEBUG(dbgs() << "\t\tPrune sublane " << PrintLaneMask(S.LaneMask)
3407 << " at " << Def << "\n");
3408 SmallVector<SlotIndex, 8> EndPoints;
3409 LIS->pruneValue(S, Def, &EndPoints);
3410 DidPrune = true;
3411 // Mark value number as unused.
3412 ValueOut->markUnused();
3413
3414 if (V.Identical && S.Query(OtherDef).valueOutOrDead()) {
3415 // If V is identical to V.OtherVNI (and S was live at OtherDef),
3416 // then we can't simply prune V from S. V needs to be replaced
3417 // with V.OtherVNI.
3418 LIS->extendToIndices(S, EndPoints);
3419 }
3420
3421 // We may need to eliminate the subrange if the copy introduced a live
3422 // out undef value.
3423 if (ValueOut->isPHIDef())
3424 ShrinkMask |= S.LaneMask;
3425 continue;
3426 }
3427
3428 // If a subrange ends at the copy, then a value was copied but only
3429 // partially used later. Shrink the subregister range appropriately.
3430 //
3431 // Ultimately this calls shrinkToUses, so assuming ShrinkMask is
3432 // conservatively correct.
3433 if ((Q.valueIn() != nullptr && Q.valueOut() == nullptr) ||
3434 (V.Resolution == CR_Erase && isLiveThrough(Q))) {
3435 LLVM_DEBUG(dbgs() << "\t\tDead uses at sublane "
3436 << PrintLaneMask(S.LaneMask) << " at " << Def
3437 << "\n");
3438 ShrinkMask |= S.LaneMask;
3439 }
3440 }
3441 }
3442 if (DidPrune)
3444}
3445
3446/// Check if any of the subranges of @p LI contain a definition at @p Def.
3448 for (LiveInterval::SubRange &SR : LI.subranges()) {
3449 if (VNInfo *VNI = SR.Query(Def).valueOutOrDead())
3450 if (VNI->def == Def)
3451 return true;
3452 }
3453 return false;
3454}
3455
3456void JoinVals::pruneMainSegments(LiveInterval &LI, bool &ShrinkMainRange) {
3457 assert(&static_cast<LiveRange &>(LI) == &LR);
3458
3459 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3460 if (Vals[i].Resolution != CR_Keep)
3461 continue;
3462 VNInfo *VNI = LR.getValNumInfo(i);
3463 if (VNI->isUnused() || VNI->isPHIDef() || isDefInSubRange(LI, VNI->def))
3464 continue;
3465 Vals[i].Pruned = true;
3466 ShrinkMainRange = true;
3467 }
3468}
3469
3470void JoinVals::removeImplicitDefs() {
3471 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3472 Val &V = Vals[i];
3473 if (V.Resolution != CR_Keep || !V.ErasableImplicitDef || !V.Pruned)
3474 continue;
3475
3476 VNInfo *VNI = LR.getValNumInfo(i);
3477 VNI->markUnused();
3478 LR.removeValNo(VNI);
3479 }
3480}
3481
3482void JoinVals::eraseInstrs(SmallPtrSetImpl<MachineInstr *> &ErasedInstrs,
3483 SmallVectorImpl<Register> &ShrinkRegs,
3484 LiveInterval *LI) {
3485 for (unsigned i = 0, e = LR.getNumValNums(); i != e; ++i) {
3486 // Get the def location before markUnused() below invalidates it.
3487 VNInfo *VNI = LR.getValNumInfo(i);
3488 SlotIndex Def = VNI->def;
3489 switch (Vals[i].Resolution) {
3490 case CR_Keep: {
3491 // If an IMPLICIT_DEF value is pruned, it doesn't serve a purpose any
3492 // longer. The IMPLICIT_DEF instructions are only inserted by
3493 // PHIElimination to guarantee that all PHI predecessors have a value.
3494 if (!Vals[i].ErasableImplicitDef || !Vals[i].Pruned)
3495 break;
3496 // Remove value number i from LR.
3497 // For intervals with subranges, removing a segment from the main range
3498 // may require extending the previous segment: for each definition of
3499 // a subregister, there will be a corresponding def in the main range.
3500 // That def may fall in the middle of a segment from another subrange.
3501 // In such cases, removing this def from the main range must be
3502 // complemented by extending the main range to account for the liveness
3503 // of the other subrange.
3504 // The new end point of the main range segment to be extended.
3505 SlotIndex NewEnd;
3506 if (LI != nullptr) {
3508 assert(I != LR.end());
3509 // Do not extend beyond the end of the segment being removed.
3510 // The segment may have been pruned in preparation for joining
3511 // live ranges.
3512 NewEnd = I->end;
3513 }
3514
3515 LR.removeValNo(VNI);
3516 // Note that this VNInfo is reused and still referenced in NewVNInfo,
3517 // make it appear like an unused value number.
3518 VNI->markUnused();
3519
3520 if (LI != nullptr && LI->hasSubRanges()) {
3521 assert(static_cast<LiveRange *>(LI) == &LR);
3522 // Determine the end point based on the subrange information:
3523 // minimum of (earliest def of next segment,
3524 // latest end point of containing segment)
3525 SlotIndex ED, LE;
3526 for (LiveInterval::SubRange &SR : LI->subranges()) {
3527 LiveRange::iterator I = SR.find(Def);
3528 if (I == SR.end())
3529 continue;
3530 if (I->start > Def)
3531 ED = ED.isValid() ? std::min(ED, I->start) : I->start;
3532 else
3533 LE = LE.isValid() ? std::max(LE, I->end) : I->end;
3534 }
3535 if (LE.isValid())
3536 NewEnd = std::min(NewEnd, LE);
3537 if (ED.isValid())
3538 NewEnd = std::min(NewEnd, ED);
3539
3540 // We only want to do the extension if there was a subrange that
3541 // was live across Def.
3542 if (LE.isValid()) {
3543 LiveRange::iterator S = LR.find(Def);
3544 if (S != LR.begin())
3545 std::prev(S)->end = NewEnd;
3546 }
3547 }
3548 LLVM_DEBUG({
3549 dbgs() << "\t\tremoved " << i << '@' << Def << ": " << LR << '\n';
3550 if (LI != nullptr)
3551 dbgs() << "\t\t LHS = " << *LI << '\n';
3552 });
3553 [[fallthrough]];
3554 }
3555
3556 case CR_Erase: {
3557 MachineInstr *MI = Indexes->getInstructionFromIndex(Def);
3558 assert(MI && "No instruction to erase");
3559 if (MI->isCopy()) {
3560 Register Reg = MI->getOperand(1).getReg();
3561 if (Reg.isVirtual() && Reg != CP.getSrcReg() && Reg != CP.getDstReg())
3562 ShrinkRegs.push_back(Reg);
3563 }
3564 ErasedInstrs.insert(MI);
3565 LLVM_DEBUG(dbgs() << "\t\terased:\t" << Def << '\t' << *MI);
3567 MI->eraseFromParent();
3568 break;
3569 }
3570 default:
3571 break;
3572 }
3573 }
3574}
3575
3576void RegisterCoalescer::joinSubRegRanges(LiveRange &LRange, LiveRange &RRange,
3577 LaneBitmask LaneMask,
3578 const CoalescerPair &CP) {
3579 SmallVector<VNInfo *, 16> NewVNInfo;
3580 JoinVals RHSVals(RRange, CP.getSrcReg(), CP.getSrcIdx(), LaneMask, NewVNInfo,
3581 CP, LIS, TRI, true, true);
3582 JoinVals LHSVals(LRange, CP.getDstReg(), CP.getDstIdx(), LaneMask, NewVNInfo,
3583 CP, LIS, TRI, true, true);
3584
3585 // Compute NewVNInfo and resolve conflicts (see also joinVirtRegs())
3586 // We should be able to resolve all conflicts here as we could successfully do
3587 // it on the mainrange already. There is however a problem when multiple
3588 // ranges get mapped to the "overflow" lane mask bit which creates unexpected
3589 // interferences.
3590 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals)) {
3591 // We already determined that it is legal to merge the intervals, so this
3592 // should never fail.
3593 llvm_unreachable("*** Couldn't join subrange!\n");
3594 }
3595 if (!LHSVals.resolveConflicts(RHSVals) ||
3596 !RHSVals.resolveConflicts(LHSVals)) {
3597 // We already determined that it is legal to merge the intervals, so this
3598 // should never fail.
3599 llvm_unreachable("*** Couldn't join subrange!\n");
3600 }
3601
3602 // The merging algorithm in LiveInterval::join() can't handle conflicting
3603 // value mappings, so we need to remove any live ranges that overlap a
3604 // CR_Replace resolution. Collect a set of end points that can be used to
3605 // restore the live range after joining.
3606 SmallVector<SlotIndex, 8> EndPoints;
3607 LHSVals.pruneValues(RHSVals, EndPoints, false);
3608 RHSVals.pruneValues(LHSVals, EndPoints, false);
3609
3610 LHSVals.removeImplicitDefs();
3611 RHSVals.removeImplicitDefs();
3612
3613 assert(LRange.verify() && RRange.verify());
3614
3615 // Join RRange into LHS.
3616 LRange.join(RRange, LHSVals.getAssignments(), RHSVals.getAssignments(),
3617 NewVNInfo);
3618
3619 LLVM_DEBUG(dbgs() << "\t\tjoined lanes: " << PrintLaneMask(LaneMask) << ' '
3620 << LRange << "\n");
3621 if (EndPoints.empty())
3622 return;
3623
3624 // Recompute the parts of the live range we had to remove because of
3625 // CR_Replace conflicts.
3626 LLVM_DEBUG({
3627 dbgs() << "\t\trestoring liveness to " << EndPoints.size() << " points: ";
3628 for (unsigned i = 0, n = EndPoints.size(); i != n; ++i) {
3629 dbgs() << EndPoints[i];
3630 if (i != n - 1)
3631 dbgs() << ',';
3632 }
3633 dbgs() << ": " << LRange << '\n';
3634 });
3635 LIS->extendToIndices(LRange, EndPoints);
3636}
3637
3638void RegisterCoalescer::mergeSubRangeInto(LiveInterval &LI,
3639 const LiveRange &ToMerge,
3640 LaneBitmask LaneMask,
3641 CoalescerPair &CP,
3642 unsigned ComposeSubRegIdx) {
3644 LI.refineSubRanges(
3645 Allocator, LaneMask,
3646 [this, &Allocator, &ToMerge, &CP](LiveInterval::SubRange &SR) {
3647 if (SR.empty()) {
3648 SR.assign(ToMerge, Allocator);
3649 } else {
3650 // joinSubRegRange() destroys the merged range, so we need a copy.
3651 LiveRange RangeCopy(ToMerge, Allocator);
3652 joinSubRegRanges(SR, RangeCopy, SR.LaneMask, CP);
3653 }
3654 },
3655 *LIS->getSlotIndexes(), *TRI, ComposeSubRegIdx);
3656}
3657
3658bool RegisterCoalescer::isHighCostLiveInterval(LiveInterval &LI) {
3660 return false;
3661 auto &Counter = LargeLIVisitCounter[LI.reg()];
3662 if (Counter < LargeIntervalFreqThreshold) {
3663 Counter++;
3664 return false;
3665 }
3666 return true;
3667}
3668
3669bool RegisterCoalescer::joinVirtRegs(CoalescerPair &CP) {
3670 SmallVector<VNInfo *, 16> NewVNInfo;
3671 LiveInterval &RHS = LIS->getInterval(CP.getSrcReg());
3672 LiveInterval &LHS = LIS->getInterval(CP.getDstReg());
3673 bool TrackSubRegLiveness = MRI->shouldTrackSubRegLiveness(*CP.getNewRC());
3674 JoinVals RHSVals(RHS, CP.getSrcReg(), CP.getSrcIdx(), LaneBitmask::getNone(),
3675 NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness);
3676 JoinVals LHSVals(LHS, CP.getDstReg(), CP.getDstIdx(), LaneBitmask::getNone(),
3677 NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness);
3678
3679 LLVM_DEBUG(dbgs() << "\t\tRHS = " << RHS << "\n\t\tLHS = " << LHS << '\n');
3680
3681 if (isHighCostLiveInterval(LHS) || isHighCostLiveInterval(RHS))
3682 return false;
3683
3684 // First compute NewVNInfo and the simple value mappings.
3685 // Detect impossible conflicts early.
3686 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals))
3687 return false;
3688
3689 // Some conflicts can only be resolved after all values have been mapped.
3690 if (!LHSVals.resolveConflicts(RHSVals) || !RHSVals.resolveConflicts(LHSVals))
3691 return false;
3692
3693 // All clear, the live ranges can be merged.
3694 if (RHS.hasSubRanges() || LHS.hasSubRanges()) {
3696
3697 // Transform lanemasks from the LHS to masks in the coalesced register and
3698 // create initial subranges if necessary.
3699 unsigned DstIdx = CP.getDstIdx();
3700 if (!LHS.hasSubRanges()) {
3701 LaneBitmask Mask = DstIdx == 0 ? CP.getNewRC()->getLaneMask()
3702 : TRI->getSubRegIndexLaneMask(DstIdx);
3703 // LHS must support subregs or we wouldn't be in this codepath.
3704 assert(Mask.any());
3705 LHS.createSubRangeFrom(Allocator, Mask, LHS);
3706 } else if (DstIdx != 0) {
3707 // Transform LHS lanemasks to new register class if necessary.
3708 for (LiveInterval::SubRange &R : LHS.subranges()) {
3709 LaneBitmask Mask = TRI->composeSubRegIndexLaneMask(DstIdx, R.LaneMask);
3710 R.LaneMask = Mask;
3711 }
3712 }
3713 LLVM_DEBUG(dbgs() << "\t\tLHST = " << printReg(CP.getDstReg()) << ' ' << LHS
3714 << '\n');
3715
3716 // Determine lanemasks of RHS in the coalesced register and merge subranges.
3717 unsigned SrcIdx = CP.getSrcIdx();
3718 if (!RHS.hasSubRanges()) {
3719 LaneBitmask Mask = SrcIdx == 0 ? CP.getNewRC()->getLaneMask()
3720 : TRI->getSubRegIndexLaneMask(SrcIdx);
3721 mergeSubRangeInto(LHS, RHS, Mask, CP, DstIdx);
3722 } else {
3723 // Pair up subranges and merge.
3724 for (LiveInterval::SubRange &R : RHS.subranges()) {
3725 LaneBitmask Mask = TRI->composeSubRegIndexLaneMask(SrcIdx, R.LaneMask);
3726 mergeSubRangeInto(LHS, R, Mask, CP, DstIdx);
3727 }
3728 }
3729 LLVM_DEBUG(dbgs() << "\tJoined SubRanges " << LHS << "\n");
3730
3731 // Pruning implicit defs from subranges may result in the main range
3732 // having stale segments.
3733 LHSVals.pruneMainSegments(LHS, ShrinkMainRange);
3734
3735 LHSVals.pruneSubRegValues(LHS, ShrinkMask);
3736 RHSVals.pruneSubRegValues(LHS, ShrinkMask);
3737 } else if (TrackSubRegLiveness && !CP.getDstIdx() && CP.getSrcIdx()) {
3738 LHS.createSubRangeFrom(LIS->getVNInfoAllocator(),
3739 CP.getNewRC()->getLaneMask(), LHS);
3740 mergeSubRangeInto(LHS, RHS, TRI->getSubRegIndexLaneMask(CP.getSrcIdx()), CP,
3741 CP.getDstIdx());
3742 LHSVals.pruneMainSegments(LHS, ShrinkMainRange);
3743 LHSVals.pruneSubRegValues(LHS, ShrinkMask);
3744 }
3745
3746 // The merging algorithm in LiveInterval::join() can't handle conflicting
3747 // value mappings, so we need to remove any live ranges that overlap a
3748 // CR_Replace resolution. Collect a set of end points that can be used to
3749 // restore the live range after joining.
3750 SmallVector<SlotIndex, 8> EndPoints;
3751 LHSVals.pruneValues(RHSVals, EndPoints, true);
3752 RHSVals.pruneValues(LHSVals, EndPoints, true);
3753
3754 // Erase COPY and IMPLICIT_DEF instructions. This may cause some external
3755 // registers to require trimming.
3756 SmallVector<Register, 8> ShrinkRegs;
3757 LHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs, &LHS);
3758 RHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs);
3759 while (!ShrinkRegs.empty())
3760 shrinkToUses(&LIS->getInterval(ShrinkRegs.pop_back_val()));
3761
3762 // Scan and mark undef any DBG_VALUEs that would refer to a different value.
3763 checkMergingChangesDbgValues(CP, LHS, LHSVals, RHS, RHSVals);
3764
3765 // If the RHS covers any PHI locations that were tracked for debug-info, we
3766 // must update tracking information to reflect the join.
3767 auto RegIt = RegToPHIIdx.find(CP.getSrcReg());
3768 if (RegIt != RegToPHIIdx.end()) {
3769 // Iterate over all the debug instruction numbers assigned this register.
3770 for (unsigned InstID : RegIt->second) {
3771 auto PHIIt = PHIValToPos.find(InstID);
3772 assert(PHIIt != PHIValToPos.end());
3773 const SlotIndex &SI = PHIIt->second.SI;
3774
3775 // Does the RHS cover the position of this PHI?
3776 auto LII = RHS.find(SI);
3777 if (LII == RHS.end() || LII->start > SI)
3778 continue;
3779
3780 // Accept two kinds of subregister movement:
3781 // * When we merge from one register class into a larger register:
3782 // %1:gr16 = some-inst
3783 // ->
3784 // %2:gr32.sub_16bit = some-inst
3785 // * When the PHI is already in a subregister, and the larger class
3786 // is coalesced:
3787 // %2:gr32.sub_16bit = some-inst
3788 // %3:gr32 = COPY %2
3789 // ->
3790 // %3:gr32.sub_16bit = some-inst
3791 // Test for subregister move:
3792 if (CP.getSrcIdx() != 0 || CP.getDstIdx() != 0)
3793 // If we're moving between different subregisters, ignore this join.
3794 // The PHI will not get a location, dropping variable locations.
3795 if (PHIIt->second.SubReg && PHIIt->second.SubReg != CP.getSrcIdx())
3796 continue;
3797
3798 // Update our tracking of where the PHI is.
3799 PHIIt->second.Reg = CP.getDstReg();
3800
3801 // If we merge into a sub-register of a larger class (test above),
3802 // update SubReg.
3803 if (CP.getSrcIdx() != 0)
3804 PHIIt->second.SubReg = CP.getSrcIdx();
3805 }
3806
3807 // Rebuild the register index in RegToPHIIdx to account for PHIs tracking
3808 // different VRegs now. Copy old collection of debug instruction numbers and
3809 // erase the old one:
3810 auto InstrNums = RegIt->second;
3811 RegToPHIIdx.erase(RegIt);
3812
3813 // There might already be PHIs being tracked in the destination VReg. Insert
3814 // into an existing tracking collection, or insert a new one.
3815 RegIt = RegToPHIIdx.find(CP.getDstReg());
3816 if (RegIt != RegToPHIIdx.end())
3817 llvm::append_range(RegIt->second, InstrNums);
3818 else
3819 RegToPHIIdx.insert({CP.getDstReg(), InstrNums});
3820 }
3821
3822 // Join RHS into LHS.
3823 LHS.join(RHS, LHSVals.getAssignments(), RHSVals.getAssignments(), NewVNInfo);
3824
3825 // Kill flags are going to be wrong if the live ranges were overlapping.
3826 // Eventually, we should simply clear all kill flags when computing live
3827 // ranges. They are reinserted after register allocation.
3828 MRI->clearKillFlags(LHS.reg());
3829 MRI->clearKillFlags(RHS.reg());
3830
3831 if (!EndPoints.empty()) {
3832 // Recompute the parts of the live range we had to remove because of
3833 // CR_Replace conflicts.
3834 LLVM_DEBUG({
3835 dbgs() << "\t\trestoring liveness to " << EndPoints.size() << " points: ";
3836 for (unsigned i = 0, n = EndPoints.size(); i != n; ++i) {
3837 dbgs() << EndPoints[i];
3838 if (i != n - 1)
3839 dbgs() << ',';
3840 }
3841 dbgs() << ": " << LHS << '\n';
3842 });
3843 LIS->extendToIndices((LiveRange &)LHS, EndPoints);
3844 }
3845
3846 return true;
3847}
3848
3849bool RegisterCoalescer::joinIntervals(CoalescerPair &CP) {
3850 return CP.isPhys() ? joinReservedPhysReg(CP) : joinVirtRegs(CP);
3851}
3852
3853void RegisterCoalescer::buildVRegToDbgValueMap(MachineFunction &MF) {
3854 const SlotIndexes &Slots = *LIS->getSlotIndexes();
3856
3857 // After collecting a block of DBG_VALUEs into ToInsert, enter them into the
3858 // vreg => DbgValueLoc map.
3859 auto CloseNewDVRange = [this, &ToInsert](SlotIndex Slot) {
3860 for (auto *X : ToInsert) {
3861 for (const auto &Op : X->debug_operands()) {
3862 if (Op.isReg() && Op.getReg().isVirtual())
3863 DbgVRegToValues[Op.getReg()].push_back({Slot, X});
3864 }
3865 }
3866
3867 ToInsert.clear();
3868 };
3869
3870 // Iterate over all instructions, collecting them into the ToInsert vector.
3871 // Once a non-debug instruction is found, record the slot index of the
3872 // collected DBG_VALUEs.
3873 for (auto &MBB : MF) {
3874 SlotIndex CurrentSlot = Slots.getMBBStartIdx(&MBB);
3875
3876 for (auto &MI : MBB) {
3877 if (MI.isDebugValue()) {
3878 if (any_of(MI.debug_operands(), [](const MachineOperand &MO) {
3879 return MO.isReg() && MO.getReg().isVirtual();
3880 }))
3881 ToInsert.push_back(&MI);
3882 } else if (!MI.isDebugOrPseudoInstr()) {
3883 CurrentSlot = Slots.getInstructionIndex(MI);
3884 CloseNewDVRange(CurrentSlot);
3885 }
3886 }
3887
3888 // Close range of DBG_VALUEs at the end of blocks.
3889 CloseNewDVRange(Slots.getMBBEndIdx(&MBB));
3890 }
3891
3892 // Sort all DBG_VALUEs we've seen by slot number.
3893 for (auto &Pair : DbgVRegToValues)
3894 llvm::sort(Pair.second);
3895}
3896
3897void RegisterCoalescer::checkMergingChangesDbgValues(CoalescerPair &CP,
3898 LiveRange &LHS,
3899 JoinVals &LHSVals,
3900 LiveRange &RHS,
3901 JoinVals &RHSVals) {
3902 auto ScanForDstReg = [&](Register Reg) {
3903 checkMergingChangesDbgValuesImpl(Reg, RHS, LHS, LHSVals);
3904 };
3905
3906 auto ScanForSrcReg = [&](Register Reg) {
3907 checkMergingChangesDbgValuesImpl(Reg, LHS, RHS, RHSVals);
3908 };
3909
3910 // Scan for unsound updates of both the source and destination register.
3911 ScanForSrcReg(CP.getSrcReg());
3912 ScanForDstReg(CP.getDstReg());
3913}
3914
3915void RegisterCoalescer::checkMergingChangesDbgValuesImpl(Register Reg,
3916 LiveRange &OtherLR,
3917 LiveRange &RegLR,
3918 JoinVals &RegVals) {
3919 // Are there any DBG_VALUEs to examine?
3920 auto VRegMapIt = DbgVRegToValues.find(Reg);
3921 if (VRegMapIt == DbgVRegToValues.end())
3922 return;
3923
3924 auto &DbgValueSet = VRegMapIt->second;
3925 auto DbgValueSetIt = DbgValueSet.begin();
3926 auto SegmentIt = OtherLR.begin();
3927
3928 bool LastUndefResult = false;
3929 SlotIndex LastUndefIdx;
3930
3931 // If the "Other" register is live at a slot Idx, test whether Reg can
3932 // safely be merged with it, or should be marked undef.
3933 auto ShouldUndef = [&RegVals, &RegLR, &LastUndefResult,
3934 &LastUndefIdx](SlotIndex Idx) -> bool {
3935 // Our worst-case performance typically happens with asan, causing very
3936 // many DBG_VALUEs of the same location. Cache a copy of the most recent
3937 // result for this edge-case.
3938 if (LastUndefIdx == Idx)
3939 return LastUndefResult;
3940
3941 // If the other range was live, and Reg's was not, the register coalescer
3942 // will not have tried to resolve any conflicts. We don't know whether
3943 // the DBG_VALUE will refer to the same value number, so it must be made
3944 // undef.
3945 auto OtherIt = RegLR.find(Idx);
3946 if (OtherIt == RegLR.end())
3947 return true;
3948
3949 // Both the registers were live: examine the conflict resolution record for
3950 // the value number Reg refers to. CR_Keep meant that this value number
3951 // "won" and the merged register definitely refers to that value. CR_Erase
3952 // means the value number was a redundant copy of the other value, which
3953 // was coalesced and Reg deleted. It's safe to refer to the other register
3954 // (which will be the source of the copy).
3955 auto Resolution = RegVals.getResolution(OtherIt->valno->id);
3956 LastUndefResult =
3957 Resolution != JoinVals::CR_Keep && Resolution != JoinVals::CR_Erase;
3958 LastUndefIdx = Idx;
3959 return LastUndefResult;
3960 };
3961
3962 // Iterate over both the live-range of the "Other" register, and the set of
3963 // DBG_VALUEs for Reg at the same time. Advance whichever one has the lowest
3964 // slot index. This relies on the DbgValueSet being ordered.
3965 while (DbgValueSetIt != DbgValueSet.end() && SegmentIt != OtherLR.end()) {
3966 if (DbgValueSetIt->first < SegmentIt->end) {
3967 // "Other" is live and there is a DBG_VALUE of Reg: test if we should
3968 // set it undef.
3969 if (DbgValueSetIt->first >= SegmentIt->start) {
3970 bool HasReg = DbgValueSetIt->second->hasDebugOperandForReg(Reg);
3971 bool ShouldUndefReg = ShouldUndef(DbgValueSetIt->first);
3972 if (HasReg && ShouldUndefReg) {
3973 // Mark undef, erase record of this DBG_VALUE to avoid revisiting.
3974 DbgValueSetIt->second->setDebugValueUndef();
3975 continue;
3976 }
3977 }
3978 ++DbgValueSetIt;
3979 } else {
3980 ++SegmentIt;
3981 }
3982 }
3983}
3984
3985namespace {
3986
3987/// Information concerning MBB coalescing priority.
3988struct MBBPriorityInfo {
3989 MachineBasicBlock *MBB;
3990 unsigned Depth;
3991 bool IsSplit;
3992
3993 MBBPriorityInfo(MachineBasicBlock *mbb, unsigned depth, bool issplit)
3994 : MBB(mbb), Depth(depth), IsSplit(issplit) {}
3995};
3996
3997} // end anonymous namespace
3998
3999/// C-style comparator that sorts first based on the loop depth of the basic
4000/// block (the unsigned), and then on the MBB number.
4001///
4002/// EnableGlobalCopies assumes that the primary sort key is loop depth.
4003static int compareMBBPriority(const MBBPriorityInfo *LHS,
4004 const MBBPriorityInfo *RHS) {
4005 // Deeper loops first
4006 if (LHS->Depth != RHS->Depth)
4007 return LHS->Depth > RHS->Depth ? -1 : 1;
4008
4009 // Try to unsplit critical edges next.
4010 if (LHS->IsSplit != RHS->IsSplit)
4011 return LHS->IsSplit ? -1 : 1;
4012
4013 // Prefer blocks that are more connected in the CFG. This takes care of
4014 // the most difficult copies first while intervals are short.
4015 unsigned cl = LHS->MBB->pred_size() + LHS->MBB->succ_size();
4016 unsigned cr = RHS->MBB->pred_size() + RHS->MBB->succ_size();
4017 if (cl != cr)
4018 return cl > cr ? -1 : 1;
4019
4020 // As a last resort, sort by block number.
4021 return LHS->MBB->getNumber() < RHS->MBB->getNumber() ? -1 : 1;
4022}
4023
4024/// \returns true if the given copy uses or defines a local live range.
4025static bool isLocalCopy(MachineInstr *Copy, const LiveIntervals *LIS) {
4026 if (!Copy->isCopy())
4027 return false;
4028
4029 if (Copy->getOperand(1).isUndef())
4030 return false;
4031
4032 Register SrcReg = Copy->getOperand(1).getReg();
4033 Register DstReg = Copy->getOperand(0).getReg();
4034 if (SrcReg.isPhysical() || DstReg.isPhysical())
4035 return false;
4036
4037 return LIS->intervalIsInOneMBB(LIS->getInterval(SrcReg)) ||
4038 LIS->intervalIsInOneMBB(LIS->getInterval(DstReg));
4039}
4040
4041void RegisterCoalescer::lateLiveIntervalUpdate() {
4042 for (Register reg : ToBeUpdated) {
4043 if (!LIS->hasInterval(reg))
4044 continue;
4045 LiveInterval &LI = LIS->getInterval(reg);
4046 shrinkToUses(&LI, &DeadDefs);
4047 if (!DeadDefs.empty())
4048 eliminateDeadDefs();
4049 }
4050 ToBeUpdated.clear();
4051}
4052
4053bool RegisterCoalescer::copyCoalesceWorkList(
4055 bool Progress = false;
4056 SmallPtrSet<MachineInstr *, 4> CurrentErasedInstrs;
4057 for (MachineInstr *&MI : CurrList) {
4058 if (!MI)
4059 continue;
4060 // Skip instruction pointers that have already been erased, for example by
4061 // dead code elimination.
4062 if (ErasedInstrs.count(MI) || CurrentErasedInstrs.count(MI)) {
4063 MI = nullptr;
4064 continue;
4065 }
4066 bool Again = false;
4067 bool Success = joinCopy(MI, Again, CurrentErasedInstrs);
4068 Progress |= Success;
4069 if (Success || !Again)
4070 MI = nullptr;
4071 }
4072 // Clear instructions not recorded in `ErasedInstrs` but erased.
4073 if (!CurrentErasedInstrs.empty()) {
4074 for (MachineInstr *&MI : CurrList) {
4075 if (MI && CurrentErasedInstrs.count(MI))
4076 MI = nullptr;
4077 }
4078 for (MachineInstr *&MI : WorkList) {
4079 if (MI && CurrentErasedInstrs.count(MI))
4080 MI = nullptr;
4081 }
4082 }
4083 return Progress;
4084}
4085
4086/// Check if DstReg is a terminal node.
4087/// I.e., it does not have any affinity other than \p Copy.
4088static bool isTerminalReg(Register DstReg, const MachineInstr &Copy,
4089 const MachineRegisterInfo *MRI) {
4090 assert(Copy.isCopyLike());
4091 // Check if the destination of this copy as any other affinity.
4092 for (const MachineInstr &MI : MRI->reg_nodbg_instructions(DstReg))
4093 if (&MI != &Copy && MI.isCopyLike())
4094 return false;
4095 return true;
4096}
4097
4098bool RegisterCoalescer::applyTerminalRule(const MachineInstr &Copy) const {
4099 assert(Copy.isCopyLike());
4100 if (!UseTerminalRule)
4101 return false;
4102 Register SrcReg, DstReg;
4103 unsigned SrcSubReg = 0, DstSubReg = 0;
4104 if (!isMoveInstr(*TRI, &Copy, SrcReg, DstReg, SrcSubReg, DstSubReg))
4105 return false;
4106 // Check if the destination of this copy has any other affinity.
4107 if (DstReg.isPhysical() ||
4108 // If SrcReg is a physical register, the copy won't be coalesced.
4109 // Ignoring it may have other side effect (like missing
4110 // rematerialization). So keep it.
4111 SrcReg.isPhysical() || !isTerminalReg(DstReg, Copy, MRI))
4112 return false;
4113
4114 // DstReg is a terminal node. Check if it interferes with any other
4115 // copy involving SrcReg.
4116 const MachineBasicBlock *OrigBB = Copy.getParent();
4117 const LiveInterval &DstLI = LIS->getInterval(DstReg);
4118 for (const MachineInstr &MI : MRI->reg_nodbg_instructions(SrcReg)) {
4119 // Technically we should check if the weight of the new copy is
4120 // interesting compared to the other one and update the weight
4121 // of the copies accordingly. However, this would only work if
4122 // we would gather all the copies first then coalesce, whereas
4123 // right now we interleave both actions.
4124 // For now, just consider the copies that are in the same block.
4125 if (&MI == &Copy || !MI.isCopyLike() || MI.getParent() != OrigBB)
4126 continue;
4127 Register OtherSrcReg, OtherReg;
4128 unsigned OtherSrcSubReg = 0, OtherSubReg = 0;
4129 if (!isMoveInstr(*TRI, &Copy, OtherSrcReg, OtherReg, OtherSrcSubReg,
4130 OtherSubReg))
4131 return false;
4132 if (OtherReg == SrcReg)
4133 OtherReg = OtherSrcReg;
4134 // Check if OtherReg is a non-terminal.
4135 if (OtherReg.isPhysical() || isTerminalReg(OtherReg, MI, MRI))
4136 continue;
4137 // Check that OtherReg interfere with DstReg.
4138 if (LIS->getInterval(OtherReg).overlaps(DstLI)) {
4139 LLVM_DEBUG(dbgs() << "Apply terminal rule for: " << printReg(DstReg)
4140 << '\n');
4141 return true;
4142 }
4143 }
4144 return false;
4145}
4146
4147void RegisterCoalescer::copyCoalesceInMBB(MachineBasicBlock *MBB) {
4148 LLVM_DEBUG(dbgs() << MBB->getName() << ":\n");
4149
4150 // Collect all copy-like instructions in MBB. Don't start coalescing anything
4151 // yet, it might invalidate the iterator.
4152 const unsigned PrevSize = WorkList.size();
4153 if (JoinGlobalCopies) {
4154 SmallVector<MachineInstr *, 2> LocalTerminals;
4155 SmallVector<MachineInstr *, 2> GlobalTerminals;
4156 // Coalesce copies top-down to propagate coalescing and rematerialization
4157 // forward.
4158 for (MachineInstr &MI : *MBB) {
4159 if (!MI.isCopyLike())
4160 continue;
4161 bool ApplyTerminalRule = applyTerminalRule(MI);
4162 if (isLocalCopy(&MI, LIS)) {
4163 if (ApplyTerminalRule)
4164 LocalTerminals.push_back(&MI);
4165 else
4166 LocalWorkList.push_back(&MI);
4167 } else {
4168 if (ApplyTerminalRule)
4169 GlobalTerminals.push_back(&MI);
4170 else
4171 WorkList.push_back(&MI);
4172 }
4173 }
4174 // Append the copies evicted by the terminal rule at the end of the list.
4175 LocalWorkList.append(LocalTerminals.begin(), LocalTerminals.end());
4176 WorkList.append(GlobalTerminals.begin(), GlobalTerminals.end());
4177 } else {
4179 // Coalesce copies top-down to propagate coalescing and rematerialization
4180 // forward.
4181 for (MachineInstr &MII : *MBB)
4182 if (MII.isCopyLike()) {
4183 if (applyTerminalRule(MII))
4184 Terminals.push_back(&MII);
4185 else
4186 WorkList.push_back(&MII);
4187 }
4188 // Append the copies evicted by the terminal rule at the end of the list.
4189 WorkList.append(Terminals.begin(), Terminals.end());
4190 }
4191 // Try coalescing the collected copies immediately, and remove the nulls.
4192 // This prevents the WorkList from getting too large since most copies are
4193 // joinable on the first attempt.
4194 MutableArrayRef<MachineInstr *> CurrList(WorkList.begin() + PrevSize,
4195 WorkList.end());
4196 if (copyCoalesceWorkList(CurrList))
4197 WorkList.erase(
4198 std::remove(WorkList.begin() + PrevSize, WorkList.end(), nullptr),
4199 WorkList.end());
4200}
4201
4202void RegisterCoalescer::coalesceLocals() {
4203 copyCoalesceWorkList(LocalWorkList);
4204 for (MachineInstr *MI : LocalWorkList) {
4205 if (MI)
4206 WorkList.push_back(MI);
4207 }
4208 LocalWorkList.clear();
4209}
4210
4211void RegisterCoalescer::joinAllIntervals() {
4212 LLVM_DEBUG(dbgs() << "********** JOINING INTERVALS ***********\n");
4213 assert(WorkList.empty() && LocalWorkList.empty() && "Old data still around.");
4214
4215 std::vector<MBBPriorityInfo> MBBs;
4216 MBBs.reserve(MF->size());
4217 for (MachineBasicBlock &MBB : *MF) {
4218 MBBs.push_back(MBBPriorityInfo(&MBB, Loops->getLoopDepth(&MBB),
4219 JoinSplitEdges && isSplitEdge(&MBB)));
4220 }
4221 array_pod_sort(MBBs.begin(), MBBs.end(), compareMBBPriority);
4222
4223 // Coalesce intervals in MBB priority order.
4224 unsigned CurrDepth = std::numeric_limits<unsigned>::max();
4225 for (MBBPriorityInfo &MBB : MBBs) {
4226 // Try coalescing the collected local copies for deeper loops.
4227 if (JoinGlobalCopies && MBB.Depth < CurrDepth) {
4228 coalesceLocals();
4229 CurrDepth = MBB.Depth;
4230 }
4231 copyCoalesceInMBB(MBB.MBB);
4232 }
4233 lateLiveIntervalUpdate();
4234 coalesceLocals();
4235
4236 // Joining intervals can allow other intervals to be joined. Iteratively join
4237 // until we make no progress.
4238 while (copyCoalesceWorkList(WorkList))
4239 /* empty */;
4240 lateLiveIntervalUpdate();
4241}
4242
4246 MFPropsModifier _(*this, MF);
4247 auto &LIS = MFAM.getResult<LiveIntervalsAnalysis>(MF);
4248 auto &Loops = MFAM.getResult<MachineLoopAnalysis>(MF);
4249 auto *SI = MFAM.getCachedResult<SlotIndexesAnalysis>(MF);
4250 RegisterCoalescer Impl(&LIS, SI, &Loops);
4251 if (!Impl.run(MF))
4252 return PreservedAnalyses::all();
4254 PA.preserveSet<CFGAnalyses>();
4255 PA.preserve<LiveIntervalsAnalysis>();
4256 PA.preserve<SlotIndexesAnalysis>();
4257 PA.preserve<MachineLoopAnalysis>();
4258 PA.preserve<MachineDominatorTreeAnalysis>();
4259 return PA;
4260}
4261
4262bool RegisterCoalescerLegacy::runOnMachineFunction(MachineFunction &MF) {
4263 auto *LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
4264 auto *Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
4265 auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
4266 SlotIndexes *SI = SIWrapper ? &SIWrapper->getSI() : nullptr;
4267 RegisterCoalescer Impl(LIS, SI, Loops);
4268 return Impl.run(MF);
4269}
4270
4271bool RegisterCoalescer::run(MachineFunction &fn) {
4272 LLVM_DEBUG(dbgs() << "********** REGISTER COALESCER **********\n"
4273 << "********** Function: " << fn.getName() << '\n');
4274
4275 // Variables changed between a setjmp and a longjump can have undefined value
4276 // after the longjmp. This behaviour can be observed if such a variable is
4277 // spilled, so longjmp won't restore the value in the spill slot.
4278 // RegisterCoalescer should not run in functions with a setjmp to avoid
4279 // merging such undefined variables with predictable ones.
4280 //
4281 // TODO: Could specifically disable coalescing registers live across setjmp
4282 // calls
4283 if (fn.exposesReturnsTwice()) {
4284 LLVM_DEBUG(
4285 dbgs() << "* Skipped as it exposes functions that returns twice.\n");
4286 return false;
4287 }
4288
4289 MF = &fn;
4290 MRI = &fn.getRegInfo();
4291 const TargetSubtargetInfo &STI = fn.getSubtarget();
4292 TRI = STI.getRegisterInfo();
4293 TII = STI.getInstrInfo();
4295 JoinGlobalCopies = STI.enableJoinGlobalCopies();
4296 else
4297 JoinGlobalCopies = (EnableGlobalCopies == cl::BOU_TRUE);
4298
4299 // If there are PHIs tracked by debug-info, they will need updating during
4300 // coalescing. Build an index of those PHIs to ease updating.
4301 SlotIndexes *Slots = LIS->getSlotIndexes();
4302 for (const auto &DebugPHI : MF->DebugPHIPositions) {
4303 MachineBasicBlock *MBB = DebugPHI.second.MBB;
4304 Register Reg = DebugPHI.second.Reg;
4305 unsigned SubReg = DebugPHI.second.SubReg;
4306 SlotIndex SI = Slots->getMBBStartIdx(MBB);
4307 PHIValPos P = {SI, Reg, SubReg};
4308 PHIValToPos.insert(std::make_pair(DebugPHI.first, P));
4309 RegToPHIIdx[Reg].push_back(DebugPHI.first);
4310 }
4311
4312 // The MachineScheduler does not currently require JoinSplitEdges. This will
4313 // either be enabled unconditionally or replaced by a more general live range
4314 // splitting optimization.
4315 JoinSplitEdges = EnableJoinSplits;
4316
4317 if (VerifyCoalescing)
4318 MF->verify(LIS, SI, "Before register coalescing", &errs());
4319
4320 DbgVRegToValues.clear();
4322
4323 RegClassInfo.runOnMachineFunction(fn);
4324
4325 // Join (coalesce) intervals if requested.
4326 if (EnableJoining)
4327 joinAllIntervals();
4328
4329 // After deleting a lot of copies, register classes may be less constrained.
4330 // Removing sub-register operands may allow GR32_ABCD -> GR32 and DPR_VFP2 ->
4331 // DPR inflation.
4332 array_pod_sort(InflateRegs.begin(), InflateRegs.end());
4333 InflateRegs.erase(llvm::unique(InflateRegs), InflateRegs.end());
4334 LLVM_DEBUG(dbgs() << "Trying to inflate " << InflateRegs.size()
4335 << " regs.\n");
4336 for (Register Reg : InflateRegs) {
4337 if (MRI->reg_nodbg_empty(Reg))
4338 continue;
4339 if (MRI->recomputeRegClass(Reg)) {
4340 LLVM_DEBUG(dbgs() << printReg(Reg) << " inflated to "
4341 << TRI->getRegClassName(MRI->getRegClass(Reg)) << '\n');
4342 ++NumInflated;
4343
4344 LiveInterval &LI = LIS->getInterval(Reg);
4345 if (LI.hasSubRanges()) {
4346 // If the inflated register class does not support subregisters anymore
4347 // remove the subranges.
4348 if (!MRI->shouldTrackSubRegLiveness(Reg)) {
4349 LI.clearSubRanges();
4350 } else {
4351#ifndef NDEBUG
4352 LaneBitmask MaxMask = MRI->getMaxLaneMaskForVReg(Reg);
4353 // If subranges are still supported, then the same subregs
4354 // should still be supported.
4355 for (LiveInterval::SubRange &S : LI.subranges()) {
4356 assert((S.LaneMask & ~MaxMask).none());
4357 }
4358#endif
4359 }
4360 }
4361 }
4362 }
4363
4364 // After coalescing, update any PHIs that are being tracked by debug-info
4365 // with their new VReg locations.
4366 for (auto &p : MF->DebugPHIPositions) {
4367 auto it = PHIValToPos.find(p.first);
4368 assert(it != PHIValToPos.end());
4369 p.second.Reg = it->second.Reg;
4370 p.second.SubReg = it->second.SubReg;
4371 }
4372
4373 PHIValToPos.clear();
4374 RegToPHIIdx.clear();
4375
4376 LLVM_DEBUG(LIS->dump());
4377
4378 if (VerifyCoalescing)
4379 MF->verify(LIS, SI, "After register coalescing", &errs());
4380 return true;
4381}
unsigned SubReg
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
Hexagon Hardware Loops
#define _
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
A common definition of LaneBitmask for use in TableGen and CodeGen.
#define I(x, y, z)
Definition MD5.cpp:58
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define P(N)
if(PassOpts->AAPipeline)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
Basic Register Allocator
static cl::opt< cl::boolOrDefault > EnableGlobalCopies("join-globalcopies", cl::desc("Coalesce copies that span blocks (default=subtarget)"), cl::init(cl::BOU_UNSET), cl::Hidden)
Temporary flag to test global copy optimization.
static bool isLocalCopy(MachineInstr *Copy, const LiveIntervals *LIS)
static bool isSplitEdge(const MachineBasicBlock *MBB)
Return true if this block should be vacated by the coalescer to eliminate branches.
static int compareMBBPriority(const MBBPriorityInfo *LHS, const MBBPriorityInfo *RHS)
C-style comparator that sorts first based on the loop depth of the basic block (the unsigned),...
static cl::opt< unsigned > LargeIntervalSizeThreshold("large-interval-size-threshold", cl::Hidden, cl::desc("If the valnos size of an interval is larger than the threshold, " "it is regarded as a large interval. "), cl::init(100))
static bool isDefInSubRange(LiveInterval &LI, SlotIndex Def)
Check if any of the subranges of LI contain a definition at Def.
static std::pair< bool, bool > addSegmentsWithValNo(LiveRange &Dst, VNInfo *DstValNo, const LiveRange &Src, const VNInfo *SrcValNo)
Copy segments with value number SrcValNo from liverange Src to live range @Dst and use value number D...
static bool isLiveThrough(const LiveQueryResult Q)
static bool isTerminalReg(Register DstReg, const MachineInstr &Copy, const MachineRegisterInfo *MRI)
Check if DstReg is a terminal node.
static cl::opt< bool > VerifyCoalescing("verify-coalescing", cl::desc("Verify machine instrs before and after register coalescing"), cl::Hidden)
register Register static false bool isMoveInstr(const TargetRegisterInfo &tri, const MachineInstr *MI, Register &Src, Register &Dst, unsigned &SrcSub, unsigned &DstSub)
static cl::opt< bool > EnableJoinSplits("join-splitedges", cl::desc("Coalesce copies on split edges (default=subtarget)"), cl::Hidden)
Temporary flag to test critical edge unsplitting.
static cl::opt< bool > EnableJoining("join-liveintervals", cl::desc("Coalesce copies (default=true)"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > LargeIntervalFreqThreshold("large-interval-freq-threshold", cl::Hidden, cl::desc("For a large interval, if it is coalesced with other live " "intervals many times more than the threshold, stop its " "coalescing to control the compile time. "), cl::init(256))
static bool definesFullReg(const MachineInstr &MI, Register Reg)
Returns true if MI defines the full vreg Reg, as opposed to just defining a subregister.
static cl::opt< unsigned > LateRematUpdateThreshold("late-remat-update-threshold", cl::Hidden, cl::desc("During rematerialization for a copy, if the def instruction has " "many other copy uses to be rematerialized, delay the multiple " "separate live interval update work and do them all at once after " "all those rematerialization are done. It will save a lot of " "repeated work. "), cl::init(100))
static cl::opt< bool > UseTerminalRule("terminal-rule", cl::desc("Apply the terminal rule"), cl::init(false), cl::Hidden)
SI Optimize VGPR LiveRange
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static DenseMap< Register, std::vector< std::pair< SlotIndex, MachineInstr * > > > buildVRegToDbgValueMap(MachineFunction &MF, const LiveIntervals *Liveness)
static void shrinkToUses(LiveInterval &LI, LiveIntervals &LIS)
Value * RHS
Value * LHS
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition Pass.cpp:270
bool test(unsigned Idx) const
Definition BitVector.h:461
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
A helper class for register coalescers.
bool flip()
Swap SrcReg and DstReg.
bool isCoalescable(const MachineInstr *) const
Return true if MI is a copy instruction that will become an identity copy after coalescing.
bool setRegisters(const MachineInstr *)
Set registers to match the copy instruction MI.
A debug info location.
Definition DebugLoc.h:124
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:165
bool erase(const KeyT &Val)
Definition DenseMap.h:303
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:214
bool isAsCheapAsAMove(const MachineInstr &MI) const override
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
LLVM_ABI void removeEmptySubRanges()
Removes all subranges without any segments (subranges without segments are not considered valid and s...
Register reg() const
bool hasSubRanges() const
Returns true if subregister liveness information is available.
SubRange * createSubRangeFrom(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, const LiveRange &CopyFrom)
Like createSubRange() but the new range is filled with a copy of the liveness information in CopyFrom...
iterator_range< subrange_iterator > subranges()
LLVM_ABI void refineSubRanges(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function< void(LiveInterval::SubRange &)> Apply, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx=0)
Refines the subranges to support LaneMask.
LLVM_ABI void computeSubRangeUndefs(SmallVectorImpl< SlotIndex > &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const
For a given lane mask LaneMask, compute indexes at which the lane is marked undefined by subregister ...
SubRange * createSubRange(BumpPtrAllocator &Allocator, LaneBitmask LaneMask)
Creates a new empty subregister live range.
LLVM_ABI void clearSubRanges()
Removes all subregister liveness information.
bool hasInterval(Register Reg) const
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Return the first index in the given basic block.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
LLVM_ABI bool hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const
Returns true if VNI is killed by any PHI-def values in LI.
SlotIndex InsertMachineInstrInMaps(MachineInstr &MI)
LLVM_ABI bool checkRegMaskInterference(const LiveInterval &LI, BitVector &UsableRegs)
Test if LI is live across any register mask instructions, and compute a bit mask of physical register...
SlotIndexes * getSlotIndexes() const
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
VNInfo::Allocator & getVNInfoAllocator()
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveRange & getRegUnit(unsigned Unit)
Return the live range for register unit Unit.
LiveRange * getCachedRegUnit(unsigned Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
LiveInterval & getInterval(Register Reg)
LLVM_ABI void pruneValue(LiveRange &LR, SlotIndex Kill, SmallVectorImpl< SlotIndex > *EndPoints)
If LR has a live value at Kill, prune its live range by removing any liveness reachable from Kill.
void removeInterval(Register Reg)
Interval removal.
LLVM_ABI MachineBasicBlock * intervalIsInOneMBB(const LiveInterval &LI) const
If LI is confined to a single basic block, return a pointer to that block.
LLVM_ABI void removeVRegDefAt(LiveInterval &LI, SlotIndex Pos)
Remove value number and related live segments of LI and its subranges that start at position Pos.
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
LLVM_ABI void extendToIndices(LiveRange &LR, ArrayRef< SlotIndex > Indices, ArrayRef< SlotIndex > Undefs)
Extend the live range LR to reach all points in Indices.
LLVM_ABI void dump() const
LLVM_ABI void removePhysRegDefAt(MCRegister Reg, SlotIndex Pos)
Remove value numbers and related live segments starting at position Pos that are part of any liverang...
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
bool isLiveInToMBB(const LiveRange &LR, const MachineBasicBlock *mbb) const
SlotIndex ReplaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI)
Result of a LiveRange query.
VNInfo * valueOutOrDead() const
Returns the value alive at the end of the instruction, if any.
VNInfo * valueIn() const
Return the value that is live-in to the instruction.
VNInfo * valueOut() const
Return the value leaving the instruction, if any.
VNInfo * valueDefined() const
Return the value defined by this instruction, if any.
SlotIndex endPoint() const
Return the end point of the last live range segment to interact with the instruction,...
bool isKill() const
Return true if the live-in value is killed by this instruction.
Callback methods for LiveRangeEdit owners.
SlotIndex rematerializeAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, const Remat &RM, const TargetRegisterInfo &, bool Late=false, unsigned SubIdx=0, MachineInstr *ReplaceIndexMI=nullptr)
rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an instruction into MBB before...
bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx, SlotIndex UseIdx) const
allUsesAvailableAt - Return true if all registers used by OrigMI at OrigIdx are also available with t...
void eliminateDeadDefs(SmallVectorImpl< MachineInstr * > &Dead, ArrayRef< Register > RegsBeingSpilled={})
eliminateDeadDefs - Try to delete machine instructions that are now dead (allDefsAreDead returns true...
This class represents the liveness of a register, stack slot, etc.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
Segments::iterator iterator
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
LLVM_ABI void join(LiveRange &Other, const int *ValNoAssignments, const int *RHSValNoAssignments, SmallVectorImpl< VNInfo * > &NewVNInfo)
join - Join two live ranges (this, and other) together.
bool liveAt(SlotIndex index) const
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
LLVM_ABI void removeValNo(VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
bool empty() const
bool overlaps(const LiveRange &other) const
overlaps - Return true if the intersection of the two live ranges is not empty.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
bool verify() const
Walk the range and assert if any invariants fail to hold.
LLVM_ABI VNInfo * MergeValueNumberInto(VNInfo *V1, VNInfo *V2)
MergeValueNumberInto - This method is called when two value numbers are found to be equivalent.
unsigned getNumValNums() const
iterator begin()
VNInfoList valnos
bool containsOneValue() const
size_t size() const
iterator FindSegmentContaining(SlotIndex Idx)
Return an iterator to the segment that contains the specified index, or end() if there is none.
void assign(const LiveRange &Other, BumpPtrAllocator &Allocator)
Copies values numbers and live segments from Other into this range.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
Describe properties that are true of each instruction in the target description file.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
MCRegUnitRootIterator enumerates the root registers of a register unit.
bool isValid() const
Check if the iterator is at the end of the list.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
An RAII based helper class to modify MachineFunctionProperties when running pass.
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
LLVM_ABI bool hasEHPadSuccessor() const
bool isEHPad() const
Returns true if the block is a landing pad.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
Analysis pass which computes a MachineDominatorTree.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool exposesReturnsTwice() const
exposesReturnsTwice - Returns true if the function calls setjmp or any other similar functions with a...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
DenseMap< unsigned, DebugPHIRegallocPos > DebugPHIPositions
Map of debug instruction numbers to the position of their PHI instructions during register allocation...
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
LLVM_ABI void setRegisterDefReadUndef(Register Reg, bool IsUndef=true)
Mark all subregister defs of register Reg with the undef flag.
bool isImplicitDef() const
bool isCopy() const
const MachineBasicBlock * getParent() const
bool isCopyLike() const
Return true if the instruction behaves like a copy.
filtered_mop_range all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
LLVM_ABI std::pair< bool, bool > readsWritesVirtualRegister(Register Reg, SmallVectorImpl< unsigned > *Ops=nullptr) const
Return a pair of bools (reads, writes) indicating if this instruction reads or writes Reg.
bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx=nullptr) const
Return true if the use operand of the specified index is tied to a def operand.
LLVM_ABI bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
bool isDebugInstr() const
unsigned getNumOperands() const
Retuns the total number of operands.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
bool isRegTiedToUseOperand(unsigned DefOpIdx, unsigned *UseOpIdx=nullptr) const
Given the index of a register def operand, check if the register def is tied to a source operand,...
bool isFullCopy() const
LLVM_ABI int findRegisterUseOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isKill=false) const
Returns the operand index that is a use of the specific register or -1 if it is not found.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
bool isCommutable(QueryType Type=IgnoreBundle) const
Return true if this may be a 2- or 3-address instruction (of the form "X = op Y, Z,...
mop_range operands()
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
LLVM_ABI void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx, const TargetRegisterInfo &RegInfo)
Replace all occurrences of FromReg with ToReg:SubIdx, properly composing subreg indices where necessa...
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
void setDebugLoc(DebugLoc DL)
Replace current source information with new such.
LLVM_ABI bool allDefsAreDead() const
Return true if all the defs of this instruction are dead.
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
LLVM_ABI void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo &)
substVirtReg - Substitute the current register with the virtual subregister Reg:SubReg.
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setIsDead(bool Val=true)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
LLVM_ABI void substPhysReg(MCRegister Reg, const TargetRegisterInfo &)
substPhysReg - Substitute the current register with the physical register Reg, taking any existing Su...
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
defusechain_instr_iterator< true, true, false, true > reg_instr_iterator
reg_instr_iterator/reg_instr_begin/reg_instr_end - Walk all defs and uses of the specified register,...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:303
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
bool isProperSubClass(const TargetRegisterClass *RC) const
isProperSubClass - Returns true if RC has a legal super-class with more allocatable registers.
LLVM_ABI void runOnMachineFunction(const MachineFunction &MF, bool Rev=false)
runOnFunction - Prepare to answer questions about MF.
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Wrapper class representing virtual and physical registers.
Definition Register.h:19
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
Definition Register.h:102
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:74
constexpr unsigned id() const
Definition Register.h:95
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:78
SlotIndex - An opaque wrapper around machine indexes.
Definition SlotIndexes.h:66
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
bool isEarlyClobber() const
isEarlyClobber - Returns true if this is an early-clobber slot.
bool isValid() const
Returns true if this is a valid index.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
bool isDead() const
isDead - Returns true if this is a dead def kill slot.
SlotIndexes pass.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
SlotIndex getMBBEndIdx(unsigned Num) const
Returns the last index in the given basic block number.
SlotIndex getNextNonNullIndex(SlotIndex Index)
Returns the next non-null index, if one exists.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
SlotIndex getMBBStartIdx(unsigned Num) const
Returns the first index in the given basic block number.
SlotIndex getIndexBefore(const MachineInstr &MI) const
getIndexBefore - Returns the index of the last indexed instruction before MI, or the start index of i...
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
static const unsigned CommuteAnyOperandIndex
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual bool enableJoinGlobalCopies() const
True if the subtarget should enable joining global copies.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
VNInfo - Value Number Information.
void markUnused()
Mark this value as unused.
BumpPtrAllocator Allocator
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:194
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:174
self_iterator getIterator()
Definition ilist_node.h:130
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
This namespace contains all of the command line option processing machinery.
Definition CommandLine.h:53
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
iterator end() const
Definition BasicBlock.h:89
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI char & RegisterCoalescerID
RegisterCoalescer - This pass merges live ranges to eliminate copies.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
LLVM_ABI Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2116
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:634
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
Definition LaneBitmask.h:92
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
auto unique(Range &&R, Predicate P)
Definition STLExtras.h:2056
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:1987
LLVM_ABI void initializeRegisterCoalescerLegacyPass(PassRegistry &)
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1712
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1624
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
unsigned MCRegUnit
Register units are used to compute register aliasing.
Definition MCRegister.h:30
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ Success
The lock was released successfully.
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
DWARFExpression::Operation Op
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1877
LLVM_ABI void eraseInstrs(ArrayRef< MachineInstr * > DeadInstrs, MachineRegisterInfo &MRI, LostDebugLocObserver *LocObserver=nullptr)
Definition Utils.cpp:1705
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
Definition STLExtras.h:1584
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:853
static constexpr LaneBitmask getLane(unsigned Lane)
Definition LaneBitmask.h:83
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
constexpr bool any() const
Definition LaneBitmask.h:53
static constexpr LaneBitmask getNone()
Definition LaneBitmask.h:81
Remat - Information needed to rematerialize at a specific location.
This represents a simple continuous liveness interval for a value.