Turn the EdgeBundles class into a stand-alone machine CFG analysis pass.
The analysis will be needed by both the greedy register allocator and the X86FloatingPoint pass. It only needs to be computed once when the CFG doesn't change. This pass is very fast, usually showing up as 0.0% wall time. llvm-svn: 122832
This commit is contained in:
@@ -24,7 +24,6 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/GraphWriter.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
@@ -35,56 +34,6 @@ static cl::opt<bool>
|
||||
AllowSplit("spiller-splits-edges",
|
||||
cl::desc("Allow critical edge splitting during spilling"));
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Edge Bundles
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// compute - Compute the edge bundles for MF. Bundles depend only on the CFG.
|
||||
void EdgeBundles::compute(const MachineFunction *mf) {
|
||||
MF = mf;
|
||||
EC.clear();
|
||||
EC.grow(2 * MF->size());
|
||||
|
||||
for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
|
||||
++I) {
|
||||
const MachineBasicBlock &MBB = *I;
|
||||
unsigned OutE = 2 * MBB.getNumber() + 1;
|
||||
// Join the outgoing bundle with the ingoing bundles of all successors.
|
||||
for (MachineBasicBlock::const_succ_iterator SI = MBB.succ_begin(),
|
||||
SE = MBB.succ_end(); SI != SE; ++SI)
|
||||
EC.join(OutE, 2 * (*SI)->getNumber());
|
||||
}
|
||||
EC.compress();
|
||||
}
|
||||
|
||||
/// view - Visualize the annotated bipartite CFG with Graphviz.
|
||||
void EdgeBundles::view() const {
|
||||
ViewGraph(*this, "EdgeBundles");
|
||||
}
|
||||
|
||||
/// Specialize WriteGraph, the standard implementation won't work.
|
||||
raw_ostream &llvm::WriteGraph(raw_ostream &O, const EdgeBundles &G,
|
||||
bool ShortNames,
|
||||
const std::string &Title) {
|
||||
const MachineFunction *MF = G.getMachineFunction();
|
||||
|
||||
O << "digraph {\n";
|
||||
for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
|
||||
I != E; ++I) {
|
||||
unsigned BB = I->getNumber();
|
||||
O << "\t\"BB#" << BB << "\" [ shape=box ]\n"
|
||||
<< '\t' << G.getBundle(BB, false) << " -> \"BB#" << BB << "\"\n"
|
||||
<< "\t\"BB#" << BB << "\" -> " << G.getBundle(BB, true) << '\n';
|
||||
for (MachineBasicBlock::const_succ_iterator SI = I->succ_begin(),
|
||||
SE = I->succ_end(); SI != SE; ++SI)
|
||||
O << "\t\"BB#" << BB << "\" -> \"BB#" << (*SI)->getNumber()
|
||||
<< "\" [ color=lightgray ]\n";
|
||||
}
|
||||
O << "}\n";
|
||||
return O;
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Split Analysis
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
Reference in New Issue
Block a user