mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
mi-sched: Don't call MBB.size() in initSUnits. The driver already has instr count.
This fixes a pathological compile time problem with very large blocks and lots of scheduling boundaries. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f89c749870
commit
d2763f6ce6
@ -293,8 +293,7 @@ public:
|
||||
void enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount);
|
||||
|
||||
unsigned regioninstrs) LLVM_OVERRIDE;
|
||||
|
||||
/// Implement ScheduleDAGInstrs interface for scheduling a sequence of
|
||||
/// reorderable instructions.
|
||||
|
@ -104,12 +104,8 @@ namespace llvm {
|
||||
/// The end of the range to be scheduled.
|
||||
MachineBasicBlock::iterator RegionEnd;
|
||||
|
||||
/// The index in BB of RegionEnd.
|
||||
///
|
||||
/// This is the instruction number from the top of the current block, not
|
||||
/// the SlotIndex. It is only used by the AntiDepBreaker and should be
|
||||
/// removed once that client is obsolete.
|
||||
unsigned EndIndex;
|
||||
/// Instructions in this region (distance(RegionBegin, RegionEnd)).
|
||||
unsigned NumRegionInstrs;
|
||||
|
||||
/// After calling BuildSchedGraph, each machine instruction in the current
|
||||
/// scheduling region is mapped to an SUnit.
|
||||
@ -185,7 +181,7 @@ namespace llvm {
|
||||
virtual void enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount);
|
||||
unsigned regioninstrs);
|
||||
|
||||
/// Notify that the scheduler has finished scheduling the current region.
|
||||
virtual void exitRegion();
|
||||
|
@ -160,7 +160,8 @@ void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,
|
||||
MachineBasicBlock::iterator EndItr) {
|
||||
assert(VLIWScheduler && "VLIW Scheduler is not initialized!");
|
||||
VLIWScheduler->startBlock(MBB);
|
||||
VLIWScheduler->enterRegion(MBB, BeginItr, EndItr, MBB->size());
|
||||
VLIWScheduler->enterRegion(MBB, BeginItr, EndItr,
|
||||
std::distance(BeginItr, EndItr));
|
||||
VLIWScheduler->schedule();
|
||||
|
||||
// Generate MI -> SU map.
|
||||
|
@ -255,14 +255,15 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
||||
|
||||
// The next region starts above the previous region. Look backward in the
|
||||
// instruction stream until we find the nearest boundary.
|
||||
unsigned NumRegionInstrs = 0;
|
||||
MachineBasicBlock::iterator I = RegionEnd;
|
||||
for(;I != MBB->begin(); --I, --RemainingInstrs) {
|
||||
for(;I != MBB->begin(); --I, --RemainingInstrs, ++NumRegionInstrs) {
|
||||
if (TII->isSchedulingBoundary(llvm::prior(I), MBB, *MF))
|
||||
break;
|
||||
}
|
||||
// Notify the scheduler of the region, even if we may skip scheduling
|
||||
// it. Perhaps it still needs to be bundled.
|
||||
Scheduler->enterRegion(MBB, I, RegionEnd, RemainingInstrs);
|
||||
Scheduler->enterRegion(MBB, I, RegionEnd, NumRegionInstrs);
|
||||
|
||||
// Skip empty scheduling regions (0 or 1 schedulable instructions).
|
||||
if (I == RegionEnd || I == llvm::prior(RegionEnd)) {
|
||||
@ -277,7 +278,8 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
||||
<< "\n From: " << *I << " To: ";
|
||||
if (RegionEnd != MBB->end()) dbgs() << *RegionEnd;
|
||||
else dbgs() << "End";
|
||||
dbgs() << " Remaining: " << RemainingInstrs << "\n");
|
||||
dbgs() << " RegionInstrs: " << NumRegionInstrs
|
||||
<< " Remaining: " << RemainingInstrs << "\n");
|
||||
|
||||
// Schedule a region: possibly reorder instructions.
|
||||
// This invalidates 'RegionEnd' and 'I'.
|
||||
@ -446,9 +448,9 @@ bool ScheduleDAGMI::checkSchedLimit() {
|
||||
void ScheduleDAGMI::enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount)
|
||||
unsigned regioninstrs)
|
||||
{
|
||||
ScheduleDAGInstrs::enterRegion(bb, begin, end, endcount);
|
||||
ScheduleDAGInstrs::enterRegion(bb, begin, end, regioninstrs);
|
||||
|
||||
// For convenience remember the end of the liveness region.
|
||||
LiveRegionEnd =
|
||||
|
@ -127,6 +127,12 @@ namespace {
|
||||
/// The schedule. Null SUnit*'s represent noop instructions.
|
||||
std::vector<SUnit*> Sequence;
|
||||
|
||||
/// The index in BB of RegionEnd.
|
||||
///
|
||||
/// This is the instruction number from the top of the current block, not
|
||||
/// the SlotIndex. It is only used by the AntiDepBreaker.
|
||||
unsigned EndIndex;
|
||||
|
||||
public:
|
||||
SchedulePostRATDList(
|
||||
MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT,
|
||||
@ -141,11 +147,14 @@ namespace {
|
||||
///
|
||||
void startBlock(MachineBasicBlock *BB);
|
||||
|
||||
// Set the index of RegionEnd within the current BB.
|
||||
void setEndIndex(unsigned EndIdx) { EndIndex = EndIdx; }
|
||||
|
||||
/// Initialize the scheduler state for the next scheduling region.
|
||||
virtual void enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount);
|
||||
unsigned regioninstrs);
|
||||
|
||||
/// Notify that the scheduler has finished scheduling the current region.
|
||||
virtual void exitRegion();
|
||||
@ -197,7 +206,7 @@ SchedulePostRATDList::SchedulePostRATDList(
|
||||
TargetSubtargetInfo::AntiDepBreakMode AntiDepMode,
|
||||
SmallVectorImpl<const TargetRegisterClass*> &CriticalPathRCs)
|
||||
: ScheduleDAGInstrs(MF, MLI, MDT, /*IsPostRA=*/true), AA(AA),
|
||||
LiveRegs(TRI->getNumRegs())
|
||||
LiveRegs(TRI->getNumRegs()), EndIndex(0)
|
||||
{
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const InstrItineraryData *InstrItins = TM.getInstrItineraryData();
|
||||
@ -223,8 +232,8 @@ SchedulePostRATDList::~SchedulePostRATDList() {
|
||||
void SchedulePostRATDList::enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount) {
|
||||
ScheduleDAGInstrs::enterRegion(bb, begin, end, endcount);
|
||||
unsigned regioninstrs) {
|
||||
ScheduleDAGInstrs::enterRegion(bb, begin, end, regioninstrs);
|
||||
Sequence.clear();
|
||||
}
|
||||
|
||||
@ -312,20 +321,21 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
|
||||
unsigned Count = MBB->size(), CurrentCount = Count;
|
||||
for (MachineBasicBlock::iterator I = Current; I != MBB->begin(); ) {
|
||||
MachineInstr *MI = llvm::prior(I);
|
||||
--Count;
|
||||
// Calls are not scheduling boundaries before register allocation, but
|
||||
// post-ra we don't gain anything by scheduling across calls since we
|
||||
// don't need to worry about register pressure.
|
||||
if (MI->isCall() || TII->isSchedulingBoundary(MI, MBB, Fn)) {
|
||||
Scheduler.enterRegion(MBB, I, Current, CurrentCount);
|
||||
Scheduler.enterRegion(MBB, I, Current, CurrentCount - Count);
|
||||
Scheduler.setEndIndex(CurrentCount);
|
||||
Scheduler.schedule();
|
||||
Scheduler.exitRegion();
|
||||
Scheduler.EmitSchedule();
|
||||
Current = MI;
|
||||
CurrentCount = Count - 1;
|
||||
CurrentCount = Count;
|
||||
Scheduler.Observe(MI, CurrentCount);
|
||||
}
|
||||
I = MI;
|
||||
--Count;
|
||||
if (MI->isBundle())
|
||||
Count -= MI->getBundleSize();
|
||||
}
|
||||
@ -333,6 +343,7 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
|
||||
assert((MBB->begin() == Current || CurrentCount != 0) &&
|
||||
"Instruction count mismatch!");
|
||||
Scheduler.enterRegion(MBB, MBB->begin(), Current, CurrentCount);
|
||||
Scheduler.setEndIndex(CurrentCount);
|
||||
Scheduler.schedule();
|
||||
Scheduler.exitRegion();
|
||||
Scheduler.EmitSchedule();
|
||||
|
@ -178,11 +178,11 @@ void ScheduleDAGInstrs::finishBlock() {
|
||||
void ScheduleDAGInstrs::enterRegion(MachineBasicBlock *bb,
|
||||
MachineBasicBlock::iterator begin,
|
||||
MachineBasicBlock::iterator end,
|
||||
unsigned endcount) {
|
||||
unsigned regioninstrs) {
|
||||
assert(bb == BB && "startBlock should set BB");
|
||||
RegionBegin = begin;
|
||||
RegionEnd = end;
|
||||
EndIndex = endcount;
|
||||
NumRegionInstrs = regioninstrs;
|
||||
MISUnitMap.clear();
|
||||
|
||||
ScheduleDAG::clearDAG();
|
||||
@ -664,7 +664,7 @@ void addChainDependency (AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
||||
void ScheduleDAGInstrs::initSUnits() {
|
||||
// We'll be allocating one SUnit for each real instruction in the region,
|
||||
// which is contained within a basic block.
|
||||
SUnits.reserve(BB->size());
|
||||
SUnits.reserve(NumRegionInstrs);
|
||||
|
||||
for (MachineBasicBlock::iterator I = RegionBegin; I != RegionEnd; ++I) {
|
||||
MachineInstr *MI = I;
|
||||
|
Loading…
x
Reference in New Issue
Block a user