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