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