diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2012-05-03 16:50:55 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2012-05-03 16:50:55 +0000 | 
| commit | b61ab53cb789e568acbb2952fbead20ab853a696 (patch) | |
| tree | 8575c732129e272992ac5d7b4c2519238fff4735 /lib/CodeGen/DFAPacketizer.cpp | |
| parent | 63faed5b8e4f2755f127fcb8aa440480c0649327 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/DFAPacketizer.cpp')
| -rw-r--r-- | lib/CodeGen/DFAPacketizer.cpp | 89 | 
1 files changed, 55 insertions, 34 deletions
| diff --git a/lib/CodeGen/DFAPacketizer.cpp b/lib/CodeGen/DFAPacketizer.cpp index bfbe7790998f..5ff641c7c844 100644 --- a/lib/CodeGen/DFAPacketizer.cpp +++ b/lib/CodeGen/DFAPacketizer.cpp @@ -23,10 +23,10 @@  //  //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/ScheduleDAGInstrs.h"  #include "llvm/CodeGen/DFAPacketizer.h"  #include "llvm/CodeGen/MachineInstr.h"  #include "llvm/CodeGen/MachineInstrBundle.h" +#include "llvm/CodeGen/ScheduleDAGInstrs.h"  #include "llvm/Target/TargetInstrInfo.h"  #include "llvm/MC/MCInstrItineraries.h"  using namespace llvm; @@ -100,17 +100,17 @@ void DFAPacketizer::reserveResources(llvm::MachineInstr *MI) {    reserveResources(&MID);  } -namespace llvm { +namespace {  // DefaultVLIWScheduler - This class extends ScheduleDAGInstrs and overrides  // Schedule method to build the dependence graph.  class DefaultVLIWScheduler : public ScheduleDAGInstrs {  public:    DefaultVLIWScheduler(MachineFunction &MF, MachineLoopInfo &MLI, -                   MachineDominatorTree &MDT, bool IsPostRA); +                       MachineDominatorTree &MDT, bool IsPostRA);    // Schedule - Actual scheduling work.    void schedule();  }; -} +} // end anonymous namespace  DefaultVLIWScheduler::DefaultVLIWScheduler(    MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT, @@ -129,25 +129,49 @@ VLIWPacketizerList::VLIWPacketizerList(    bool IsPostRA) : TM(MF.getTarget()), MF(MF)  {    TII = TM.getInstrInfo();    ResourceTracker = TII->CreateTargetScheduleState(&TM, 0); -  VLIWScheduler = new DefaultVLIWScheduler(MF, MLI, MDT, IsPostRA); +  SchedulerImpl = new DefaultVLIWScheduler(MF, MLI, MDT, IsPostRA);  }  // VLIWPacketizerList Dtor  VLIWPacketizerList::~VLIWPacketizerList() { -  if (VLIWScheduler) -    delete VLIWScheduler; +  delete SchedulerImpl; +  delete ResourceTracker; +} + +// ignorePseudoInstruction - ignore pseudo instructions. +bool VLIWPacketizerList::ignorePseudoInstruction(MachineInstr *MI, +                                                 MachineBasicBlock *MBB) { +  if (MI->isDebugValue()) +    return true; + +  if (TII->isSchedulingBoundary(MI, MBB, MF)) +    return true; + +  return false; +} + +// isSoloInstruction - return true if instruction I must end previous +// packet. +bool VLIWPacketizerList::isSoloInstruction(MachineInstr *I) { +  if (I->isInlineAsm()) +    return true; + +  return false; +} -  if (ResourceTracker) -    delete ResourceTracker; +// addToPacket - Add I to the current packet and reserve resource. +void VLIWPacketizerList::addToPacket(MachineInstr *MI) { +  CurrentPacketMIs.push_back(MI); +  ResourceTracker->reserveResources(MI);  }  // endPacket - End the current packet, bundle packet instructions and reset  // DFA state.  void VLIWPacketizerList::endPacket(MachineBasicBlock *MBB, -                                         MachineInstr *MI) { +                                         MachineInstr *I) {    if (CurrentPacketMIs.size() > 1) {      MachineInstr *MIFirst = CurrentPacketMIs.front(); -    finalizeBundle(*MBB, MIFirst, MI); +    finalizeBundle(*MBB, MIFirst, I);    }    CurrentPacketMIs.clear();    ResourceTracker->clearResources(); @@ -157,36 +181,31 @@ void VLIWPacketizerList::endPacket(MachineBasicBlock *MBB,  void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,                                        MachineBasicBlock::iterator BeginItr,                                        MachineBasicBlock::iterator EndItr) { -  assert(VLIWScheduler && "VLIW Scheduler is not initialized!"); -  VLIWScheduler->enterRegion(MBB, BeginItr, EndItr, MBB->size()); -  VLIWScheduler->schedule(); -  VLIWScheduler->exitRegion(); - -  // Generate MI -> SU map. -  //std::map <MachineInstr*, SUnit*> MIToSUnit; -  MIToSUnit.clear(); -  for (unsigned i = 0, e = VLIWScheduler->SUnits.size(); i != e; ++i) { -    SUnit *SU = &VLIWScheduler->SUnits[i]; -    MIToSUnit[SU->getInstr()] = SU; -  } +  assert(MBB->end() == EndItr && "Bad EndIndex"); + +  SchedulerImpl->enterRegion(MBB, BeginItr, EndItr, MBB->size()); + +  // Build the DAG without reordering instructions. +  SchedulerImpl->schedule(); + +  // Remember scheduling units. +  SUnits = SchedulerImpl->SUnits;    // The main packetizer loop.    for (; BeginItr != EndItr; ++BeginItr) {      MachineInstr *MI = BeginItr; -    this->initPacketizerState(); +    // Ignore pseudo instructions. +    if (ignorePseudoInstruction(MI, MBB)) +      continue;      // End the current packet if needed. -    if (this->isSoloInstruction(MI)) { +    if (isSoloInstruction(MI)) {        endPacket(MBB, MI);        continue;      } -    // Ignore pseudo instructions. -    if (this->ignorePseudoInstruction(MI, MBB)) -      continue; - -    SUnit *SUI = MIToSUnit[MI]; +    SUnit *SUI = SchedulerImpl->getSUnit(MI);      assert(SUI && "Missing SUnit Info!");      // Ask DFA if machine resource is available for MI. @@ -196,13 +215,13 @@ void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,        for (std::vector<MachineInstr*>::iterator VI = CurrentPacketMIs.begin(),             VE = CurrentPacketMIs.end(); VI != VE; ++VI) {          MachineInstr *MJ = *VI; -        SUnit *SUJ = MIToSUnit[MJ]; +        SUnit *SUJ = SchedulerImpl->getSUnit(MJ);          assert(SUJ && "Missing SUnit Info!");          // Is it legal to packetize SUI and SUJ together. -        if (!this->isLegalToPacketizeTogether(SUI, SUJ)) { +        if (!isLegalToPacketizeTogether(SUI, SUJ)) {            // Allow packetization if dependency can be pruned. -          if (!this->isLegalToPruneDependencies(SUI, SUJ)) { +          if (!isLegalToPruneDependencies(SUI, SUJ)) {              // End the packet if dependency cannot be pruned.              endPacket(MBB, MI);              break; @@ -215,9 +234,11 @@ void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,      }      // Add MI to the current packet. -    BeginItr = this->addToPacket(MI); +    addToPacket(MI);    } // For all instructions in BB.    // End any packet left behind.    endPacket(MBB, EndItr); + +  SchedulerImpl->exitRegion();  } | 
