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