mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Refactored the LiveRangeEdit interface so that MachineFunction, TargetInstrInfo, MachineRegisterInfo, LiveIntervals, and VirtRegMap are all passed into the constructor and stored as members instead of passed in to each method.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153903 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3197b4453d
commit
8a06af9669
@ -655,7 +655,7 @@ void InlineSpiller::analyzeSiblingValues() {
|
||||
if (OrigVNI->def != VNI->def)
|
||||
DefMI = traceSiblingValue(Reg, VNI, OrigVNI);
|
||||
}
|
||||
if (DefMI && Edit->checkRematerializable(VNI, DefMI, TII, AA)) {
|
||||
if (DefMI && Edit->checkRematerializable(VNI, DefMI, AA)) {
|
||||
DEBUG(dbgs() << "Value " << PrintReg(Reg) << ':' << VNI->id << '@'
|
||||
<< VNI->def << " may remat from " << *DefMI);
|
||||
}
|
||||
@ -856,7 +856,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg,
|
||||
SibValueMap::const_iterator SibI = SibValues.find(ParentVNI);
|
||||
if (SibI != SibValues.end())
|
||||
RM.OrigMI = SibI->second.DefMI;
|
||||
if (!Edit->canRematerializeAt(RM, UseIdx, false, LIS)) {
|
||||
if (!Edit->canRematerializeAt(RM, UseIdx, false)) {
|
||||
markValueUsed(&VirtReg, ParentVNI);
|
||||
DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << *MI);
|
||||
return false;
|
||||
@ -883,12 +883,12 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg,
|
||||
}
|
||||
|
||||
// Alocate a new register for the remat.
|
||||
LiveInterval &NewLI = Edit->createFrom(Original, LIS, VRM);
|
||||
LiveInterval &NewLI = Edit->createFrom(Original);
|
||||
NewLI.markNotSpillable();
|
||||
|
||||
// Finally we can rematerialize OrigMI before MI.
|
||||
SlotIndex DefIdx = Edit->rematerializeAt(*MI->getParent(), MI, NewLI.reg, RM,
|
||||
LIS, TII, TRI);
|
||||
TRI);
|
||||
DEBUG(dbgs() << "\tremat: " << DefIdx << '\t'
|
||||
<< *LIS.getInstructionFromIndex(DefIdx));
|
||||
|
||||
@ -913,7 +913,7 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg,
|
||||
/// and trim the live ranges after.
|
||||
void InlineSpiller::reMaterializeAll() {
|
||||
// analyzeSiblingValues has already tested all relevant defining instructions.
|
||||
if (!Edit->anyRematerializable(LIS, TII, AA))
|
||||
if (!Edit->anyRematerializable(AA))
|
||||
return;
|
||||
|
||||
UsedValues.clear();
|
||||
@ -954,7 +954,7 @@ void InlineSpiller::reMaterializeAll() {
|
||||
if (DeadDefs.empty())
|
||||
return;
|
||||
DEBUG(dbgs() << "Remat created " << DeadDefs.size() << " dead defs.\n");
|
||||
Edit->eliminateDeadDefs(DeadDefs, LIS, VRM, TII, RegsToSpill);
|
||||
Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
|
||||
|
||||
// Get rid of deleted and empty intervals.
|
||||
for (unsigned i = RegsToSpill.size(); i != 0; --i) {
|
||||
@ -966,7 +966,7 @@ void InlineSpiller::reMaterializeAll() {
|
||||
LiveInterval &LI = LIS.getInterval(Reg);
|
||||
if (!LI.empty())
|
||||
continue;
|
||||
Edit->eraseVirtReg(Reg, LIS);
|
||||
Edit->eraseVirtReg(Reg);
|
||||
RegsToSpill.erase(RegsToSpill.begin() + (i - 1));
|
||||
}
|
||||
DEBUG(dbgs() << RegsToSpill.size() << " registers to spill after remat.\n");
|
||||
@ -1181,7 +1181,7 @@ void InlineSpiller::spillAroundUses(unsigned Reg) {
|
||||
|
||||
// Allocate interval around instruction.
|
||||
// FIXME: Infer regclass from instruction alone.
|
||||
LiveInterval &NewLI = Edit->createFrom(Reg, LIS, VRM);
|
||||
LiveInterval &NewLI = Edit->createFrom(Reg);
|
||||
NewLI.markNotSpillable();
|
||||
|
||||
if (RI.Reads)
|
||||
@ -1244,7 +1244,7 @@ void InlineSpiller::spillAll() {
|
||||
// Hoisted spills may cause dead code.
|
||||
if (!DeadDefs.empty()) {
|
||||
DEBUG(dbgs() << "Eliminating " << DeadDefs.size() << " dead defs\n");
|
||||
Edit->eliminateDeadDefs(DeadDefs, LIS, VRM, TII, RegsToSpill);
|
||||
Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
|
||||
}
|
||||
|
||||
// Finally delete the SnippetCopies.
|
||||
@ -1260,7 +1260,7 @@ void InlineSpiller::spillAll() {
|
||||
|
||||
// Delete all spilled registers.
|
||||
for (unsigned i = 0, e = RegsToSpill.size(); i != e; ++i)
|
||||
Edit->eraseVirtReg(RegsToSpill[i], LIS);
|
||||
Edit->eraseVirtReg(RegsToSpill[i]);
|
||||
}
|
||||
|
||||
void InlineSpiller::spill(LiveRangeEdit &edit) {
|
||||
@ -1289,5 +1289,5 @@ void InlineSpiller::spill(LiveRangeEdit &edit) {
|
||||
if (!RegsToSpill.empty())
|
||||
spillAll();
|
||||
|
||||
Edit->calculateRegClassAndHint(MF, LIS, Loops);
|
||||
Edit->calculateRegClassAndHint(MF, Loops);
|
||||
}
|
||||
|
@ -31,13 +31,10 @@ STATISTIC(NumFracRanges, "Number of live ranges fractured by DCE");
|
||||
|
||||
void LiveRangeEdit::Delegate::anchor() { }
|
||||
|
||||
LiveInterval &LiveRangeEdit::createFrom(unsigned OldReg,
|
||||
LiveIntervals &LIS,
|
||||
VirtRegMap &VRM) {
|
||||
MachineRegisterInfo &MRI = VRM.getRegInfo();
|
||||
LiveInterval &LiveRangeEdit::createFrom(unsigned OldReg) {
|
||||
unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
|
||||
VRM.grow();
|
||||
VRM.setIsSplitFromReg(VReg, VRM.getOriginal(OldReg));
|
||||
VRM->grow();
|
||||
VRM->setIsSplitFromReg(VReg, VRM->getOriginal(OldReg));
|
||||
LiveInterval &LI = LIS.getOrCreateInterval(VReg);
|
||||
newRegs_.push_back(&LI);
|
||||
return LI;
|
||||
@ -45,37 +42,32 @@ LiveInterval &LiveRangeEdit::createFrom(unsigned OldReg,
|
||||
|
||||
bool LiveRangeEdit::checkRematerializable(VNInfo *VNI,
|
||||
const MachineInstr *DefMI,
|
||||
const TargetInstrInfo &tii,
|
||||
AliasAnalysis *aa) {
|
||||
assert(DefMI && "Missing instruction");
|
||||
scannedRemattable_ = true;
|
||||
if (!tii.isTriviallyReMaterializable(DefMI, aa))
|
||||
if (!TII.isTriviallyReMaterializable(DefMI, aa))
|
||||
return false;
|
||||
remattable_.insert(VNI);
|
||||
return true;
|
||||
}
|
||||
|
||||
void LiveRangeEdit::scanRemattable(LiveIntervals &lis,
|
||||
const TargetInstrInfo &tii,
|
||||
AliasAnalysis *aa) {
|
||||
void LiveRangeEdit::scanRemattable(AliasAnalysis *aa) {
|
||||
for (LiveInterval::vni_iterator I = parent_.vni_begin(),
|
||||
E = parent_.vni_end(); I != E; ++I) {
|
||||
VNInfo *VNI = *I;
|
||||
if (VNI->isUnused())
|
||||
continue;
|
||||
MachineInstr *DefMI = lis.getInstructionFromIndex(VNI->def);
|
||||
MachineInstr *DefMI = LIS.getInstructionFromIndex(VNI->def);
|
||||
if (!DefMI)
|
||||
continue;
|
||||
checkRematerializable(VNI, DefMI, tii, aa);
|
||||
checkRematerializable(VNI, DefMI, aa);
|
||||
}
|
||||
scannedRemattable_ = true;
|
||||
}
|
||||
|
||||
bool LiveRangeEdit::anyRematerializable(LiveIntervals &lis,
|
||||
const TargetInstrInfo &tii,
|
||||
AliasAnalysis *aa) {
|
||||
bool LiveRangeEdit::anyRematerializable(AliasAnalysis *aa) {
|
||||
if (!scannedRemattable_)
|
||||
scanRemattable(lis, tii, aa);
|
||||
scanRemattable(aa);
|
||||
return !remattable_.empty();
|
||||
}
|
||||
|
||||
@ -83,8 +75,7 @@ bool LiveRangeEdit::anyRematerializable(LiveIntervals &lis,
|
||||
/// OrigIdx are also available with the same value at UseIdx.
|
||||
bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
|
||||
SlotIndex OrigIdx,
|
||||
SlotIndex UseIdx,
|
||||
LiveIntervals &lis) {
|
||||
SlotIndex UseIdx) {
|
||||
OrigIdx = OrigIdx.getRegSlot(true);
|
||||
UseIdx = UseIdx.getRegSlot(true);
|
||||
for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
|
||||
@ -92,10 +83,10 @@ bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
|
||||
if (!MO.isReg() || !MO.getReg() || MO.isDef())
|
||||
continue;
|
||||
// Reserved registers are OK.
|
||||
if (MO.isUndef() || !lis.hasInterval(MO.getReg()))
|
||||
if (MO.isUndef() || !LIS.hasInterval(MO.getReg()))
|
||||
continue;
|
||||
|
||||
LiveInterval &li = lis.getInterval(MO.getReg());
|
||||
LiveInterval &li = LIS.getInterval(MO.getReg());
|
||||
const VNInfo *OVNI = li.getVNInfoAt(OrigIdx);
|
||||
if (!OVNI)
|
||||
continue;
|
||||
@ -107,8 +98,7 @@ bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
|
||||
|
||||
bool LiveRangeEdit::canRematerializeAt(Remat &RM,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis) {
|
||||
bool cheapAsAMove) {
|
||||
assert(scannedRemattable_ && "Call anyRematerializable first");
|
||||
|
||||
// Use scanRemattable info.
|
||||
@ -118,10 +108,10 @@ bool LiveRangeEdit::canRematerializeAt(Remat &RM,
|
||||
// No defining instruction provided.
|
||||
SlotIndex DefIdx;
|
||||
if (RM.OrigMI)
|
||||
DefIdx = lis.getInstructionIndex(RM.OrigMI);
|
||||
DefIdx = LIS.getInstructionIndex(RM.OrigMI);
|
||||
else {
|
||||
DefIdx = RM.ParentVNI->def;
|
||||
RM.OrigMI = lis.getInstructionFromIndex(DefIdx);
|
||||
RM.OrigMI = LIS.getInstructionFromIndex(DefIdx);
|
||||
assert(RM.OrigMI && "No defining instruction for remattable value");
|
||||
}
|
||||
|
||||
@ -130,7 +120,7 @@ bool LiveRangeEdit::canRematerializeAt(Remat &RM,
|
||||
return false;
|
||||
|
||||
// Verify that all used registers are available with the same values.
|
||||
if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx, lis))
|
||||
if (!allUsesAvailableAt(RM.OrigMI, DefIdx, UseIdx))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -140,27 +130,22 @@ SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg,
|
||||
const Remat &RM,
|
||||
LiveIntervals &lis,
|
||||
const TargetInstrInfo &tii,
|
||||
const TargetRegisterInfo &tri,
|
||||
bool Late) {
|
||||
assert(RM.OrigMI && "Invalid remat");
|
||||
tii.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri);
|
||||
TII.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri);
|
||||
rematted_.insert(RM.ParentVNI);
|
||||
return lis.getSlotIndexes()->insertMachineInstrInMaps(--MI, Late)
|
||||
return LIS.getSlotIndexes()->insertMachineInstrInMaps(--MI, Late)
|
||||
.getRegSlot();
|
||||
}
|
||||
|
||||
void LiveRangeEdit::eraseVirtReg(unsigned Reg, LiveIntervals &LIS) {
|
||||
void LiveRangeEdit::eraseVirtReg(unsigned Reg) {
|
||||
if (delegate_ && delegate_->LRE_CanEraseVirtReg(Reg))
|
||||
LIS.removeInterval(Reg);
|
||||
}
|
||||
|
||||
bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
SmallVectorImpl<MachineInstr*> &Dead,
|
||||
MachineRegisterInfo &MRI,
|
||||
LiveIntervals &LIS,
|
||||
const TargetInstrInfo &TII) {
|
||||
SmallVectorImpl<MachineInstr*> &Dead) {
|
||||
MachineInstr *DefMI = 0, *UseMI = 0;
|
||||
|
||||
// Check that there is a single def and a single use.
|
||||
@ -206,13 +191,10 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
|
||||
}
|
||||
|
||||
void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
LiveIntervals &LIS, VirtRegMap &VRM,
|
||||
const TargetInstrInfo &TII,
|
||||
ArrayRef<unsigned> RegsBeingSpilled) {
|
||||
SetVector<LiveInterval*,
|
||||
SmallVector<LiveInterval*, 8>,
|
||||
SmallPtrSet<LiveInterval*, 8> > ToShrink;
|
||||
MachineRegisterInfo &MRI = VRM.getRegInfo();
|
||||
|
||||
for (;;) {
|
||||
// Erase all dead defs.
|
||||
@ -263,7 +245,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
LI.removeValNo(VNI);
|
||||
if (LI.empty()) {
|
||||
ToShrink.remove(&LI);
|
||||
eraseVirtReg(Reg, LIS);
|
||||
eraseVirtReg(Reg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -282,12 +264,14 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
// Shrink just one live interval. Then delete new dead defs.
|
||||
LiveInterval *LI = ToShrink.back();
|
||||
ToShrink.pop_back();
|
||||
if (foldAsLoad(LI, Dead, MRI, LIS, TII))
|
||||
if (foldAsLoad(LI, Dead))
|
||||
continue;
|
||||
if (delegate_)
|
||||
delegate_->LRE_WillShrinkVirtReg(LI->reg);
|
||||
if (!LIS.shrinkToUses(LI, &Dead))
|
||||
continue;
|
||||
if (!VRM)
|
||||
continue;
|
||||
|
||||
// Don't create new intervals for a register being spilled.
|
||||
// The new intervals would have to be spilled anyway so its not worth it.
|
||||
@ -302,7 +286,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
}
|
||||
|
||||
if (BeingSpilled) continue;
|
||||
|
||||
if (!VRM) continue;
|
||||
|
||||
// LI may have been separated, create new intervals.
|
||||
LI->RenumberValues(LIS);
|
||||
@ -311,16 +295,16 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
if (NumComp <= 1)
|
||||
continue;
|
||||
++NumFracRanges;
|
||||
bool IsOriginal = VRM.getOriginal(LI->reg) == LI->reg;
|
||||
bool IsOriginal = VRM->getOriginal(LI->reg) == LI->reg;
|
||||
DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
|
||||
SmallVector<LiveInterval*, 8> Dups(1, LI);
|
||||
for (unsigned i = 1; i != NumComp; ++i) {
|
||||
Dups.push_back(&createFrom(LI->reg, LIS, VRM));
|
||||
Dups.push_back(&createFrom(LI->reg));
|
||||
// If LI is an original interval that hasn't been split yet, make the new
|
||||
// intervals their own originals instead of referring to LI. The original
|
||||
// interval must contain all the split products, and LI doesn't.
|
||||
if (IsOriginal)
|
||||
VRM.setIsSplitFromReg(Dups.back()->reg, 0);
|
||||
VRM->setIsSplitFromReg(Dups.back()->reg, 0);
|
||||
if (delegate_)
|
||||
delegate_->LRE_DidCloneVirtReg(Dups.back()->reg, LI->reg);
|
||||
}
|
||||
@ -329,10 +313,8 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
}
|
||||
|
||||
void LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
|
||||
LiveIntervals &LIS,
|
||||
const MachineLoopInfo &Loops) {
|
||||
VirtRegAuxInfo VRAI(MF, LIS, Loops);
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||
LiveInterval &LI = **I;
|
||||
if (MRI.recomputeRegClass(LI.reg, MF.getTarget()))
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/CodeGen/LiveInterval.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -56,6 +57,10 @@ public:
|
||||
private:
|
||||
LiveInterval &parent_;
|
||||
SmallVectorImpl<LiveInterval*> &newRegs_;
|
||||
MachineRegisterInfo &MRI;
|
||||
LiveIntervals &LIS;
|
||||
VirtRegMap *VRM;
|
||||
const TargetInstrInfo &TII;
|
||||
Delegate *const delegate_;
|
||||
|
||||
/// firstNew_ - Index of the first register added to newRegs_.
|
||||
@ -73,19 +78,16 @@ private:
|
||||
SmallPtrSet<const VNInfo*,4> rematted_;
|
||||
|
||||
/// scanRemattable - Identify the parent_ values that may rematerialize.
|
||||
void scanRemattable(LiveIntervals &lis,
|
||||
const TargetInstrInfo &tii,
|
||||
AliasAnalysis *aa);
|
||||
void scanRemattable(AliasAnalysis *aa);
|
||||
|
||||
/// allUsesAvailableAt - Return true if all registers used by OrigMI at
|
||||
/// OrigIdx are also available with the same value at UseIdx.
|
||||
bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx,
|
||||
SlotIndex UseIdx, LiveIntervals &lis);
|
||||
SlotIndex UseIdx);
|
||||
|
||||
/// foldAsLoad - If LI has a single use and a single def that can be folded as
|
||||
/// a load, eliminate the register by folding the def into the use.
|
||||
bool foldAsLoad(LiveInterval *LI, SmallVectorImpl<MachineInstr*> &Dead,
|
||||
MachineRegisterInfo&, LiveIntervals&, const TargetInstrInfo&);
|
||||
bool foldAsLoad(LiveInterval *LI, SmallVectorImpl<MachineInstr*> &Dead);
|
||||
|
||||
public:
|
||||
/// Create a LiveRangeEdit for breaking down parent into smaller pieces.
|
||||
@ -94,8 +96,13 @@ public:
|
||||
/// empty initially, any existing registers are ignored.
|
||||
LiveRangeEdit(LiveInterval &parent,
|
||||
SmallVectorImpl<LiveInterval*> &newRegs,
|
||||
MachineFunction &MF,
|
||||
LiveIntervals &lis,
|
||||
VirtRegMap *vrm,
|
||||
Delegate *delegate = 0)
|
||||
: parent_(parent), newRegs_(newRegs),
|
||||
MRI(MF.getRegInfo()), LIS(lis), VRM(vrm),
|
||||
TII(*MF.getTarget().getInstrInfo()),
|
||||
delegate_(delegate),
|
||||
firstNew_(newRegs.size()),
|
||||
scannedRemattable_(false) {}
|
||||
@ -116,24 +123,23 @@ public:
|
||||
}
|
||||
|
||||
/// createFrom - Create a new virtual register based on OldReg.
|
||||
LiveInterval &createFrom(unsigned OldReg, LiveIntervals&, VirtRegMap&);
|
||||
LiveInterval &createFrom(unsigned OldReg);
|
||||
|
||||
/// create - Create a new register with the same class and original slot as
|
||||
/// parent.
|
||||
LiveInterval &create(LiveIntervals &LIS, VirtRegMap &VRM) {
|
||||
return createFrom(getReg(), LIS, VRM);
|
||||
LiveInterval &create() {
|
||||
return createFrom(getReg());
|
||||
}
|
||||
|
||||
/// anyRematerializable - Return true if any parent values may be
|
||||
/// rematerializable.
|
||||
/// This function must be called before any rematerialization is attempted.
|
||||
bool anyRematerializable(LiveIntervals&, const TargetInstrInfo&,
|
||||
AliasAnalysis*);
|
||||
bool anyRematerializable(AliasAnalysis*);
|
||||
|
||||
/// checkRematerializable - Manually add VNI to the list of rematerializable
|
||||
/// values if DefMI may be rematerializable.
|
||||
bool checkRematerializable(VNInfo *VNI, const MachineInstr *DefMI,
|
||||
const TargetInstrInfo&, AliasAnalysis*);
|
||||
AliasAnalysis*);
|
||||
|
||||
/// Remat - Information needed to rematerialize at a specific location.
|
||||
struct Remat {
|
||||
@ -147,8 +153,7 @@ public:
|
||||
/// When cheapAsAMove is set, only cheap remats are allowed.
|
||||
bool canRematerializeAt(Remat &RM,
|
||||
SlotIndex UseIdx,
|
||||
bool cheapAsAMove,
|
||||
LiveIntervals &lis);
|
||||
bool cheapAsAMove);
|
||||
|
||||
/// rematerializeAt - Rematerialize RM.ParentVNI into DestReg by inserting an
|
||||
/// instruction into MBB before MI. The new instruction is mapped, but
|
||||
@ -158,8 +163,6 @@ public:
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg,
|
||||
const Remat &RM,
|
||||
LiveIntervals&,
|
||||
const TargetInstrInfo&,
|
||||
const TargetRegisterInfo&,
|
||||
bool Late = false);
|
||||
|
||||
@ -176,7 +179,7 @@ public:
|
||||
|
||||
/// eraseVirtReg - Notify the delegate that Reg is no longer in use, and try
|
||||
/// to erase it from LIS.
|
||||
void eraseVirtReg(unsigned Reg, LiveIntervals &LIS);
|
||||
void eraseVirtReg(unsigned Reg);
|
||||
|
||||
/// eliminateDeadDefs - Try to delete machine instructions that are now dead
|
||||
/// (allDefsAreDead returns true). This may cause live intervals to be trimmed
|
||||
@ -185,14 +188,12 @@ public:
|
||||
/// allocator. These registers should not be split into new intervals
|
||||
/// as currently those new intervals are not guaranteed to spill.
|
||||
void eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
LiveIntervals&, VirtRegMap&,
|
||||
const TargetInstrInfo&,
|
||||
ArrayRef<unsigned> RegsBeingSpilled
|
||||
= ArrayRef<unsigned>());
|
||||
|
||||
/// calculateRegClassAndHint - Recompute register class and hint for each new
|
||||
/// register.
|
||||
void calculateRegClassAndHint(MachineFunction&, LiveIntervals&,
|
||||
void calculateRegClassAndHint(MachineFunction&,
|
||||
const MachineLoopInfo&);
|
||||
};
|
||||
|
||||
|
@ -187,7 +187,7 @@ void RABasic::spillReg(LiveInterval& VirtReg, unsigned PhysReg,
|
||||
unassign(SpilledVReg, PhysReg);
|
||||
|
||||
// Spill the extracted interval.
|
||||
LiveRangeEdit LRE(SpilledVReg, SplitVRegs);
|
||||
LiveRangeEdit LRE(SpilledVReg, SplitVRegs, *MF, *LIS, VRM);
|
||||
spiller().spill(LRE);
|
||||
}
|
||||
// After extracting segments, the query's results are invalid. But keep the
|
||||
@ -287,7 +287,7 @@ unsigned RABasic::selectOrSplit(LiveInterval &VirtReg,
|
||||
DEBUG(dbgs() << "spilling: " << VirtReg << '\n');
|
||||
if (!VirtReg.isSpillable())
|
||||
return ~0u;
|
||||
LiveRangeEdit LRE(VirtReg, SplitVRegs);
|
||||
LiveRangeEdit LRE(VirtReg, SplitVRegs, *MF, *LIS, VRM);
|
||||
spiller().spill(LRE);
|
||||
|
||||
// The live virtual register requesting allocation was spilled, so tell
|
||||
|
@ -1183,7 +1183,7 @@ unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
return 0;
|
||||
|
||||
// Prepare split editor.
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, this);
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, *MF, *LIS, VRM, this);
|
||||
SE->reset(LREdit, SplitSpillMode);
|
||||
|
||||
// Assign all edge bundles to the preferred candidate, or NoCand.
|
||||
@ -1231,7 +1231,7 @@ unsigned RAGreedy::tryBlockSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
assert(&SA->getParent() == &VirtReg && "Live range wasn't analyzed");
|
||||
unsigned Reg = VirtReg.reg;
|
||||
bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg));
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, this);
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, *MF, *LIS, VRM, this);
|
||||
SE->reset(LREdit, SplitSpillMode);
|
||||
ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
|
||||
for (unsigned i = 0; i != UseBlocks.size(); ++i) {
|
||||
@ -1512,7 +1512,7 @@ unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order,
|
||||
<< '-' << Uses[BestAfter] << ", " << BestDiff
|
||||
<< ", " << (BestAfter - BestBefore + 1) << " instrs\n");
|
||||
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, this);
|
||||
LiveRangeEdit LREdit(VirtReg, NewVRegs, *MF, *LIS, VRM, this);
|
||||
SE->reset(LREdit);
|
||||
|
||||
SE->openIntv();
|
||||
@ -1644,7 +1644,7 @@ unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
|
||||
|
||||
// Finally spill VirtReg itself.
|
||||
NamedRegionTimer T("Spiller", TimerGroupName, TimePassesIsEnabled);
|
||||
LiveRangeEdit LRE(VirtReg, NewVRegs, this);
|
||||
LiveRangeEdit LRE(VirtReg, NewVRegs, *MF, *LIS, VRM, this);
|
||||
spiller().spill(LRE);
|
||||
setStage(NewVRegs.begin(), NewVRegs.end(), RS_Done);
|
||||
|
||||
|
@ -550,7 +550,7 @@ bool RegAllocPBQP::mapPBQPToRegAlloc(const PBQPRAProblem &problem,
|
||||
} else if (problem.isSpillOption(vreg, alloc)) {
|
||||
vregsToAlloc.erase(vreg);
|
||||
SmallVector<LiveInterval*, 8> newSpills;
|
||||
LiveRangeEdit LRE(lis->getInterval(vreg), newSpills);
|
||||
LiveRangeEdit LRE(lis->getInterval(vreg), newSpills, *mf, *lis, vrm);
|
||||
spiller->spill(LRE);
|
||||
|
||||
DEBUG(dbgs() << "VREG " << vreg << " -> SPILLED (Cost: "
|
||||
|
@ -116,7 +116,7 @@ protected:
|
||||
}
|
||||
|
||||
// Create a new vreg & interval for this instr.
|
||||
LiveInterval *newLI = &LRE.create(*lis, *vrm);
|
||||
LiveInterval *newLI = &LRE.create();
|
||||
newLI->weight = HUGE_VALF;
|
||||
|
||||
// Update the reg operands & kill flags.
|
||||
|
@ -351,7 +351,7 @@ void SplitEditor::reset(LiveRangeEdit &LRE, ComplementSpillMode SM) {
|
||||
|
||||
// We don't need an AliasAnalysis since we will only be performing
|
||||
// cheap-as-a-copy remats anyway.
|
||||
Edit->anyRematerializable(LIS, TII, 0);
|
||||
Edit->anyRematerializable(0);
|
||||
}
|
||||
|
||||
void SplitEditor::dump() const {
|
||||
@ -436,8 +436,8 @@ VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
|
||||
|
||||
// Attempt cheap-as-a-copy rematerialization.
|
||||
LiveRangeEdit::Remat RM(ParentVNI);
|
||||
if (Edit->canRematerializeAt(RM, UseIdx, true, LIS)) {
|
||||
Def = Edit->rematerializeAt(MBB, I, LI->reg, RM, LIS, TII, TRI, Late);
|
||||
if (Edit->canRematerializeAt(RM, UseIdx, true)) {
|
||||
Def = Edit->rematerializeAt(MBB, I, LI->reg, RM, TRI, Late);
|
||||
++NumRemats;
|
||||
} else {
|
||||
// Can't remat, just insert a copy from parent.
|
||||
@ -456,11 +456,11 @@ VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
|
||||
unsigned SplitEditor::openIntv() {
|
||||
// Create the complement as index 0.
|
||||
if (Edit->empty())
|
||||
Edit->create(LIS, VRM);
|
||||
Edit->create();
|
||||
|
||||
// Create the open interval.
|
||||
OpenIdx = Edit->size();
|
||||
Edit->create(LIS, VRM);
|
||||
Edit->create();
|
||||
return OpenIdx;
|
||||
}
|
||||
|
||||
@ -1033,7 +1033,7 @@ void SplitEditor::deleteRematVictims() {
|
||||
if (Dead.empty())
|
||||
return;
|
||||
|
||||
Edit->eliminateDeadDefs(Dead, LIS, VRM, TII);
|
||||
Edit->eliminateDeadDefs(Dead);
|
||||
}
|
||||
|
||||
void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
|
||||
@ -1108,7 +1108,7 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
|
||||
SmallVector<LiveInterval*, 8> dups;
|
||||
dups.push_back(li);
|
||||
for (unsigned j = 1; j != NumComp; ++j)
|
||||
dups.push_back(&Edit->create(LIS, VRM));
|
||||
dups.push_back(&Edit->create());
|
||||
ConEQ.Distribute(&dups[0], MRI);
|
||||
// The new intervals all map back to i.
|
||||
if (LRMap)
|
||||
@ -1116,7 +1116,7 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
|
||||
}
|
||||
|
||||
// Calculate spill weight and allocation hints for new intervals.
|
||||
Edit->calculateRegClassAndHint(VRM.getMachineFunction(), LIS, SA.Loops);
|
||||
Edit->calculateRegClassAndHint(VRM.getMachineFunction(), SA.Loops);
|
||||
|
||||
assert(!LRMap || LRMap->size() == Edit->size());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user