#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/ADT/DenseMap.h"
-#include <map>
namespace llvm {
class MachineLoopInfo;
class MachineDominatorTree;
class InstrItineraryData;
-class DefaultVLIWScheduler;
+class ScheduleDAGInstrs;
class SUnit;
class DFAPacketizer {
// reserveResources - Reserve the resources occupied by a machine
// instruction and change the current state to reflect that change.
void reserveResources(llvm::MachineInstr *MI);
-
- const InstrItineraryData *getInstrItins() const { return InstrItins; }
};
// VLIWPacketizerList - Implements a simple VLIW packetizer using DFA. The
// and machine resource is marked as taken. If any dependency is found, a target
// API call is made to prune the dependence.
class VLIWPacketizerList {
-protected:
const TargetMachine &TM;
const MachineFunction &MF;
const TargetInstrInfo *TII;
- // The VLIW Scheduler.
- DefaultVLIWScheduler *VLIWScheduler;
+ // Encapsulate data types not exposed to the target interface.
+ ScheduleDAGInstrs *SchedulerImpl;
+protected:
// Vector of instructions assigned to the current packet.
std::vector<MachineInstr*> CurrentPacketMIs;
// DFA resource tracker.
DFAPacketizer *ResourceTracker;
-
- // Generate MI -> SU map.
- std::map<MachineInstr*, SUnit*> MIToSUnit;
+ // Scheduling units.
+ std::vector<SUnit> SUnits;
public:
VLIWPacketizerList(
DFAPacketizer *getResourceTracker() {return ResourceTracker;}
// addToPacket - Add MI to the current packet.
- virtual MachineBasicBlock::iterator addToPacket(MachineInstr *MI) {
- MachineBasicBlock::iterator MII = MI;
- CurrentPacketMIs.push_back(MI);
- ResourceTracker->reserveResources(MI);
- return MII;
- }
+ void addToPacket(MachineInstr *MI);
// endPacket - End the current packet.
- void endPacket(MachineBasicBlock *MBB, MachineInstr *MI);
-
- // initPacketizerState - perform initialization before packetizing
- // an instruction. This function is supposed to be overrided by
- // the target dependent packetizer.
- virtual void initPacketizerState(void) { return; }
+ void endPacket(MachineBasicBlock *MBB, MachineInstr *I);
// ignorePseudoInstruction - Ignore bundling of pseudo instructions.
- virtual bool ignorePseudoInstruction(MachineInstr *I,
- MachineBasicBlock *MBB) {
- return false;
- }
+ bool ignorePseudoInstruction(MachineInstr *I, MachineBasicBlock *MBB);
- // isSoloInstruction - return true if instruction MI can not be packetized
- // with any other instruction, which means that MI itself is a packet.
- virtual bool isSoloInstruction(MachineInstr *MI) {
- return true;
- }
+ // isSoloInstruction - return true if instruction I must end previous
+ // packet.
+ bool isSoloInstruction(MachineInstr *I);
// isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
// together.
virtual bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) {
return false;
}
-
};
}