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