66#define DEBUG_TYPE "regalloc"
68STATISTIC(numJoins,
"Number of interval joins performed");
69STATISTIC(numCrossRCs,
"Number of cross class joins performed");
70STATISTIC(numCommutes,
"Number of instruction commuting performed");
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");
79 cl::desc(
"Coalesce copies (default=true)"),
94 cl::desc(
"Coalesce copies that span blocks (default=subtarget)"),
99 cl::desc(
"Verify machine instrs before and after register coalescing"),
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 "
113 cl::desc(
"If the valnos size of an interval is larger than the threshold, "
114 "it is regarded as a large interval. "),
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. "),
146 DenseMap<unsigned, PHIValPos> PHIValToPos;
150 DenseMap<Register, SmallVector<unsigned, 2>> RegToPHIIdx;
155 using DbgValueLoc = std::pair<SlotIndex, MachineInstr *>;
156 DenseMap<Register, std::vector<DbgValueLoc>> DbgVRegToValues;
160 LaneBitmask ShrinkMask;
164 bool ShrinkMainRange =
false;
168 bool JoinGlobalCopies =
false;
172 bool JoinSplitEdges =
false;
175 SmallVector<MachineInstr *, 8> WorkList;
176 SmallVector<MachineInstr *, 8> LocalWorkList;
180 SmallPtrSet<MachineInstr *, 8> ErasedInstrs;
183 SmallVector<MachineInstr *, 8> DeadDefs;
191 DenseSet<Register> ToBeUpdated;
195 DenseMap<Register, unsigned long> LargeLIVisitCounter;
198 void eliminateDeadDefs(LiveRangeEdit *Edit =
nullptr);
201 void LRE_WillEraseInstruction(MachineInstr *
MI)
override;
204 void coalesceLocals();
207 void joinAllIntervals();
211 void copyCoalesceInMBB(MachineBasicBlock *
MBB);
222 void lateLiveIntervalUpdate();
227 bool copyValueUndefInPredecessors(
LiveRange &S,
const MachineBasicBlock *
MBB,
228 LiveQueryResult SLRQ);
232 void setUndefOnPrunedSubRegUses(LiveInterval &LI,
Register Reg,
233 LaneBitmask PrunedLanes);
240 enum class JoinResult { Joined, Deferred, Rejected };
244 JoinResult joinCopy(MachineInstr *CopyMI,
245 SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs);
251 JoinResult joinIntervals(CoalescerPair &CP);
254 JoinResult joinVirtRegs(CoalescerPair &CP);
259 bool isHighCostLiveInterval(LiveInterval &LI);
262 bool joinReservedPhysReg(CoalescerPair &CP);
269 void mergeSubRangeInto(LiveInterval &LI,
const LiveRange &ToMerge,
270 LaneBitmask LaneMask, CoalescerPair &CP,
276 LaneBitmask LaneMask,
const CoalescerPair &CP);
282 bool adjustCopiesBackFrom(
const CoalescerPair &CP, MachineInstr *CopyMI);
286 bool hasOtherReachingDefs(LiveInterval &IntA, LiveInterval &IntB,
287 VNInfo *AValNo, VNInfo *BValNo);
297 std::pair<bool, bool> removeCopyByCommutingDef(
const CoalescerPair &CP,
298 MachineInstr *CopyMI);
301 bool removePartialRedundancy(
const CoalescerPair &CP, MachineInstr &CopyMI);
305 bool reMaterializeDef(
const CoalescerPair &CP, MachineInstr *CopyMI,
309 bool canJoinPhys(
const CoalescerPair &CP);
324 void addUndefFlag(
const LiveInterval &
Int, SlotIndex UseIdx,
325 MachineOperand &MO,
unsigned SubRegIdx);
331 MachineInstr *eliminateUndefCopy(MachineInstr *CopyMI);
345 bool applyTerminalRule(
const MachineInstr &Copy)
const;
351 SmallVectorImpl<MachineInstr *> *
Dead =
nullptr) {
353 if (LIS->shrinkToUses(LI,
Dead)) {
357 LIS->splitSeparateComponents(*LI, SplitLIs);
365 void deleteInstr(MachineInstr *
MI) {
366 ErasedInstrs.insert(
MI);
367 LIS->RemoveMachineInstrFromMaps(*
MI);
368 MI->eraseFromParent();
377 void checkMergingChangesDbgValues(CoalescerPair &CP,
LiveRange &
LHS,
386 RegisterCoalescer() =
default;
387 RegisterCoalescer &operator=(RegisterCoalescer &&
Other) =
default;
389 RegisterCoalescer(LiveIntervals *LIS, SlotIndexes *SI,
390 const MachineLoopInfo *Loops,
391 const RegisterClassInfo *RegClassInfo)
392 : LIS(LIS), SI(SI), Loops(Loops), RegClassInfo(RegClassInfo) {}
394 bool run(MachineFunction &MF);
401 RegisterCoalescerLegacy() : MachineFunctionPass(ID) {}
403 void getAnalysisUsage(AnalysisUsage &AU)
const override;
405 MachineFunctionProperties getClearedProperties()
const override {
406 return MachineFunctionProperties().setIsSSA();
410 bool runOnMachineFunction(MachineFunction &)
override;
415char RegisterCoalescerLegacy::ID = 0;
420 "Register Coalescer",
false,
false)
433 Dst = MI->getOperand(0).getReg();
434 DstSub = MI->getOperand(0).getSubReg();
435 Src = MI->getOperand(1).getReg();
436 SrcSub = MI->getOperand(1).getSubReg();
437 }
else if (
MI->isSubregToReg()) {
438 Dst = MI->getOperand(0).getReg();
439 DstSub = tri.composeSubRegIndices(MI->getOperand(0).getSubReg(),
440 MI->getOperand(2).getImm());
441 Src = MI->getOperand(1).getReg();
442 SrcSub = MI->getOperand(1).getSubReg();
454 if (
MBB->pred_size() != 1 ||
MBB->succ_size() != 1)
457 for (
const auto &
MI : *
MBB) {
458 if (!
MI.isCopyLike() && !
MI.isUnconditionalBranch())
468 Flipped = CrossClass =
false;
471 unsigned SrcSub = 0, DstSub = 0;
474 Partial = SrcSub || DstSub;
477 if (Src.isPhysical()) {
478 if (Dst.isPhysical())
488 if (Dst.isPhysical()) {
491 Dst = TRI.getSubReg(Dst, DstSub);
499 Dst = TRI.getMatchingSuperReg(Dst, SrcSub, SrcRC);
510 if (SrcSub && DstSub) {
512 if (Src == Dst && SrcSub != DstSub)
515 NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
522 NewRC = TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
526 NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
529 NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
538 if (DstIdx && !SrcIdx) {
544 CrossClass = NewRC != DstRC || NewRC != SrcRC;
547 assert(Src.isVirtual() &&
"Src must be virtual");
548 assert(!(Dst.isPhysical() && DstSub) &&
"Cannot have a physical SubIdx");
555 if (DstReg.isPhysical())
567 unsigned SrcSub = 0, DstSub = 0;
575 }
else if (Src != SrcReg) {
580 if (DstReg.isPhysical()) {
581 if (!Dst.isPhysical())
583 assert(!DstIdx && !SrcIdx &&
"Inconsistent CoalescerPair state.");
586 Dst = TRI.getSubReg(Dst, DstSub);
589 return DstReg == Dst;
591 return Register(TRI.getSubReg(DstReg, SrcSub)) == Dst;
598 return TRI.composeSubRegIndices(SrcIdx, SrcSub) ==
599 TRI.composeSubRegIndices(DstIdx, DstSub);
602void RegisterCoalescerLegacy::getAnalysisUsage(
AnalysisUsage &AU)
const {
616void RegisterCoalescer::eliminateDeadDefs(
LiveRangeEdit *Edit) {
626void RegisterCoalescer::LRE_WillEraseInstruction(
MachineInstr *
MI) {
631bool RegisterCoalescer::adjustCopiesBackFrom(
const CoalescerPair &CP,
634 assert(!CP.
isPhys() &&
"This doesn't work for physreg copies.");
659 if (BS == IntB.
end())
661 VNInfo *BValNo = BS->valno;
666 if (BValNo->
def != CopyIdx)
673 if (AS == IntA.
end())
675 VNInfo *AValNo = AS->valno;
687 if (ValS == IntB.
end())
705 SlotIndex FillerStart = ValS->end, FillerEnd = BS->start;
709 BValNo->
def = FillerStart;
717 if (BValNo != ValS->valno)
726 S.removeSegment(*SS,
true);
730 if (!S.getVNInfoAt(FillerStart)) {
733 S.extendInBlock(BBStart, FillerStart);
735 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
738 if (SubBValNo != SubValSNo)
739 S.MergeValueNumberInto(SubBValNo, SubValSNo);
756 bool RecomputeLiveRange = AS->end == CopyIdx;
757 if (!RecomputeLiveRange) {
760 if (SS != S.end() &&
SS->end == CopyIdx) {
761 RecomputeLiveRange =
true;
766 if (RecomputeLiveRange)
773bool RegisterCoalescer::hasOtherReachingDefs(
LiveInterval &IntA,
782 if (ASeg.
valno != AValNo)
785 if (BI != IntB.
begin())
787 for (; BI != IntB.
end() && ASeg.
end >= BI->start; ++BI) {
788 if (BI->valno == BValNo)
790 if (BI->start <= ASeg.
start && BI->end > ASeg.
start)
792 if (BI->start > ASeg.
start && BI->start < ASeg.
end)
806 bool MergedWithDead =
false;
808 if (S.
valno != SrcValNo)
819 MergedWithDead =
true;
822 return std::make_pair(
Changed, MergedWithDead);
826RegisterCoalescer::removeCopyByCommutingDef(
const CoalescerPair &CP,
859 assert(BValNo !=
nullptr && BValNo->
def == CopyIdx);
865 return {
false,
false};
868 return {
false,
false};
870 return {
false,
false};
877 return {
false,
false};
883 return DefMO.getReg() == IntA.reg() && !DefMO.getSubReg();
885 return {
false,
false};
897 if (!
TII->findCommutedOpIndices(*
DefMI, UseOpIdx, NewDstIdx))
898 return {
false,
false};
903 return {
false,
false};
907 if (hasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
908 return {
false,
false};
917 if (US == IntA.
end() || US->valno != AValNo)
921 return {
false,
false};
931 TII->commuteInstruction(*
DefMI,
false, UseOpIdx, NewDstIdx);
933 return {
false,
false};
936 return {
false,
false};
937 if (NewMI !=
DefMI) {
962 UseMO.setReg(NewReg);
967 assert(US != IntA.
end() &&
"Use must be live");
968 if (US->valno != AValNo)
971 UseMO.setIsKill(
false);
973 UseMO.substPhysReg(NewReg, *
TRI);
975 UseMO.setReg(NewReg);
994 VNInfo *SubDVNI = S.getVNInfoAt(DefIdx);
997 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
999 S.MergeValueNumberInto(SubDVNI, SubBValNo);
1007 bool ShrinkB =
false;
1021 VNInfo *ASubValNo = SA.getVNInfoAt(AIdx);
1030 MaskA |= SA.LaneMask;
1036 VNInfo *BSubValNo = SR.empty() ? SR.getNextValue(CopyIdx, Allocator)
1037 : SR.getVNInfoAt(CopyIdx);
1038 assert(BSubValNo != nullptr);
1039 auto P = addSegmentsWithValNo(SR, BSubValNo, SA, ASubValNo);
1040 ShrinkB |= P.second;
1042 BSubValNo->def = ASubValNo->def;
1050 if ((SB.LaneMask & MaskA).any())
1054 SB.removeSegment(*S,
true);
1058 BValNo->
def = AValNo->
def;
1060 ShrinkB |=
P.second;
1067 return {
true, ShrinkB};
1117bool RegisterCoalescer::removePartialRedundancy(
const CoalescerPair &CP,
1150 bool FoundReverseCopy =
false;
1169 bool ValB_Changed =
false;
1170 for (
auto *VNI : IntB.
valnos) {
1171 if (VNI->isUnused())
1174 ValB_Changed =
true;
1182 FoundReverseCopy =
true;
1186 if (!FoundReverseCopy)
1196 if (CopyLeftBB && CopyLeftBB->
succ_size() > 1)
1207 if (InsPos != CopyLeftBB->
end()) {
1213 LLVM_DEBUG(
dbgs() <<
"\tremovePartialRedundancy: Move the copy to "
1218 TII->get(TargetOpcode::COPY), IntB.
reg())
1229 ErasedInstrs.
erase(NewCopyMI);
1231 LLVM_DEBUG(
dbgs() <<
"\tremovePartialRedundancy: Remove the copy from "
1242 deleteInstr(&CopyMI);
1258 if (!IntB.
liveAt(UseIdx))
1259 MO.setIsUndef(
true);
1269 VNInfo *BValNo = SR.Query(CopyIdx).valueOutOrDead();
1270 assert(BValNo &&
"All sublanes should be live");
1279 for (
unsigned I = 0;
I != EndPoints.
size();) {
1281 EndPoints[
I] = EndPoints.
back();
1300bool RegisterCoalescer::reMaterializeDef(
const CoalescerPair &CP,
1328 if (!
TII->isReMaterializable(*
DefMI))
1331 bool SawStore =
false;
1335 if (
MCID.getNumDefs() != 1)
1343 if (SrcIdx && DstIdx)
1359 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
1378 unsigned NewDstIdx =
TRI->composeSubRegIndices(CP.
getSrcIdx(), DefSubIdx);
1380 NewDstReg =
TRI->getSubReg(DstReg, NewDstIdx);
1390 "Only expect to deal with virtual or physical registers");
1404 LiveRangeEdit Edit(&SrcInt, NewRegs, *MF, *LIS,
nullptr,
this);
1419 "Shouldn't have SrcIdx+DstIdx at this point");
1422 TRI->getCommonSubClass(DefRC, DstRC);
1423 if (CommonRC !=
nullptr) {
1431 if (MO.isReg() && MO.getReg() == DstReg && MO.getSubReg() == DstIdx) {
1453 "No explicit operands after implicit operands.");
1456 "unexpected implicit virtual register def");
1462 ErasedInstrs.
insert(CopyMI);
1486 ((
TRI->getSubReg(MO.
getReg(), DefSubIdx) ==
1500 "subrange update for implicit-def of super register may not be "
1501 "properly handled");
1509 if (DefRC !=
nullptr) {
1511 NewRC =
TRI->getMatchingSuperRegClass(NewRC, DefRC, NewIdx);
1513 NewRC =
TRI->getCommonSubClass(NewRC, DefRC);
1514 assert(NewRC &&
"subreg chosen for remat incompatible with instruction");
1520 SR.LaneMask =
TRI->composeSubRegIndexLaneMask(DstIdx, SR.LaneMask);
1525 updateRegDefsUses(DstReg, DstReg, DstIdx);
1574 if (!SR.liveAt(DefIndex))
1575 SR.createDeadDef(DefIndex,
Alloc);
1576 MaxMask &= ~SR.LaneMask;
1578 if (MaxMask.
any()) {
1596 bool UpdatedSubRanges =
false;
1611 if (!SR.
liveAt(DefIndex))
1617 if ((SR.
LaneMask & DstMask).none()) {
1619 <<
"Removing undefined SubRange "
1632 UpdatedSubRanges =
true;
1635 if (UpdatedSubRanges)
1642 "Only expect virtual or physical registers in remat");
1650 bool HasDefMatchingCopy =
false;
1651 for (
auto [OpIndex,
Reg] : NewMIImplDefs) {
1657 if (DstReg != CopyDstReg)
1660 HasDefMatchingCopy =
true;
1664 if (!HasDefMatchingCopy)
1666 CopyDstReg,
true ,
true ,
false ));
1714 UseMO.substPhysReg(DstReg, *
TRI);
1716 UseMO.setReg(DstReg);
1725 if (ToBeUpdated.
count(SrcReg))
1728 unsigned NumCopyUses = 0;
1730 if (UseMO.getParent()->isCopyLike())
1736 if (!DeadDefs.
empty())
1737 eliminateDeadDefs(&Edit);
1739 ToBeUpdated.
insert(SrcReg);
1757 unsigned SrcSubIdx = 0, DstSubIdx = 0;
1758 if (!
isMoveInstr(*
TRI, CopyMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx))
1767 if ((SR.
LaneMask & SrcMask).none())
1772 }
else if (SrcLI.
liveAt(Idx))
1780 assert(Seg !=
nullptr &&
"No segment for defining instruction");
1785 if (((V &&
V->isPHIDef()) || (!V && !DstLI.
liveAt(Idx)))) {
1793 CopyMI->
getOpcode() == TargetOpcode::SUBREG_TO_REG);
1798 CopyMI->
setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
1815 if ((SR.
LaneMask & DstMask).none())
1839 if ((SR.
LaneMask & UseMask).none())
1847 isLive = DstLI.
liveAt(UseIdx);
1860 if (MO.
getReg() == DstReg)
1872 bool IsUndef =
true;
1874 if ((S.LaneMask & Mask).none())
1876 if (S.liveAt(UseIdx)) {
1889 ShrinkMainRange =
true;
1898 if (DstInt && DstReg != SrcReg) {
1904 if (SubReg == 0 && MO.
isDef())
1910 addUndefFlag(*DstInt, UseIdx, MO, SubReg);
1911 }
else if (MO.
isUse() && SubReg == 0 && !DstInt->
liveAt(UseIdx)) {
1933 if (SrcReg == DstReg && !Visited.
insert(
UseMI).second)
1946 for (
unsigned Op :
Ops) {
1952 if (SubIdx && MO.
isDef())
1958 unsigned SubUseIdx =
TRI->composeSubRegIndices(SubIdx, MO.
getSubReg());
1976 addUndefFlag(*DstInt, UseIdx, MO, SubUseIdx);
1987 dbgs() <<
"\t\tupdated: ";
1995bool RegisterCoalescer::canJoinPhys(
const CoalescerPair &CP) {
2000 LLVM_DEBUG(
dbgs() <<
"\tCan only merge into reserved registers.\n");
2009 dbgs() <<
"\tCannot join complex intervals into reserved register.\n");
2013bool RegisterCoalescer::copyValueUndefInPredecessors(
2027void RegisterCoalescer::setUndefOnPrunedSubRegUses(
LiveInterval &LI,
2034 if (SubRegIdx == 0 || MO.
isUndef())
2040 if (!S.
liveAt(Pos) && (PrunedLanes & SubRegMask).any()) {
2056RegisterCoalescer::JoinResult RegisterCoalescer::joinCopy(
2064 return JoinResult::Rejected;
2070 <<
"are available for allocation\n");
2071 return JoinResult::Rejected;
2082 if (!
TRI->shouldCoalesce(CopyMI, SrcRC, SrcIdx, DstRC, DstIdx,
2085 return JoinResult::Rejected;
2095 eliminateDeadDefs();
2096 return JoinResult::Joined;
2102 if (
MachineInstr *UndefMI = eliminateUndefCopy(CopyMI)) {
2103 if (UndefMI->isImplicitDef())
2104 return JoinResult::Rejected;
2105 deleteInstr(CopyMI);
2106 return JoinResult::Rejected;
2115 LLVM_DEBUG(
dbgs() <<
"\tCopy already coalesced: " << LI <<
'\n');
2120 assert(ReadVNI &&
"No value before copy and no <undef> flag.");
2121 assert(ReadVNI != DefVNI &&
"Cannot read and define the same value.");
2136 if (copyValueUndefInPredecessors(S,
MBB, SLRQ)) {
2137 LLVM_DEBUG(
dbgs() <<
"Incoming sublane value is undef at copy\n");
2138 PrunedLanes |= S.LaneMask;
2145 if (PrunedLanes.
any()) {
2146 LLVM_DEBUG(
dbgs() <<
"Pruning undef incoming lanes: " << PrunedLanes
2148 setUndefOnPrunedSubRegUses(LI, CP.
getSrcReg(), PrunedLanes);
2153 deleteInstr(CopyMI);
2154 return JoinResult::Joined;
2162 if (!canJoinPhys(CP)) {
2165 bool IsDefCopy =
false;
2166 if (reMaterializeDef(CP, CopyMI, IsDefCopy))
2167 return JoinResult::Joined;
2169 return JoinResult::Deferred;
2170 return JoinResult::Rejected;
2179 dbgs() <<
"\tConsidering merging to "
2180 <<
TRI->getRegClassName(CP.
getNewRC()) <<
" with ";
2193 ShrinkMainRange =
false;
2199 JoinResult
Result = joinIntervals(CP);
2200 if (Result != JoinResult::Joined) {
2204 bool IsDefCopy =
false;
2205 if (reMaterializeDef(CP, CopyMI, IsDefCopy))
2206 return JoinResult::Joined;
2211 bool Changed = adjustCopiesBackFrom(CP, CopyMI);
2212 bool Shrink =
false;
2214 std::tie(
Changed, Shrink) = removeCopyByCommutingDef(CP, CopyMI);
2216 deleteInstr(CopyMI);
2224 return JoinResult::Joined;
2231 if (removePartialRedundancy(CP, *CopyMI))
2232 return JoinResult::Joined;
2239 if (Result == JoinResult::Deferred)
2259 if (ErasedInstrs.
erase(CopyMI))
2261 CurrentErasedInstrs.
insert(CopyMI);
2270 if (ShrinkMask.
any()) {
2273 if ((S.LaneMask & ShrinkMask).none())
2278 ShrinkMainRange =
true;
2287 ShrinkMainRange =
true;
2289 if (ShrinkMainRange) {
2304 dbgs() <<
"\tResult = ";
2313 return JoinResult::Joined;
2316bool RegisterCoalescer::joinReservedPhysReg(
CoalescerPair &CP) {
2324 assert(
RHS.containsOneValue() &&
"Invalid join with reserved register");
2334 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
2350 !RegMaskUsable.
test(DstReg.
id())) {
2372 deleteInstr(CopyMI);
2404 if (
MI->readsRegister(DstReg,
TRI)) {
2414 <<
printReg(DstReg,
TRI) <<
" at " << CopyRegIdx <<
"\n");
2417 deleteInstr(CopyMI);
2420 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
2512 const unsigned SubIdx;
2516 const LaneBitmask LaneMask;
2520 const bool SubRangeJoin;
2523 const bool TrackSubRegLiveness;
2526 SmallVectorImpl<VNInfo *> &NewVNInfo;
2528 const CoalescerPair &CP;
2530 SlotIndexes *Indexes;
2531 const TargetRegisterInfo *
TRI;
2535 SmallVector<int, 8> Assignments;
2539 enum ConflictResolution {
2571 ConflictResolution Resolution = CR_Keep;
2574 LaneBitmask WriteLanes;
2578 LaneBitmask ValidLanes;
2581 VNInfo *RedefVNI =
nullptr;
2584 VNInfo *OtherVNI =
nullptr;
2597 bool ErasableImplicitDef =
false;
2601 bool Pruned =
false;
2604 bool PrunedComputed =
false;
2611 bool Identical =
false;
2615 bool isAnalyzed()
const {
return WriteLanes.
any(); }
2619 void mustKeepImplicitDef(
const TargetRegisterInfo &
TRI,
2620 const MachineInstr &ImpDef) {
2622 ErasableImplicitDef =
false;
2633 LaneBitmask computeWriteLanes(
const MachineInstr *
DefMI,
bool &Redef)
const;
2636 std::pair<const VNInfo *, Register> followCopyChain(
const VNInfo *VNI)
const;
2638 bool valuesIdentical(VNInfo *Value0, VNInfo *Value1,
2639 const JoinVals &
Other)
const;
2648 ConflictResolution analyzeValue(
unsigned ValNo, JoinVals &
Other);
2653 void computeAssignment(
unsigned ValNo, JoinVals &
Other);
2671 taintExtent(
unsigned ValNo, LaneBitmask TaintedLanes, JoinVals &
Other,
2672 SmallVectorImpl<std::pair<SlotIndex, LaneBitmask>> &TaintExtent);
2676 bool usesLanes(
const MachineInstr &
MI,
Register,
unsigned, LaneBitmask)
const;
2684 bool isPrunedValue(
unsigned ValNo, JoinVals &
Other);
2688 SmallVectorImpl<VNInfo *> &newVNInfo,
const CoalescerPair &cp,
2689 LiveIntervals *lis,
const TargetRegisterInfo *
TRI,
bool SubRangeJoin,
2690 bool TrackSubRegLiveness)
2691 : LR(LR),
Reg(
Reg), SubIdx(SubIdx), LaneMask(LaneMask),
2692 SubRangeJoin(SubRangeJoin), TrackSubRegLiveness(TrackSubRegLiveness),
2693 NewVNInfo(newVNInfo), CP(cp), LIS(lis), Indexes(LIS->getSlotIndexes()),
2694 TRI(
TRI), Assignments(LR.getNumValNums(), -1),
2695 Vals(LR.getNumValNums()) {}
2699 bool mapValues(JoinVals &
Other);
2703 bool resolveConflicts(JoinVals &
Other);
2708 void pruneValues(JoinVals &
Other, SmallVectorImpl<SlotIndex> &EndPoints,
2714 void pruneSubRegValues(LiveInterval &LI, LaneBitmask &ShrinkMask);
2723 void pruneMainSegments(LiveInterval &LI,
bool &ShrinkMainRange);
2729 void eraseInstrs(SmallPtrSetImpl<MachineInstr *> &ErasedInstrs,
2730 SmallVectorImpl<Register> &ShrinkRegs,
2731 LiveInterval *LI =
nullptr);
2734 void removeImplicitDefs();
2737 const int *getAssignments()
const {
return Assignments.
data(); }
2740 ConflictResolution getResolution(
unsigned Num)
const {
2741 return Vals[Num].Resolution;
2748 bool &Redef)
const {
2753 L |=
TRI->getSubRegIndexLaneMask(
2761std::pair<const VNInfo *, Register>
2762JoinVals::followCopyChain(
const VNInfo *VNI)
const {
2768 assert(
MI &&
"No defining instruction");
2769 if (!
MI->isFullCopy())
2770 return std::make_pair(VNI, TrackReg);
2771 Register SrcReg =
MI->getOperand(1).getReg();
2773 return std::make_pair(VNI, TrackReg);
2787 LaneBitmask SMask =
TRI->composeSubRegIndexLaneMask(SubIdx, S.LaneMask);
2788 if ((SMask & LaneMask).
none())
2796 return std::make_pair(VNI, TrackReg);
2799 if (ValueIn ==
nullptr) {
2806 return std::make_pair(
nullptr, SrcReg);
2811 return std::make_pair(VNI, TrackReg);
2814bool JoinVals::valuesIdentical(
VNInfo *Value0,
VNInfo *Value1,
2815 const JoinVals &
Other)
const {
2818 std::tie(Orig0, Reg0) = followCopyChain(Value0);
2819 if (Orig0 == Value1 && Reg0 ==
Other.Reg)
2824 std::tie(Orig1, Reg1) =
Other.followCopyChain(Value1);
2828 if (Orig0 ==
nullptr || Orig1 ==
nullptr)
2829 return Orig0 == Orig1 && Reg0 == Reg1;
2835 return Orig0->
def == Orig1->
def && Reg0 == Reg1;
2838JoinVals::ConflictResolution JoinVals::analyzeValue(
unsigned ValNo,
2840 Val &
V = Vals[ValNo];
2841 assert(!
V.isAnalyzed() &&
"Value has already been analyzed!");
2853 :
TRI->getSubRegIndexLaneMask(SubIdx);
2854 V.ValidLanes =
V.WriteLanes = Lanes;
2863 V.ErasableImplicitDef =
true;
2867 V.ValidLanes =
V.WriteLanes = computeWriteLanes(
DefMI, Redef);
2886 assert((TrackSubRegLiveness ||
V.RedefVNI) &&
2887 "Instruction is reading nonexistent value");
2888 if (
V.RedefVNI !=
nullptr) {
2889 computeAssignment(
V.RedefVNI->id,
Other);
2890 V.ValidLanes |= Vals[
V.RedefVNI->id].ValidLanes;
2902 V.ErasableImplicitDef =
true;
2919 if (OtherVNI->
def < VNI->
def)
2920 Other.computeAssignment(OtherVNI->
id, *
this);
2925 return CR_Impossible;
2927 V.OtherVNI = OtherVNI;
2928 Val &OtherV =
Other.Vals[OtherVNI->
id];
2932 if (!OtherV.isAnalyzed() ||
Other.Assignments[OtherVNI->
id] == -1)
2939 if ((
V.ValidLanes & OtherV.ValidLanes).any())
2941 return CR_Impossible;
2955 Other.computeAssignment(
V.OtherVNI->id, *
this);
2956 Val &OtherV =
Other.Vals[
V.OtherVNI->id];
2958 if (OtherV.ErasableImplicitDef) {
2978 <<
", keeping it.\n");
2979 OtherV.mustKeepImplicitDef(*
TRI, *OtherImpDef);
2986 dbgs() <<
"IMPLICIT_DEF defined at " <<
V.OtherVNI->def
2987 <<
" may be live into EH pad successors, keeping it.\n");
2988 OtherV.mustKeepImplicitDef(*
TRI, *OtherImpDef);
2991 OtherV.ValidLanes &= ~OtherV.WriteLanes;
3009 V.ValidLanes &= ~V.WriteLanes | OtherV.ValidLanes;
3024 valuesIdentical(VNI,
V.OtherVNI,
Other)) {
3047 if ((
V.WriteLanes & OtherV.ValidLanes).none())
3060 "Only early clobber defs can overlap a kill");
3061 return CR_Impossible;
3068 if ((
TRI->getSubRegIndexLaneMask(
Other.SubIdx) & ~
V.WriteLanes).none())
3069 return CR_Impossible;
3071 if (TrackSubRegLiveness) {
3076 if (!OtherLI.hasSubRanges()) {
3078 return (OtherMask &
V.WriteLanes).none() ? CR_Replace : CR_Impossible;
3086 TRI->composeSubRegIndexLaneMask(
Other.SubIdx, OtherSR.LaneMask);
3087 if ((OtherMask &
V.WriteLanes).none())
3090 auto OtherSRQ = OtherSR.Query(VNI->
def);
3091 if (OtherSRQ.valueIn() && OtherSRQ.endPoint() > VNI->
def) {
3093 return CR_Impossible;
3106 return CR_Impossible;
3115 return CR_Unresolved;
3118void JoinVals::computeAssignment(
unsigned ValNo, JoinVals &
Other) {
3119 Val &
V = Vals[ValNo];
3120 if (
V.isAnalyzed()) {
3123 assert(Assignments[ValNo] != -1 &&
"Bad recursion?");
3126 switch ((
V.Resolution = analyzeValue(ValNo,
Other))) {
3130 assert(
V.OtherVNI &&
"OtherVNI not assigned, can't merge.");
3131 assert(
Other.Vals[
V.OtherVNI->id].isAnalyzed() &&
"Missing recursion");
3132 Assignments[ValNo] =
Other.Assignments[
V.OtherVNI->id];
3136 <<
V.OtherVNI->def <<
" --> @"
3137 << NewVNInfo[Assignments[ValNo]]->def <<
'\n');
3140 case CR_Unresolved: {
3142 assert(
V.OtherVNI &&
"OtherVNI not assigned, can't prune");
3143 Val &OtherV =
Other.Vals[
V.OtherVNI->id];
3144 OtherV.Pruned =
true;
3149 Assignments[ValNo] = NewVNInfo.
size();
3155bool JoinVals::mapValues(JoinVals &
Other) {
3157 computeAssignment(i,
Other);
3158 if (Vals[i].Resolution == CR_Impossible) {
3167bool JoinVals::taintExtent(
3176 assert(OtherI !=
Other.LR.end() &&
"No conflict?");
3181 if (End >= MBBEnd) {
3183 << OtherI->valno->id <<
'@' << OtherI->start <<
'\n');
3187 << OtherI->valno->id <<
'@' << OtherI->start <<
" to "
3192 TaintExtent.push_back(std::make_pair(End, TaintedLanes));
3195 if (++OtherI ==
Other.LR.end() || OtherI->start >= MBBEnd)
3199 const Val &OV =
Other.Vals[OtherI->valno->id];
3200 TaintedLanes &= ~OV.WriteLanes;
3203 }
while (TaintedLanes.
any());
3209 if (
MI.isDebugOrPseudoInstr())
3216 unsigned S =
TRI->composeSubRegIndices(SubIdx, MO.
getSubReg());
3217 if ((Lanes &
TRI->getSubRegIndexLaneMask(S)).any())
3223bool JoinVals::resolveConflicts(JoinVals &
Other) {
3226 assert(
V.Resolution != CR_Impossible &&
"Unresolvable conflict");
3227 if (
V.Resolution != CR_Unresolved)
3236 assert(
V.OtherVNI &&
"Inconsistent conflict resolution.");
3238 const Val &OtherV =
Other.Vals[
V.OtherVNI->id];
3243 LaneBitmask TaintedLanes =
V.WriteLanes & OtherV.ValidLanes;
3245 if (!taintExtent(i, TaintedLanes,
Other, TaintExtent))
3249 assert(!TaintExtent.
empty() &&
"There should be at least one conflict.");
3262 "Interference ends on VNI->def. Should have been handled earlier");
3265 assert(LastMI &&
"Range must end at a proper instruction");
3266 unsigned TaintNum = 0;
3269 if (usesLanes(*
MI,
Other.Reg,
Other.SubIdx, TaintedLanes)) {
3274 if (&*
MI == LastMI) {
3275 if (++TaintNum == TaintExtent.
size())
3278 assert(LastMI &&
"Range must end at a proper instruction");
3279 TaintedLanes = TaintExtent[TaintNum].second;
3285 V.Resolution = CR_Replace;
3291bool JoinVals::isPrunedValue(
unsigned ValNo, JoinVals &
Other) {
3292 Val &
V = Vals[ValNo];
3293 if (
V.Pruned ||
V.PrunedComputed)
3296 if (
V.Resolution != CR_Erase &&
V.Resolution != CR_Merge)
3301 V.PrunedComputed =
true;
3302 V.Pruned =
Other.isPrunedValue(
V.OtherVNI->id, *
this);
3306void JoinVals::pruneValues(JoinVals &
Other,
3308 bool changeInstrs) {
3311 switch (Vals[i].Resolution) {
3321 Val &OtherV =
Other.Vals[Vals[i].OtherVNI->id];
3323 OtherV.ErasableImplicitDef && OtherV.Resolution == CR_Keep;
3324 if (!
Def.isBlock()) {
3344 <<
": " <<
Other.LR <<
'\n');
3349 if (isPrunedValue(i,
Other)) {
3354 Val &OtherV =
Other.Vals[Vals[i].OtherVNI->id];
3356 OtherV.ErasableImplicitDef && OtherV.Resolution == CR_Keep;
3359 LIS->
pruneValue(LR, Def, EraseImpDef ?
nullptr : &EndPoints);
3361 << Def <<
": " << LR <<
'\n');
3419 bool DidPrune =
false;
3424 if (
V.Resolution != CR_Erase &&
3425 (
V.Resolution != CR_Keep || !
V.ErasableImplicitDef || !
V.Pruned))
3432 OtherDef =
V.OtherVNI->def;
3435 LLVM_DEBUG(
dbgs() <<
"\t\tExpecting instruction removal at " << Def
3443 if (ValueOut !=
nullptr &&
3445 (
V.Identical &&
V.Resolution == CR_Erase && ValueOut->
def == Def))) {
3447 <<
" at " << Def <<
"\n");
3452 if (ValueOut->
def == Def)
3455 if (
V.Identical && S.Query(OtherDef).valueOutOrDead()) {
3465 ShrinkMask |= S.LaneMask;
3479 ShrinkMask |= S.LaneMask;
3491 if (VNI->
def == Def)
3497void JoinVals::pruneMainSegments(
LiveInterval &LI,
bool &ShrinkMainRange) {
3501 if (Vals[i].Resolution != CR_Keep)
3506 Vals[i].Pruned =
true;
3507 ShrinkMainRange =
true;
3511void JoinVals::removeImplicitDefs() {
3514 if (
V.Resolution != CR_Keep || !
V.ErasableImplicitDef || !
V.Pruned)
3530 switch (Vals[i].Resolution) {
3535 if (!Vals[i].ErasableImplicitDef || !Vals[i].Pruned)
3547 if (LI !=
nullptr) {
3572 ED = ED.
isValid() ? std::min(ED,
I->start) :
I->start;
3574 LE =
LE.isValid() ? std::max(LE,
I->end) :
I->
end;
3577 NewEnd = std::min(NewEnd, LE);
3579 NewEnd = std::min(NewEnd, ED);
3585 if (S != LR.
begin())
3586 std::prev(S)->end = NewEnd;
3590 dbgs() <<
"\t\tremoved " << i <<
'@' <<
Def <<
": " << LR <<
'\n';
3592 dbgs() <<
"\t\t LHS = " << *LI <<
'\n';
3599 assert(
MI &&
"No instruction to erase");
3608 MI->eraseFromParent();
3622 CP, LIS,
TRI,
true,
true);
3624 CP, LIS,
TRI,
true,
true);
3631 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals)) {
3636 if (!LHSVals.resolveConflicts(RHSVals) ||
3637 !RHSVals.resolveConflicts(LHSVals)) {
3648 LHSVals.pruneValues(RHSVals, EndPoints,
false);
3649 RHSVals.pruneValues(LHSVals, EndPoints,
false);
3651 LHSVals.removeImplicitDefs();
3652 RHSVals.removeImplicitDefs();
3657 LRange.
join(RRange, LHSVals.getAssignments(), RHSVals.getAssignments(),
3662 if (EndPoints.
empty())
3668 dbgs() <<
"\t\trestoring liveness to " << EndPoints.
size() <<
" points: ";
3669 for (
unsigned i = 0, n = EndPoints.
size(); i != n; ++i) {
3670 dbgs() << EndPoints[i];
3674 dbgs() <<
": " << LRange <<
'\n';
3679void RegisterCoalescer::mergeSubRangeInto(
LiveInterval &LI,
3683 unsigned ComposeSubRegIdx) {
3693 joinSubRegRanges(SR, RangeCopy, SR.
LaneMask, CP);
3699bool RegisterCoalescer::isHighCostLiveInterval(
LiveInterval &LI) {
3702 auto &Counter = LargeLIVisitCounter[LI.
reg()];
3710RegisterCoalescer::JoinResult
3717 NewVNInfo, CP, LIS,
TRI,
false, TrackSubRegLiveness);
3719 NewVNInfo, CP, LIS,
TRI,
false, TrackSubRegLiveness);
3723 if (isHighCostLiveInterval(
LHS) || isHighCostLiveInterval(
RHS)) {
3725 <<
RHS.valnos.size() <<
", segments=" <<
RHS.size()
3726 <<
"; LHS valnos=" <<
LHS.valnos.size()
3727 <<
", segments=" <<
LHS.size() <<
'\n');
3728 return JoinResult::Rejected;
3734 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals))
3735 return JoinResult::Deferred;
3739 if (!LHSVals.resolveConflicts(RHSVals) || !RHSVals.resolveConflicts(LHSVals))
3740 return JoinResult::Deferred;
3743 if (
RHS.hasSubRanges() ||
LHS.hasSubRanges()) {
3749 if (!
LHS.hasSubRanges()) {
3751 :
TRI->getSubRegIndexLaneMask(DstIdx);
3755 }
else if (DstIdx != 0) {
3767 if (!
RHS.hasSubRanges()) {
3769 :
TRI->getSubRegIndexLaneMask(SrcIdx);
3770 mergeSubRangeInto(
LHS,
RHS, Mask, CP, DstIdx);
3775 mergeSubRangeInto(
LHS, R, Mask, CP, DstIdx);
3782 LHSVals.pruneMainSegments(
LHS, ShrinkMainRange);
3784 LHSVals.pruneSubRegValues(
LHS, ShrinkMask);
3785 RHSVals.pruneSubRegValues(
LHS, ShrinkMask);
3791 LHSVals.pruneMainSegments(
LHS, ShrinkMainRange);
3792 LHSVals.pruneSubRegValues(
LHS, ShrinkMask);
3800 LHSVals.pruneValues(RHSVals, EndPoints,
true);
3801 RHSVals.pruneValues(LHSVals, EndPoints,
true);
3806 LHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs, &
LHS);
3807 RHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs);
3808 while (!ShrinkRegs.
empty())
3812 checkMergingChangesDbgValues(CP,
LHS, LHSVals,
RHS, RHSVals);
3817 if (RegIt != RegToPHIIdx.
end()) {
3819 for (
unsigned InstID : RegIt->second) {
3820 auto PHIIt = PHIValToPos.
find(InstID);
3825 auto LII =
RHS.find(
SI);
3826 if (LII ==
RHS.end() || LII->start >
SI)
3844 if (PHIIt->second.SubReg && PHIIt->second.SubReg != CP.
getSrcIdx())
3859 auto InstrNums = RegIt->second;
3860 RegToPHIIdx.
erase(RegIt);
3865 if (RegIt != RegToPHIIdx.
end())
3872 LHS.join(
RHS, LHSVals.getAssignments(), RHSVals.getAssignments(), NewVNInfo);
3880 if (!EndPoints.
empty()) {
3884 dbgs() <<
"\t\trestoring liveness to " << EndPoints.
size() <<
" points: ";
3885 for (
unsigned i = 0, n = EndPoints.
size(); i != n; ++i) {
3886 dbgs() << EndPoints[i];
3890 dbgs() <<
": " <<
LHS <<
'\n';
3895 return JoinResult::Joined;
3898RegisterCoalescer::JoinResult
3901 return joinReservedPhysReg(CP) ? JoinResult::Joined : JoinResult::Deferred;
3902 return joinVirtRegs(CP);
3912 for (
auto *
X : ToInsert) {
3913 for (
const auto &
Op :
X->debug_operands()) {
3914 if (
Op.isReg() &&
Op.getReg().isVirtual())
3915 DbgVRegToValues[
Op.getReg()].push_back({
Slot,
X});
3925 for (
auto &
MBB : MF) {
3928 for (
auto &
MI :
MBB) {
3929 if (
MI.isDebugValue()) {
3931 return MO.isReg() && MO.getReg().isVirtual();
3933 ToInsert.push_back(&
MI);
3934 }
else if (!
MI.isDebugOrPseudoInstr()) {
3936 CloseNewDVRange(CurrentSlot);
3945 for (
auto &Pair : DbgVRegToValues)
3949void RegisterCoalescer::checkMergingChangesDbgValues(
CoalescerPair &CP,
3953 JoinVals &RHSVals) {
3955 checkMergingChangesDbgValuesImpl(
Reg,
RHS,
LHS, LHSVals);
3959 checkMergingChangesDbgValuesImpl(
Reg,
LHS,
RHS, RHSVals);
3967void RegisterCoalescer::checkMergingChangesDbgValuesImpl(
Register Reg,
3970 JoinVals &RegVals) {
3972 auto VRegMapIt = DbgVRegToValues.
find(
Reg);
3973 if (VRegMapIt == DbgVRegToValues.
end())
3976 auto &DbgValueSet = VRegMapIt->second;
3977 auto DbgValueSetIt = DbgValueSet.begin();
3978 auto SegmentIt = OtherLR.
begin();
3980 bool LastUndefResult =
false;
3985 auto ShouldUndef = [&RegVals, &
RegLR, &LastUndefResult,
3990 if (LastUndefIdx == Idx)
3991 return LastUndefResult;
3997 auto OtherIt =
RegLR.find(Idx);
3998 if (OtherIt ==
RegLR.end())
4007 auto Resolution = RegVals.getResolution(OtherIt->valno->id);
4009 Resolution != JoinVals::CR_Keep && Resolution != JoinVals::CR_Erase;
4011 return LastUndefResult;
4017 while (DbgValueSetIt != DbgValueSet.end() && SegmentIt != OtherLR.
end()) {
4018 if (DbgValueSetIt->first < SegmentIt->end) {
4021 if (DbgValueSetIt->first >= SegmentIt->start) {
4022 bool HasReg = DbgValueSetIt->second->hasDebugOperandForReg(
Reg);
4023 bool ShouldUndefReg = ShouldUndef(DbgValueSetIt->first);
4024 if (HasReg && ShouldUndefReg) {
4026 DbgValueSetIt->second->setDebugValueUndef();
4040struct MBBPriorityInfo {
4041 MachineBasicBlock *
MBB;
4045 MBBPriorityInfo(MachineBasicBlock *mbb,
unsigned depth,
bool issplit)
4046 :
MBB(mbb),
Depth(depth), IsSplit(issplit) {}
4056 const MBBPriorityInfo *
RHS) {
4058 if (
LHS->Depth !=
RHS->Depth)
4059 return LHS->Depth >
RHS->Depth ? -1 : 1;
4062 if (
LHS->IsSplit !=
RHS->IsSplit)
4063 return LHS->IsSplit ? -1 : 1;
4067 unsigned cl =
LHS->MBB->pred_size() +
LHS->MBB->succ_size();
4068 unsigned cr =
RHS->MBB->pred_size() +
RHS->MBB->succ_size();
4070 return cl > cr ? -1 : 1;
4073 return LHS->MBB->getNumber() <
RHS->MBB->getNumber() ? -1 : 1;
4078 if (!Copy->isCopy())
4081 if (Copy->getOperand(1).isUndef())
4084 Register SrcReg = Copy->getOperand(1).getReg();
4085 Register DstReg = Copy->getOperand(0).getReg();
4093void RegisterCoalescer::lateLiveIntervalUpdate() {
4099 if (!DeadDefs.
empty())
4100 eliminateDeadDefs();
4102 ToBeUpdated.
clear();
4105bool RegisterCoalescer::copyCoalesceWorkList(
4107 bool Progress =
false;
4118 JoinResult
Result = joinCopy(
MI, CurrentErasedInstrs);
4119 Progress |=
Result == JoinResult::Joined;
4120 if (Result != JoinResult::Deferred)
4124 if (!CurrentErasedInstrs.
empty()) {
4126 if (
MI && CurrentErasedInstrs.
count(
MI))
4130 if (
MI && CurrentErasedInstrs.
count(
MI))
4141 assert(Copy.isCopyLike());
4144 if (&
MI != &Copy &&
MI.isCopyLike())
4149bool RegisterCoalescer::applyTerminalRule(
const MachineInstr &Copy)
const {
4154 unsigned SrcSubReg = 0, DstSubReg = 0;
4155 if (!
isMoveInstr(*
TRI, &Copy, SrcReg, DstReg, SrcSubReg, DstSubReg))
4176 if (&
MI == &Copy || !
MI.isCopyLike() ||
MI.getParent() != OrigBB)
4179 unsigned OtherSrcSubReg = 0, OtherSubReg = 0;
4183 if (OtherReg == SrcReg)
4184 OtherReg = OtherSrcReg;
4203 const unsigned PrevSize = WorkList.
size();
4204 if (JoinGlobalCopies) {
4210 if (!
MI.isCopyLike())
4212 bool ApplyTerminalRule = applyTerminalRule(
MI);
4214 if (ApplyTerminalRule)
4219 if (ApplyTerminalRule)
4226 LocalWorkList.
append(LocalTerminals.
begin(), LocalTerminals.
end());
4233 if (MII.isCopyLike()) {
4234 if (applyTerminalRule(MII))
4247 if (copyCoalesceWorkList(CurrList))
4249 std::remove(WorkList.
begin() + PrevSize, WorkList.
end(),
nullptr),
4253void RegisterCoalescer::coalesceLocals() {
4254 copyCoalesceWorkList(LocalWorkList);
4259 LocalWorkList.clear();
4262void RegisterCoalescer::joinAllIntervals() {
4263 LLVM_DEBUG(
dbgs() <<
"********** JOINING INTERVALS ***********\n");
4264 assert(WorkList.
empty() && LocalWorkList.empty() &&
"Old data still around.");
4266 std::vector<MBBPriorityInfo> MBBs;
4267 MBBs.reserve(MF->size());
4269 MBBs.push_back(MBBPriorityInfo(&
MBB,
Loops->getLoopDepth(&
MBB),
4275 unsigned CurrDepth = std::numeric_limits<unsigned>::max();
4276 for (MBBPriorityInfo &
MBB : MBBs) {
4278 if (JoinGlobalCopies &&
MBB.Depth < CurrDepth) {
4280 CurrDepth =
MBB.Depth;
4282 copyCoalesceInMBB(
MBB.MBB);
4284 lateLiveIntervalUpdate();
4289 while (copyCoalesceWorkList(WorkList))
4291 lateLiveIntervalUpdate();
4302 RegisterCoalescer Impl(&LIS,
SI, &
Loops, RegClassInfo);
4314bool RegisterCoalescerLegacy::runOnMachineFunction(
MachineFunction &MF) {
4315 auto *LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
4316 auto *
Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
4317 auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
4318 auto *RegClassInfo =
4319 &getAnalysis<MachineRegisterClassInfoWrapperPass>().getRCI();
4320 SlotIndexes *
SI = SIWrapper ? &SIWrapper->getSI() :
nullptr;
4321 RegisterCoalescer Impl(LIS,
SI,
Loops, RegClassInfo);
4322 return Impl.run(MF);
4326 LLVM_DEBUG(
dbgs() <<
"********** REGISTER COALESCER **********\n"
4327 <<
"********** Function: " << fn.
getName() <<
'\n');
4339 dbgs() <<
"* Skipped as it exposes functions that returns twice.\n");
4359 unsigned SubReg = DebugPHI.second.SubReg;
4361 PHIValPos
P = {
SI,
Reg, SubReg};
4362 PHIValToPos.
insert(std::make_pair(DebugPHI.first,
P));
4363 RegToPHIIdx[
Reg].push_back(DebugPHI.first);
4372 MF->
verify(LIS,
SI,
"Before register coalescing", &
errs());
4374 DbgVRegToValues.
clear();
4408 assert((S.LaneMask & ~MaxMask).none());
4419 auto it = PHIValToPos.
find(
p.first);
4421 p.second.Reg = it->second.Reg;
4422 p.second.SubReg = it->second.SubReg;
4425 PHIValToPos.
clear();
4426 RegToPHIIdx.
clear();
4431 MF->
verify(LIS,
SI,
"After register coalescing", &
errs());
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
A common definition of LaneBitmask for use in TableGen and CodeGen.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
static cl::opt< bool > UseTerminalRule("terminal-rule", cl::desc("Apply the terminal rule"), cl::init(true), cl::Hidden)
static bool isLocalCopy(MachineInstr *Copy, const LiveIntervals *LIS)
static bool isSplitEdge(const MachineBasicBlock *MBB)
Return true if this block should be vacated by the coalescer to eliminate branches.
static int compareMBBPriority(const MBBPriorityInfo *LHS, const MBBPriorityInfo *RHS)
C-style comparator that sorts first based on the loop depth of the basic block (the unsigned),...
static cl::opt< unsigned > LargeIntervalSizeThreshold("large-interval-size-threshold", cl::Hidden, cl::desc("If the valnos size of an interval is larger than the threshold, " "it is regarded as a large interval. "), cl::init(100))
static bool isDefInSubRange(LiveInterval &LI, SlotIndex Def)
Check if any of the subranges of LI contain a definition at Def.
static std::pair< bool, bool > addSegmentsWithValNo(LiveRange &Dst, VNInfo *DstValNo, const LiveRange &Src, const VNInfo *SrcValNo)
Copy segments with value number SrcValNo from liverange Src to live range @Dst and use value number D...
static bool isLiveThrough(const LiveQueryResult Q)
static bool isTerminalReg(Register DstReg, const MachineInstr &Copy, const MachineRegisterInfo *MRI)
Check if DstReg is a terminal node.
static cl::opt< bool > VerifyCoalescing("verify-coalescing", cl::desc("Verify machine instrs before and after register coalescing"), cl::Hidden)
register Register static false bool isMoveInstr(const TargetRegisterInfo &tri, const MachineInstr *MI, Register &Src, Register &Dst, unsigned &SrcSub, unsigned &DstSub)
static cl::opt< bool > EnableJoinSplits("join-splitedges", cl::desc("Coalesce copies on split edges (default=subtarget)"), cl::Hidden)
Temporary flag to test critical edge unsplitting.
static cl::opt< bool > EnableJoining("join-liveintervals", cl::desc("Coalesce copies (default=true)"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > LargeIntervalFreqThreshold("large-interval-freq-threshold", cl::Hidden, cl::desc("For a large interval, if it is coalesced with other live " "intervals many times more than the threshold, stop its " "coalescing to control the compile time. "), cl::init(256))
static cl::opt< unsigned > LateRematUpdateThreshold("late-remat-update-threshold", cl::Hidden, cl::desc("During rematerialization for a copy, if the def instruction has " "many other copy uses to be rematerialized, delay the multiple " "separate live interval update work and do them all at once after " "all those rematerialization are done. It will save a lot of " "repeated work. "), cl::init(100))
static cl::opt< cl::boolOrDefault > EnableGlobalCopies("join-globalcopies", cl::desc("Coalesce copies that span blocks (default=subtarget)"), cl::init(cl::boolOrDefault::BOU_UNSET), cl::Hidden)
Temporary flag to test global copy optimization.
SI Optimize VGPR LiveRange
This file 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)
static DenseMap< Register, std::vector< std::pair< SlotIndex, MachineInstr * > > > buildVRegToDbgValueMap(MachineFunction &MF, const LiveIntervals *Liveness)
static void shrinkToUses(LiveInterval &LI, LiveIntervals &LIS)
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
bool test(unsigned Idx) const
Returns true if bit Idx is set.
Represents analyses that only rely on functions' control flow.
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.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
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...
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 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
bool containsOneValue() 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.
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.
unsigned pred_size() const
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.
unsigned succ_size() const
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
Analysis pass which computes a MachineDominatorTree.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool exposesReturnsTwice() const
exposesReturnsTwice - Returns true if the function calls setjmp or any other similar functions with a...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
DenseMap< unsigned, DebugPHIRegallocPos > DebugPHIPositions
Map of debug instruction numbers to the position of their PHI instructions during register allocation...
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
LLVM_ABI void setRegisterDefReadUndef(Register Reg, bool IsUndef=true)
Mark all subregister defs of register Reg with the undef flag.
bool isImplicitDef() const
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,...
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,...
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
LLVM_ABI void substituteRegister(Register FromReg, Register ToReg, unsigned SubIdx, const TargetRegisterInfo &RegInfo)
Replace all occurrences of FromReg with ToReg:SubIdx, properly composing subreg indices where necessa...
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
void setDebugLoc(DebugLoc DL)
Replace current source information with new such.
LLVM_ABI bool allDefsAreDead() const
Return true if all the defs of this instruction are dead.
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
LLVM_ABI void substVirtReg(Register Reg, unsigned SubIdx, const TargetRegisterInfo &)
substVirtReg - Substitute the current register with the virtual subregister Reg:SubReg.
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setIsDead(bool Val=true)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
LLVM_ABI void substPhysReg(MCRegister Reg, const TargetRegisterInfo &)
substPhysReg - Substitute the current register with the physical register Reg, taking any existing Su...
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
LLVM_ABI bool recomputeRegClass(Register Reg)
recomputeRegClass - Try to find a legal super-class of Reg's register class that still satisfies the ...
reg_instr_iterator reg_instr_begin(Register RegNo) const
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI void clearKillFlags(Register Reg) const
clearKillFlags - Iterate over all the uses of the given register and clear the kill flag from the Mac...
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
static reg_instr_iterator reg_instr_end()
bool use_nodbg_empty(Register RegNo) const
use_nodbg_empty - Return true if there are no non-Debug instructions using the specified register.
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
bool reg_nodbg_empty(Register RegNo) const
reg_nodbg_empty - Return true if the only instructions using or defining Reg are Debug instructions.
use_instr_nodbg_iterator use_instr_nodbg_begin(Register RegNo) const
bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const
Returns true if liveness for register class RC should be tracked at the subregister level.
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
LLVM_ABI LaneBitmask getMaxLaneMaskForVReg(Register Reg) const
Returns a mask covering all bits that can appear in lane masks of subregisters of the virtual registe...
LLVM_ABI bool isConstantPhysReg(MCRegister PhysReg) const
Returns true if PhysReg is unallocatable and constant throughout the function.
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
defusechain_instr_iterator< true, true, false, true > reg_instr_iterator
reg_instr_iterator/reg_instr_begin/reg_instr_end - Walk all defs and uses of the specified register,...
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
iterator_range< use_iterator > use_operands(Register Reg) const
iterator_range< reg_instr_nodbg_iterator > reg_nodbg_instructions(Register Reg) const
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
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.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SlotIndex - An opaque wrapper around machine indexes.
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.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
SlotIndex getMBBEndIdx(unsigned Num) const
Returns the index past the last valid index in the given basic block.
SlotIndex getNextNonNullIndex(SlotIndex Index)
Returns the next non-null index, if one exists.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
SlotIndex getMBBStartIdx(unsigned Num) const
Returns the first index in the given basic block number.
SlotIndex getIndexBefore(const MachineInstr &MI) const
getIndexBefore - Returns the index of the last indexed instruction before MI, or the start index of i...
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
static const unsigned CommuteAnyOperandIndex
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual bool enableJoinGlobalCopies() const
True if the subtarget should enable joining global copies.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
VNInfo - Value Number Information.
void markUnused()
Mark this value as unused.
BumpPtrAllocator Allocator
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
static LLVM_ABI bool allUsesAvailableAt(const MachineInstr *MI, SlotIndex UseIdx, const LiveIntervals &LIS, const MachineRegisterInfo &MRI, const TargetInstrInfo &TII)
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
self_iterator getIterator()
#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.
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
NodeAddr< DefNode * > Def
UseMask
Specifies the way the mask should be analyzed for undefs/poisonous elements in the shuffle mask.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI char & RegisterCoalescerID
RegisterCoalescer - This pass merges live ranges to eliminate copies.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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...
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
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)
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
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.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
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.
DWARFExpression::Operation Op
auto make_second_range(ContainerTy &&c)
Given a container of pairs, return a range over the second elements.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI void eraseInstrs(ArrayRef< MachineInstr * > DeadInstrs, MachineRegisterInfo &MRI, LostDebugLocObserver *LocObserver=nullptr)
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
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
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static constexpr LaneBitmask getLane(unsigned Lane)
static constexpr LaneBitmask getAll()
constexpr bool any() const
static constexpr LaneBitmask getNone()
Remat - Information needed to rematerialize at a specific location.
This represents a simple continuous liveness interval for a value.