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