Program Listing for File DepGraphTransform.h#
↰ Return to documentation for file (src/midend/programTransformation/loopProcessing/depGraph/DepGraphTransform.h)
#ifndef TRANSFORM_DEPGRAPH
#define TRANSFORM_DEPGRAPH
#include <GraphUpdate.h>
#include <DomainInfo.h>
#include <DepInfoUpdate.h>
#include <DepGraph.h>
#include <assert.h>
inline DepDirection EdgeDir2DepDir( GraphAccess::EdgeDirection dir)
{
switch (dir) {
case GraphAccess::EdgeOut : return DEP_SRC;
case GraphAccess::EdgeIn : return DEP_SINK;
case GraphAccess::BiEdge: return DEP_SRC_SINK;
default: ROSE_ABORT();
}
}
template <class Graph, class DepInfoUpdate>
class UpdateDepEdgeInfo {
DepInfoUpdate T;
Graph *graph;
public:
UpdateDepEdgeInfo( Graph* g, const DepInfoUpdate& _T) : T(_T), graph(g) {}
void operator() ( typename Graph::Edge *e, GraphAccess::EdgeDirection dir)
{ if (! UpdateDepInfo<DepInfoUpdate>(T)( e->GetInfo(), EdgeDir2DepDir(dir)) )
graph->DeleteEdge(e);
}
};
template <class Graph, class Node>
void CopySplitNodeEdge
( Graph *graph, Node* orig, Node* split, const DomainCond &splitCond)
{
CopyNodeEdge(graph, orig, split);
typedef UpdateDepEdgeInfo<Graph,DepInfoRestrictDomain> InfoOp;
UpdateNodeEdge (graph,split, InfoOp(graph,DepInfoRestrictDomain(splitCond)) );
}
template <class Graph, class Node>
void UpdateSplitNodeEdge ( Graph *c, Node* split, const DomainCond &splitCond)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoRestrictDomain> InfoOp;
UpdateNodeEdge(c,split, InfoOp(c,DepInfoRestrictDomain(splitCond)) );
}
template <class Graph, class Node>
void DepGraphNodeRestrictDomain
( Graph *graph, Node* node, const DomainCond &cond)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoRestrictDomain> InfoOp;
UpdateNodeEdge ( graph, node, InfoOp(graph,DepInfoRestrictDomain(cond)) );
}
template <class Graph, class Node>
void FuseDepGraphNode ( Graph* graph, Node* orig, Node* split)
{
MoveNodeEdge( graph, split, orig);
graph->DeleteNode(split);
}
template <class Graph, class SelectNode>
void DepGraphInsertLoop (Graph* graph, SelectNode nodes, int level)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoInsertLoop> InfoOp;
UpdateEachNodeEdge( graph, nodes, InfoOp(graph,DepInfoInsertLoop(level)) );
}
template <class Graph, class Node>
void DepGraphNodeInsertLoop (Graph* graph, Node* n, int level)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoInsertLoop> InfoOp;
UpdateNodeEdge( graph, n, InfoOp(graph,DepInfoInsertLoop(level)) );
}
template <class Graph, class Node>
void DepGraphNodeSwapLoop
(Graph* graph, Node* node, int level1, int level2)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoSwapLoop> InfoOp;
UpdateNodeEdge( graph, node, InfoOp(graph,DepInfoSwapLoop(level1,level2)) );
}
template <class Graph, class Node>
void DepGraphNodeRemoveLoop (Graph* graph, Node* node, int level)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoRemoveLoop> InfoOp;
UpdateNodeEdge( graph, node, InfoOp(graph,DepInfoRemoveLoop(level)) );
}
template <class Graph, class Node>
void DepGraphNodeMergeLoop (Graph* graph, Node* node,
int desc, int src)
{
typedef UpdateDepEdgeInfo<Graph,DepInfoMergeLoop> InfoOp;
UpdateNodeEdge ( graph, node, InfoOp(graph, DepInfoMergeLoop(desc,src)) );
}
template <class Graph, class Node>
void DepGraphNodeAlignLoop (Graph* graph, Node* node,
int level, int align)
{
if (align != 0) {
typedef UpdateDepEdgeInfo<Graph,DepInfoAlignLoop> InfoOp;
UpdateNodeEdge ( graph, node, InfoOp(graph,DepInfoAlignLoop(level,-align)) );
}
}
#endif