summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-03-08 04:25:59 +0000
committerChris Lattner <sabre@nondot.org>2006-03-08 04:25:59 +0000
commitb0d21ef20c29f4ea46d21b488f17feaa6a8760e1 (patch)
tree090bf7d3bcd785f81c02a84bba5792a39611d985 /lib
parent2b0e309640c638025d83c8f6f4ee2698ba1b8b92 (diff)
downloadllvm-b0d21ef20c29f4ea46d21b488f17feaa6a8760e1.tar.gz
llvm-b0d21ef20c29f4ea46d21b488f17feaa6a8760e1.tar.bz2
llvm-b0d21ef20c29f4ea46d21b488f17feaa6a8760e1.tar.xz
Change the interface for getting a target HazardRecognizer to be more clean.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26608 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/SelectionDAG/ScheduleDAG.cpp2
-rw-r--r--lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp23
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp8
-rw-r--r--lib/Target/PowerPC/PPCHazardRecognizers.cpp10
-rw-r--r--lib/Target/PowerPC/PPCHazardRecognizers.h2
-rw-r--r--lib/Target/PowerPC/PPCISelDAGToDAG.cpp7
6 files changed, 23 insertions, 29 deletions
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
index c9455a0094..d6255db9c1 100644
--- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
@@ -14,9 +14,9 @@
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "sched"
+#include "llvm/CodeGen/ScheduleDAG.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/ScheduleDAG.h"
#include "llvm/CodeGen/SSARegMap.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetInstrInfo.h"
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
index 93198d1093..e089d0bc0f 100644
--- a/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
+++ b/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
@@ -178,7 +178,7 @@ private:
bool isBottomUp;
/// HazardRec - The hazard recognizer to use.
- HazardRecognizer &HazardRec;
+ HazardRecognizer *HazardRec;
typedef std::priority_queue<SUnit*, std::vector<SUnit*>, ls_rr_sort>
AvailableQueueTy;
@@ -186,7 +186,7 @@ private:
public:
ScheduleDAGList(SelectionDAG &dag, MachineBasicBlock *bb,
const TargetMachine &tm, bool isbottomup,
- HazardRecognizer &HR)
+ HazardRecognizer *HR)
: ScheduleDAG(listSchedulingBURR, dag, bb, tm),
CurrCycle(0), HeadSUnit(NULL), TailSUnit(NULL), isBottomUp(isbottomup),
HazardRec(HR) {
@@ -199,6 +199,7 @@ public:
delete SU;
SU = NextSU;
}
+ delete HazardRec;
}
void Schedule();
@@ -413,12 +414,10 @@ void ScheduleDAGList::ListScheduleTopDown() {
// Available queue.
AvailableQueueTy Available;
- HazardRec.StartBasicBlock();
-
// Emit the entry node first.
SUnit *Entry = SUnitMap[DAG.getEntryNode().Val];
ScheduleNodeTopDown(Available, Entry);
- HazardRec.EmitInstruction(Entry->Node);
+ HazardRec->EmitInstruction(Entry->Node);
// All leaves to Available queue.
for (SUnit *SU = HeadSUnit; SU != NULL; SU = SU->Next) {
@@ -446,7 +445,7 @@ void ScheduleDAGList::ListScheduleTopDown() {
N->getOpcode() < ISD::BUILTIN_OP_END && i != e; ++i)
N = CurNode->FlaggedNodes[i];
- HazardRecognizer::HazardType HT = HazardRec.getHazardType(N);
+ HazardRecognizer::HazardType HT = HazardRec->getHazardType(N);
if (HT == HazardRecognizer::NoHazard) {
FoundNode = CurNode;
break;
@@ -467,19 +466,19 @@ void ScheduleDAGList::ListScheduleTopDown() {
// If we found a node to schedule, do it now.
if (FoundNode) {
ScheduleNodeTopDown(Available, FoundNode);
- HazardRec.EmitInstruction(FoundNode->Node);
+ HazardRec->EmitInstruction(FoundNode->Node);
} else if (!HasNoopHazards) {
// Otherwise, we have a pipeline stall, but no other problem, just advance
// the current cycle and try again.
DEBUG(std::cerr << "*** Advancing cycle, no work to do\n");
- HazardRec.AdvanceCycle();
+ HazardRec->AdvanceCycle();
++NumStalls;
} else {
// Otherwise, we have no instructions to issue and we have instructions
// that will fault if we don't do this right. This is the case for
// processors without pipeline interlocks and other cases.
DEBUG(std::cerr << "*** Emitting noop\n");
- HazardRec.EmitNoop();
+ HazardRec->EmitNoop();
Sequence.push_back(0); // NULL SUnit* -> noop
++NumNoops;
}
@@ -691,14 +690,14 @@ void ScheduleDAGList::Schedule() {
llvm::ScheduleDAG* llvm::createBURRListDAGScheduler(SelectionDAG &DAG,
MachineBasicBlock *BB) {
- HazardRecognizer HR;
- return new ScheduleDAGList(DAG, BB, DAG.getTarget(), true, HR);
+ return new ScheduleDAGList(DAG, BB, DAG.getTarget(), true,
+ new HazardRecognizer());
}
/// createTDListDAGScheduler - This creates a top-down list scheduler with the
/// specified hazard recognizer.
ScheduleDAG* llvm::createTDListDAGScheduler(SelectionDAG &DAG,
MachineBasicBlock *BB,
- HazardRecognizer &HR) {
+ HazardRecognizer *HR) {
return new ScheduleDAGList(DAG, BB, DAG.getTarget(), false, HR);
}
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 3e97494a26..b0eae94e92 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2474,17 +2474,15 @@ void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) {
SL = createBURRListDAGScheduler(DAG, BB);
break;
case listSchedulingTD:
- SL = createTDListDAGScheduler(DAG, BB, GetTargetHazardRecognizer());
+ SL = createTDListDAGScheduler(DAG, BB, CreateTargetHazardRecognizer());
break;
}
BB = SL->Run();
delete SL;
}
-HazardRecognizer &SelectionDAGISel::
-GetTargetHazardRecognizer() {
- static HazardRecognizer DefaultRecognizer;
- return DefaultRecognizer;
+HazardRecognizer *SelectionDAGISel::CreateTargetHazardRecognizer() {
+ return new HazardRecognizer();
}
/// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
diff --git a/lib/Target/PowerPC/PPCHazardRecognizers.cpp b/lib/Target/PowerPC/PPCHazardRecognizers.cpp
index 852b9c8e32..203f116135 100644
--- a/lib/Target/PowerPC/PPCHazardRecognizers.cpp
+++ b/lib/Target/PowerPC/PPCHazardRecognizers.cpp
@@ -50,6 +50,10 @@ using namespace llvm;
// e.g. integer divides that only execute in the second slot.
//
+PPCHazardRecognizer970::PPCHazardRecognizer970() {
+ EndDispatchGroup();
+}
+
void PPCHazardRecognizer970::EndDispatchGroup() {
DEBUG(std::cerr << "=== Start of dispatch group\n");
// Pipeline units.
@@ -117,12 +121,6 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode) {
return FXU;
}
-
-/// StartBasicBlock - Initiate a new dispatch group.
-void PPCHazardRecognizer970::StartBasicBlock() {
- EndDispatchGroup();
-}
-
/// isLoadOfStoredAddress - If we have a load from the previously stored pointer
/// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
bool PPCHazardRecognizer970::
diff --git a/lib/Target/PowerPC/PPCHazardRecognizers.h b/lib/Target/PowerPC/PPCHazardRecognizers.h
index 5f7bb1bac2..fb1f88e044 100644
--- a/lib/Target/PowerPC/PPCHazardRecognizers.h
+++ b/lib/Target/PowerPC/PPCHazardRecognizers.h
@@ -52,7 +52,7 @@ class PPCHazardRecognizer970 : public HazardRecognizer {
unsigned StoreSize;
public:
- virtual void StartBasicBlock();
+ PPCHazardRecognizer970();
virtual HazardType getHazardType(SDNode *Node);
virtual void EmitInstruction(SDNode *Node);
virtual void AdvanceCycle();
diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 5c74a7ba6c..4c2d4af6f9 100644
--- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -41,7 +41,6 @@ namespace {
class PPCDAGToDAGISel : public SelectionDAGISel {
PPCTargetLowering PPCLowering;
unsigned GlobalBaseReg;
- PPCHazardRecognizer970 PPC970HR;
public:
PPCDAGToDAGISel(TargetMachine &TM)
: SelectionDAGISel(PPCLowering), PPCLowering(TM) {}
@@ -125,12 +124,12 @@ namespace {
return "PowerPC DAG->DAG Pattern Instruction Selection";
}
- /// GetTargetHazardRecognizer - Return the hazard recognizer to use for this
+ /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for this
/// target when scheduling the DAG.
- virtual HazardRecognizer &GetTargetHazardRecognizer() {
+ virtual HazardRecognizer *CreateTargetHazardRecognizer() {
// Should use subtarget info to pick the right hazard recognizer. For
// now, always return a PPC970 recognizer.
- return PPC970HR;
+ return new PPCHazardRecognizer970();
}
// Include the pieces autogenerated from the target description.