mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:39:57 +00:00
[NFC][Regalloc] accessors for 'reg' and 'weight'
Also renamed the fields to follow style guidelines. Accessors help with readability - weight mutation, in particular, is easier to follow this way. Differential Revision: https://reviews.llvm.org/D87725
This commit is contained in:
parent
f2aa3ef913
commit
2e97c41718
@ -704,12 +704,16 @@ namespace llvm {
|
||||
private:
|
||||
SubRange *SubRanges = nullptr; ///< Single linked list of subregister live
|
||||
/// ranges.
|
||||
const unsigned Reg; // the register or stack slot of this interval.
|
||||
float Weight = 0.0; // weight of this interval
|
||||
|
||||
public:
|
||||
const unsigned reg; // the register or stack slot of this interval.
|
||||
float weight; // weight of this interval
|
||||
unsigned reg() const { return Reg; }
|
||||
float weight() const { return Weight; }
|
||||
void incrementWeight(float Inc) { Weight += Inc; }
|
||||
void setWeight(float Value) { Weight = Value; }
|
||||
|
||||
LiveInterval(unsigned Reg, float Weight) : reg(Reg), weight(Weight) {}
|
||||
LiveInterval(unsigned Reg, float Weight) : Reg(Reg), Weight(Weight) {}
|
||||
|
||||
~LiveInterval() {
|
||||
clearSubRanges();
|
||||
@ -806,14 +810,10 @@ namespace llvm {
|
||||
unsigned getSize() const;
|
||||
|
||||
/// isSpillable - Can this interval be spilled?
|
||||
bool isSpillable() const {
|
||||
return weight != huge_valf;
|
||||
}
|
||||
bool isSpillable() const { return Weight != huge_valf; }
|
||||
|
||||
/// markNotSpillable - Mark interval as not spillable
|
||||
void markNotSpillable() {
|
||||
weight = huge_valf;
|
||||
}
|
||||
void markNotSpillable() { Weight = huge_valf; }
|
||||
|
||||
/// For a given lane mask @p LaneMask, compute indexes at which the
|
||||
/// lane is marked undefined by subregister <def,read-undef> definitions.
|
||||
@ -870,7 +870,7 @@ namespace llvm {
|
||||
bool operator<(const LiveInterval& other) const {
|
||||
const SlotIndex &thisIndex = beginIndex();
|
||||
const SlotIndex &otherIndex = other.beginIndex();
|
||||
return std::tie(thisIndex, reg) < std::tie(otherIndex, other.reg);
|
||||
return std::tie(thisIndex, Reg) < std::tie(otherIndex, other.Reg);
|
||||
}
|
||||
|
||||
void print(raw_ostream &OS) const;
|
||||
|
@ -152,7 +152,7 @@ public:
|
||||
return *Parent;
|
||||
}
|
||||
|
||||
Register getReg() const { return getParent().reg; }
|
||||
Register getReg() const { return getParent().reg(); }
|
||||
|
||||
/// Iterator for accessing the new registers added by this edit.
|
||||
using iterator = SmallVectorImpl<Register>::const_iterator;
|
||||
|
@ -86,7 +86,7 @@ static bool isRematerializable(const LiveInterval &LI,
|
||||
const LiveIntervals &LIS,
|
||||
VirtRegMap *VRM,
|
||||
const TargetInstrInfo &TII) {
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
unsigned Original = VRM ? VRM->getOriginal(Reg) : 0;
|
||||
for (LiveInterval::const_vni_iterator I = LI.vni_begin(), E = LI.vni_end();
|
||||
I != E; ++I) {
|
||||
@ -140,7 +140,7 @@ void VirtRegAuxInfo::calculateSpillWeightAndHint(LiveInterval &li) {
|
||||
// Check if unspillable.
|
||||
if (weight < 0)
|
||||
return;
|
||||
li.weight = weight;
|
||||
li.setWeight(weight);
|
||||
}
|
||||
|
||||
float VirtRegAuxInfo::futureWeight(LiveInterval &li, SlotIndex start,
|
||||
@ -159,10 +159,10 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
unsigned numInstr = 0; // Number of instructions using li
|
||||
SmallPtrSet<MachineInstr*, 8> visited;
|
||||
|
||||
std::pair<unsigned, unsigned> TargetHint = mri.getRegAllocationHint(li.reg);
|
||||
std::pair<unsigned, unsigned> TargetHint = mri.getRegAllocationHint(li.reg());
|
||||
|
||||
if (li.isSpillable() && VRM) {
|
||||
Register Reg = li.reg;
|
||||
Register Reg = li.reg();
|
||||
Register Original = VRM->getOriginal(Reg);
|
||||
const LiveInterval &OrigInt = LIS.getInterval(Original);
|
||||
// li comes from a split of OrigInt. If OrigInt was marked
|
||||
@ -215,7 +215,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
std::set<CopyHint> CopyHints;
|
||||
|
||||
for (MachineRegisterInfo::reg_instr_nodbg_iterator
|
||||
I = mri.reg_instr_nodbg_begin(li.reg),
|
||||
I = mri.reg_instr_nodbg_begin(li.reg()),
|
||||
E = mri.reg_instr_nodbg_end();
|
||||
I != E;) {
|
||||
MachineInstr *mi = &*(I++);
|
||||
@ -243,7 +243,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
|
||||
// Calculate instr weight.
|
||||
bool reads, writes;
|
||||
std::tie(reads, writes) = mi->readsWritesVirtualRegister(li.reg);
|
||||
std::tie(reads, writes) = mi->readsWritesVirtualRegister(li.reg());
|
||||
weight = LiveIntervals::getSpillWeight(writes, reads, &MBFI, *mi);
|
||||
|
||||
// Give extra weight to what looks like a loop induction variable update.
|
||||
@ -256,7 +256,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
// Get allocation hints from copies.
|
||||
if (!mi->isCopy())
|
||||
continue;
|
||||
Register hint = copyHint(mi, li.reg, tri, mri);
|
||||
Register hint = copyHint(mi, li.reg(), tri, mri);
|
||||
if (!hint)
|
||||
continue;
|
||||
// Force hweight onto the stack so that x86 doesn't add hidden precision,
|
||||
@ -275,7 +275,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
if (updateLI && CopyHints.size()) {
|
||||
// Remove a generic hint if previously added by target.
|
||||
if (TargetHint.first == 0 && TargetHint.second)
|
||||
mri.clearSimpleHint(li.reg);
|
||||
mri.clearSimpleHint(li.reg());
|
||||
|
||||
std::set<unsigned> HintedRegs;
|
||||
for (auto &Hint : CopyHints) {
|
||||
@ -283,7 +283,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start,
|
||||
(TargetHint.first != 0 && Hint.Reg == TargetHint.second))
|
||||
// Don't add the same reg twice or the target-type hint again.
|
||||
continue;
|
||||
mri.addRegAllocationHint(li.reg, Hint.Reg);
|
||||
mri.addRegAllocationHint(li.reg(), Hint.Reg);
|
||||
}
|
||||
|
||||
// Weakly boost the spill weight of hinted registers.
|
||||
|
@ -289,8 +289,9 @@ bool InlineSpiller::isSnippet(const LiveInterval &SnipLI) {
|
||||
|
||||
// Check that all uses satisfy our criteria.
|
||||
for (MachineRegisterInfo::reg_instr_nodbg_iterator
|
||||
RI = MRI.reg_instr_nodbg_begin(SnipLI.reg),
|
||||
E = MRI.reg_instr_nodbg_end(); RI != E; ) {
|
||||
RI = MRI.reg_instr_nodbg_begin(SnipLI.reg()),
|
||||
E = MRI.reg_instr_nodbg_end();
|
||||
RI != E;) {
|
||||
MachineInstr &MI = *RI++;
|
||||
|
||||
// Allow copies to/from Reg.
|
||||
@ -299,11 +300,11 @@ bool InlineSpiller::isSnippet(const LiveInterval &SnipLI) {
|
||||
|
||||
// Allow stack slot loads.
|
||||
int FI;
|
||||
if (SnipLI.reg == TII.isLoadFromStackSlot(MI, FI) && FI == StackSlot)
|
||||
if (SnipLI.reg() == TII.isLoadFromStackSlot(MI, FI) && FI == StackSlot)
|
||||
continue;
|
||||
|
||||
// Allow stack slot stores.
|
||||
if (SnipLI.reg == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot)
|
||||
if (SnipLI.reg() == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot)
|
||||
continue;
|
||||
|
||||
// Allow a single additional instruction.
|
||||
@ -432,7 +433,7 @@ void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
|
||||
do {
|
||||
LiveInterval *LI;
|
||||
std::tie(LI, VNI) = WorkList.pop_back_val();
|
||||
Register Reg = LI->reg;
|
||||
Register Reg = LI->reg();
|
||||
LLVM_DEBUG(dbgs() << "Checking redundant spills for " << VNI->id << '@'
|
||||
<< VNI->def << " in " << *LI << '\n');
|
||||
|
||||
@ -511,7 +512,7 @@ void InlineSpiller::markValueUsed(LiveInterval *LI, VNInfo *VNI) {
|
||||
if (!SnippetCopies.count(MI))
|
||||
continue;
|
||||
LiveInterval &SnipLI = LIS.getInterval(MI->getOperand(1).getReg());
|
||||
assert(isRegToSpill(SnipLI.reg) && "Unexpected register in copy");
|
||||
assert(isRegToSpill(SnipLI.reg()) && "Unexpected register in copy");
|
||||
VNInfo *SnipVNI = SnipLI.getVNInfoAt(VNI->def.getRegSlot(true));
|
||||
assert(SnipVNI && "Snippet undefined before copy");
|
||||
WorkList.push_back(std::make_pair(&SnipLI, SnipVNI));
|
||||
@ -556,7 +557,7 @@ bool InlineSpiller::canGuaranteeAssignmentAfterRemat(Register VReg,
|
||||
bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) {
|
||||
// Analyze instruction
|
||||
SmallVector<std::pair<MachineInstr *, unsigned>, 8> Ops;
|
||||
VirtRegInfo RI = AnalyzeVirtRegInBundle(MI, VirtReg.reg, &Ops);
|
||||
VirtRegInfo RI = AnalyzeVirtRegInBundle(MI, VirtReg.reg(), &Ops);
|
||||
|
||||
if (!RI.Reads)
|
||||
return false;
|
||||
@ -568,7 +569,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) {
|
||||
LLVM_DEBUG(dbgs() << "\tadding <undef> flags: ");
|
||||
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = MI.getOperand(i);
|
||||
if (MO.isReg() && MO.isUse() && MO.getReg() == VirtReg.reg)
|
||||
if (MO.isReg() && MO.isUse() && MO.getReg() == VirtReg.reg())
|
||||
MO.setIsUndef();
|
||||
}
|
||||
LLVM_DEBUG(dbgs() << UseIdx << '\t' << MI);
|
||||
@ -608,7 +609,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) {
|
||||
|
||||
// If we can't guarantee that we'll be able to actually assign the new vreg,
|
||||
// we can't remat.
|
||||
if (!canGuaranteeAssignmentAfterRemat(VirtReg.reg, MI)) {
|
||||
if (!canGuaranteeAssignmentAfterRemat(VirtReg.reg(), MI)) {
|
||||
markValueUsed(&VirtReg, ParentVNI);
|
||||
LLVM_DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << MI);
|
||||
return false;
|
||||
@ -633,7 +634,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) {
|
||||
// Replace operands
|
||||
for (const auto &OpPair : Ops) {
|
||||
MachineOperand &MO = OpPair.first->getOperand(OpPair.second);
|
||||
if (MO.isReg() && MO.isUse() && MO.getReg() == VirtReg.reg) {
|
||||
if (MO.isReg() && MO.isUse() && MO.getReg() == VirtReg.reg()) {
|
||||
MO.setReg(NewVReg);
|
||||
MO.setIsKill();
|
||||
}
|
||||
@ -1171,7 +1172,7 @@ void HoistSpillHelper::addToMergeableSpills(MachineInstr &Spill, int StackSlot,
|
||||
// save a copy of LiveInterval in StackSlotToOrigLI because the original
|
||||
// LiveInterval may be cleared after all its references are spilled.
|
||||
if (StackSlotToOrigLI.find(StackSlot) == StackSlotToOrigLI.end()) {
|
||||
auto LI = std::make_unique<LiveInterval>(OrigLI.reg, OrigLI.weight);
|
||||
auto LI = std::make_unique<LiveInterval>(OrigLI.reg(), OrigLI.weight());
|
||||
LI->assign(OrigLI, Allocator);
|
||||
StackSlotToOrigLI[StackSlot] = std::move(LI);
|
||||
}
|
||||
@ -1199,7 +1200,7 @@ bool HoistSpillHelper::rmFromMergeableSpills(MachineInstr &Spill,
|
||||
bool HoistSpillHelper::isSpillCandBB(LiveInterval &OrigLI, VNInfo &OrigVNI,
|
||||
MachineBasicBlock &BB, Register &LiveReg) {
|
||||
SlotIndex Idx;
|
||||
Register OrigReg = OrigLI.reg;
|
||||
Register OrigReg = OrigLI.reg();
|
||||
MachineBasicBlock::iterator MI = IPA.getLastInsertPointIter(OrigLI, BB);
|
||||
if (MI != BB.end())
|
||||
Idx = LIS.getInstructionIndex(*MI);
|
||||
|
@ -777,12 +777,12 @@ void UserValue::addDefsFromCopies(
|
||||
if (Kills.empty())
|
||||
return;
|
||||
// Don't track copies from physregs, there are too many uses.
|
||||
if (!Register::isVirtualRegister(LI->reg))
|
||||
if (!Register::isVirtualRegister(LI->reg()))
|
||||
return;
|
||||
|
||||
// Collect all the (vreg, valno) pairs that are copies of LI.
|
||||
SmallVector<std::pair<LiveInterval*, const VNInfo*>, 8> CopyValues;
|
||||
for (MachineOperand &MO : MRI.use_nodbg_operands(LI->reg)) {
|
||||
for (MachineOperand &MO : MRI.use_nodbg_operands(LI->reg())) {
|
||||
MachineInstr *MI = MO.getParent();
|
||||
// Copies of the full value.
|
||||
if (MO.getSubReg() || !MI->isCopy())
|
||||
@ -1066,7 +1066,7 @@ UserValue::splitLocation(unsigned OldLocNo, ArrayRef<Register> NewRegs,
|
||||
LII->start < LocMapI.stop()) {
|
||||
// Overlapping correct location. Allocate NewLocNo now.
|
||||
if (NewLocNo == UndefLocNo) {
|
||||
MachineOperand MO = MachineOperand::CreateReg(LI->reg, false);
|
||||
MachineOperand MO = MachineOperand::CreateReg(LI->reg(), false);
|
||||
MO.setSubReg(locations[OldLocNo].getSubReg());
|
||||
NewLocNo = getLocationNo(MO);
|
||||
DidChange = true;
|
||||
|
@ -951,9 +951,9 @@ void LiveInterval::refineSubRanges(
|
||||
MatchingRange = createSubRangeFrom(Allocator, Matching, SR);
|
||||
// Now that the subrange is split in half, make sure we
|
||||
// only keep in the subranges the VNIs that touch the related half.
|
||||
stripValuesNotDefiningMask(reg, *MatchingRange, Matching, Indexes, TRI,
|
||||
stripValuesNotDefiningMask(reg(), *MatchingRange, Matching, Indexes, TRI,
|
||||
ComposeSubRegIdx);
|
||||
stripValuesNotDefiningMask(reg, SR, SR.LaneMask, Indexes, TRI,
|
||||
stripValuesNotDefiningMask(reg(), SR, SR.LaneMask, Indexes, TRI,
|
||||
ComposeSubRegIdx);
|
||||
}
|
||||
Apply(*MatchingRange);
|
||||
@ -977,11 +977,11 @@ void LiveInterval::computeSubRangeUndefs(SmallVectorImpl<SlotIndex> &Undefs,
|
||||
LaneBitmask LaneMask,
|
||||
const MachineRegisterInfo &MRI,
|
||||
const SlotIndexes &Indexes) const {
|
||||
assert(Register::isVirtualRegister(reg));
|
||||
LaneBitmask VRegMask = MRI.getMaxLaneMaskForVReg(reg);
|
||||
assert(Register::isVirtualRegister(reg()));
|
||||
LaneBitmask VRegMask = MRI.getMaxLaneMaskForVReg(reg());
|
||||
assert((VRegMask & LaneMask).any());
|
||||
const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
|
||||
for (const MachineOperand &MO : MRI.def_operands(reg)) {
|
||||
for (const MachineOperand &MO : MRI.def_operands(reg())) {
|
||||
if (!MO.isUndef())
|
||||
continue;
|
||||
unsigned SubReg = MO.getSubReg();
|
||||
@ -1043,12 +1043,12 @@ void LiveInterval::SubRange::print(raw_ostream &OS) const {
|
||||
}
|
||||
|
||||
void LiveInterval::print(raw_ostream &OS) const {
|
||||
OS << printReg(reg) << ' ';
|
||||
OS << printReg(reg()) << ' ';
|
||||
super::print(OS);
|
||||
// Print subranges
|
||||
for (const SubRange &SR : subranges())
|
||||
OS << SR;
|
||||
OS << " weight:" << weight;
|
||||
OS << " weight:" << Weight;
|
||||
}
|
||||
|
||||
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
||||
@ -1087,7 +1087,7 @@ void LiveInterval::verify(const MachineRegisterInfo *MRI) const {
|
||||
|
||||
// Make sure SubRanges are fine and LaneMasks are disjunct.
|
||||
LaneBitmask Mask;
|
||||
LaneBitmask MaxMask = MRI != nullptr ? MRI->getMaxLaneMaskForVReg(reg)
|
||||
LaneBitmask MaxMask = MRI != nullptr ? MRI->getMaxLaneMaskForVReg(reg())
|
||||
: LaneBitmask::getAll();
|
||||
for (const SubRange &SR : subranges()) {
|
||||
// Subrange lanemask should be disjunct to any previous subrange masks.
|
||||
@ -1361,8 +1361,9 @@ unsigned ConnectedVNInfoEqClasses::Classify(const LiveRange &LR) {
|
||||
void ConnectedVNInfoEqClasses::Distribute(LiveInterval &LI, LiveInterval *LIV[],
|
||||
MachineRegisterInfo &MRI) {
|
||||
// Rewrite instructions.
|
||||
for (MachineRegisterInfo::reg_iterator RI = MRI.reg_begin(LI.reg),
|
||||
RE = MRI.reg_end(); RI != RE;) {
|
||||
for (MachineRegisterInfo::reg_iterator RI = MRI.reg_begin(LI.reg()),
|
||||
RE = MRI.reg_end();
|
||||
RI != RE;) {
|
||||
MachineOperand &MO = *RI;
|
||||
MachineInstr *MI = RI->getParent();
|
||||
++RI;
|
||||
@ -1382,7 +1383,7 @@ void ConnectedVNInfoEqClasses::Distribute(LiveInterval &LI, LiveInterval *LIV[],
|
||||
if (!VNI)
|
||||
continue;
|
||||
if (unsigned EqClass = getEqClass(VNI))
|
||||
MO.setReg(LIV[EqClass-1]->reg);
|
||||
MO.setReg(LIV[EqClass - 1]->reg());
|
||||
}
|
||||
|
||||
// Distribute subregister liveranges.
|
||||
|
@ -60,7 +60,7 @@ void LiveIntervalCalc::calculate(LiveInterval &LI, bool TrackSubRegs) {
|
||||
// Visit all def operands. If the same instruction has multiple defs of Reg,
|
||||
// createDeadDef() will deduplicate.
|
||||
const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
for (const MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
|
||||
if (!MO.isDef() && !MO.readsReg())
|
||||
continue;
|
||||
@ -127,7 +127,7 @@ void LiveIntervalCalc::constructMainRangeFromSubranges(LiveInterval &LI) {
|
||||
}
|
||||
}
|
||||
resetLiveOutMap();
|
||||
extendToUses(MainRange, LI.reg, LaneBitmask::getAll(), &LI);
|
||||
extendToUses(MainRange, LI.reg(), LaneBitmask::getAll(), &LI);
|
||||
}
|
||||
|
||||
void LiveIntervalCalc::createDeadDefs(LiveRange &LR, Register Reg) {
|
||||
|
@ -85,8 +85,8 @@ LiveIntervalUnion::print(raw_ostream &OS, const TargetRegisterInfo *TRI) const {
|
||||
return;
|
||||
}
|
||||
for (LiveSegments::const_iterator SI = Segments.begin(); SI.valid(); ++SI) {
|
||||
OS << " [" << SI.start() << ' ' << SI.stop() << "):"
|
||||
<< printReg(SI.value()->reg, TRI);
|
||||
OS << " [" << SI.start() << ' ' << SI.stop()
|
||||
<< "):" << printReg(SI.value()->reg(), TRI);
|
||||
}
|
||||
OS << '\n';
|
||||
}
|
||||
@ -95,7 +95,7 @@ LiveIntervalUnion::print(raw_ostream &OS, const TargetRegisterInfo *TRI) const {
|
||||
// Verify the live intervals in this union and add them to the visited set.
|
||||
void LiveIntervalUnion::verify(LiveVirtRegBitSet& VisitedVRegs) {
|
||||
for (SegmentIter SI = Segments.begin(); SI.valid(); ++SI)
|
||||
VisitedVRegs.set(SI.value()->reg);
|
||||
VisitedVRegs.set(SI.value()->reg());
|
||||
}
|
||||
#endif //!NDEBUG
|
||||
|
||||
|
@ -193,7 +193,7 @@ bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
|
||||
assert(LICalc && "LICalc not initialized.");
|
||||
assert(LI.empty() && "Should only compute empty intervals.");
|
||||
LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
|
||||
LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg));
|
||||
LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg()));
|
||||
return computeDeadValues(LI, nullptr);
|
||||
}
|
||||
|
||||
@ -453,13 +453,13 @@ void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
|
||||
bool LiveIntervals::shrinkToUses(LiveInterval *li,
|
||||
SmallVectorImpl<MachineInstr*> *dead) {
|
||||
LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
|
||||
assert(Register::isVirtualRegister(li->reg) &&
|
||||
assert(Register::isVirtualRegister(li->reg()) &&
|
||||
"Can only shrink virtual registers");
|
||||
|
||||
// Shrink subregister live ranges.
|
||||
bool NeedsCleanup = false;
|
||||
for (LiveInterval::SubRange &S : li->subranges()) {
|
||||
shrinkToUses(S, li->reg);
|
||||
shrinkToUses(S, li->reg());
|
||||
if (S.empty())
|
||||
NeedsCleanup = true;
|
||||
}
|
||||
@ -469,8 +469,8 @@ bool LiveIntervals::shrinkToUses(LiveInterval *li,
|
||||
// Find all the values used, including PHI kills.
|
||||
ShrinkToUsesWorkList WorkList;
|
||||
|
||||
// Visit all instructions reading li->reg.
|
||||
unsigned Reg = li->reg;
|
||||
// Visit all instructions reading li->reg().
|
||||
unsigned Reg = li->reg();
|
||||
for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
|
||||
if (UseMI.isDebugValue() || !UseMI.readsVirtualRegister(Reg))
|
||||
continue;
|
||||
@ -523,7 +523,7 @@ bool LiveIntervals::computeDeadValues(LiveInterval &LI,
|
||||
|
||||
// Is the register live before? Otherwise we may have to add a read-undef
|
||||
// flag for subregister defs.
|
||||
unsigned VReg = LI.reg;
|
||||
unsigned VReg = LI.reg();
|
||||
if (MRI->shouldTrackSubRegLiveness(VReg)) {
|
||||
if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
|
||||
MachineInstr *MI = getInstructionFromIndex(Def);
|
||||
@ -543,7 +543,7 @@ bool LiveIntervals::computeDeadValues(LiveInterval &LI,
|
||||
// This is a dead def. Make sure the instruction knows.
|
||||
MachineInstr *MI = getInstructionFromIndex(Def);
|
||||
assert(MI && "No instruction defining live value");
|
||||
MI->addRegisterDead(LI.reg, TRI);
|
||||
MI->addRegisterDead(LI.reg(), TRI);
|
||||
if (HaveDeadDef)
|
||||
MayHaveSplitComponents = true;
|
||||
HaveDeadDef = true;
|
||||
@ -1716,7 +1716,7 @@ void LiveIntervals::splitSeparateComponents(LiveInterval &LI,
|
||||
if (NumComp <= 1)
|
||||
return;
|
||||
LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n');
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
const TargetRegisterClass *RegClass = MRI->getRegClass(Reg);
|
||||
for (unsigned I = 1; I < NumComp; ++I) {
|
||||
Register NewVReg = MRI->createVirtualRegister(RegClass);
|
||||
|
@ -188,7 +188,7 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
MachineInstr *DefMI = nullptr, *UseMI = nullptr;
|
||||
|
||||
// Check that there is a single def and a single use.
|
||||
for (MachineOperand &MO : MRI.reg_nodbg_operands(LI->reg)) {
|
||||
for (MachineOperand &MO : MRI.reg_nodbg_operands(LI->reg())) {
|
||||
MachineInstr *MI = MO.getParent();
|
||||
if (MO.isDef()) {
|
||||
if (DefMI && DefMI != MI)
|
||||
@ -224,7 +224,7 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
<< " into single use: " << *UseMI);
|
||||
|
||||
SmallVector<unsigned, 8> Ops;
|
||||
if (UseMI->readsWritesVirtualRegister(LI->reg, &Ops).second)
|
||||
if (UseMI->readsWritesVirtualRegister(LI->reg(), &Ops).second)
|
||||
return false;
|
||||
|
||||
MachineInstr *FoldMI = TII.foldMemoryOperand(*UseMI, Ops, *DefMI, &LIS);
|
||||
@ -236,7 +236,7 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
if (UseMI->shouldUpdateCallSiteInfo())
|
||||
UseMI->getMF()->moveCallSiteInfo(UseMI, FoldMI);
|
||||
UseMI->eraseFromParent();
|
||||
DefMI->addRegisterDead(LI->reg, nullptr);
|
||||
DefMI->addRegisterDead(LI->reg(), nullptr);
|
||||
Dead.push_back(DefMI);
|
||||
++NumDCEFoldedLoads;
|
||||
return true;
|
||||
@ -332,7 +332,7 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink,
|
||||
// Remove defined value.
|
||||
if (MOI->isDef()) {
|
||||
if (TheDelegate && LI.getVNInfoAt(Idx) != nullptr)
|
||||
TheDelegate->LRE_WillShrinkVirtReg(LI.reg);
|
||||
TheDelegate->LRE_WillShrinkVirtReg(LI.reg());
|
||||
LIS.removeVRegDefAt(LI, Idx);
|
||||
if (LI.empty())
|
||||
RegsToErase.push_back(Reg);
|
||||
@ -369,7 +369,7 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink,
|
||||
pop_back();
|
||||
DeadRemats->insert(MI);
|
||||
const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
|
||||
MI->substituteRegister(Dest, NewLI.reg, 0, TRI);
|
||||
MI->substituteRegister(Dest, NewLI.reg(), 0, TRI);
|
||||
MI->getOperand(0).setIsDead(true);
|
||||
} else {
|
||||
if (TheDelegate)
|
||||
@ -409,7 +409,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
|
||||
ToShrink.pop_back();
|
||||
if (foldAsLoad(LI, Dead))
|
||||
continue;
|
||||
unsigned VReg = LI->reg;
|
||||
unsigned VReg = LI->reg();
|
||||
if (TheDelegate)
|
||||
TheDelegate->LRE_WillShrinkVirtReg(VReg);
|
||||
if (!LIS.shrinkToUses(LI, &Dead))
|
||||
@ -442,9 +442,9 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
|
||||
// intervals their own originals instead of referring to LI. The original
|
||||
// interval must contain all the split products, and LI doesn't.
|
||||
if (Original != VReg && Original != 0)
|
||||
VRM->setIsSplitFromReg(SplitLI->reg, Original);
|
||||
VRM->setIsSplitFromReg(SplitLI->reg(), Original);
|
||||
if (TheDelegate)
|
||||
TheDelegate->LRE_DidCloneVirtReg(SplitLI->reg, VReg);
|
||||
TheDelegate->LRE_DidCloneVirtReg(SplitLI->reg(), VReg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -466,11 +466,11 @@ LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
|
||||
VirtRegAuxInfo VRAI(MF, LIS, VRM, Loops, MBFI);
|
||||
for (unsigned I = 0, Size = size(); I < Size; ++I) {
|
||||
LiveInterval &LI = LIS.getInterval(get(I));
|
||||
if (MRI.recomputeRegClass(LI.reg))
|
||||
if (MRI.recomputeRegClass(LI.reg()))
|
||||
LLVM_DEBUG({
|
||||
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
|
||||
dbgs() << "Inflated " << printReg(LI.reg) << " to "
|
||||
<< TRI->getRegClassName(MRI.getRegClass(LI.reg)) << '\n';
|
||||
dbgs() << "Inflated " << printReg(LI.reg()) << " to "
|
||||
<< TRI->getRegClassName(MRI.getRegClass(LI.reg())) << '\n';
|
||||
});
|
||||
VRAI.calculateSpillWeightAndHint(LI);
|
||||
}
|
||||
|
@ -102,10 +102,10 @@ static bool foreachUnit(const TargetRegisterInfo *TRI,
|
||||
}
|
||||
|
||||
void LiveRegMatrix::assign(LiveInterval &VirtReg, unsigned PhysReg) {
|
||||
LLVM_DEBUG(dbgs() << "assigning " << printReg(VirtReg.reg, TRI) << " to "
|
||||
LLVM_DEBUG(dbgs() << "assigning " << printReg(VirtReg.reg(), TRI) << " to "
|
||||
<< printReg(PhysReg, TRI) << ':');
|
||||
assert(!VRM->hasPhys(VirtReg.reg) && "Duplicate VirtReg assignment");
|
||||
VRM->assignVirt2Phys(VirtReg.reg, PhysReg);
|
||||
assert(!VRM->hasPhys(VirtReg.reg()) && "Duplicate VirtReg assignment");
|
||||
VRM->assignVirt2Phys(VirtReg.reg(), PhysReg);
|
||||
|
||||
foreachUnit(
|
||||
TRI, VirtReg, PhysReg, [&](unsigned Unit, const LiveRange &Range) {
|
||||
@ -119,10 +119,10 @@ void LiveRegMatrix::assign(LiveInterval &VirtReg, unsigned PhysReg) {
|
||||
}
|
||||
|
||||
void LiveRegMatrix::unassign(LiveInterval &VirtReg) {
|
||||
Register PhysReg = VRM->getPhys(VirtReg.reg);
|
||||
LLVM_DEBUG(dbgs() << "unassigning " << printReg(VirtReg.reg, TRI) << " from "
|
||||
<< printReg(PhysReg, TRI) << ':');
|
||||
VRM->clearVirt(VirtReg.reg);
|
||||
Register PhysReg = VRM->getPhys(VirtReg.reg());
|
||||
LLVM_DEBUG(dbgs() << "unassigning " << printReg(VirtReg.reg(), TRI)
|
||||
<< " from " << printReg(PhysReg, TRI) << ':');
|
||||
VRM->clearVirt(VirtReg.reg());
|
||||
|
||||
foreachUnit(TRI, VirtReg, PhysReg,
|
||||
[&](unsigned Unit, const LiveRange &Range) {
|
||||
@ -148,8 +148,8 @@ bool LiveRegMatrix::checkRegMaskInterference(LiveInterval &VirtReg,
|
||||
// Check if the cached information is valid.
|
||||
// The same BitVector can be reused for all PhysRegs.
|
||||
// We could cache multiple VirtRegs if it becomes necessary.
|
||||
if (RegMaskVirtReg != VirtReg.reg || RegMaskTag != UserTag) {
|
||||
RegMaskVirtReg = VirtReg.reg;
|
||||
if (RegMaskVirtReg != VirtReg.reg() || RegMaskTag != UserTag) {
|
||||
RegMaskVirtReg = VirtReg.reg();
|
||||
RegMaskTag = UserTag;
|
||||
RegMaskUsable.clear();
|
||||
LIS->checkRegMaskInterference(VirtReg, RegMaskUsable);
|
||||
@ -165,7 +165,7 @@ bool LiveRegMatrix::checkRegUnitInterference(LiveInterval &VirtReg,
|
||||
unsigned PhysReg) {
|
||||
if (VirtReg.empty())
|
||||
return false;
|
||||
CoalescerPair CP(VirtReg.reg, PhysReg, *TRI);
|
||||
CoalescerPair CP(VirtReg.reg(), PhysReg, *TRI);
|
||||
|
||||
bool Result = foreachUnit(TRI, VirtReg, PhysReg, [&](unsigned Unit,
|
||||
const LiveRange &Range) {
|
||||
|
@ -2529,7 +2529,7 @@ void MachineVerifier::verifyLiveIntervals() {
|
||||
}
|
||||
|
||||
const LiveInterval &LI = LiveInts->getInterval(Reg);
|
||||
assert(Reg == LI.reg && "Invalid reg to interval mapping");
|
||||
assert(Reg == LI.reg() && "Invalid reg to interval mapping");
|
||||
verifyLiveInterval(LI);
|
||||
}
|
||||
|
||||
@ -2855,7 +2855,7 @@ void MachineVerifier::verifyLiveRange(const LiveRange &LR, unsigned Reg,
|
||||
}
|
||||
|
||||
void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
assert(Register::isVirtualRegister(Reg));
|
||||
verifyLiveRange(LI, Reg);
|
||||
|
||||
@ -2872,10 +2872,10 @@ void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) {
|
||||
}
|
||||
if (SR.empty()) {
|
||||
report("Subrange must not be empty", MF);
|
||||
report_context(SR, LI.reg, SR.LaneMask);
|
||||
report_context(SR, LI.reg(), SR.LaneMask);
|
||||
}
|
||||
Mask |= SR.LaneMask;
|
||||
verifyLiveRange(SR, LI.reg, SR.LaneMask);
|
||||
verifyLiveRange(SR, LI.reg(), SR.LaneMask);
|
||||
if (!LI.covers(SR)) {
|
||||
report("A Subrange is not covered by the main range", MF);
|
||||
report_context(LI);
|
||||
|
@ -87,13 +87,13 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
|
||||
// Continue assigning vregs one at a time to available physical registers.
|
||||
while (LiveInterval *VirtReg = dequeue()) {
|
||||
assert(!VRM->hasPhys(VirtReg->reg) && "Register already assigned");
|
||||
assert(!VRM->hasPhys(VirtReg->reg()) && "Register already assigned");
|
||||
|
||||
// Unused registers can appear when the spiller coalesces snippets.
|
||||
if (MRI->reg_nodbg_empty(VirtReg->reg)) {
|
||||
if (MRI->reg_nodbg_empty(VirtReg->reg())) {
|
||||
LLVM_DEBUG(dbgs() << "Dropping unused " << *VirtReg << '\n');
|
||||
aboutToRemoveInterval(*VirtReg);
|
||||
LIS->removeInterval(VirtReg->reg);
|
||||
LIS->removeInterval(VirtReg->reg());
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -104,8 +104,8 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
// register if possible and populate a list of new live intervals that
|
||||
// result from splitting.
|
||||
LLVM_DEBUG(dbgs() << "\nselectOrSplit "
|
||||
<< TRI->getRegClassName(MRI->getRegClass(VirtReg->reg))
|
||||
<< ':' << *VirtReg << " w=" << VirtReg->weight << '\n');
|
||||
<< TRI->getRegClassName(MRI->getRegClass(VirtReg->reg()))
|
||||
<< ':' << *VirtReg << " w=" << VirtReg->weight() << '\n');
|
||||
|
||||
using VirtRegVec = SmallVector<Register, 4>;
|
||||
|
||||
@ -117,8 +117,9 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
// Probably caused by an inline asm.
|
||||
MachineInstr *MI = nullptr;
|
||||
for (MachineRegisterInfo::reg_instr_iterator
|
||||
I = MRI->reg_instr_begin(VirtReg->reg), E = MRI->reg_instr_end();
|
||||
I != E; ) {
|
||||
I = MRI->reg_instr_begin(VirtReg->reg()),
|
||||
E = MRI->reg_instr_end();
|
||||
I != E;) {
|
||||
MI = &*(I++);
|
||||
if (MI->isInlineAsm())
|
||||
break;
|
||||
@ -133,8 +134,9 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
report_fatal_error("ran out of registers during register allocation");
|
||||
}
|
||||
// Keep going after reporting the error.
|
||||
VRM->assignVirt2Phys(VirtReg->reg,
|
||||
RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg)).front());
|
||||
VRM->assignVirt2Phys(
|
||||
VirtReg->reg(),
|
||||
RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg())).front());
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -145,16 +147,16 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
assert(LIS->hasInterval(Reg));
|
||||
|
||||
LiveInterval *SplitVirtReg = &LIS->getInterval(Reg);
|
||||
assert(!VRM->hasPhys(SplitVirtReg->reg) && "Register already assigned");
|
||||
if (MRI->reg_nodbg_empty(SplitVirtReg->reg)) {
|
||||
assert(!VRM->hasPhys(SplitVirtReg->reg()) && "Register already assigned");
|
||||
if (MRI->reg_nodbg_empty(SplitVirtReg->reg())) {
|
||||
assert(SplitVirtReg->empty() && "Non-empty but used interval");
|
||||
LLVM_DEBUG(dbgs() << "not queueing unused " << *SplitVirtReg << '\n');
|
||||
aboutToRemoveInterval(*SplitVirtReg);
|
||||
LIS->removeInterval(SplitVirtReg->reg);
|
||||
LIS->removeInterval(SplitVirtReg->reg());
|
||||
continue;
|
||||
}
|
||||
LLVM_DEBUG(dbgs() << "queuing new interval: " << *SplitVirtReg << "\n");
|
||||
assert(Register::isVirtualRegister(SplitVirtReg->reg) &&
|
||||
assert(Register::isVirtualRegister(SplitVirtReg->reg()) &&
|
||||
"expect split value in virtual register");
|
||||
enqueue(SplitVirtReg);
|
||||
++NumNewQueued;
|
||||
|
@ -46,7 +46,7 @@ static RegisterRegAlloc basicRegAlloc("basic", "basic register allocator",
|
||||
namespace {
|
||||
struct CompSpillWeight {
|
||||
bool operator()(LiveInterval *A, LiveInterval *B) const {
|
||||
return A->weight < B->weight;
|
||||
return A->weight() < B->weight();
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -213,7 +213,7 @@ bool RABasic::spillInterferences(LiveInterval &VirtReg, Register PhysReg,
|
||||
Q.collectInterferingVRegs();
|
||||
for (unsigned i = Q.interferingVRegs().size(); i; --i) {
|
||||
LiveInterval *Intf = Q.interferingVRegs()[i - 1];
|
||||
if (!Intf->isSpillable() || Intf->weight > VirtReg.weight)
|
||||
if (!Intf->isSpillable() || Intf->weight() > VirtReg.weight())
|
||||
return false;
|
||||
Intfs.push_back(Intf);
|
||||
}
|
||||
@ -227,7 +227,7 @@ bool RABasic::spillInterferences(LiveInterval &VirtReg, Register PhysReg,
|
||||
LiveInterval &Spill = *Intfs[i];
|
||||
|
||||
// Skip duplicates.
|
||||
if (!VRM->hasPhys(Spill.reg))
|
||||
if (!VRM->hasPhys(Spill.reg()))
|
||||
continue;
|
||||
|
||||
// Deallocate the interfering vreg by removing it from the union.
|
||||
@ -259,7 +259,7 @@ Register RABasic::selectOrSplit(LiveInterval &VirtReg,
|
||||
SmallVector<Register, 8> PhysRegSpillCands;
|
||||
|
||||
// Check for an available register in this class.
|
||||
AllocationOrder Order(VirtReg.reg, *VRM, RegClassInfo, Matrix);
|
||||
AllocationOrder Order(VirtReg.reg(), *VRM, RegClassInfo, Matrix);
|
||||
while (Register PhysReg = Order.next()) {
|
||||
// Check for interference in PhysReg
|
||||
switch (Matrix->checkInterference(VirtReg, PhysReg)) {
|
||||
|
@ -247,12 +247,12 @@ class RAGreedy : public MachineFunctionPass,
|
||||
IndexedMap<RegInfo, VirtReg2IndexFunctor> ExtraRegInfo;
|
||||
|
||||
LiveRangeStage getStage(const LiveInterval &VirtReg) const {
|
||||
return ExtraRegInfo[VirtReg.reg].Stage;
|
||||
return ExtraRegInfo[VirtReg.reg()].Stage;
|
||||
}
|
||||
|
||||
void setStage(const LiveInterval &VirtReg, LiveRangeStage Stage) {
|
||||
ExtraRegInfo.resize(MRI->getNumVirtRegs());
|
||||
ExtraRegInfo[VirtReg.reg].Stage = Stage;
|
||||
ExtraRegInfo[VirtReg.reg()].Stage = Stage;
|
||||
}
|
||||
|
||||
template<typename Iterator>
|
||||
@ -677,7 +677,7 @@ void RAGreedy::enqueue(PQueue &CurQueue, LiveInterval *LI) {
|
||||
// Prioritize live ranges by size, assigning larger ranges first.
|
||||
// The queue holds (size, reg) pairs.
|
||||
const unsigned Size = LI->getSize();
|
||||
const unsigned Reg = LI->reg;
|
||||
const unsigned Reg = LI->reg();
|
||||
assert(Register::isVirtualRegister(Reg) &&
|
||||
"Can only enqueue virtual registers");
|
||||
unsigned Prio;
|
||||
@ -768,7 +768,7 @@ Register RAGreedy::tryAssign(LiveInterval &VirtReg,
|
||||
|
||||
// If we missed a simple hint, try to cheaply evict interference from the
|
||||
// preferred register.
|
||||
if (Register Hint = MRI->getSimpleHint(VirtReg.reg))
|
||||
if (Register Hint = MRI->getSimpleHint(VirtReg.reg()))
|
||||
if (Order.isHint(Hint)) {
|
||||
LLVM_DEBUG(dbgs() << "missed hint " << printReg(Hint, TRI) << '\n');
|
||||
EvictionCost MaxCost;
|
||||
@ -800,7 +800,7 @@ Register RAGreedy::tryAssign(LiveInterval &VirtReg,
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
Register RAGreedy::canReassign(LiveInterval &VirtReg, Register PrevReg) {
|
||||
AllocationOrder Order(VirtReg.reg, *VRM, RegClassInfo, Matrix);
|
||||
AllocationOrder Order(VirtReg.reg(), *VRM, RegClassInfo, Matrix);
|
||||
Register PhysReg;
|
||||
while ((PhysReg = Order.next())) {
|
||||
if (PhysReg == PrevReg)
|
||||
@ -846,8 +846,8 @@ bool RAGreedy::shouldEvict(LiveInterval &A, bool IsHint,
|
||||
if (CanSplit && IsHint && !BreaksHint)
|
||||
return true;
|
||||
|
||||
if (A.weight > B.weight) {
|
||||
LLVM_DEBUG(dbgs() << "should evict: " << B << " w= " << B.weight << '\n');
|
||||
if (A.weight() > B.weight()) {
|
||||
LLVM_DEBUG(dbgs() << "should evict: " << B << " w= " << B.weight() << '\n');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -878,7 +878,7 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
//
|
||||
// This works out so a register without a cascade number is allowed to evict
|
||||
// anything, and it can be evicted by anything.
|
||||
unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
|
||||
unsigned Cascade = ExtraRegInfo[VirtReg.reg()].Cascade;
|
||||
if (!Cascade)
|
||||
Cascade = NextCascade;
|
||||
|
||||
@ -892,13 +892,13 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
// Check if any interfering live range is heavier than MaxWeight.
|
||||
for (unsigned i = Q.interferingVRegs().size(); i; --i) {
|
||||
LiveInterval *Intf = Q.interferingVRegs()[i - 1];
|
||||
assert(Register::isVirtualRegister(Intf->reg) &&
|
||||
assert(Register::isVirtualRegister(Intf->reg()) &&
|
||||
"Only expecting virtual register interference from query");
|
||||
|
||||
// Do not allow eviction of a virtual register if we are in the middle
|
||||
// of last-chance recoloring and this virtual register is one that we
|
||||
// have scavenged a physical register for.
|
||||
if (FixedRegisters.count(Intf->reg))
|
||||
if (FixedRegisters.count(Intf->reg()))
|
||||
return false;
|
||||
|
||||
// Never evict spill products. They cannot split or spill.
|
||||
@ -910,12 +910,14 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
//
|
||||
// Also allow urgent evictions of unspillable ranges from a strictly
|
||||
// larger allocation order.
|
||||
bool Urgent = !VirtReg.isSpillable() &&
|
||||
(Intf->isSpillable() ||
|
||||
RegClassInfo.getNumAllocatableRegs(MRI->getRegClass(VirtReg.reg)) <
|
||||
RegClassInfo.getNumAllocatableRegs(MRI->getRegClass(Intf->reg)));
|
||||
bool Urgent =
|
||||
!VirtReg.isSpillable() &&
|
||||
(Intf->isSpillable() ||
|
||||
RegClassInfo.getNumAllocatableRegs(MRI->getRegClass(VirtReg.reg())) <
|
||||
RegClassInfo.getNumAllocatableRegs(
|
||||
MRI->getRegClass(Intf->reg())));
|
||||
// Only evict older cascades or live ranges without a cascade.
|
||||
unsigned IntfCascade = ExtraRegInfo[Intf->reg].Cascade;
|
||||
unsigned IntfCascade = ExtraRegInfo[Intf->reg()].Cascade;
|
||||
if (Cascade <= IntfCascade) {
|
||||
if (!Urgent)
|
||||
return false;
|
||||
@ -924,10 +926,10 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
Cost.BrokenHints += 10;
|
||||
}
|
||||
// Would this break a satisfied hint?
|
||||
bool BreaksHint = VRM->hasPreferredPhys(Intf->reg);
|
||||
bool BreaksHint = VRM->hasPreferredPhys(Intf->reg());
|
||||
// Update eviction cost.
|
||||
Cost.BrokenHints += BreaksHint;
|
||||
Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight);
|
||||
Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight());
|
||||
// Abort if this would be too expensive.
|
||||
if (!(Cost < MaxCost))
|
||||
return false;
|
||||
@ -977,17 +979,17 @@ bool RAGreedy::canEvictInterferenceInRange(LiveInterval &VirtReg,
|
||||
continue;
|
||||
|
||||
// Cannot evict non virtual reg interference.
|
||||
if (!Register::isVirtualRegister(Intf->reg))
|
||||
if (!Register::isVirtualRegister(Intf->reg()))
|
||||
return false;
|
||||
// Never evict spill products. They cannot split or spill.
|
||||
if (getStage(*Intf) == RS_Done)
|
||||
return false;
|
||||
|
||||
// Would this break a satisfied hint?
|
||||
bool BreaksHint = VRM->hasPreferredPhys(Intf->reg);
|
||||
bool BreaksHint = VRM->hasPreferredPhys(Intf->reg());
|
||||
// Update eviction cost.
|
||||
Cost.BrokenHints += BreaksHint;
|
||||
Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight);
|
||||
Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight());
|
||||
// Abort if this would be too expensive.
|
||||
if (!(Cost < MaxCost))
|
||||
return false;
|
||||
@ -1018,7 +1020,7 @@ unsigned RAGreedy::getCheapestEvicteeWeight(const AllocationOrder &Order,
|
||||
float *BestEvictweight) {
|
||||
EvictionCost BestEvictCost;
|
||||
BestEvictCost.setMax();
|
||||
BestEvictCost.MaxWeight = VirtReg.weight;
|
||||
BestEvictCost.MaxWeight = VirtReg.weight();
|
||||
unsigned BestEvicteePhys = 0;
|
||||
|
||||
// Go over all physical registers and find the best candidate for eviction
|
||||
@ -1043,9 +1045,9 @@ void RAGreedy::evictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
// Make sure that VirtReg has a cascade number, and assign that cascade
|
||||
// number to every evicted register. These live ranges than then only be
|
||||
// evicted by a newer cascade, preventing infinite loops.
|
||||
unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
|
||||
unsigned Cascade = ExtraRegInfo[VirtReg.reg()].Cascade;
|
||||
if (!Cascade)
|
||||
Cascade = ExtraRegInfo[VirtReg.reg].Cascade = NextCascade++;
|
||||
Cascade = ExtraRegInfo[VirtReg.reg()].Cascade = NextCascade++;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "evicting " << printReg(PhysReg, TRI)
|
||||
<< " interference: Cascade " << Cascade << '\n');
|
||||
@ -1067,18 +1069,18 @@ void RAGreedy::evictInterference(LiveInterval &VirtReg, Register PhysReg,
|
||||
for (unsigned i = 0, e = Intfs.size(); i != e; ++i) {
|
||||
LiveInterval *Intf = Intfs[i];
|
||||
// The same VirtReg may be present in multiple RegUnits. Skip duplicates.
|
||||
if (!VRM->hasPhys(Intf->reg))
|
||||
if (!VRM->hasPhys(Intf->reg()))
|
||||
continue;
|
||||
|
||||
LastEvicted.addEviction(PhysReg, VirtReg.reg, Intf->reg);
|
||||
LastEvicted.addEviction(PhysReg, VirtReg.reg(), Intf->reg());
|
||||
|
||||
Matrix->unassign(*Intf);
|
||||
assert((ExtraRegInfo[Intf->reg].Cascade < Cascade ||
|
||||
assert((ExtraRegInfo[Intf->reg()].Cascade < Cascade ||
|
||||
VirtReg.isSpillable() < Intf->isSpillable()) &&
|
||||
"Cannot decrease cascade number, illegal eviction");
|
||||
ExtraRegInfo[Intf->reg].Cascade = Cascade;
|
||||
ExtraRegInfo[Intf->reg()].Cascade = Cascade;
|
||||
++NumEvicted;
|
||||
NewVRegs.push_back(Intf->reg);
|
||||
NewVRegs.push_back(Intf->reg());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1114,10 +1116,10 @@ unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
|
||||
// hints, and only evict smaller spill weights.
|
||||
if (CostPerUseLimit < ~0u) {
|
||||
BestCost.BrokenHints = 0;
|
||||
BestCost.MaxWeight = VirtReg.weight;
|
||||
BestCost.MaxWeight = VirtReg.weight();
|
||||
|
||||
// Check of any registers in RC are below CostPerUseLimit.
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(VirtReg.reg);
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(VirtReg.reg());
|
||||
unsigned MinCost = RegClassInfo.getMinCost(RC);
|
||||
if (MinCost >= CostPerUseLimit) {
|
||||
LLVM_DEBUG(dbgs() << TRI->getRegClassName(RC) << " minimum cost = "
|
||||
@ -1578,7 +1580,7 @@ BlockFrequency RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand,
|
||||
bool *CanCauseEvictionChain) {
|
||||
BlockFrequency GlobalCost = 0;
|
||||
const BitVector &LiveBundles = Cand.LiveBundles;
|
||||
unsigned VirtRegToSplit = SA->getParent().reg;
|
||||
unsigned VirtRegToSplit = SA->getParent().reg();
|
||||
ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
|
||||
for (unsigned i = 0; i != UseBlocks.size(); ++i) {
|
||||
const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
|
||||
@ -1679,7 +1681,7 @@ void RAGreedy::splitAroundRegion(LiveRangeEdit &LREdit,
|
||||
// Isolate even single instructions when dealing with a proper sub-class.
|
||||
// That guarantees register class inflation for the stack interval because it
|
||||
// is all copies.
|
||||
unsigned Reg = SA->getParent().reg;
|
||||
unsigned Reg = SA->getParent().reg();
|
||||
bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg));
|
||||
|
||||
// First handle all the blocks with uses.
|
||||
@ -1942,7 +1944,7 @@ unsigned RAGreedy::calculateRegionSplitCost(LiveInterval &VirtReg,
|
||||
// See splitCanCauseEvictionChain for detailed description of bad
|
||||
// eviction chain scenarios.
|
||||
LLVM_DEBUG(dbgs() << "Best split candidate of vreg "
|
||||
<< printReg(VirtReg.reg, TRI) << " may ");
|
||||
<< printReg(VirtReg.reg(), TRI) << " may ");
|
||||
if (!(*CanCauseEvictionChain))
|
||||
LLVM_DEBUG(dbgs() << "not ");
|
||||
LLVM_DEBUG(dbgs() << "cause bad eviction chain\n");
|
||||
@ -2001,7 +2003,7 @@ unsigned RAGreedy::doRegionSplit(LiveInterval &VirtReg, unsigned BestCand,
|
||||
unsigned RAGreedy::tryBlockSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
SmallVectorImpl<Register> &NewVRegs) {
|
||||
assert(&SA->getParent() == &VirtReg && "Live range wasn't analyzed");
|
||||
Register Reg = VirtReg.reg;
|
||||
Register Reg = VirtReg.reg();
|
||||
bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg));
|
||||
LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
|
||||
SE->reset(LREdit, SplitSpillMode);
|
||||
@ -2067,7 +2069,7 @@ static unsigned getNumAllocatableRegsForConstraints(
|
||||
unsigned
|
||||
RAGreedy::tryInstructionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
SmallVectorImpl<Register> &NewVRegs) {
|
||||
const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg);
|
||||
const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg());
|
||||
// There is no point to this if there are no larger sub-classes.
|
||||
if (!RegClassInfo.isProperSubClass(CurRC))
|
||||
return 0;
|
||||
@ -2095,8 +2097,8 @@ RAGreedy::tryInstructionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
if (const MachineInstr *MI = Indexes->getInstructionFromIndex(Uses[i]))
|
||||
if (MI->isFullCopy() ||
|
||||
SuperRCNumAllocatableRegs ==
|
||||
getNumAllocatableRegsForConstraints(MI, VirtReg.reg, SuperRC, TII,
|
||||
TRI, RCI)) {
|
||||
getNumAllocatableRegsForConstraints(MI, VirtReg.reg(), SuperRC,
|
||||
TII, TRI, RCI)) {
|
||||
LLVM_DEBUG(dbgs() << " skip:\t" << Uses[i] << '\t' << *MI);
|
||||
continue;
|
||||
}
|
||||
@ -2113,7 +2115,7 @@ RAGreedy::tryInstructionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
|
||||
SmallVector<unsigned, 8> IntvMap;
|
||||
SE->finish(&IntvMap);
|
||||
DebugVars->splitRegister(VirtReg.reg, LREdit.regs(), *LIS);
|
||||
DebugVars->splitRegister(VirtReg.reg(), LREdit.regs(), *LIS);
|
||||
ExtraRegInfo.resize(MRI->getNumVirtRegs());
|
||||
|
||||
// Assign all new registers to RS_Spill. This was the last chance.
|
||||
@ -2169,7 +2171,7 @@ void RAGreedy::calcGapWeights(unsigned PhysReg,
|
||||
break;
|
||||
|
||||
// Update the gaps covered by IntI.
|
||||
const float weight = IntI.value()->weight;
|
||||
const float weight = IntI.value()->weight();
|
||||
for (; Gap != NumGaps; ++Gap) {
|
||||
GapWeight[Gap] = std::max(GapWeight[Gap], weight);
|
||||
if (Uses[Gap+1].getBaseIndex() >= IntI.stop())
|
||||
@ -2409,7 +2411,7 @@ unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
SE->useIntv(SegStart, SegStop);
|
||||
SmallVector<unsigned, 8> IntvMap;
|
||||
SE->finish(&IntvMap);
|
||||
DebugVars->splitRegister(VirtReg.reg, LREdit.regs(), *LIS);
|
||||
DebugVars->splitRegister(VirtReg.reg(), LREdit.regs(), *LIS);
|
||||
|
||||
// If the new range has the same number of instructions as before, mark it as
|
||||
// RS_Split2 so the next split will be forced to make progress. Otherwise,
|
||||
@ -2511,7 +2513,7 @@ bool
|
||||
RAGreedy::mayRecolorAllInterferences(unsigned PhysReg, LiveInterval &VirtReg,
|
||||
SmallLISet &RecoloringCandidates,
|
||||
const SmallVirtRegSet &FixedRegisters) {
|
||||
const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg);
|
||||
const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg());
|
||||
|
||||
for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
|
||||
LiveIntervalUnion::Query &Q = Matrix->query(VirtReg, *Units);
|
||||
@ -2530,9 +2532,10 @@ RAGreedy::mayRecolorAllInterferences(unsigned PhysReg, LiveInterval &VirtReg,
|
||||
// However, if VirtReg has tied defs and Intf doesn't, then
|
||||
// there is still a point in examining if it can be recolorable.
|
||||
if (((getStage(*Intf) == RS_Done &&
|
||||
MRI->getRegClass(Intf->reg) == CurRC) &&
|
||||
!(hasTiedDef(MRI, VirtReg.reg) && !hasTiedDef(MRI, Intf->reg))) ||
|
||||
FixedRegisters.count(Intf->reg)) {
|
||||
MRI->getRegClass(Intf->reg()) == CurRC) &&
|
||||
!(hasTiedDef(MRI, VirtReg.reg()) &&
|
||||
!hasTiedDef(MRI, Intf->reg()))) ||
|
||||
FixedRegisters.count(Intf->reg())) {
|
||||
LLVM_DEBUG(
|
||||
dbgs() << "Early abort: the interference is not recolorable.\n");
|
||||
return false;
|
||||
@ -2608,8 +2611,8 @@ unsigned RAGreedy::tryLastChanceRecoloring(LiveInterval &VirtReg,
|
||||
DenseMap<Register, Register> VirtRegToPhysReg;
|
||||
// Mark VirtReg as fixed, i.e., it will not be recolored pass this point in
|
||||
// this recoloring "session".
|
||||
assert(!FixedRegisters.count(VirtReg.reg));
|
||||
FixedRegisters.insert(VirtReg.reg);
|
||||
assert(!FixedRegisters.count(VirtReg.reg()));
|
||||
FixedRegisters.insert(VirtReg.reg());
|
||||
SmallVector<Register, 4> CurrentNewVRegs;
|
||||
|
||||
Order.rewind();
|
||||
@ -2644,7 +2647,7 @@ unsigned RAGreedy::tryLastChanceRecoloring(LiveInterval &VirtReg,
|
||||
for (SmallLISet::iterator It = RecoloringCandidates.begin(),
|
||||
EndIt = RecoloringCandidates.end();
|
||||
It != EndIt; ++It) {
|
||||
Register ItVirtReg = (*It)->reg;
|
||||
Register ItVirtReg = (*It)->reg();
|
||||
enqueue(RecoloringQueue, *It);
|
||||
assert(VRM->hasPhys(ItVirtReg) &&
|
||||
"Interferences are supposed to be with allocated variables");
|
||||
@ -2697,7 +2700,7 @@ unsigned RAGreedy::tryLastChanceRecoloring(LiveInterval &VirtReg,
|
||||
for (SmallLISet::iterator It = RecoloringCandidates.begin(),
|
||||
EndIt = RecoloringCandidates.end();
|
||||
It != EndIt; ++It) {
|
||||
Register ItVirtReg = (*It)->reg;
|
||||
Register ItVirtReg = (*It)->reg();
|
||||
if (VRM->hasPhys(ItVirtReg))
|
||||
Matrix->unassign(**It);
|
||||
Register ItPhysReg = VirtRegToPhysReg[ItVirtReg];
|
||||
@ -2743,7 +2746,7 @@ bool RAGreedy::tryRecoloringCandidates(PQueue &RecoloringQueue,
|
||||
<< " succeeded with: " << printReg(PhysReg, TRI) << '\n');
|
||||
|
||||
Matrix->assign(*LI, PhysReg);
|
||||
FixedRegisters.insert(LI->reg);
|
||||
FixedRegisters.insert(LI->reg());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -2900,7 +2903,7 @@ void RAGreedy::tryHintRecoloring(LiveInterval &VirtReg) {
|
||||
SmallSet<unsigned, 4> Visited;
|
||||
SmallVector<unsigned, 2> RecoloringCandidates;
|
||||
HintsInfo Info;
|
||||
unsigned Reg = VirtReg.reg;
|
||||
unsigned Reg = VirtReg.reg();
|
||||
Register PhysReg = VRM->getPhys(Reg);
|
||||
// Start the recoloring algorithm from the input live-interval, then
|
||||
// it will propagate to the ones that are copy-related with it.
|
||||
@ -3003,11 +3006,11 @@ void RAGreedy::tryHintRecoloring(LiveInterval &VirtReg) {
|
||||
/// getting rid of 2 copies.
|
||||
void RAGreedy::tryHintsRecoloring() {
|
||||
for (LiveInterval *LI : SetOfBrokenHints) {
|
||||
assert(Register::isVirtualRegister(LI->reg) &&
|
||||
assert(Register::isVirtualRegister(LI->reg()) &&
|
||||
"Recoloring is possible only for virtual registers");
|
||||
// Some dead defs may be around (e.g., because of debug uses).
|
||||
// Ignore those.
|
||||
if (!VRM->hasPhys(LI->reg))
|
||||
if (!VRM->hasPhys(LI->reg()))
|
||||
continue;
|
||||
tryHintRecoloring(*LI);
|
||||
}
|
||||
@ -3019,10 +3022,10 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
unsigned Depth) {
|
||||
unsigned CostPerUseLimit = ~0u;
|
||||
// First try assigning a free register.
|
||||
AllocationOrder Order(VirtReg.reg, *VRM, RegClassInfo, Matrix);
|
||||
AllocationOrder Order(VirtReg.reg(), *VRM, RegClassInfo, Matrix);
|
||||
if (unsigned PhysReg = tryAssign(VirtReg, Order, NewVRegs, FixedRegisters)) {
|
||||
// If VirtReg got an assignment, the eviction info is no longre relevant.
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg);
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg());
|
||||
// When NewVRegs is not empty, we may have made decisions such as evicting
|
||||
// a virtual register, go with the earlier decisions and use the physical
|
||||
// register.
|
||||
@ -3040,7 +3043,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
|
||||
LiveRangeStage Stage = getStage(VirtReg);
|
||||
LLVM_DEBUG(dbgs() << StageName[Stage] << " Cascade "
|
||||
<< ExtraRegInfo[VirtReg.reg].Cascade << '\n');
|
||||
<< ExtraRegInfo[VirtReg.reg()].Cascade << '\n');
|
||||
|
||||
// Try to evict a less worthy live range, but only for ranges from the primary
|
||||
// queue. The RS_Split ranges already failed to do this, and they should not
|
||||
@ -3049,7 +3052,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
if (Register PhysReg =
|
||||
tryEvict(VirtReg, Order, NewVRegs, CostPerUseLimit,
|
||||
FixedRegisters)) {
|
||||
Register Hint = MRI->getSimpleHint(VirtReg.reg);
|
||||
Register Hint = MRI->getSimpleHint(VirtReg.reg());
|
||||
// If VirtReg has a hint and that hint is broken record this
|
||||
// virtual register as a recoloring candidate for broken hint.
|
||||
// Indeed, since we evicted a variable in its neighborhood it is
|
||||
@ -3059,7 +3062,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
SetOfBrokenHints.insert(&VirtReg);
|
||||
// If VirtReg eviction someone, the eviction info for it as an evictee is
|
||||
// no longre relevant.
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg);
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg());
|
||||
return PhysReg;
|
||||
}
|
||||
|
||||
@ -3071,7 +3074,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
if (Stage < RS_Split) {
|
||||
setStage(VirtReg, RS_Split);
|
||||
LLVM_DEBUG(dbgs() << "wait for second round\n");
|
||||
NewVRegs.push_back(VirtReg.reg);
|
||||
NewVRegs.push_back(VirtReg.reg());
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3081,7 +3084,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
Register PhysReg = trySplit(VirtReg, Order, NewVRegs, FixedRegisters);
|
||||
if (PhysReg || (NewVRegs.size() - NewVRegSizeBefore)) {
|
||||
// If VirtReg got split, the eviction info is no longer relevant.
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg);
|
||||
LastEvicted.clearEvicteeInfo(VirtReg.reg());
|
||||
return PhysReg;
|
||||
}
|
||||
}
|
||||
@ -3100,7 +3103,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
// right thing here. Anyway, that is still good for early testing.
|
||||
setStage(VirtReg, RS_Memory);
|
||||
LLVM_DEBUG(dbgs() << "Do as if this register is in memory\n");
|
||||
NewVRegs.push_back(VirtReg.reg);
|
||||
NewVRegs.push_back(VirtReg.reg());
|
||||
} else {
|
||||
NamedRegionTimer T("spill", "Spiller", TimerGroupName,
|
||||
TimerGroupDescription, TimePassesIsEnabled);
|
||||
@ -3111,7 +3114,7 @@ Register RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
|
||||
// Tell LiveDebugVariables about the new ranges. Ranges not being covered by
|
||||
// the new regs are kept in LDV (still mapping to the old register), until
|
||||
// we rewrite spilled locations in LDV at a later stage.
|
||||
DebugVars->splitRegister(VirtReg.reg, LRE.regs(), *LIS);
|
||||
DebugVars->splitRegister(VirtReg.reg(), LRE.regs(), *LIS);
|
||||
|
||||
if (VerifyEnabled)
|
||||
MF->verify(this, "After spilling");
|
||||
|
@ -199,7 +199,7 @@ public:
|
||||
|
||||
for (auto NId : G.nodeIds()) {
|
||||
PBQP::PBQPNum SpillCost =
|
||||
LIS.getInterval(G.getNodeMetadata(NId).getVReg()).weight;
|
||||
LIS.getInterval(G.getNodeMetadata(NId).getVReg()).weight();
|
||||
if (SpillCost == 0.0)
|
||||
SpillCost = std::numeric_limits<PBQP::PBQPNum>::min();
|
||||
else
|
||||
@ -290,7 +290,7 @@ private:
|
||||
// If two intervals end at the same point, we need a way to break the tie or
|
||||
// the set will assume they're actually equal and refuse to insert a
|
||||
// "duplicate". Just compare the vregs - fast and guaranteed unique.
|
||||
return std::get<0>(I1)->reg < std::get<0>(I2)->reg;
|
||||
return std::get<0>(I1)->reg() < std::get<0>(I2)->reg();
|
||||
}
|
||||
|
||||
static bool isAtLastSegment(const IntervalInfo &I) {
|
||||
@ -595,8 +595,8 @@ void RegAllocPBQP::initializeGraph(PBQPRAGraph &G, VirtRegMap &VRM,
|
||||
// If this is an empty interval move it to the EmptyIntervalVRegs set then
|
||||
// continue.
|
||||
if (VRegLI.empty()) {
|
||||
EmptyIntervalVRegs.insert(VRegLI.reg);
|
||||
VRegsToAlloc.erase(VRegLI.reg);
|
||||
EmptyIntervalVRegs.insert(VRegLI.reg());
|
||||
VRegsToAlloc.erase(VRegLI.reg());
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -684,7 +684,7 @@ void RegAllocPBQP::spillVReg(Register VReg,
|
||||
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
|
||||
(void)TRI;
|
||||
LLVM_DEBUG(dbgs() << "VREG " << printReg(VReg, &TRI) << " -> SPILLED (Cost: "
|
||||
<< LRE.getParent().weight << ", New vregs: ");
|
||||
<< LRE.getParent().weight() << ", New vregs: ");
|
||||
|
||||
// Copy any newly inserted live intervals into the list of regs to
|
||||
// allocate.
|
||||
@ -692,8 +692,8 @@ void RegAllocPBQP::spillVReg(Register VReg,
|
||||
I != E; ++I) {
|
||||
const LiveInterval &LI = LIS.getInterval(*I);
|
||||
assert(!LI.empty() && "Empty spill range.");
|
||||
LLVM_DEBUG(dbgs() << printReg(LI.reg, &TRI) << " ");
|
||||
VRegsToAlloc.insert(LI.reg);
|
||||
LLVM_DEBUG(dbgs() << printReg(LI.reg(), &TRI) << " ");
|
||||
VRegsToAlloc.insert(LI.reg());
|
||||
}
|
||||
|
||||
LLVM_DEBUG(dbgs() << ")\n");
|
||||
@ -749,10 +749,10 @@ void RegAllocPBQP::finalizeAlloc(MachineFunction &MF,
|
||||
I != E; ++I) {
|
||||
LiveInterval &LI = LIS.getInterval(*I);
|
||||
|
||||
unsigned PReg = MRI.getSimpleHint(LI.reg);
|
||||
unsigned PReg = MRI.getSimpleHint(LI.reg());
|
||||
|
||||
if (PReg == 0) {
|
||||
const TargetRegisterClass &RC = *MRI.getRegClass(LI.reg);
|
||||
const TargetRegisterClass &RC = *MRI.getRegClass(LI.reg());
|
||||
const ArrayRef<MCPhysReg> RawPRegOrder = RC.getRawAllocationOrder(MF);
|
||||
for (unsigned CandidateReg : RawPRegOrder) {
|
||||
if (!VRM.getRegInfo().isReserved(CandidateReg)) {
|
||||
@ -764,7 +764,7 @@ void RegAllocPBQP::finalizeAlloc(MachineFunction &MF,
|
||||
"No un-reserved physical registers in this register class");
|
||||
}
|
||||
|
||||
VRM.assignVirt2Phys(LI.reg, PReg);
|
||||
VRM.assignVirt2Phys(LI.reg(), PReg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -649,7 +649,7 @@ bool RegisterCoalescer::adjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
// in IntB, we can merge them.
|
||||
if (ValS+1 != BS) return false;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Extending: " << printReg(IntB.reg, TRI));
|
||||
LLVM_DEBUG(dbgs() << "Extending: " << printReg(IntB.reg(), TRI));
|
||||
|
||||
SlotIndex FillerStart = ValS->end, FillerEnd = BS->start;
|
||||
// We are about to delete CopyMI, so need to remove it as the 'instruction
|
||||
@ -692,13 +692,13 @@ bool RegisterCoalescer::adjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
|
||||
// If the source instruction was killing the source register before the
|
||||
// merge, unset the isKill marker given the live range has been extended.
|
||||
int UIdx = ValSEndInst->findRegisterUseOperandIdx(IntB.reg, true);
|
||||
int UIdx = ValSEndInst->findRegisterUseOperandIdx(IntB.reg(), true);
|
||||
if (UIdx != -1) {
|
||||
ValSEndInst->getOperand(UIdx).setIsKill(false);
|
||||
}
|
||||
|
||||
// Rewrite the copy.
|
||||
CopyMI->substituteRegister(IntA.reg, IntB.reg, 0, *TRI);
|
||||
CopyMI->substituteRegister(IntA.reg(), IntB.reg(), 0, *TRI);
|
||||
// If the copy instruction was killing the destination register or any
|
||||
// subrange before the merge trim the live range.
|
||||
bool RecomputeLiveRange = AS->end == CopyIdx;
|
||||
@ -817,7 +817,7 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
return { false, false };
|
||||
// If DefMI is a two-address instruction then commuting it will change the
|
||||
// destination register.
|
||||
int DefIdx = DefMI->findRegisterDefOperandIdx(IntA.reg);
|
||||
int DefIdx = DefMI->findRegisterDefOperandIdx(IntA.reg());
|
||||
assert(DefIdx != -1);
|
||||
unsigned UseOpIdx;
|
||||
if (!DefMI->isRegTiedToUseOperand(DefIdx, &UseOpIdx))
|
||||
@ -838,7 +838,7 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
|
||||
MachineOperand &NewDstMO = DefMI->getOperand(NewDstIdx);
|
||||
Register NewReg = NewDstMO.getReg();
|
||||
if (NewReg != IntB.reg || !IntB.Query(AValNo->def).isKill())
|
||||
if (NewReg != IntB.reg() || !IntB.Query(AValNo->def).isKill())
|
||||
return { false, false };
|
||||
|
||||
// Make sure there are no other definitions of IntB that would reach the
|
||||
@ -848,7 +848,7 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
|
||||
// If some of the uses of IntA.reg is already coalesced away, return false.
|
||||
// It's not possible to determine whether it's safe to perform the coalescing.
|
||||
for (MachineOperand &MO : MRI->use_nodbg_operands(IntA.reg)) {
|
||||
for (MachineOperand &MO : MRI->use_nodbg_operands(IntA.reg())) {
|
||||
MachineInstr *UseMI = MO.getParent();
|
||||
unsigned OpNo = &MO - &UseMI->getOperand(0);
|
||||
SlotIndex UseIdx = LIS->getInstructionIndex(*UseMI);
|
||||
@ -870,9 +870,9 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
TII->commuteInstruction(*DefMI, false, UseOpIdx, NewDstIdx);
|
||||
if (!NewMI)
|
||||
return { false, false };
|
||||
if (Register::isVirtualRegister(IntA.reg) &&
|
||||
Register::isVirtualRegister(IntB.reg) &&
|
||||
!MRI->constrainRegClass(IntB.reg, MRI->getRegClass(IntA.reg)))
|
||||
if (Register::isVirtualRegister(IntA.reg()) &&
|
||||
Register::isVirtualRegister(IntB.reg()) &&
|
||||
!MRI->constrainRegClass(IntB.reg(), MRI->getRegClass(IntA.reg())))
|
||||
return { false, false };
|
||||
if (NewMI != DefMI) {
|
||||
LIS->ReplaceMachineInstrInMaps(*DefMI, *NewMI);
|
||||
@ -891,9 +891,10 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
// = B
|
||||
|
||||
// Update uses of IntA of the specific Val# with IntB.
|
||||
for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(IntA.reg),
|
||||
for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(IntA.reg()),
|
||||
UE = MRI->use_end();
|
||||
UI != UE; /* ++UI is below because of possible MI removal */) {
|
||||
UI != UE;
|
||||
/* ++UI is below because of possible MI removal */) {
|
||||
MachineOperand &UseMO = *UI;
|
||||
++UI;
|
||||
if (UseMO.isUndef())
|
||||
@ -920,7 +921,7 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
continue;
|
||||
if (!UseMI->isCopy())
|
||||
continue;
|
||||
if (UseMI->getOperand(0).getReg() != IntB.reg ||
|
||||
if (UseMI->getOperand(0).getReg() != IntB.reg() ||
|
||||
UseMI->getOperand(0).getSubReg())
|
||||
continue;
|
||||
|
||||
@ -951,10 +952,10 @@ RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
BumpPtrAllocator &Allocator = LIS->getVNInfoAllocator();
|
||||
if (IntA.hasSubRanges() || IntB.hasSubRanges()) {
|
||||
if (!IntA.hasSubRanges()) {
|
||||
LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntA.reg);
|
||||
LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntA.reg());
|
||||
IntA.createSubRangeFrom(Allocator, Mask, IntA);
|
||||
} else if (!IntB.hasSubRanges()) {
|
||||
LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntB.reg);
|
||||
LaneBitmask Mask = MRI->getMaxLaneMaskForVReg(IntB.reg());
|
||||
IntB.createSubRangeFrom(Allocator, Mask, IntB);
|
||||
}
|
||||
SlotIndex AIdx = CopyIdx.getRegSlot(true);
|
||||
@ -1100,8 +1101,8 @@ bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP,
|
||||
continue;
|
||||
}
|
||||
// Check DefMI is a reverse copy and it is in BB Pred.
|
||||
if (DefMI->getOperand(0).getReg() != IntA.reg ||
|
||||
DefMI->getOperand(1).getReg() != IntB.reg ||
|
||||
if (DefMI->getOperand(0).getReg() != IntA.reg() ||
|
||||
DefMI->getOperand(1).getReg() != IntB.reg() ||
|
||||
DefMI->getParent() != Pred) {
|
||||
CopyLeftBB = Pred;
|
||||
continue;
|
||||
@ -1158,8 +1159,8 @@ bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP,
|
||||
|
||||
// Insert new copy to CopyLeftBB.
|
||||
MachineInstr *NewCopyMI = BuildMI(*CopyLeftBB, InsPos, CopyMI.getDebugLoc(),
|
||||
TII->get(TargetOpcode::COPY), IntB.reg)
|
||||
.addReg(IntA.reg);
|
||||
TII->get(TargetOpcode::COPY), IntB.reg())
|
||||
.addReg(IntA.reg());
|
||||
SlotIndex NewCopyIdx =
|
||||
LIS->InsertMachineInstrInMaps(*NewCopyMI).getRegSlot();
|
||||
IntB.createDeadDef(NewCopyIdx, LIS->getVNInfoAllocator());
|
||||
@ -1752,7 +1753,7 @@ void RegisterCoalescer::updateRegDefsUses(unsigned SrcReg, unsigned DstReg,
|
||||
if (SubIdx != 0 && MO.isUse() && MRI->shouldTrackSubRegLiveness(DstReg)) {
|
||||
if (!DstInt->hasSubRanges()) {
|
||||
BumpPtrAllocator &Allocator = LIS->getVNInfoAllocator();
|
||||
LaneBitmask FullMask = MRI->getMaxLaneMaskForVReg(DstInt->reg);
|
||||
LaneBitmask FullMask = MRI->getMaxLaneMaskForVReg(DstInt->reg());
|
||||
LaneBitmask UsedLanes = TRI->getSubRegIndexLaneMask(SubIdx);
|
||||
LaneBitmask UnusedLanes = FullMask & ~UsedLanes;
|
||||
DstInt->createSubRangeFrom(Allocator, UsedLanes, *DstInt);
|
||||
@ -1991,7 +1992,7 @@ bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) {
|
||||
continue;
|
||||
LLVM_DEBUG(dbgs() << "Shrink LaneUses (Lane " << PrintLaneMask(S.LaneMask)
|
||||
<< ")\n");
|
||||
LIS->shrinkToUses(S, LI.reg);
|
||||
LIS->shrinkToUses(S, LI.reg());
|
||||
}
|
||||
LI.removeEmptySubRanges();
|
||||
}
|
||||
@ -3353,7 +3354,7 @@ void RegisterCoalescer::mergeSubRangeInto(LiveInterval &LI,
|
||||
bool RegisterCoalescer::isHighCostLiveInterval(LiveInterval &LI) {
|
||||
if (LI.valnos.size() < LargeIntervalSizeThreshold)
|
||||
return false;
|
||||
auto &Counter = LargeLIVisitCounter[LI.reg];
|
||||
auto &Counter = LargeLIVisitCounter[LI.reg()];
|
||||
if (Counter < LargeIntervalFreqThreshold) {
|
||||
Counter++;
|
||||
return false;
|
||||
@ -3456,8 +3457,8 @@ bool RegisterCoalescer::joinVirtRegs(CoalescerPair &CP) {
|
||||
// Kill flags are going to be wrong if the live ranges were overlapping.
|
||||
// Eventually, we should simply clear all kill flags when computing live
|
||||
// ranges. They are reinserted after register allocation.
|
||||
MRI->clearKillFlags(LHS.reg);
|
||||
MRI->clearKillFlags(RHS.reg);
|
||||
MRI->clearKillFlags(LHS.reg());
|
||||
MRI->clearKillFlags(RHS.reg());
|
||||
|
||||
if (!EndPoints.empty()) {
|
||||
// Recompute the parts of the live range we had to remove because of
|
||||
|
@ -130,7 +130,7 @@ bool RenameIndependentSubregs::renameComponents(LiveInterval &LI) const {
|
||||
return false;
|
||||
|
||||
// Create a new VReg for each class.
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
const TargetRegisterClass *RegClass = MRI->getRegClass(Reg);
|
||||
SmallVector<LiveInterval*, 4> Intervals;
|
||||
Intervals.push_back(&LI);
|
||||
@ -175,7 +175,7 @@ bool RenameIndependentSubregs::findComponents(IntEqClasses &Classes,
|
||||
// across subranges when they are affected by the same MachineOperand.
|
||||
const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
|
||||
Classes.grow(NumComponents);
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
for (const MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
|
||||
if (!MO.isDef() && !MO.readsReg())
|
||||
continue;
|
||||
@ -212,7 +212,7 @@ void RenameIndependentSubregs::rewriteOperands(const IntEqClasses &Classes,
|
||||
const SmallVectorImpl<SubRangeInfo> &SubRangeInfos,
|
||||
const SmallVectorImpl<LiveInterval*> &Intervals) const {
|
||||
const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
|
||||
unsigned Reg = Intervals[0]->reg;
|
||||
unsigned Reg = Intervals[0]->reg();
|
||||
for (MachineRegisterInfo::reg_nodbg_iterator I = MRI->reg_nodbg_begin(Reg),
|
||||
E = MRI->reg_nodbg_end(); I != E; ) {
|
||||
MachineOperand &MO = *I++;
|
||||
@ -242,7 +242,7 @@ void RenameIndependentSubregs::rewriteOperands(const IntEqClasses &Classes,
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned VReg = Intervals[ID]->reg;
|
||||
unsigned VReg = Intervals[ID]->reg();
|
||||
MO.setReg(VReg);
|
||||
|
||||
if (MO.isTied() && Reg != VReg) {
|
||||
@ -304,7 +304,7 @@ void RenameIndependentSubregs::computeMainRangesFixFlags(
|
||||
const SlotIndexes &Indexes = *LIS->getSlotIndexes();
|
||||
for (size_t I = 0, E = Intervals.size(); I < E; ++I) {
|
||||
LiveInterval &LI = *Intervals[I];
|
||||
unsigned Reg = LI.reg;
|
||||
unsigned Reg = LI.reg();
|
||||
|
||||
LI.removeEmptySubRanges();
|
||||
|
||||
|
@ -168,7 +168,7 @@ void SplitAnalysis::analyzeUses() {
|
||||
|
||||
// Get use slots form the use-def chain.
|
||||
const MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
for (MachineOperand &MO : MRI.use_nodbg_operands(CurLI->reg))
|
||||
for (MachineOperand &MO : MRI.use_nodbg_operands(CurLI->reg()))
|
||||
if (!MO.isUndef())
|
||||
UseSlots.push_back(LIS.getInstructionIndex(*MO.getParent()).getRegSlot());
|
||||
|
||||
@ -333,7 +333,7 @@ unsigned SplitAnalysis::countLiveBlocks(const LiveInterval *cli) const {
|
||||
}
|
||||
|
||||
bool SplitAnalysis::isOriginalEndpoint(SlotIndex Idx) const {
|
||||
unsigned OrigReg = VRM.getOriginal(CurLI->reg);
|
||||
unsigned OrigReg = VRM.getOriginal(CurLI->reg());
|
||||
const LiveInterval &Orig = LIS.getInterval(OrigReg);
|
||||
assert(!Orig.empty() && "Splitting empty interval?");
|
||||
LiveInterval::const_iterator I = Orig.find(Idx);
|
||||
@ -433,7 +433,7 @@ void SplitEditor::addDeadDef(LiveInterval &LI, VNInfo *VNI, bool Original) {
|
||||
LaneBitmask LM;
|
||||
for (const MachineOperand &DefOp : DefMI->defs()) {
|
||||
Register R = DefOp.getReg();
|
||||
if (R != LI.reg)
|
||||
if (R != LI.reg())
|
||||
continue;
|
||||
if (unsigned SR = DefOp.getSubReg())
|
||||
LM |= TRI.getSubRegIndexLaneMask(SR);
|
||||
@ -636,7 +636,7 @@ VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
|
||||
LiveInterval &OrigLI = LIS.getInterval(Original);
|
||||
VNInfo *OrigVNI = OrigLI.getVNInfoAt(UseIdx);
|
||||
|
||||
unsigned Reg = LI->reg;
|
||||
unsigned Reg = LI->reg();
|
||||
bool DidRemat = false;
|
||||
if (OrigVNI) {
|
||||
LiveRangeEdit::Remat RM(ParentVNI);
|
||||
@ -1329,7 +1329,7 @@ void SplitEditor::rewriteAssigned(bool ExtendRanges) {
|
||||
// Rewrite to the mapped register at Idx.
|
||||
unsigned RegIdx = RegAssign.lookup(Idx);
|
||||
LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
|
||||
MO.setReg(LI.reg);
|
||||
MO.setReg(LI.reg());
|
||||
LLVM_DEBUG(dbgs() << " rewr " << printMBBReference(*MI->getParent())
|
||||
<< '\t' << Idx << ':' << RegIdx << '\t' << *MI);
|
||||
|
||||
@ -1411,7 +1411,7 @@ void SplitEditor::deleteRematVictims() {
|
||||
continue;
|
||||
MachineInstr *MI = LIS.getInstructionFromIndex(S.valno->def);
|
||||
assert(MI && "Missing instruction for dead def");
|
||||
MI->addRegisterDead(LI->reg, &TRI);
|
||||
MI->addRegisterDead(LI->reg(), &TRI);
|
||||
|
||||
if (!MI->allDefsAreDead())
|
||||
continue;
|
||||
@ -1531,7 +1531,7 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
|
||||
LIS.splitSeparateComponents(LI, SplitLIs);
|
||||
unsigned Original = VRM.getOriginal(VReg);
|
||||
for (LiveInterval *SplitLI : SplitLIs)
|
||||
VRM.setIsSplitFromReg(SplitLI->reg, Original);
|
||||
VRM.setIsSplitFromReg(SplitLI->reg(), Original);
|
||||
|
||||
// The new intervals all map back to i.
|
||||
if (LRMap)
|
||||
|
@ -145,7 +145,7 @@ namespace {
|
||||
// their weight.
|
||||
struct IntervalSorter {
|
||||
bool operator()(LiveInterval* LHS, LiveInterval* RHS) const {
|
||||
return LHS->weight > RHS->weight;
|
||||
return LHS->weight() > RHS->weight();
|
||||
}
|
||||
};
|
||||
|
||||
@ -174,7 +174,8 @@ void StackSlotColoring::ScanForSpillSlotRefs(MachineFunction &MF) {
|
||||
continue;
|
||||
LiveInterval &li = LS->getInterval(FI);
|
||||
if (!MI.isDebugValue())
|
||||
li.weight += LiveIntervals::getSpillWeight(false, true, MBFI, MI);
|
||||
li.incrementWeight(
|
||||
LiveIntervals::getSpillWeight(false, true, MBFI, MI));
|
||||
}
|
||||
for (MachineInstr::mmo_iterator MMOI = MI.memoperands_begin(),
|
||||
EE = MI.memoperands_end();
|
||||
@ -222,7 +223,7 @@ void StackSlotColoring::InitializeSlots() {
|
||||
for (auto *I : Intervals) {
|
||||
LiveInterval &li = I->second;
|
||||
LLVM_DEBUG(li.dump());
|
||||
int FI = Register::stackSlot2Index(li.reg);
|
||||
int FI = Register::stackSlot2Index(li.reg());
|
||||
if (MFI->isDeadObjectIndex(FI))
|
||||
continue;
|
||||
|
||||
@ -269,7 +270,7 @@ StackSlotColoring::OverlapWithAssignments(LiveInterval *li, int Color) const {
|
||||
int StackSlotColoring::ColorSlot(LiveInterval *li) {
|
||||
int Color = -1;
|
||||
bool Share = false;
|
||||
int FI = Register::stackSlot2Index(li->reg);
|
||||
int FI = Register::stackSlot2Index(li->reg());
|
||||
uint8_t StackID = MFI->getStackID(FI);
|
||||
|
||||
if (!DisableSharing) {
|
||||
@ -331,12 +332,12 @@ bool StackSlotColoring::ColorSlots(MachineFunction &MF) {
|
||||
bool Changed = false;
|
||||
for (unsigned i = 0, e = SSIntervals.size(); i != e; ++i) {
|
||||
LiveInterval *li = SSIntervals[i];
|
||||
int SS = Register::stackSlot2Index(li->reg);
|
||||
int SS = Register::stackSlot2Index(li->reg());
|
||||
int NewSS = ColorSlot(li);
|
||||
assert(NewSS >= 0 && "Stack coloring failed?");
|
||||
SlotMapping[SS] = NewSS;
|
||||
RevMap[NewSS].push_back(SS);
|
||||
SlotWeights[NewSS] += li->weight;
|
||||
SlotWeights[NewSS] += li->weight();
|
||||
UsedColors.set(NewSS);
|
||||
Changed |= (SS != NewSS);
|
||||
}
|
||||
@ -344,8 +345,8 @@ bool StackSlotColoring::ColorSlots(MachineFunction &MF) {
|
||||
LLVM_DEBUG(dbgs() << "\nSpill slots after coloring:\n");
|
||||
for (unsigned i = 0, e = SSIntervals.size(); i != e; ++i) {
|
||||
LiveInterval *li = SSIntervals[i];
|
||||
int SS = Register::stackSlot2Index(li->reg);
|
||||
li->weight = SlotWeights[SS];
|
||||
int SS = Register::stackSlot2Index(li->reg());
|
||||
li->setWeight(SlotWeights[SS]);
|
||||
}
|
||||
// Sort them by new weight.
|
||||
llvm::stable_sort(SSIntervals, IntervalSorter());
|
||||
|
@ -68,7 +68,7 @@ bool TargetRegisterInfo::shouldRegionSplitForVirtReg(
|
||||
const MachineFunction &MF, const LiveInterval &VirtReg) const {
|
||||
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
|
||||
const MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
MachineInstr *MI = MRI.getUniqueVRegDef(VirtReg.reg);
|
||||
MachineInstr *MI = MRI.getUniqueVRegDef(VirtReg.reg());
|
||||
if (MI && TII->isTriviallyReMaterializable(*MI) &&
|
||||
VirtReg.size() > HugeSizeForSplit)
|
||||
return false;
|
||||
|
@ -114,7 +114,7 @@ GCNNSAReassign::tryAssignRegisters(SmallVectorImpl<LiveInterval *> &Intervals,
|
||||
unsigned NumRegs = Intervals.size();
|
||||
|
||||
for (unsigned N = 0; N < NumRegs; ++N)
|
||||
if (VRM->hasPhys(Intervals[N]->reg))
|
||||
if (VRM->hasPhys(Intervals[N]->reg()))
|
||||
LRM->unassign(*Intervals[N]);
|
||||
|
||||
for (unsigned N = 0; N < NumRegs; ++N)
|
||||
@ -302,14 +302,15 @@ bool GCNNSAReassign::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Attempting to reassign NSA: " << *MI
|
||||
<< "\tOriginal allocation:\t";
|
||||
for(auto *LI : Intervals)
|
||||
dbgs() << " " << llvm::printReg((VRM->getPhys(LI->reg)), TRI);
|
||||
for (auto *LI
|
||||
: Intervals) dbgs()
|
||||
<< " " << llvm::printReg((VRM->getPhys(LI->reg())), TRI);
|
||||
dbgs() << '\n');
|
||||
|
||||
bool Success = scavengeRegs(Intervals);
|
||||
if (!Success) {
|
||||
LLVM_DEBUG(dbgs() << "\tCannot reallocate.\n");
|
||||
if (VRM->hasPhys(Intervals.back()->reg)) // Did not change allocation.
|
||||
if (VRM->hasPhys(Intervals.back()->reg())) // Did not change allocation.
|
||||
continue;
|
||||
} else {
|
||||
// Check we did not make it worse for other instructions.
|
||||
@ -328,7 +329,7 @@ bool GCNNSAReassign::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
if (!Success) {
|
||||
for (unsigned I = 0; I < Info->VAddrDwords; ++I)
|
||||
if (VRM->hasPhys(Intervals[I]->reg))
|
||||
if (VRM->hasPhys(Intervals[I]->reg()))
|
||||
LRM->unassign(*Intervals[I]);
|
||||
|
||||
for (unsigned I = 0; I < Info->VAddrDwords; ++I)
|
||||
@ -339,11 +340,12 @@ bool GCNNSAReassign::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
C.second = true;
|
||||
++NumNSAConverted;
|
||||
LLVM_DEBUG(dbgs() << "\tNew allocation:\t\t ["
|
||||
<< llvm::printReg((VRM->getPhys(Intervals.front()->reg)), TRI)
|
||||
<< " : "
|
||||
<< llvm::printReg((VRM->getPhys(Intervals.back()->reg)), TRI)
|
||||
<< "]\n");
|
||||
LLVM_DEBUG(
|
||||
dbgs() << "\tNew allocation:\t\t ["
|
||||
<< llvm::printReg((VRM->getPhys(Intervals.front()->reg())), TRI)
|
||||
<< " : "
|
||||
<< llvm::printReg((VRM->getPhys(Intervals.back()->reg())), TRI)
|
||||
<< "]\n");
|
||||
Changed = true;
|
||||
}
|
||||
|
||||
|
@ -650,7 +650,7 @@ unsigned GCNRegBankReassign::computeStallCycles(Register SrcReg, Register Reg,
|
||||
|
||||
unsigned GCNRegBankReassign::scavengeReg(LiveInterval &LI, unsigned Bank,
|
||||
unsigned SubReg) const {
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(LI.reg);
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(LI.reg());
|
||||
unsigned MaxNumRegs = (Bank < NUM_VGPR_BANKS) ? MaxNumVGPRs
|
||||
: MaxNumSGPRs;
|
||||
unsigned MaxReg = MaxNumRegs + (Bank < NUM_VGPR_BANKS ? AMDGPU::VGPR0
|
||||
|
@ -97,7 +97,7 @@ bool WebAssemblyOptimizeLiveIntervals::runOnMachineFunction(
|
||||
// values through live-range splitting and stackification, it will have to
|
||||
// do.
|
||||
MF.getInfo<WebAssemblyFunctionInfo>()->setFrameBaseVreg(
|
||||
SplitLIs.back()->reg);
|
||||
SplitLIs.back()->reg());
|
||||
}
|
||||
SplitLIs.clear();
|
||||
}
|
||||
|
@ -106,8 +106,8 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
continue;
|
||||
|
||||
LiveInterval *LI = &Liveness->getInterval(VReg);
|
||||
assert(LI->weight == 0.0f);
|
||||
LI->weight = computeWeight(MRI, MBFI, VReg);
|
||||
assert(LI->weight() == 0.0f);
|
||||
LI->setWeight(computeWeight(MRI, MBFI, VReg));
|
||||
LLVM_DEBUG(LI->dump());
|
||||
SortedIntervals.push_back(LI);
|
||||
}
|
||||
@ -118,10 +118,10 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
// TODO: Investigate more intelligent sorting heuristics. For starters, we
|
||||
// should try to coalesce adjacent live intervals before non-adjacent ones.
|
||||
llvm::sort(SortedIntervals, [MRI](LiveInterval *LHS, LiveInterval *RHS) {
|
||||
if (MRI->isLiveIn(LHS->reg) != MRI->isLiveIn(RHS->reg))
|
||||
return MRI->isLiveIn(LHS->reg);
|
||||
if (LHS->weight != RHS->weight)
|
||||
return LHS->weight > RHS->weight;
|
||||
if (MRI->isLiveIn(LHS->reg()) != MRI->isLiveIn(RHS->reg()))
|
||||
return MRI->isLiveIn(LHS->reg());
|
||||
if (LHS->weight() != RHS->weight())
|
||||
return LHS->weight() > RHS->weight();
|
||||
if (LHS->empty() || RHS->empty())
|
||||
return !LHS->empty() && RHS->empty();
|
||||
return *LHS < *RHS;
|
||||
@ -135,14 +135,14 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
bool Changed = false;
|
||||
for (size_t I = 0, E = SortedIntervals.size(); I < E; ++I) {
|
||||
LiveInterval *LI = SortedIntervals[I];
|
||||
unsigned Old = LI->reg;
|
||||
unsigned Old = LI->reg();
|
||||
size_t Color = I;
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(Old);
|
||||
|
||||
// Check if it's possible to reuse any of the used colors.
|
||||
if (!MRI->isLiveIn(Old))
|
||||
for (unsigned C : UsedColors.set_bits()) {
|
||||
if (MRI->getRegClass(SortedIntervals[C]->reg) != RC)
|
||||
if (MRI->getRegClass(SortedIntervals[C]->reg()) != RC)
|
||||
continue;
|
||||
for (LiveInterval *OtherLI : Assignments[C])
|
||||
if (!OtherLI->empty() && OtherLI->overlaps(*LI))
|
||||
@ -152,7 +152,7 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
continue_outer:;
|
||||
}
|
||||
|
||||
unsigned New = SortedIntervals[Color]->reg;
|
||||
unsigned New = SortedIntervals[Color]->reg();
|
||||
SlotMapping[I] = New;
|
||||
Changed |= Old != New;
|
||||
UsedColors.set(Color);
|
||||
@ -160,7 +160,7 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
// If we reassigned the stack pointer, update the debug frame base info.
|
||||
if (Old != New && MFI.isFrameBaseVirtual() && MFI.getFrameBaseVreg() == Old)
|
||||
MFI.setFrameBaseVreg(New);
|
||||
LLVM_DEBUG(dbgs() << "Assigning vreg" << Register::virtReg2Index(LI->reg)
|
||||
LLVM_DEBUG(dbgs() << "Assigning vreg" << Register::virtReg2Index(LI->reg())
|
||||
<< " to vreg" << Register::virtReg2Index(New) << "\n");
|
||||
}
|
||||
if (!Changed)
|
||||
@ -168,7 +168,7 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) {
|
||||
|
||||
// Rewrite register operands.
|
||||
for (size_t I = 0, E = SortedIntervals.size(); I < E; ++I) {
|
||||
unsigned Old = SortedIntervals[I]->reg;
|
||||
unsigned Old = SortedIntervals[I]->reg();
|
||||
unsigned New = SlotMapping[I];
|
||||
if (Old != New)
|
||||
MRI->replaceRegWith(Old, New);
|
||||
|
Loading…
Reference in New Issue
Block a user