mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Skeleton of the list schedule.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25544 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -37,9 +37,10 @@ namespace llvm {
|
|||||||
|
|
||||||
// Scheduling heuristics
|
// Scheduling heuristics
|
||||||
enum SchedHeuristics {
|
enum SchedHeuristics {
|
||||||
noScheduling,
|
noScheduling, // No scheduling, emit breath first sequence.
|
||||||
simpleScheduling,
|
simpleScheduling, // Two pass, min. critical path, max. utilization.
|
||||||
simpleNoItinScheduling
|
simpleNoItinScheduling, // Same as above exact using generic latency.
|
||||||
|
listSchedulingBURR, // Bottom up reg reduction list scheduling.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -332,6 +333,11 @@ namespace llvm {
|
|||||||
ScheduleDAG* createSimpleDAGScheduler(SchedHeuristics Heuristic,
|
ScheduleDAG* createSimpleDAGScheduler(SchedHeuristics Heuristic,
|
||||||
SelectionDAG &DAG,
|
SelectionDAG &DAG,
|
||||||
MachineBasicBlock *BB);
|
MachineBasicBlock *BB);
|
||||||
|
|
||||||
|
/// createBURRListDAGScheduler - This creates a bottom up register usage
|
||||||
|
/// reduction list scheduler.
|
||||||
|
ScheduleDAG* createBURRListDAGScheduler(SelectionDAG &DAG,
|
||||||
|
MachineBasicBlock *BB);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
61
lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
Normal file
61
lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
//===-- ScheduleDAGSimple.cpp - Implement a list scheduler for isel DAG ---===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file was developed by Evan Cheng and is distributed under the
|
||||||
|
// University of Illinois Open Source License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This implements a simple two pass scheduler. The first pass attempts to push
|
||||||
|
// backward any lengthy instructions and critical paths. The second pass packs
|
||||||
|
// instructions into semi-optimal time slots.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "sched"
|
||||||
|
#include "llvm/CodeGen/ScheduleDAG.h"
|
||||||
|
#include "llvm/CodeGen/SelectionDAG.h"
|
||||||
|
#include "llvm/Target/TargetMachine.h"
|
||||||
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <queue>
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// Sorting functions for ready queue.
|
||||||
|
struct LSSortPred : public std::binary_function<SDOperand, SDOperand, bool> {
|
||||||
|
bool operator()(const SDOperand* left, const SDOperand* right) const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// ScheduleDAGList - List scheduler.
|
||||||
|
|
||||||
|
class ScheduleDAGList : public ScheduleDAG {
|
||||||
|
private:
|
||||||
|
LSSortPred &Cmp;
|
||||||
|
|
||||||
|
// Ready queue
|
||||||
|
std::priority_queue<SDOperand*, std::vector<SDOperand*>, LSSortPred> Ready;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScheduleDAGList(SelectionDAG &dag, MachineBasicBlock *bb,
|
||||||
|
const TargetMachine &tm, LSSortPred cmp)
|
||||||
|
: ScheduleDAG(listSchedulingBURR, dag, bb, tm), Cmp(cmp), Ready(Cmp)
|
||||||
|
{};
|
||||||
|
|
||||||
|
void Schedule();
|
||||||
|
};
|
||||||
|
} // end namespace llvm
|
||||||
|
|
||||||
|
void ScheduleDAGList::Schedule() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
llvm::ScheduleDAG*
|
||||||
|
llvm::createBURRListDAGScheduler(SelectionDAG &DAG,
|
||||||
|
MachineBasicBlock *BB) {
|
||||||
|
return new ScheduleDAGList(DAG, BB, DAG.getTarget(), LSSortPred());
|
||||||
|
}
|
@@ -69,6 +69,8 @@ namespace {
|
|||||||
clEnumValN(simpleNoItinScheduling, "simple-noitin",
|
clEnumValN(simpleNoItinScheduling, "simple-noitin",
|
||||||
"Simple two pass scheduling: Same as simple "
|
"Simple two pass scheduling: Same as simple "
|
||||||
"except using generic latency"),
|
"except using generic latency"),
|
||||||
|
clEnumValN(listSchedulingBURR, "list-BURR",
|
||||||
|
"Bottom up register reduction list scheduling"),
|
||||||
clEnumValEnd));
|
clEnumValEnd));
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@@ -1775,6 +1777,8 @@ void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) {
|
|||||||
case simpleNoItinScheduling:
|
case simpleNoItinScheduling:
|
||||||
SL = createSimpleDAGScheduler(ISHeuristic, DAG, BB);
|
SL = createSimpleDAGScheduler(ISHeuristic, DAG, BB);
|
||||||
break;
|
break;
|
||||||
|
case listSchedulingBURR:
|
||||||
|
SL = createBURRListDAGScheduler(DAG, BB);
|
||||||
}
|
}
|
||||||
BB = SL->Run();
|
BB = SL->Run();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user