OpenASIP 2.2
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Protected Member Functions | Private Attributes | Friends | List of all members
ProgramDependenceNode Class Reference

#include <ProgramDependenceNode.hh>

Inheritance diagram for ProgramDependenceNode:
Inheritance graph
Collaboration diagram for ProgramDependenceNode:
Collaboration graph

Public Types

enum  NodeType {
  PDG_NODE_REGION , PDG_NODE_PREDICATE , PDG_NODE_MOVE , PDG_NODE_LOOPENTRY ,
  PDG_NODE_LOOPCLOSE
}
 
typedef std::set< ProgramDependenceNode * > NodesInfo
 

Public Member Functions

 ProgramDependenceNode (NodeType type=PDG_NODE_REGION)
 
 ProgramDependenceNode (ControlDependenceNode &cdgNode, NodeType type=PDG_NODE_REGION)
 
 ProgramDependenceNode (MoveNode &mNode, NodeType type=PDG_NODE_MOVE)
 
virtual ~ProgramDependenceNode ()
 
bool isRegionNode () const
 
bool isPredicateMoveNode () const
 
bool isMoveNode () const
 
bool isLoopEntryNode () const
 
bool isLoopEntryNode (int component) const
 
bool isLoopCloseNode () const
 
bool isLastNode () const
 
void setLoopEntryNode (int component)
 
void setComponent (int component)
 
void setLastNode ()
 
int component () const
 
MoveNodemoveNode ()
 
const MoveNodemoveNode () const
 
ControlDependenceNodecdgNode ()
 
const ControlDependenceNodecdgNode () const
 
std::string dotString () const
 
std::string toString () const
 
const NodesInforegion ()
 
const NodesInfoeec ()
 
void printRelations () const
 
BasicBlockNodenewFirstBB ()
 
void setNewFirstBB (BasicBlockNode *newBB)
 
std::vector< BasicBlockNode * > leafBlocks ()
 
void addLeafBlock (BasicBlockNode *newLeaf)
 
void addLeafBlocks (std::vector< BasicBlockNode * > newLeafs)
 
- Public Member Functions inherited from GraphNode
 GraphNode (int nodeID)
 
 GraphNode ()
 
virtual ~GraphNode ()
 
virtual GraphNodeclone () const
 
int nodeID () const
 

Protected Member Functions

void setPredicateMoveNode ()
 
void addToRegion (ProgramDependenceNode &node)
 
void addToEEC (ProgramDependenceNode &node)
 

Private Attributes

MoveNodemNode_
 
ControlDependenceNodecdgNode_
 
NodeType type_
 
NodesInfo region_
 Stores "region" information for computing serialization information.
 
NodesInfo eec_
 Stores "eec" information for computing serialization information.
 
int component_
 Number of strong component the node belongs to. Node can be part of several strong components so this value have practical meaning only for loop close nodes - close just one loop, and loop entry nodes - marks a component in which node is loop entry. Still can be regular region of larger loop Full list of nodes that belongs to actual components is available in strongComponents_ vector in PDG.
 
BasicBlockNodenewFirstBB_
 First basic block of a subgraph of a region.
 
std::vector< BasicBlockNode * > leafBlocks_
 Vector of basic blocks of a subgraph that do not have outgoing edged and will need to get connected.
 
bool lastNode_
 Indicates that node must be scheduled last between it's siblings because it's subgraph contains close node and it's parent is entry.
 

Friends

class ProgramDependenceGraph
 

Detailed Description

Definition at line 43 of file ProgramDependenceNode.hh.

Member Typedef Documentation

◆ NodesInfo

Definition at line 64 of file ProgramDependenceNode.hh.

Member Enumeration Documentation

◆ NodeType

Enumerator
PDG_NODE_REGION 
PDG_NODE_PREDICATE 
PDG_NODE_MOVE 
PDG_NODE_LOOPENTRY 
PDG_NODE_LOOPCLOSE 

Definition at line 45 of file ProgramDependenceNode.hh.

45 {
46 PDG_NODE_REGION, // Region nodes of PDG
47 PDG_NODE_PREDICATE, // Predicate nodes of PDG
48 PDG_NODE_MOVE, // Single statements nodes
49 PDG_NODE_LOOPENTRY, // Region that is loop entry node
50 PDG_NODE_LOOPCLOSE // Region that is loop entry node
51 };

Constructor & Destructor Documentation

◆ ProgramDependenceNode() [1/3]

ProgramDependenceNode::ProgramDependenceNode ( NodeType  type = PDG_NODE_REGION)

Constructor creating Program Dependence Node which is empty. Does not have related CDG node. For example Loop Close node.

Parameters
typeType of the node

Definition at line 45 of file ProgramDependenceNode.cc.

47 : GraphNode(), type_(type), component_(-1), newFirstBB_(NULL),
48 lastNode_(false) {
49 mNode_ = NULL;
50 cdgNode_ = NULL;
51}
bool lastNode_
Indicates that node must be scheduled last between it's siblings because it's subgraph contains close...
BasicBlockNode * newFirstBB_
First basic block of a subgraph of a region.
int component_
Number of strong component the node belongs to. Node can be part of several strong components so this...
ControlDependenceNode * cdgNode_

References cdgNode_, and mNode_.

◆ ProgramDependenceNode() [2/3]

ProgramDependenceNode::ProgramDependenceNode ( ControlDependenceNode cdgNode,
NodeType  type = PDG_NODE_REGION 
)

Constructor creating Program Dependence Node from Control Dependence region node.

Parameters
cdgNodenode of CDG
typeType of the node

Definition at line 59 of file ProgramDependenceNode.cc.

62 : GraphNode(), cdgNode_(&cdgNode), type_(type), component_(-1),
63 newFirstBB_(NULL), lastNode_(false) {
64 mNode_ = NULL;
65}
ControlDependenceNode & cdgNode()

References mNode_.

◆ ProgramDependenceNode() [3/3]

ProgramDependenceNode::ProgramDependenceNode ( MoveNode mNode,
NodeType  type = PDG_NODE_MOVE 
)

Constructor creating Program Dependence Node from Data Dependence node.

Parameters
mNodeMoveNode of DDG
typeType of the node

Definition at line 72 of file ProgramDependenceNode.cc.

75 : GraphNode(), mNode_(&mNode), type_(type), component_(-1),
76 newFirstBB_(NULL), lastNode_(false) {
77 cdgNode_ = NULL;
78}

References cdgNode_.

◆ ~ProgramDependenceNode()

ProgramDependenceNode::~ProgramDependenceNode ( )
virtual

Empty destructor.

Definition at line 83 of file ProgramDependenceNode.cc.

83 {
84 region_.clear();
85 eec_.clear();
86}
NodesInfo eec_
Stores "eec" information for computing serialization information.
NodesInfo region_
Stores "region" information for computing serialization information.

References eec_, and region_.

Member Function Documentation

◆ addLeafBlock()

void ProgramDependenceNode::addLeafBlock ( BasicBlockNode newLeaf)
inline

Definition at line 90 of file ProgramDependenceNode.hh.

90 {
91 leafBlocks_.push_back(newLeaf); }
std::vector< BasicBlockNode * > leafBlocks_
Vector of basic blocks of a subgraph that do not have outgoing edged and will need to get connected.

References leafBlocks_.

Referenced by ProgramDependenceGraph::processPredicate(), and ProgramDependenceGraph::processRegion().

◆ addLeafBlocks()

void ProgramDependenceNode::addLeafBlocks ( std::vector< BasicBlockNode * >  newLeafs)
inline

Definition at line 92 of file ProgramDependenceNode.hh.

92 {
93 leafBlocks_.insert(leafBlocks_.end(), newLeafs.begin(), newLeafs.end());
94 }

References leafBlocks_.

Referenced by ProgramDependenceGraph::processRegion().

◆ addToEEC()

void ProgramDependenceNode::addToEEC ( ProgramDependenceNode node)
protected

Add node to "eec" set for computing serialization information

Parameters
nodeNode to add to the set

Definition at line 270 of file ProgramDependenceNode.cc.

270 {
271 eec_.insert(&node);
272}

References eec_.

Referenced by ProgramDependenceGraph::computeEECInfo().

◆ addToRegion()

void ProgramDependenceNode::addToRegion ( ProgramDependenceNode node)
protected

Add node to "region" set for computing serialization information

Parameters
nodeNode to add to the set

Definition at line 250 of file ProgramDependenceNode.cc.

250 {
251 region_.insert(&node);
252}

References region_.

Referenced by ProgramDependenceGraph::computeRegionInfo(), and ProgramDependenceGraph::regionHelper().

◆ cdgNode() [1/2]

ControlDependenceNode & ProgramDependenceNode::cdgNode ( )

Returns CDGNode corresponding to given node in CDG.

Returns
CDGNode corresponding to given node in CDG

Definition at line 214 of file ProgramDependenceNode.cc.

214 {
215 if ((type_ == PDG_NODE_REGION
218 && cdgNode_ != NULL) {
219 return *cdgNode_;
220 } else {
221 TCEString msg = "ControlNode type does not contain CDGNode in ";
222 msg += toString() + "!";
223 throw InvalidData(__FILE__, __LINE__, __func__, msg);
224 }
225}
#define __func__
std::string toString() const

References __func__, cdgNode_, PDG_NODE_LOOPCLOSE, PDG_NODE_LOOPENTRY, PDG_NODE_REGION, toString(), and type_.

Here is the call graph for this function:

◆ cdgNode() [2/2]

const ControlDependenceNode & ProgramDependenceNode::cdgNode ( ) const

Returns CDGNode corresponding to given node in CDG as constant.

Returns
CDGNode corresponding to given node in CDG as constant

Definition at line 231 of file ProgramDependenceNode.cc.

231 {
232 if ((type_ == PDG_NODE_REGION
235 && cdgNode_ != NULL) {
236 return *cdgNode_;
237 } else {
238 TCEString msg = "ControlNode type does not contain CDGNode in ";
239 msg += toString() + "!";
240 throw InvalidData(__FILE__, __LINE__, __func__, msg);
241 }
242}

References __func__, cdgNode_, PDG_NODE_LOOPCLOSE, PDG_NODE_LOOPENTRY, PDG_NODE_REGION, toString(), and type_.

Here is the call graph for this function:

◆ component()

int ProgramDependenceNode::component ( ) const
inline

Definition at line 76 of file ProgramDependenceNode.hh.

76{ return component_;}

References component_.

Referenced by isLoopEntryNode(), setComponent(), and setLoopEntryNode().

◆ dotString()

std::string ProgramDependenceNode::dotString ( ) const
virtual

Returns content of a node as a string in .dot format.

Returns
string representing content of a node in .dot format

Reimplemented from GraphNode.

Definition at line 140 of file ProgramDependenceNode.cc.

140 {
141 if (isPredicateMoveNode()) {
142 return TCEString("label=\"") +
143 toString() + "\",shape=box,color=green";
144 }
145 if (isRegionNode()) {
146 return TCEString("label=\"")
147 + toString() + "\",shape=box,color=blue";
148 }
149 if (isMoveNode() && moveNode().isMove() && moveNode().move().isCall()) {
150 return TCEString("label=\"")
151 + toString() + "\",shape=box,color=red";
152 }
153 if (isLoopEntryNode()) {
154 return TCEString("label=\"")
155 + toString() + "\",shape=box,color=red";
156 }
157 if (isLoopCloseNode()) {
158 return TCEString("label=\"")
159 + toString() + "\",shape=box,color=yellow";
160 }
161
162 return TCEString("label=\"") + toString() + "\"";
163}

References isLoopCloseNode(), isLoopEntryNode(), isMoveNode(), isPredicateMoveNode(), isRegionNode(), moveNode(), and toString().

Here is the call graph for this function:

◆ eec()

const ProgramDependenceNode::NodesInfo & ProgramDependenceNode::eec ( )

Returns the "eec" set for given node

Returns
the "eec" set for given node

Definition at line 281 of file ProgramDependenceNode.cc.

281 {
282 return eec_;
283}

References eec_.

Referenced by ProgramDependenceGraph::compareSiblings(), and ProgramDependenceGraph::computeEECInfo().

◆ isLastNode()

bool ProgramDependenceNode::isLastNode ( ) const
inline

Definition at line 72 of file ProgramDependenceNode.hh.

72{ return lastNode_;}

References lastNode_.

Referenced by ProgramDependenceGraph::compareSiblings(), and toString().

◆ isLoopCloseNode()

bool ProgramDependenceNode::isLoopCloseNode ( ) const
inline

◆ isLoopEntryNode() [1/2]

bool ProgramDependenceNode::isLoopEntryNode ( ) const
inline

◆ isLoopEntryNode() [2/2]

bool ProgramDependenceNode::isLoopEntryNode ( int  component) const
inline

Definition at line 69 of file ProgramDependenceNode.hh.

References component(), component_, PDG_NODE_LOOPENTRY, and type_.

Here is the call graph for this function:

◆ isMoveNode()

bool ProgramDependenceNode::isMoveNode ( ) const
inline

◆ isPredicateMoveNode()

bool ProgramDependenceNode::isPredicateMoveNode ( ) const
inline

◆ isRegionNode()

bool ProgramDependenceNode::isRegionNode ( ) const
inline

◆ leafBlocks()

std::vector< BasicBlockNode * > ProgramDependenceNode::leafBlocks ( )
inline

Definition at line 89 of file ProgramDependenceNode.hh.

89{ return leafBlocks_;}

References leafBlocks_.

Referenced by ProgramDependenceGraph::processRegion().

◆ moveNode() [1/2]

MoveNode & ProgramDependenceNode::moveNode ( )

Returns MoveNode corresponding to given node in DDG.

Returns
MoveNode corresponding to given node in DDG

Definition at line 182 of file ProgramDependenceNode.cc.

182 {
184 && mNode_ != NULL) {
185 return *mNode_;
186 } else {
187 TCEString msg = "MoveNode type does not contain move in ";
188 msg += toString() + "!";
189 throw InvalidData(__FILE__, __LINE__, __func__, msg);
190 }
191}

References __func__, mNode_, PDG_NODE_MOVE, PDG_NODE_PREDICATE, toString(), and type_.

Referenced by dotString(), ProgramDependenceGraph::processPredicate(), ProgramDependenceGraph::processRegion(), ProgramDependenceGraph::ProgramDependenceGraph(), and ProgramDependenceGraph::removeGuardedJump().

Here is the call graph for this function:

◆ moveNode() [2/2]

const MoveNode & ProgramDependenceNode::moveNode ( ) const

Returns MoveNode corresponding to given node in DDG as constant.

Returns
MoveNode corresponding to given node in DDG as constant

Definition at line 198 of file ProgramDependenceNode.cc.

198 {
200 && mNode_ != NULL) {
201 return *mNode_;
202 } else {
203 TCEString msg = "MoveNode type does not contain move in ";
204 msg += toString() + "!";
205 throw InvalidData(__FILE__, __LINE__, __func__, msg);
206 }
207}

References __func__, mNode_, PDG_NODE_MOVE, PDG_NODE_PREDICATE, toString(), and type_.

Here is the call graph for this function:

◆ newFirstBB()

BasicBlockNode * ProgramDependenceNode::newFirstBB ( )
inline

Definition at line 87 of file ProgramDependenceNode.hh.

87{ return newFirstBB_;}

References newFirstBB_.

Referenced by ProgramDependenceGraph::processRegion().

◆ printRelations()

void ProgramDependenceNode::printRelations ( ) const

Definition at line 297 of file ProgramDependenceNode.cc.

297 {
298 Application::logStream() << "Relations: ";
299 for (NodesInfo::const_iterator iter = region_.begin();
300 iter != region_.end();
301 iter ++) {
302 Application::logStream() << (*iter)->toString() << ", ";
303 }
304 Application::logStream() << std::endl;
305 Application::logStream() << "EEC: ";
306 for (NodesInfo::const_iterator iter = eec_.begin();
307 iter != eec_.end();
308 iter ++) {
309 Application::logStream() << (*iter)->toString() << ", ";
310 }
311 Application::logStream() << std::endl;
312
313}
static std::ostream & logStream()

References eec_, Application::logStream(), and region_.

Referenced by ProgramDependenceGraph::processRegion().

Here is the call graph for this function:

◆ region()

const ProgramDependenceNode::NodesInfo & ProgramDependenceNode::region ( )

Returns the "region" set for given node

Returns
the "region" set for given node

Definition at line 260 of file ProgramDependenceNode.cc.

260 {
261 return region_;
262}

References region_.

Referenced by ProgramDependenceGraph::regionHelper().

◆ setComponent()

void ProgramDependenceNode::setComponent ( int  component)
inline

Definition at line 74 of file ProgramDependenceNode.hh.

References component(), and component_.

Referenced by ProgramDependenceGraph::detectStrongComponents().

Here is the call graph for this function:

◆ setLastNode()

void ProgramDependenceNode::setLastNode ( )
inline

Definition at line 75 of file ProgramDependenceNode.hh.

75{ lastNode_ = true; }

References lastNode_.

Referenced by ProgramDependenceGraph::ProgramDependenceGraph().

◆ setLoopEntryNode()

void ProgramDependenceNode::setLoopEntryNode ( int  component)

Sets the node to be loop entry node of a given component (loop)

Parameters
componentComponent of which the node is loop entry node

Definition at line 292 of file ProgramDependenceNode.cc.

292 {
295}

References component(), component_, PDG_NODE_LOOPENTRY, and type_.

Referenced by ProgramDependenceGraph::detectStrongComponents().

Here is the call graph for this function:

◆ setNewFirstBB()

void ProgramDependenceNode::setNewFirstBB ( BasicBlockNode newBB)
inline

◆ setPredicateMoveNode()

void ProgramDependenceNode::setPredicateMoveNode ( )
protected

Sets node to be predicate node

Definition at line 168 of file ProgramDependenceNode.cc.

168 {
170 TCEString msg = "Trying to create predicate move from Region in ";
171 msg += toString() + "!";
172 throw InvalidData(__FILE__, __LINE__, __func__, msg);
173 }
175}

References __func__, PDG_NODE_MOVE, PDG_NODE_PREDICATE, toString(), and type_.

Referenced by ProgramDependenceGraph::removeGuardedJump().

Here is the call graph for this function:

◆ toString()

std::string ProgramDependenceNode::toString ( ) const
virtual

Returns content of a node as a string.

Returns
string representing content of a node

Node added during strong components detection to collect edges pointing to loop entry from outside the loop. Do not have cdg equivalent if analysis was done directly on pdg

Loop entry is region node converted during detection of loops Exists in CDG even if loop detection was done on PDG

Node added during strong components detection to collect edges pointing to loop entry from inside the loop. Do not have cdg equivalent if analysis was done directly on pdg

Reimplemented from GraphNode.

Definition at line 93 of file ProgramDependenceNode.cc.

93 {
94 TCEString result;
95 if (isRegionNode()) {
96 if (cdgNode_ != NULL) {
97 result += cdgNode_->toString() + ": " +
99 } else {
100 /// Node added during strong components detection
101 /// to collect edges pointing to loop entry from outside the loop.
102 /// Do not have cdg equivalent if analysis was done directly on pdg
103 result += "Collect_" + Conversion::toString(nodeID());
104 }
105 }
106 if (isLoopEntryNode()) {
107 /// Loop entry is region node converted during detection of loops
108 /// Exists in CDG even if loop detection was done on PDG
109 result += "LoopEntry_" + Conversion::toString(nodeID()) +
110 ": " + cdgNode_->toString();
111 }
112 if (isLoopCloseNode()) {
113 /// Node added during strong components detection
114 /// to collect edges pointing to loop entry from inside the loop.
115 /// Do not have cdg equivalent if analysis was done directly on pdg
116 if (cdgNode_ != NULL) {
117 result += "LoopClose_" + Conversion::toString(nodeID()) +
118 ": " + cdgNode_->toString();
119 } else {
120 result += "LoopClose_" + Conversion::toString(nodeID());
121 }
122 }
123 if (isPredicateMoveNode()) {
124 result += "Predicate: " + mNode_->toString() + ": " +
126 }
127 if (isLastNode()) {
128 result += "_LAST";
129 }
130 if (mNode_ != NULL && !isPredicateMoveNode()) {
131 result+= mNode_->toString() + ": " + Conversion::toString(nodeID());
132 }
133 return result;
134}
std::string toString() const
static std::string toString(const T &source)
int nodeID() const
std::string toString() const
Definition MoveNode.cc:576

References cdgNode_, isLastNode(), isLoopCloseNode(), isLoopEntryNode(), isPredicateMoveNode(), isRegionNode(), mNode_, GraphNode::nodeID(), ControlDependenceNode::toString(), MoveNode::toString(), and Conversion::toString().

Referenced by cdgNode(), cdgNode(), ProgramDependenceGraph::computeEECInfo(), ProgramDependenceGraph::detectStrongComponents(), dotString(), moveNode(), moveNode(), ProgramDependenceGraph::processPredicate(), ProgramDependenceGraph::processRegion(), ProgramDependenceGraph::removeGuardedJump(), and setPredicateMoveNode().

Here is the call graph for this function:

Friends And Related Symbol Documentation

◆ ProgramDependenceGraph

friend class ProgramDependenceGraph
friend

Definition at line 97 of file ProgramDependenceNode.hh.

Member Data Documentation

◆ cdgNode_

ControlDependenceNode* ProgramDependenceNode::cdgNode_
private

◆ component_

int ProgramDependenceNode::component_
private

Number of strong component the node belongs to. Node can be part of several strong components so this value have practical meaning only for loop close nodes - close just one loop, and loop entry nodes - marks a component in which node is loop entry. Still can be regular region of larger loop Full list of nodes that belongs to actual components is available in strongComponents_ vector in PDG.

Definition at line 116 of file ProgramDependenceNode.hh.

Referenced by component(), isLoopEntryNode(), setComponent(), and setLoopEntryNode().

◆ eec_

NodesInfo ProgramDependenceNode::eec_
private

Stores "eec" information for computing serialization information.

Definition at line 108 of file ProgramDependenceNode.hh.

Referenced by addToEEC(), eec(), printRelations(), and ~ProgramDependenceNode().

◆ lastNode_

bool ProgramDependenceNode::lastNode_
private

Indicates that node must be scheduled last between it's siblings because it's subgraph contains close node and it's parent is entry.

Definition at line 124 of file ProgramDependenceNode.hh.

Referenced by isLastNode(), and setLastNode().

◆ leafBlocks_

std::vector<BasicBlockNode*> ProgramDependenceNode::leafBlocks_
private

Vector of basic blocks of a subgraph that do not have outgoing edged and will need to get connected.

Definition at line 121 of file ProgramDependenceNode.hh.

Referenced by addLeafBlock(), addLeafBlocks(), and leafBlocks().

◆ mNode_

MoveNode* ProgramDependenceNode::mNode_
private

◆ newFirstBB_

BasicBlockNode* ProgramDependenceNode::newFirstBB_
private

First basic block of a subgraph of a region.

Definition at line 118 of file ProgramDependenceNode.hh.

Referenced by newFirstBB(), and setNewFirstBB().

◆ region_

NodesInfo ProgramDependenceNode::region_
private

Stores "region" information for computing serialization information.

Definition at line 106 of file ProgramDependenceNode.hh.

Referenced by addToRegion(), printRelations(), region(), and ~ProgramDependenceNode().

◆ type_

NodeType ProgramDependenceNode::type_
private

The documentation for this class was generated from the following files: