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;
168 bool ShrinkMainRange =
false;
172 bool JoinGlobalCopies =
false;
176 bool JoinSplitEdges =
false;
179 SmallVector<MachineInstr *, 8> WorkList;
180 SmallVector<MachineInstr *, 8> LocalWorkList;
184 SmallPtrSet<MachineInstr *, 8> ErasedInstrs;
187 SmallVector<MachineInstr *, 8> DeadDefs;
195 DenseSet<Register> ToBeUpdated;
199 DenseMap<Register, unsigned long> LargeLIVisitCounter;
202 void eliminateDeadDefs(LiveRangeEdit *Edit =
nullptr);
205 void LRE_WillEraseInstruction(MachineInstr *
MI)
override;
208 void coalesceLocals();
211 void joinAllIntervals();
215 void copyCoalesceInMBB(MachineBasicBlock *
MBB);
226 void lateLiveIntervalUpdate();
231 bool copyValueUndefInPredecessors(
LiveRange &S,
const MachineBasicBlock *
MBB,
232 LiveQueryResult SLRQ);
236 void setUndefOnPrunedSubRegUses(LiveInterval &LI,
Register Reg,
237 LaneBitmask PrunedLanes);
244 enum class JoinResult { Joined, Deferred, Rejected };
248 JoinResult joinCopy(MachineInstr *CopyMI,
249 SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs);
255 JoinResult joinIntervals(CoalescerPair &CP);
258 JoinResult joinVirtRegs(CoalescerPair &CP);
263 bool isHighCostLiveInterval(LiveInterval &LI);
266 bool joinReservedPhysReg(CoalescerPair &CP);
273 void mergeSubRangeInto(LiveInterval &LI,
const LiveRange &ToMerge,
274 LaneBitmask LaneMask, CoalescerPair &CP,
280 LaneBitmask LaneMask,
const CoalescerPair &CP);
286 bool adjustCopiesBackFrom(
const CoalescerPair &CP, MachineInstr *CopyMI);
290 bool hasOtherReachingDefs(LiveInterval &IntA, LiveInterval &IntB,
291 VNInfo *AValNo, VNInfo *BValNo);
301 std::pair<bool, bool> removeCopyByCommutingDef(
const CoalescerPair &CP,
302 MachineInstr *CopyMI);
305 bool removePartialRedundancy(
const CoalescerPair &CP, MachineInstr &CopyMI);
309 bool reMaterializeDef(
const CoalescerPair &CP, MachineInstr *CopyMI,
313 bool canJoinPhys(
const CoalescerPair &CP);
324 void updatePrunedSubRanges(LiveInterval &LI);
333 void addUndefFlag(
const LiveInterval &
Int, SlotIndex UseIdx,
334 MachineOperand &MO,
unsigned SubRegIdx);
340 MachineInstr *eliminateUndefCopy(MachineInstr *CopyMI);
354 bool applyTerminalRule(
const MachineInstr &Copy)
const;
360 SmallVectorImpl<MachineInstr *> *
Dead =
nullptr) {
362 if (LIS->shrinkToUses(LI,
Dead)) {
366 LIS->splitSeparateComponents(*LI, SplitLIs);
374 void deleteInstr(MachineInstr *
MI) {
375 ErasedInstrs.insert(
MI);
376 LIS->RemoveMachineInstrFromMaps(*
MI);
377 MI->eraseFromParent();
386 void checkMergingChangesDbgValues(CoalescerPair &CP,
LiveRange &
LHS,
395 RegisterCoalescer() =
default;
396 RegisterCoalescer &operator=(RegisterCoalescer &&
Other) =
default;
398 RegisterCoalescer(LiveIntervals *LIS, SlotIndexes *SI,
399 const MachineLoopInfo *Loops,
400 const RegisterClassInfo *RegClassInfo)
401 : LIS(LIS), SI(SI), Loops(Loops), RegClassInfo(RegClassInfo) {}
410 RegisterCoalescerLegacy() : MachineFunctionPass(ID) {}
412 void getAnalysisUsage(AnalysisUsage &AU)
const override;
414 MachineFunctionProperties getClearedProperties()
const override {
415 return MachineFunctionProperties().setIsSSA();
424char RegisterCoalescerLegacy::ID = 0;
429 "Register Coalescer",
false,
false)
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();
463 if (
MBB->pred_size() != 1 ||
MBB->succ_size() != 1)
466 for (
const auto &
MI : *
MBB) {
467 if (!
MI.isCopyLike() && !
MI.isUnconditionalBranch())
477 Flipped = CrossClass =
false;
480 unsigned SrcSub = 0, DstSub = 0;
483 Partial = SrcSub || DstSub;
486 if (Src.isPhysical()) {
487 if (Dst.isPhysical())
497 if (Dst.isPhysical()) {
500 Dst = TRI.getSubReg(Dst, DstSub);
508 Dst = TRI.getMatchingSuperReg(Dst, SrcSub, SrcRC);
519 if (SrcSub && DstSub) {
521 if (Src == Dst && SrcSub != DstSub)
524 NewRC = TRI.getCommonSuperRegClass(SrcRC, SrcSub, DstRC, DstSub, SrcIdx,
531 NewRC = TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
535 NewRC = TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSub);
538 NewRC = TRI.getCommonSubClass(DstRC, SrcRC);
547 if (DstIdx && !SrcIdx) {
553 CrossClass = NewRC != DstRC || NewRC != SrcRC;
556 assert(Src.isVirtual() &&
"Src must be virtual");
557 assert(!(Dst.isPhysical() && DstSub) &&
"Cannot have a physical SubIdx");
564 if (DstReg.isPhysical())
576 unsigned SrcSub = 0, DstSub = 0;
584 }
else if (Src != SrcReg) {
589 if (DstReg.isPhysical()) {
590 if (!Dst.isPhysical())
592 assert(!DstIdx && !SrcIdx &&
"Inconsistent CoalescerPair state.");
595 Dst = TRI.getSubReg(Dst, DstSub);
598 return DstReg == Dst;
600 return Register(TRI.getSubReg(DstReg, SrcSub)) == Dst;
607 return TRI.composeSubRegIndices(SrcIdx, SrcSub) ==
608 TRI.composeSubRegIndices(DstIdx, DstSub);
611void RegisterCoalescerLegacy::getAnalysisUsage(
AnalysisUsage &AU)
const {
622void RegisterCoalescer::eliminateDeadDefs(
LiveRangeEdit *Edit) {
632void RegisterCoalescer::LRE_WillEraseInstruction(
MachineInstr *
MI) {
637bool RegisterCoalescer::adjustCopiesBackFrom(
const CoalescerPair &CP,
640 assert(!CP.
isPhys() &&
"This doesn't work for physreg copies.");
665 if (BS == IntB.
end())
667 VNInfo *BValNo = BS->valno;
672 if (BValNo->
def != CopyIdx)
679 if (AS == IntA.
end())
681 VNInfo *AValNo = AS->valno;
693 if (ValS == IntB.
end())
711 SlotIndex FillerStart = ValS->end, FillerEnd = BS->start;
715 BValNo->
def = FillerStart;
723 if (BValNo != ValS->valno)
732 S.removeSegment(*SS,
true);
736 if (!S.getVNInfoAt(FillerStart)) {
739 S.extendInBlock(BBStart, FillerStart);
741 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
744 if (SubBValNo != SubValSNo)
745 S.MergeValueNumberInto(SubBValNo, SubValSNo);
762 bool RecomputeLiveRange = AS->end == CopyIdx;
763 if (!RecomputeLiveRange) {
766 if (SS != S.end() &&
SS->end == CopyIdx) {
767 RecomputeLiveRange =
true;
772 if (RecomputeLiveRange)
779bool RegisterCoalescer::hasOtherReachingDefs(
LiveInterval &IntA,
788 if (ASeg.
valno != AValNo)
791 if (BI != IntB.
begin())
793 for (; BI != IntB.
end() && ASeg.
end >= BI->start; ++BI) {
794 if (BI->valno == BValNo)
796 if (BI->start <= ASeg.
start && BI->end > ASeg.
start)
798 if (BI->start > ASeg.
start && BI->start < ASeg.
end)
812 bool MergedWithDead =
false;
814 if (S.
valno != SrcValNo)
825 MergedWithDead =
true;
828 return std::make_pair(
Changed, MergedWithDead);
832RegisterCoalescer::removeCopyByCommutingDef(
const CoalescerPair &CP,
865 assert(BValNo !=
nullptr && BValNo->
def == CopyIdx);
871 return {
false,
false};
874 return {
false,
false};
876 return {
false,
false};
883 return {
false,
false};
889 return DefMO.getReg() == IntA.reg() && !DefMO.getSubReg();
891 return {
false,
false};
903 if (!
TII->findCommutedOpIndices(*
DefMI, UseOpIdx, NewDstIdx))
904 return {
false,
false};
909 return {
false,
false};
913 if (hasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
914 return {
false,
false};
924 if (US == IntA.
end() || US->valno != AValNo)
928 return {
false,
false};
938 TII->commuteInstruction(*
DefMI,
false, UseOpIdx, NewDstIdx);
940 return {
false,
false};
943 return {
false,
false};
944 if (NewMI !=
DefMI) {
969 UseMO.setReg(NewReg);
974 assert(US != IntA.
end() &&
"Use must be live");
975 if (US->valno != AValNo)
978 UseMO.setIsKill(
false);
980 UseMO.substPhysReg(NewReg, *
TRI);
982 UseMO.setReg(NewReg);
1001 VNInfo *SubDVNI = S.getVNInfoAt(DefIdx);
1004 VNInfo *SubBValNo = S.getVNInfoAt(CopyIdx);
1006 S.MergeValueNumberInto(SubDVNI, SubBValNo);
1014 bool ShrinkB =
false;
1028 VNInfo *ASubValNo = SA.getVNInfoAt(AIdx);
1037 MaskA |= SA.LaneMask;
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;
1049 BSubValNo->def = ASubValNo->def;
1057 if ((SB.LaneMask & MaskA).any())
1061 SB.removeSegment(*S,
true);
1065 BValNo->
def = AValNo->
def;
1067 ShrinkB |=
P.second;
1074 return {
true, ShrinkB};
1124bool RegisterCoalescer::removePartialRedundancy(
const CoalescerPair &CP,
1157 bool FoundReverseCopy =
false;
1176 bool ValB_Changed =
false;
1177 for (
auto *VNI : IntB.
valnos) {
1178 if (VNI->isUnused())
1181 ValB_Changed =
true;
1189 FoundReverseCopy =
true;
1193 if (!FoundReverseCopy)
1203 if (CopyLeftBB && CopyLeftBB->
succ_size() > 1)
1214 if (InsPos != CopyLeftBB->
end()) {
1220 LLVM_DEBUG(
dbgs() <<
"\tremovePartialRedundancy: Move the copy to "
1225 TII->get(TargetOpcode::COPY), IntB.
reg())
1236 ErasedInstrs.
erase(NewCopyMI);
1238 LLVM_DEBUG(
dbgs() <<
"\tremovePartialRedundancy: Remove the copy from "
1249 deleteInstr(&CopyMI);
1265 if (!IntB.
liveAt(UseIdx))
1266 MO.setIsUndef(
true);
1276 VNInfo *BValNo = SR.Query(CopyIdx).valueOutOrDead();
1277 assert(BValNo &&
"All sublanes should be live");
1286 for (
unsigned I = 0;
I != EndPoints.
size();) {
1288 EndPoints[
I] = EndPoints.
back();
1307bool RegisterCoalescer::reMaterializeDef(
const CoalescerPair &CP,
1335 if (!
TII->isReMaterializable(*
DefMI))
1338 bool SawStore =
false;
1342 if (
MCID.getNumDefs() != 1)
1350 if (SrcIdx && DstIdx)
1366 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
1385 unsigned NewDstIdx =
TRI->composeSubRegIndices(CP.
getSrcIdx(), DefSubIdx);
1387 NewDstReg =
TRI->getSubReg(DstReg, NewDstIdx);
1397 "Only expect to deal with virtual or physical registers");
1411 LiveRangeEdit Edit(&SrcInt, NewRegs, *MF, *LIS,
nullptr,
this);
1426 "Shouldn't have SrcIdx+DstIdx at this point");
1429 TRI->getCommonSubClass(DefRC, DstRC);
1430 if (CommonRC !=
nullptr) {
1438 if (MO.isReg() && MO.getReg() == DstReg && MO.getSubReg() == DstIdx) {
1460 "No explicit operands after implicit operands.");
1463 "unexpected implicit virtual register def");
1469 ErasedInstrs.
insert(CopyMI);
1493 ((
TRI->getSubReg(MO.
getReg(), DefSubIdx) ==
1507 "subrange update for implicit-def of super register may not be "
1508 "properly handled");
1516 if (DefRC !=
nullptr) {
1518 NewRC =
TRI->getMatchingSuperRegClass(NewRC, DefRC, NewIdx);
1520 NewRC =
TRI->getCommonSubClass(NewRC, DefRC);
1521 assert(NewRC &&
"subreg chosen for remat incompatible with instruction");
1527 SR.LaneMask =
TRI->composeSubRegIndexLaneMask(DstIdx, SR.LaneMask);
1532 updateRegDefsUses(DstReg, DstReg, DstIdx);
1581 if (!SR.liveAt(DefIndex))
1582 SR.createDeadDef(DefIndex,
Alloc);
1583 MaxMask &= ~SR.LaneMask;
1585 if (MaxMask.
any()) {
1603 bool UpdatedSubRanges =
false;
1618 if (!SR.
liveAt(DefIndex))
1624 if ((SR.
LaneMask & DstMask).none()) {
1626 <<
"Removing undefined SubRange "
1639 UpdatedSubRanges =
true;
1642 if (UpdatedSubRanges)
1649 "Only expect virtual or physical registers in remat");
1658 bool HasDefMatchingCopy =
false;
1659 for (
auto [OpIndex,
Reg] : NewMIImplDefs) {
1665 if (DstReg != CopyDstReg)
1668 HasDefMatchingCopy =
true;
1672 if (!HasDefMatchingCopy)
1674 CopyDstReg,
true ,
true ,
false ));
1722 UseMO.substPhysReg(DstReg, *
TRI);
1724 UseMO.setReg(DstReg);
1733 if (ToBeUpdated.
count(SrcReg))
1736 unsigned NumCopyUses = 0;
1738 if (UseMO.getParent()->isCopyLike())
1744 if (!DeadDefs.
empty())
1745 eliminateDeadDefs(&Edit);
1747 ToBeUpdated.
insert(SrcReg);
1765 unsigned SrcSubIdx = 0, DstSubIdx = 0;
1766 if (!
isMoveInstr(*
TRI, CopyMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx))
1775 if ((SR.
LaneMask & SrcMask).none())
1780 }
else if (SrcLI.
liveAt(Idx))
1788 assert(Seg !=
nullptr &&
"No segment for defining instruction");
1793 if (((V &&
V->isPHIDef()) || (!V && !DstLI.
liveAt(Idx)))) {
1801 CopyMI->
getOpcode() == TargetOpcode::SUBREG_TO_REG);
1806 CopyMI->
setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
1823 if ((SR.
LaneMask & DstMask).none())
1847 if ((SR.
LaneMask & UseMask).none())
1855 isLive = DstLI.
liveAt(UseIdx);
1868 if (MO.
getReg() == DstReg)
1880 bool IsUndef =
true;
1882 if ((S.LaneMask & Mask).none())
1884 if (S.liveAt(UseIdx)) {
1897 ShrinkMainRange =
true;
1906 if (DstInt && DstReg != SrcReg) {
1912 if (SubReg == 0 && MO.
isDef())
1918 addUndefFlag(*DstInt, UseIdx, MO, SubReg);
1919 }
else if (MO.
isUse() && SubReg == 0 && !DstInt->
liveAt(UseIdx)) {
1941 if (SrcReg == DstReg && !Visited.
insert(
UseMI).second)
1954 for (
unsigned Op :
Ops) {
1960 if (SubIdx && MO.
isDef())
1966 unsigned SubUseIdx =
TRI->composeSubRegIndices(SubIdx, MO.
getSubReg());
1984 addUndefFlag(*DstInt, UseIdx, MO, SubUseIdx);
1995 dbgs() <<
"\t\tupdated: ";
2003bool RegisterCoalescer::canJoinPhys(
const CoalescerPair &CP) {
2008 LLVM_DEBUG(
dbgs() <<
"\tCan only merge into reserved registers.\n");
2017 dbgs() <<
"\tCannot join complex intervals into reserved register.\n");
2021bool RegisterCoalescer::copyValueUndefInPredecessors(
2035void RegisterCoalescer::setUndefOnPrunedSubRegUses(
LiveInterval &LI,
2042 if (SubRegIdx == 0 || MO.
isUndef())
2048 if (!S.
liveAt(Pos) && (PrunedLanes & SubRegMask).any()) {
2064void RegisterCoalescer::updatePrunedSubRanges(
LiveInterval &LI) {
2067 for (
auto [Mask, Idx] : PHIKills) {
2068 if ((Mask & S.LaneMask).any() && LI.
liveAt(
Idx.getPrevSlot()))
2072 if (!EndPoints.
empty()) {
2079 if ((S.LaneMask & ShrinkMask).none())
2085 ShrinkMainRange =
true;
2091RegisterCoalescer::JoinResult RegisterCoalescer::joinCopy(
2099 return JoinResult::Rejected;
2105 <<
"are available for allocation\n");
2106 return JoinResult::Rejected;
2117 if (!
TRI->shouldCoalesce(CopyMI, SrcRC, SrcIdx, DstRC, DstIdx,
2120 return JoinResult::Rejected;
2130 eliminateDeadDefs();
2131 return JoinResult::Joined;
2137 if (
MachineInstr *UndefMI = eliminateUndefCopy(CopyMI)) {
2138 if (UndefMI->isImplicitDef())
2139 return JoinResult::Rejected;
2140 deleteInstr(CopyMI);
2141 return JoinResult::Rejected;
2150 LLVM_DEBUG(
dbgs() <<
"\tCopy already coalesced: " << LI <<
'\n');
2155 assert(ReadVNI &&
"No value before copy and no <undef> flag.");
2156 assert(ReadVNI != DefVNI &&
"Cannot read and define the same value.");
2171 if (copyValueUndefInPredecessors(S,
MBB, SLRQ)) {
2172 LLVM_DEBUG(
dbgs() <<
"Incoming sublane value is undef at copy\n");
2173 PrunedLanes |= S.LaneMask;
2180 if (PrunedLanes.
any()) {
2181 LLVM_DEBUG(
dbgs() <<
"Pruning undef incoming lanes: " << PrunedLanes
2183 setUndefOnPrunedSubRegUses(LI, CP.
getSrcReg(), PrunedLanes);
2188 deleteInstr(CopyMI);
2189 return JoinResult::Joined;
2197 if (!canJoinPhys(CP)) {
2200 bool IsDefCopy =
false;
2201 if (reMaterializeDef(CP, CopyMI, IsDefCopy))
2202 return JoinResult::Joined;
2204 return JoinResult::Deferred;
2205 return JoinResult::Rejected;
2214 dbgs() <<
"\tConsidering merging to "
2215 <<
TRI->getRegClassName(CP.
getNewRC()) <<
" with ";
2228 ShrinkMainRange =
false;
2235 JoinResult
Result = joinIntervals(CP);
2236 if (Result != JoinResult::Joined) {
2240 bool IsDefCopy =
false;
2241 if (reMaterializeDef(CP, CopyMI, IsDefCopy))
2242 return JoinResult::Joined;
2247 bool Changed = adjustCopiesBackFrom(CP, CopyMI);
2248 bool Shrink =
false;
2250 std::tie(
Changed, Shrink) = removeCopyByCommutingDef(CP, CopyMI);
2252 deleteInstr(CopyMI);
2260 return JoinResult::Joined;
2267 if (removePartialRedundancy(CP, *CopyMI))
2268 return JoinResult::Joined;
2275 if (Result == JoinResult::Deferred)
2295 if (ErasedInstrs.
erase(CopyMI))
2297 CurrentErasedInstrs.
insert(CopyMI);
2305 if (ShrinkMask.
any() || !PHIKills.empty())
2324 dbgs() <<
"\tResult = ";
2333 return JoinResult::Joined;
2336bool RegisterCoalescer::joinReservedPhysReg(
CoalescerPair &CP) {
2344 assert(
RHS.containsOneValue() &&
"Invalid join with reserved register");
2354 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
2370 !RegMaskUsable.
test(DstReg.
id())) {
2392 deleteInstr(CopyMI);
2414 bool IsEarlyClobber =
2425 if (
MI.isDebugInstr())
2427 if (
MI.readsRegister(DstReg,
TRI)) {
2437 <<
printReg(DstReg,
TRI) <<
" at " << CopyRegIdx <<
"\n");
2440 deleteInstr(CopyMI);
2443 for (MCRegUnit Unit :
TRI->regunits(DstReg)) {
2535 const unsigned SubIdx;
2539 const LaneBitmask LaneMask;
2543 const bool SubRangeJoin;
2546 const bool TrackSubRegLiveness;
2549 SmallVectorImpl<VNInfo *> &NewVNInfo;
2551 const CoalescerPair &CP;
2553 SlotIndexes *Indexes;
2554 const TargetRegisterInfo *
TRI;
2558 SmallVector<int, 8> Assignments;
2562 enum ConflictResolution {
2594 ConflictResolution Resolution = CR_Keep;
2597 LaneBitmask WriteLanes;
2601 LaneBitmask ValidLanes;
2604 VNInfo *RedefVNI =
nullptr;
2607 VNInfo *OtherVNI =
nullptr;
2620 bool ErasableImplicitDef =
false;
2624 bool Pruned =
false;
2627 bool PrunedComputed =
false;
2634 bool Identical =
false;
2638 bool isAnalyzed()
const {
return WriteLanes.
any(); }
2642 void mustKeepImplicitDef(
const TargetRegisterInfo &
TRI,
2643 const MachineInstr &ImpDef) {
2645 ErasableImplicitDef =
false;
2657 LaneBitmask computeWriteLanes(
const MachineInstr *
DefMI,
bool &Redef)
const;
2660 std::pair<const VNInfo *, Register> followCopyChain(
const VNInfo *VNI)
const;
2662 bool valuesIdentical(VNInfo *Value0, VNInfo *Value1,
2663 const JoinVals &
Other)
const;
2672 ConflictResolution analyzeValue(
unsigned ValNo, JoinVals &
Other);
2677 void computeAssignment(
unsigned ValNo, JoinVals &
Other);
2695 taintExtent(
unsigned ValNo, LaneBitmask TaintedLanes, JoinVals &
Other,
2696 SmallVectorImpl<std::pair<SlotIndex, LaneBitmask>> &TaintExtent);
2700 bool usesLanes(
const MachineInstr &
MI,
Register,
unsigned, LaneBitmask)
const;
2708 bool isPrunedValue(
unsigned ValNo, JoinVals &
Other);
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()) {}
2723 bool mapValues(JoinVals &
Other);
2727 bool resolveConflicts(JoinVals &
Other);
2732 void pruneValues(JoinVals &
Other, SmallVectorImpl<SlotIndex> &EndPoints,
2738 void pruneSubRegValues(
2739 LiveInterval &LI, LaneBitmask &ShrinkMask,
2740 SmallVectorImpl<std::pair<LaneBitmask, SlotIndex>> &PHIKills);
2749 void pruneMainSegments(LiveInterval &LI,
bool &ShrinkMainRange);
2755 void eraseInstrs(SmallPtrSetImpl<MachineInstr *> &ErasedInstrs,
2756 SmallVectorImpl<Register> &ShrinkRegs,
2757 LiveInterval *LI =
nullptr);
2760 void removeImplicitDefs();
2763 const int *getAssignments()
const {
return Assignments.
data(); }
2766 ConflictResolution getResolution(
unsigned Num)
const {
2767 return Vals[Num].Resolution;
2774 bool &Redef)
const {
2779 L |=
TRI->getSubRegIndexLaneMask(
2787std::pair<const VNInfo *, Register>
2788JoinVals::followCopyChain(
const VNInfo *VNI)
const {
2794 assert(
MI &&
"No defining instruction");
2795 if (!
MI->isFullCopy())
2796 return std::make_pair(VNI, TrackReg);
2797 Register SrcReg =
MI->getOperand(1).getReg();
2799 return std::make_pair(VNI, TrackReg);
2813 LaneBitmask SMask =
TRI->composeSubRegIndexLaneMask(SubIdx, S.LaneMask);
2814 if ((SMask & LaneMask).
none())
2822 return std::make_pair(VNI, TrackReg);
2825 if (ValueIn ==
nullptr) {
2832 return std::make_pair(
nullptr, SrcReg);
2837 return std::make_pair(VNI, TrackReg);
2840bool JoinVals::valuesIdentical(
VNInfo *Value0,
VNInfo *Value1,
2841 const JoinVals &
Other)
const {
2844 std::tie(Orig0, Reg0) = followCopyChain(Value0);
2845 if (Orig0 == Value1 && Reg0 ==
Other.Reg)
2850 std::tie(Orig1, Reg1) =
Other.followCopyChain(Value1);
2854 if (Orig0 ==
nullptr || Orig1 ==
nullptr)
2855 return Orig0 == Orig1 && Reg0 == Reg1;
2861 return Orig0->
def == Orig1->
def && Reg0 == Reg1;
2864JoinVals::ConflictResolution JoinVals::analyzeValue(
unsigned ValNo,
2866 Val &
V = Vals[ValNo];
2867 assert(!
V.isAnalyzed() &&
"Value has already been analyzed!");
2879 :
TRI->getSubRegIndexLaneMask(SubIdx);
2880 V.ValidLanes =
V.WriteLanes = Lanes;
2889 V.ErasableImplicitDef =
true;
2893 V.ValidLanes =
V.WriteLanes = computeWriteLanes(
DefMI, Redef);
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;
2928 V.ErasableImplicitDef =
true;
2945 if (OtherVNI->
def < VNI->
def)
2946 Other.computeAssignment(OtherVNI->
id, *
this);
2951 return CR_Impossible;
2953 V.OtherVNI = OtherVNI;
2954 Val &OtherV =
Other.Vals[OtherVNI->
id];
2958 if (!OtherV.isAnalyzed() ||
Other.Assignments[OtherVNI->
id] == -1)
2965 if ((
V.ValidLanes & OtherV.ValidLanes).any())
2967 return CR_Impossible;
2981 Other.computeAssignment(
V.OtherVNI->id, *
this);
2982 Val &OtherV =
Other.Vals[
V.OtherVNI->id];
2984 if (OtherV.ErasableImplicitDef) {
3004 <<
", keeping it.\n");
3005 OtherV.mustKeepImplicitDef(*
TRI, *OtherImpDef);
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);
3017 OtherV.ValidLanes &= ~OtherV.WriteLanes;
3035 V.ValidLanes &= ~V.WriteLanes | OtherV.ValidLanes;
3050 valuesIdentical(VNI,
V.OtherVNI,
Other)) {
3073 if ((
V.WriteLanes & OtherV.ValidLanes).none())
3086 "Only early clobber defs can overlap a kill");
3087 return CR_Impossible;
3094 if ((
TRI->getSubRegIndexLaneMask(
Other.SubIdx) & ~
V.WriteLanes).none())
3095 return CR_Impossible;
3097 if (TrackSubRegLiveness) {
3102 if (!OtherLI.hasSubRanges()) {
3104 return (OtherMask &
V.WriteLanes).none() ? CR_Replace : CR_Impossible;
3112 TRI->composeSubRegIndexLaneMask(
Other.SubIdx, OtherSR.LaneMask);
3113 if ((OtherMask &
V.WriteLanes).none())
3116 auto OtherSRQ = OtherSR.Query(VNI->
def);
3117 if (OtherSRQ.valueIn() && OtherSRQ.endPoint() > VNI->
def) {
3119 return CR_Impossible;
3132 return CR_Impossible;
3141 return CR_Unresolved;
3144void JoinVals::computeAssignment(
unsigned ValNo, JoinVals &
Other) {
3145 Val &
V = Vals[ValNo];
3146 if (
V.isAnalyzed()) {
3149 assert(Assignments[ValNo] != -1 &&
"Bad recursion?");
3152 switch ((
V.Resolution = analyzeValue(ValNo,
Other))) {
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];
3162 <<
V.OtherVNI->def <<
" --> @"
3163 << NewVNInfo[Assignments[ValNo]]->def <<
'\n');
3166 case CR_Unresolved: {
3168 assert(
V.OtherVNI &&
"OtherVNI not assigned, can't prune");
3169 Val &OtherV =
Other.Vals[
V.OtherVNI->id];
3170 OtherV.Pruned =
true;
3175 Assignments[ValNo] = NewVNInfo.
size();
3181bool JoinVals::mapValues(JoinVals &
Other) {
3183 computeAssignment(i,
Other);
3184 if (Vals[i].Resolution == CR_Impossible) {
3193bool JoinVals::taintExtent(
3202 assert(OtherI !=
Other.LR.end() &&
"No conflict?");
3207 if (
End >= MBBEnd) {
3209 << OtherI->valno->id <<
'@' << OtherI->start <<
'\n');
3213 << OtherI->valno->id <<
'@' << OtherI->start <<
" to "
3218 TaintExtent.push_back(std::make_pair(
End, TaintedLanes));
3221 if (++OtherI ==
Other.LR.end() || OtherI->start >= MBBEnd)
3225 const Val &OV =
Other.Vals[OtherI->valno->id];
3226 TaintedLanes &= ~OV.WriteLanes;
3229 }
while (TaintedLanes.
any());
3235 if (
MI.isDebugOrPseudoInstr())
3242 unsigned S =
TRI->composeSubRegIndices(SubIdx, MO.
getSubReg());
3243 if ((Lanes &
TRI->getSubRegIndexLaneMask(S)).any())
3249bool JoinVals::resolveConflicts(JoinVals &
Other) {
3252 assert(
V.Resolution != CR_Impossible &&
"Unresolvable conflict");
3253 if (
V.Resolution != CR_Unresolved)
3262 assert(
V.OtherVNI &&
"Inconsistent conflict resolution.");
3264 const Val &OtherV =
Other.Vals[
V.OtherVNI->id];
3269 LaneBitmask TaintedLanes =
V.WriteLanes & OtherV.ValidLanes;
3271 if (!taintExtent(i, TaintedLanes,
Other, TaintExtent))
3275 assert(!TaintExtent.
empty() &&
"There should be at least one conflict.");
3288 "Interference ends on VNI->def. Should have been handled earlier");
3291 assert(LastMI &&
"Range must end at a proper instruction");
3292 unsigned TaintNum = 0;
3295 if (usesLanes(*
MI,
Other.Reg,
Other.SubIdx, TaintedLanes)) {
3300 if (&*
MI == LastMI) {
3301 if (++TaintNum == TaintExtent.
size())
3304 assert(LastMI &&
"Range must end at a proper instruction");
3305 TaintedLanes = TaintExtent[TaintNum].second;
3311 V.Resolution = CR_Replace;
3317bool JoinVals::isPrunedValue(
unsigned ValNo, JoinVals &
Other) {
3318 Val &
V = Vals[ValNo];
3319 if (
V.Pruned ||
V.PrunedComputed)
3322 if (
V.Resolution != CR_Erase &&
V.Resolution != CR_Merge)
3327 V.PrunedComputed =
true;
3328 V.Pruned =
Other.isPrunedValue(
V.OtherVNI->id, *
this);
3332void JoinVals::pruneValues(JoinVals &
Other,
3334 bool changeInstrs) {
3337 switch (Vals[i].Resolution) {
3347 Val &OtherV =
Other.Vals[Vals[i].OtherVNI->id];
3349 OtherV.ErasableImplicitDef && OtherV.Resolution == CR_Keep;
3350 if (!
Def.isBlock()) {
3370 <<
": " <<
Other.LR <<
'\n');
3375 if (isPrunedValue(i,
Other)) {
3380 Val &OtherV =
Other.Vals[Vals[i].OtherVNI->id];
3382 OtherV.ErasableImplicitDef && OtherV.Resolution == CR_Keep;
3385 LIS->
pruneValue(LR, Def, EraseImpDef ?
nullptr : &EndPoints);
3387 << Def <<
": " << LR <<
'\n');
3403 if (
PHI->isUnused() || !
PHI->isPHIDef())
3460void JoinVals::pruneSubRegValues(
3464 bool DidPrune =
false;
3469 if (
V.Resolution != CR_Erase &&
3470 (
V.Resolution != CR_Keep || !
V.ErasableImplicitDef || !
V.Pruned))
3477 OtherDef =
V.OtherVNI->def;
3480 LLVM_DEBUG(
dbgs() <<
"\t\tExpecting instruction removal at " << Def
3488 if (ValueOut !=
nullptr &&
3490 (
V.Identical &&
V.Resolution == CR_Erase && ValueOut->
def == Def))) {
3492 <<
" at " << Def <<
"\n");
3499 if (ValueOut->
def == Def)
3502 if (
V.Identical && S.Query(OtherDef).valueOutOrDead()) {
3509 PHIKills.emplace_back(S.LaneMask,
Kill);
3515 ShrinkMask |= S.LaneMask;
3529 ShrinkMask |= S.LaneMask;
3541 if (VNI->
def == Def)
3547void JoinVals::pruneMainSegments(
LiveInterval &LI,
bool &ShrinkMainRange) {
3551 if (Vals[i].Resolution != CR_Keep)
3556 Vals[i].Pruned =
true;
3557 ShrinkMainRange =
true;
3561void JoinVals::removeImplicitDefs() {
3564 if (
V.Resolution != CR_Keep || !
V.ErasableImplicitDef || !
V.Pruned)
3580 switch (Vals[i].Resolution) {
3585 if (!Vals[i].ErasableImplicitDef || !Vals[i].Pruned)
3597 if (LI !=
nullptr) {
3622 ED = ED.
isValid() ? std::min(ED,
I->start) :
I->start;
3624 LE =
LE.isValid() ? std::max(LE,
I->end) :
I->
end;
3627 NewEnd = std::min(NewEnd, LE);
3629 NewEnd = std::min(NewEnd, ED);
3635 if (S != LR.
begin())
3636 std::prev(S)->end = NewEnd;
3640 dbgs() <<
"\t\tremoved " << i <<
'@' <<
Def <<
": " << LR <<
'\n';
3642 dbgs() <<
"\t\t LHS = " << *LI <<
'\n';
3649 assert(
MI &&
"No instruction to erase");
3658 MI->eraseFromParent();
3672 CP, LIS,
TRI,
true,
true);
3674 CP, LIS,
TRI,
true,
true);
3681 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals)) {
3686 if (!LHSVals.resolveConflicts(RHSVals) ||
3687 !RHSVals.resolveConflicts(LHSVals)) {
3698 LHSVals.pruneValues(RHSVals, EndPoints,
false);
3699 RHSVals.pruneValues(LHSVals, EndPoints,
false);
3701 LHSVals.removeImplicitDefs();
3702 RHSVals.removeImplicitDefs();
3707 LRange.
join(RRange, LHSVals.getAssignments(), RHSVals.getAssignments(),
3712 if (EndPoints.
empty())
3718 dbgs() <<
"\t\trestoring liveness to " << EndPoints.
size() <<
" points: ";
3719 for (
unsigned i = 0, n = EndPoints.
size(); i != n; ++i) {
3720 dbgs() << EndPoints[i];
3724 dbgs() <<
": " << LRange <<
'\n';
3729void RegisterCoalescer::mergeSubRangeInto(
LiveInterval &LI,
3733 unsigned ComposeSubRegIdx) {
3743 joinSubRegRanges(SR, RangeCopy, SR.
LaneMask, CP);
3753bool RegisterCoalescer::isHighCostLiveInterval(
LiveInterval &LI) {
3756 auto &Counter = LargeLIVisitCounter[LI.
reg()];
3764RegisterCoalescer::JoinResult
3771 NewVNInfo, CP, LIS,
TRI,
false, TrackSubRegLiveness);
3773 NewVNInfo, CP, LIS,
TRI,
false, TrackSubRegLiveness);
3777 if (isHighCostLiveInterval(
LHS) || isHighCostLiveInterval(
RHS)) {
3779 <<
RHS.valnos.size() <<
", segments=" <<
RHS.size()
3780 <<
"; LHS valnos=" <<
LHS.valnos.size()
3781 <<
", segments=" <<
LHS.size() <<
'\n');
3782 return JoinResult::Rejected;
3788 if (!LHSVals.mapValues(RHSVals) || !RHSVals.mapValues(LHSVals))
3789 return JoinResult::Deferred;
3793 if (!LHSVals.resolveConflicts(RHSVals) || !RHSVals.resolveConflicts(LHSVals))
3794 return JoinResult::Deferred;
3797 if (
RHS.hasSubRanges() ||
LHS.hasSubRanges()) {
3803 if (!
LHS.hasSubRanges()) {
3805 :
TRI->getSubRegIndexLaneMask(DstIdx);
3809 }
else if (DstIdx != 0) {
3821 if (!
RHS.hasSubRanges()) {
3823 :
TRI->getSubRegIndexLaneMask(SrcIdx);
3824 mergeSubRangeInto(
LHS,
RHS, Mask, CP, DstIdx);
3829 mergeSubRangeInto(
LHS, R, Mask, CP, DstIdx);
3836 LHSVals.pruneMainSegments(
LHS, ShrinkMainRange);
3838 LHSVals.pruneSubRegValues(
LHS, ShrinkMask, PHIKills);
3839 RHSVals.pruneSubRegValues(
LHS, ShrinkMask, PHIKills);
3845 LHSVals.pruneMainSegments(
LHS, ShrinkMainRange);
3846 LHSVals.pruneSubRegValues(
LHS, ShrinkMask, PHIKills);
3854 LHSVals.pruneValues(RHSVals, EndPoints,
true);
3855 RHSVals.pruneValues(LHSVals, EndPoints,
true);
3860 LHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs, &
LHS);
3861 RHSVals.eraseInstrs(ErasedInstrs, ShrinkRegs);
3862 while (!ShrinkRegs.
empty())
3866 checkMergingChangesDbgValues(CP,
LHS, LHSVals,
RHS, RHSVals);
3871 if (RegIt != RegToPHIIdx.
end()) {
3873 for (
unsigned InstID : RegIt->second) {
3874 auto PHIIt = PHIValToPos.
find(InstID);
3879 auto LII =
RHS.find(
SI);
3880 if (LII ==
RHS.end() || LII->start >
SI)
3898 if (PHIIt->second.SubReg && PHIIt->second.SubReg != CP.
getSrcIdx())
3913 auto InstrNums = RegIt->second;
3914 RegToPHIIdx.
erase(RegIt);
3919 if (RegIt != RegToPHIIdx.
end())
3926 LHS.join(
RHS, LHSVals.getAssignments(), RHSVals.getAssignments(), NewVNInfo);
3934 if (!EndPoints.
empty()) {
3938 dbgs() <<
"\t\trestoring liveness to " << EndPoints.
size() <<
" points: ";
3939 for (
unsigned i = 0, n = EndPoints.
size(); i != n; ++i) {
3940 dbgs() << EndPoints[i];
3944 dbgs() <<
": " <<
LHS <<
'\n';
3949 return JoinResult::Joined;
3952RegisterCoalescer::JoinResult
3955 return joinReservedPhysReg(CP) ? JoinResult::Joined : JoinResult::Deferred;
3956 return joinVirtRegs(CP);
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});
3979 for (
auto &
MBB : MF) {
3982 for (
auto &
MI :
MBB) {
3983 if (
MI.isDebugValue()) {
3985 return MO.isReg() && MO.getReg().isVirtual();
3987 ToInsert.push_back(&
MI);
3988 }
else if (!
MI.isDebugOrPseudoInstr()) {
3990 CloseNewDVRange(CurrentSlot);
3999 for (
auto &Pair : DbgVRegToValues)
4003void RegisterCoalescer::checkMergingChangesDbgValues(
CoalescerPair &CP,
4007 JoinVals &RHSVals) {
4009 checkMergingChangesDbgValuesImpl(
Reg,
RHS,
LHS, LHSVals);
4013 checkMergingChangesDbgValuesImpl(
Reg,
LHS,
RHS, RHSVals);
4021void RegisterCoalescer::checkMergingChangesDbgValuesImpl(
Register Reg,
4024 JoinVals &RegVals) {
4026 auto VRegMapIt = DbgVRegToValues.
find(
Reg);
4027 if (VRegMapIt == DbgVRegToValues.
end())
4030 auto &DbgValueSet = VRegMapIt->second;
4031 auto DbgValueSetIt = DbgValueSet.begin();
4032 auto SegmentIt = OtherLR.
begin();
4034 bool LastUndefResult =
false;
4039 auto ShouldUndef = [&RegVals, &
RegLR, &LastUndefResult,
4044 if (LastUndefIdx == Idx)
4045 return LastUndefResult;
4051 auto OtherIt =
RegLR.find(Idx);
4052 if (OtherIt ==
RegLR.end())
4061 auto Resolution = RegVals.getResolution(OtherIt->valno->id);
4063 Resolution != JoinVals::CR_Keep && Resolution != JoinVals::CR_Erase;
4065 return LastUndefResult;
4071 while (DbgValueSetIt != DbgValueSet.end() && SegmentIt != OtherLR.
end()) {
4072 if (DbgValueSetIt->first < SegmentIt->end) {
4075 if (DbgValueSetIt->first >= SegmentIt->start) {
4076 bool HasReg = DbgValueSetIt->second->hasDebugOperandForReg(
Reg);
4077 bool ShouldUndefReg = ShouldUndef(DbgValueSetIt->first);
4078 if (HasReg && ShouldUndefReg) {
4080 DbgValueSetIt->second->setDebugValueUndef();
4094struct MBBPriorityInfo {
4095 MachineBasicBlock *
MBB;
4099 MBBPriorityInfo(MachineBasicBlock *mbb,
unsigned depth,
bool issplit)
4100 :
MBB(mbb),
Depth(depth), IsSplit(issplit) {}
4110 const MBBPriorityInfo *
RHS) {
4112 if (
LHS->Depth !=
RHS->Depth)
4113 return LHS->Depth >
RHS->Depth ? -1 : 1;
4116 if (
LHS->IsSplit !=
RHS->IsSplit)
4117 return LHS->IsSplit ? -1 : 1;
4121 unsigned cl =
LHS->MBB->pred_size() +
LHS->MBB->succ_size();
4122 unsigned cr =
RHS->MBB->pred_size() +
RHS->MBB->succ_size();
4124 return cl > cr ? -1 : 1;
4127 return LHS->MBB->getNumber() <
RHS->MBB->getNumber() ? -1 : 1;
4132 if (!Copy->isCopy())
4135 if (Copy->getOperand(1).isUndef())
4138 Register SrcReg = Copy->getOperand(1).getReg();
4139 Register DstReg = Copy->getOperand(0).getReg();
4147void RegisterCoalescer::lateLiveIntervalUpdate() {
4153 if (!DeadDefs.
empty())
4154 eliminateDeadDefs();
4156 ToBeUpdated.
clear();
4159bool RegisterCoalescer::copyCoalesceWorkList(
4161 bool Progress =
false;
4172 JoinResult
Result = joinCopy(
MI, CurrentErasedInstrs);
4173 Progress |=
Result == JoinResult::Joined;
4174 if (Result != JoinResult::Deferred)
4178 if (!CurrentErasedInstrs.
empty()) {
4180 if (
MI && CurrentErasedInstrs.
count(
MI))
4184 if (
MI && CurrentErasedInstrs.
count(
MI))
4195 assert(Copy.isCopyLike());
4198 if (&
MI != &Copy &&
MI.isCopyLike())
4203bool RegisterCoalescer::applyTerminalRule(
const MachineInstr &Copy)
const {
4208 unsigned SrcSubReg = 0, DstSubReg = 0;
4209 if (!
isMoveInstr(*
TRI, &Copy, SrcReg, DstReg, SrcSubReg, DstSubReg))
4230 if (&
MI == &Copy || !
MI.isCopyLike() ||
MI.getParent() != OrigBB)
4233 unsigned OtherSrcSubReg = 0, OtherSubReg = 0;
4237 if (OtherReg == SrcReg)
4238 OtherReg = OtherSrcReg;
4257 const unsigned PrevSize = WorkList.
size();
4258 if (JoinGlobalCopies) {
4264 if (!
MI.isCopyLike())
4266 bool ApplyTerminalRule = applyTerminalRule(
MI);
4268 if (ApplyTerminalRule)
4273 if (ApplyTerminalRule)
4280 LocalWorkList.
append(LocalTerminals.
begin(), LocalTerminals.
end());
4287 if (MII.isCopyLike()) {
4288 if (applyTerminalRule(MII))
4301 if (copyCoalesceWorkList(CurrList))
4303 std::remove(WorkList.
begin() + PrevSize, WorkList.
end(),
nullptr),
4307void RegisterCoalescer::coalesceLocals() {
4308 copyCoalesceWorkList(LocalWorkList);
4313 LocalWorkList.clear();
4316void RegisterCoalescer::joinAllIntervals() {
4317 LLVM_DEBUG(
dbgs() <<
"********** JOINING INTERVALS ***********\n");
4318 assert(WorkList.
empty() && LocalWorkList.empty() &&
"Old data still around.");
4320 std::vector<MBBPriorityInfo> MBBs;
4321 MBBs.reserve(MF->size());
4323 MBBs.push_back(MBBPriorityInfo(&
MBB,
Loops->getLoopDepth(&
MBB),
4329 unsigned CurrDepth = std::numeric_limits<unsigned>::max();
4330 for (MBBPriorityInfo &
MBB : MBBs) {
4332 if (JoinGlobalCopies &&
MBB.Depth < CurrDepth) {
4334 CurrDepth =
MBB.Depth;
4336 copyCoalesceInMBB(
MBB.MBB);
4338 lateLiveIntervalUpdate();
4343 while (copyCoalesceWorkList(WorkList))
4345 lateLiveIntervalUpdate();
4356 RegisterCoalescer Impl(&LIS,
SI, &
Loops, RegClassInfo);
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);
4378 LLVM_DEBUG(
dbgs() <<
"********** REGISTER COALESCER **********\n"
4379 <<
"********** Function: " << fn.
getName() <<
'\n');
4391 dbgs() <<
"* Skipped as it exposes functions that returns twice.\n");
4411 unsigned SubReg = DebugPHI.second.SubReg;
4413 PHIValPos
P = {
SI,
Reg, SubReg};
4414 PHIValToPos.
insert(std::make_pair(DebugPHI.first,
P));
4415 RegToPHIIdx[
Reg].push_back(DebugPHI.first);
4424 MF->
verify(LIS,
SI,
"Before register coalescing", &
errs());
4426 DbgVRegToValues.
clear();
4460 assert((S.LaneMask & ~MaxMask).none());
4471 auto it = PHIValToPos.
find(
p.first);
4473 p.second.Reg = it->second.Reg;
4474 p.second.SubReg = it->second.SubReg;
4477 PHIValToPos.
clear();
4478 RegToPHIIdx.
clear();
4483 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)
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 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 & 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.
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.
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),...
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 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)
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)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the 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.
@ 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.
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.
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
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.
@ End
Run the machine verifier once, at the end of the pipeline.
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.