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