mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
MachineScheduler support for viewGraph.
llvm-svn: 173432
This commit is contained in:
parent
8da14ff342
commit
efbba4d345
@ -325,6 +325,9 @@ public:
|
|||||||
|
|
||||||
BitVector &getScheduledTrees() { return ScheduledTrees; }
|
BitVector &getScheduledTrees() { return ScheduledTrees; }
|
||||||
|
|
||||||
|
void viewGraph(const Twine &Name, const Twine &Title) LLVM_OVERRIDE;
|
||||||
|
void viewGraph() LLVM_OVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Top-Level entry points for the schedule() driver...
|
// Top-Level entry points for the schedule() driver...
|
||||||
|
|
||||||
|
@ -578,8 +578,8 @@ namespace llvm {
|
|||||||
/// viewGraph - Pop up a GraphViz/gv window with the ScheduleDAG rendered
|
/// viewGraph - Pop up a GraphViz/gv window with the ScheduleDAG rendered
|
||||||
/// using 'dot'.
|
/// using 'dot'.
|
||||||
///
|
///
|
||||||
void viewGraph(const Twine &Name, const Twine &Title);
|
virtual void viewGraph(const Twine &Name, const Twine &Title);
|
||||||
void viewGraph();
|
virtual void viewGraph();
|
||||||
|
|
||||||
virtual void dumpNode(const SUnit *SU) const = 0;
|
virtual void dumpNode(const SUnit *SU) const = 0;
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/GraphWriter.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
@ -557,7 +558,6 @@ void ScheduleDAGMI::buildDAGWithRegPressure() {
|
|||||||
|
|
||||||
// Build the DAG, and compute current register pressure.
|
// Build the DAG, and compute current register pressure.
|
||||||
buildSchedGraph(AA, &RPTracker);
|
buildSchedGraph(AA, &RPTracker);
|
||||||
if (ViewMISchedDAGs) viewGraph();
|
|
||||||
|
|
||||||
// Initialize top/bottom trackers after computing region pressure.
|
// Initialize top/bottom trackers after computing region pressure.
|
||||||
initRegPressure();
|
initRegPressure();
|
||||||
@ -2294,3 +2294,90 @@ static MachineSchedRegistry ShufflerRegistry(
|
|||||||
"shuffle", "Shuffle machine instructions alternating directions",
|
"shuffle", "Shuffle machine instructions alternating directions",
|
||||||
createInstructionShuffler);
|
createInstructionShuffler);
|
||||||
#endif // !NDEBUG
|
#endif // !NDEBUG
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// GraphWriter support for ScheduleDAGMI.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
template<> struct GraphTraits<
|
||||||
|
ScheduleDAGMI*> : public GraphTraits<ScheduleDAG*> {};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct DOTGraphTraits<ScheduleDAGMI*> : public DefaultDOTGraphTraits {
|
||||||
|
|
||||||
|
DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
|
||||||
|
|
||||||
|
static std::string getGraphName(const ScheduleDAG *G) {
|
||||||
|
return G->MF.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool renderGraphFromBottomUp() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isNodeHidden(const SUnit *Node) {
|
||||||
|
return (Node->NumPreds > 10 || Node->NumSuccs > 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool hasNodeAddressLabel(const SUnit *Node,
|
||||||
|
const ScheduleDAG *Graph) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If you want to override the dot attributes printed for a particular
|
||||||
|
/// edge, override this method.
|
||||||
|
static std::string getEdgeAttributes(const SUnit *Node,
|
||||||
|
SUnitIterator EI,
|
||||||
|
const ScheduleDAG *Graph) {
|
||||||
|
if (EI.isArtificialDep())
|
||||||
|
return "color=cyan,style=dashed";
|
||||||
|
if (EI.isCtrlDep())
|
||||||
|
return "color=blue,style=dashed";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string getNodeLabel(const SUnit *SU, const ScheduleDAG *G) {
|
||||||
|
std::string Str;
|
||||||
|
raw_string_ostream SS(Str);
|
||||||
|
SS << "SU(" << SU->NodeNum << ')';
|
||||||
|
return SS.str();
|
||||||
|
}
|
||||||
|
static std::string getNodeDescription(const SUnit *SU, const ScheduleDAG *G) {
|
||||||
|
return G->getGraphNodeLabel(SU);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string getNodeAttributes(const SUnit *N,
|
||||||
|
const ScheduleDAG *Graph) {
|
||||||
|
std::string Str("shape=Mrecord");
|
||||||
|
const SchedDFSResult *DFS =
|
||||||
|
static_cast<const ScheduleDAGMI*>(Graph)->getDFSResult();
|
||||||
|
if (DFS) {
|
||||||
|
Str += ",style=filled,fillcolor=\"#";
|
||||||
|
Str += DOT::getColorString(DFS->getSubtreeID(N));
|
||||||
|
Str += '"';
|
||||||
|
}
|
||||||
|
return Str;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace llvm
|
||||||
|
#endif // NDEBUG
|
||||||
|
|
||||||
|
/// viewGraph - Pop up a ghostview window with the reachable parts of the DAG
|
||||||
|
/// rendered using 'dot'.
|
||||||
|
///
|
||||||
|
void ScheduleDAGMI::viewGraph(const Twine &Name, const Twine &Title) {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
ViewGraph(this, Name, false, Title);
|
||||||
|
#else
|
||||||
|
errs() << "ScheduleDAGMI::viewGraph is only available in debug builds on "
|
||||||
|
<< "systems with Graphviz or gv!\n";
|
||||||
|
#endif // NDEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Out-of-line implementation with no arguments is handy for gdb.
|
||||||
|
void ScheduleDAGMI::viewGraph() {
|
||||||
|
viewGraph(getDAGName(), "Scheduling-Units Graph for " + getDAGName());
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user