diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/DFAPacketizer.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineScheduler.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/PostRASchedulerList.cpp | 25 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/ScheduleDAGInstrs.cpp | 6 | 
4 files changed, 30 insertions, 16 deletions
| diff --git a/llvm/lib/CodeGen/DFAPacketizer.cpp b/llvm/lib/CodeGen/DFAPacketizer.cpp index 840a10128da..6619bcfd194 100644 --- a/llvm/lib/CodeGen/DFAPacketizer.cpp +++ b/llvm/lib/CodeGen/DFAPacketizer.cpp @@ -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. diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp index a6c5a9f933c..da6920575db 100644 --- a/llvm/lib/CodeGen/MachineScheduler.cpp +++ b/llvm/lib/CodeGen/MachineScheduler.cpp @@ -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 = diff --git a/llvm/lib/CodeGen/PostRASchedulerList.cpp b/llvm/lib/CodeGen/PostRASchedulerList.cpp index 27f56762de9..b8747b9330b 100644 --- a/llvm/lib/CodeGen/PostRASchedulerList.cpp +++ b/llvm/lib/CodeGen/PostRASchedulerList.cpp @@ -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(); diff --git a/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp b/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp index 892903c2388..b0245d5c3c7 100644 --- a/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp +++ b/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp @@ -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; | 

