parent
e0e1db012c
commit
135fb4be7c
|
@ -1,87 +0,0 @@
|
||||||
//===- DependenceGraph.cpp - Dependence graph for a function ----*- C++ -*-===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file was developed by the LLVM research group and is distributed under
|
|
||||||
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// This file implements an explicit representation for the dependence graph
|
|
||||||
// of a function, with one node per instruction and one edge per dependence.
|
|
||||||
// Dependences include both data and control dependences.
|
|
||||||
//
|
|
||||||
// Each dep. graph node (class DepGraphNode) keeps lists of incoming and
|
|
||||||
// outgoing dependence edges.
|
|
||||||
//
|
|
||||||
// Each dep. graph edge (class Dependence) keeps a pointer to one end-point
|
|
||||||
// of the dependence. This saves space and is important because dep. graphs
|
|
||||||
// can grow quickly. It works just fine because the standard idiom is to
|
|
||||||
// start with a known node and enumerate the dependences to or from that node.
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
|
|
||||||
#include "llvm/Analysis/DependenceGraph.h"
|
|
||||||
#include "llvm/Function.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
// class Dependence:
|
|
||||||
//
|
|
||||||
// A representation of a simple (non-loop-related) dependence
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void Dependence::print(std::ostream &O) const
|
|
||||||
{
|
|
||||||
assert(depType != NoDependence && "This dependence should never be created!");
|
|
||||||
switch (depType) {
|
|
||||||
case TrueDependence: O << "TRUE dependence"; break;
|
|
||||||
case AntiDependence: O << "ANTI dependence"; break;
|
|
||||||
case OutputDependence: O << "OUTPUT dependence"; break;
|
|
||||||
case ControlDependence: O << "CONTROL dependence"; break;
|
|
||||||
default: assert(0 && "Invalid dependence type"); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
// class DepGraphNode
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DepGraphNode::print(std::ostream &O) const
|
|
||||||
{
|
|
||||||
const_iterator DI = outDepBegin(), DE = outDepEnd();
|
|
||||||
|
|
||||||
O << "\nDeps. from instr:" << getInstr();
|
|
||||||
|
|
||||||
for ( ; DI != DE; ++DI)
|
|
||||||
{
|
|
||||||
O << "\t";
|
|
||||||
DI->print(O);
|
|
||||||
O << " to instruction:";
|
|
||||||
O << DI->getSink()->getInstr();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
// class DependenceGraph
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DependenceGraph::~DependenceGraph()
|
|
||||||
{
|
|
||||||
// Free all DepGraphNode objects created for this graph
|
|
||||||
for (map_iterator I = depNodeMap.begin(), E = depNodeMap.end(); I != E; ++I)
|
|
||||||
delete I->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DependenceGraph::print(const Function& func, std::ostream &O) const
|
|
||||||
{
|
|
||||||
O << "DEPENDENCE GRAPH FOR FUNCTION " << func.getName() << ":\n";
|
|
||||||
for (Function::const_iterator BB=func.begin(), FE=func.end(); BB != FE; ++BB)
|
|
||||||
for (BasicBlock::const_iterator II=BB->begin(), IE=BB->end(); II !=IE; ++II)
|
|
||||||
if (const DepGraphNode* dgNode = this->getNode(*II))
|
|
||||||
dgNode->print(O);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // End llvm namespace
|
|
Loading…
Reference in New Issue