62 static unsigned nodeCnt=0;
64 std::cout <<
"getId(" <<
getId() <<
")" << std::endl;
65 std::cout <<
"nodeCnt(" << nodeCnt <<
")" << std::endl;
72 return current().convert<Edge>();
79 return current().convert<Node>();
87 Node::dump (ostream& os, OA_ptr<IRHandlesIRInterface> ir)
95 return mDGNode->operator==(other);
100 return mDGNode->operator<(other);
109 os <<
"DUGStandard Node: ";
120 unsigned int count = 0;
122 for ( ; srcIter->isValid(); ++(*srcIter), ++count) {
123 OA_ptr<NodeInterface> node = srcIter->currentDUGNode();
124 if (count == 0) { os <<
" <-- ("; }
129 if (count > 0) { os <<
")" << endl; }
134 for ( ; outIter->isValid(); ++(*outIter), ++count) {
135 OA_ptr<NodeInterface> node = outIter->currentDUGNode();
136 if (count == 0) { os <<
" --> ("; }
141 if (count > 0) { os <<
")" << endl; }
151 char buf1[20], buf2[20];
152 sprintf(buf1,
"(%u)\\n",
getId());
153 sprintf(buf2,
"@%u", ih.hval());
155 std::string::size_type loc = str.find(
"::", 0);
156 if( loc != std::string::npos ) str.erase(loc, 2);
161 OA_ptr<Location> memLoc =
mDUG->mIR->getLocation(
mProc, sym);
162 if (memLoc.ptrEqual(0)){
164 std::cout <<
"^^^^^ NULL LOCATION ^^^^^" << std::endl;
165 std::cout <<
"\tmProc(" <<
mDUG->mIR->toString(
mProc);
166 std::cout <<
"), sym(" <<
mDUG->mIR->toString(sym)
168 if (
mDef == IRHandle(0) ||
mDef == IRHandle(1) ||
mDef == IRHandle(2))
169 std::cout <<
"stmt(012)" << std::endl;
171 std::cout <<
"stmt(" <<
mDUG->mIR->toString((StmtHandle)
mDef)
175 else if (!memLoc->isLocal()) {
180 os <<
"\"" << str <<
"\"";
185 OA_ptr<DGraph::EdgesIteratorInterface>
191 OA_ptr<DGraph::EdgesIteratorInterface>
197 OA_ptr<DGraph::NodesIteratorInterface>
203 OA_ptr<DGraph::NodesIteratorInterface>
209 OA_ptr<EdgesIteratorInterface>
212 OA_ptr<EdgesIterator> retval;
218 OA_ptr<EdgesIteratorInterface>
221 OA_ptr<EdgesIterator> retval;
227 OA_ptr<NodesIteratorInterface>
230 OA_ptr<NodesIterator> retval;
236 OA_ptr<NodesIteratorInterface>
239 OA_ptr<NodesIterator> retval;
254 : mDUG(pDUG), mNode1(pNode1), mNode2(pNode2), mType(pType),
255 mCall(call), mProc(proc)
259 mDGEdge =
new DGraph::EdgeImplement(pNode1->mDGNode,
269 return mDGEdge->operator==(other);
272 bool Edge::operator<(DGraph::EdgeInterface& other)
274 return mDGEdge->operator<(other);
279 void Edge::dump(ostream& os)
286 std::string::size_type loc = s.find(
"::", 0);
287 if( loc != std::string::npos ) s.erase(0, loc+2);
291 void Edge::dumpdot(ostream& os, OA_ptr<DUGIRInterface> ir)
293 OA_ptr<NodeInterface> srcNode = getDUGSource();
294 OA_ptr<NodeInterface> sinkNode = getDUGSink();
296 srcNode->dumpdot(os, ir);
298 sinkNode->dumpdot(os, ir);
299 dumpdot_label(os, ir);
304 void Edge::dumpdot_label(ostream& os, OA_ptr<DUGIRInterface> ir)
306 CallHandle call = getCall();
309 if (call != CallHandle(0)) os <<
"(" << call.hval() <<
")";
312 ProcHandle proc = getProc();
317 if (call != CallHandle(0)){
324 SymHandle calleeSym = ir->getSymHandle(call);
325 procStr = ir->toString(calleeSym);
328 os <<
"\", style=dashed];" << endl;
331 os <<
"\"];" << endl;
337 DUGStandard::DUGStandard(
338 OA_ptr<DUGIRInterface> pIR,
339 OA_ptr<DataFlow::ParamBindings> pParamBind)
340 : mIR(pIR), mParamBind(pParamBind)
342 mEntry = mExit =
NULL;
343 mDGraph =
new DGraph::DGraphImplement;
344 mCallNodes =
new std::list<OA_ptr<Node> >;
345 mReturnNodes =
new std::list<OA_ptr<Node> >;
346 mActiveSymSet =
new std::set<SymHandle>;
347 mActiveMemRefSet =
new std::set<MemRefHandle>;
348 mActiveStmtSet =
new std::set<StmtHandle>;
349 mUnknownLocActive =
false;
353 DUGStandard::~DUGStandard()
364 DUGStandard::getDUGEdge(
365 const OA_ptr<DGraph::EdgeInterface> dgEdge)
const
375 DUGStandard::getDUGNode(
376 const OA_ptr<DGraph::NodeInterface> dgNode)
const
383 void DUGStandard::addEdge(OA_ptr<DGraph::EdgeInterface> pEdge)
385 mDGraph->addEdge(pEdge);
388 void DUGStandard::addNode(OA_ptr<DGraph::NodeInterface> pNode)
391 mDGraph->addNode(pNode);
395 OA_ptr<DGraph::NodesIteratorInterface> DUGStandard::getNodesIterator()
const
397 return mDGraph->getNodesIterator();
400 OA_ptr<DGraph::NodesIteratorInterface>
401 DUGStandard::getEntryNodesIterator( )
const
404 return mDGraph->getEntryNodesIterator();
407 OA_ptr<DGraph::NodesIteratorInterface>
408 DUGStandard::getExitNodesIterator( )
const
410 return mDGraph->getExitNodesIterator();
414 OA_ptr<DGraph::EdgesIteratorInterface> DUGStandard::getEdgesIterator()
const
417 return mDGraph->getEdgesIterator();
420 OA_ptr<DGraph::NodesIteratorInterface> DUGStandard::getDFSIterator(OA_ptr<DGraph::NodeInterface>
n)
424 return mDGraph->getDFSIterator(n);
427 OA_ptr<DGraph::NodesIteratorInterface> DUGStandard::getBFSIterator()
430 OA_ptr<DGraph::NodesIteratorInterface> retval;
435 OA_ptr<DGraph::NodesIteratorInterface>
438 return mDGraph->getReversePostDFSIterator(pOrient);
441 OA_ptr<DGraph::NodesIteratorInterface>
442 DUGStandard::getReversePostDFSIterator(OA_ptr<DGraph::NodeInterface> root,
453 OA_ptr<DGraph::NodesIteratorInterface>
459 OA_ptr<DGraph::NodesIteratorInterface>
460 DUGStandard::getPostDFSIterator(OA_ptr<DGraph::NodeInterface> root,
467 OA_ptr<NodesIteratorInterface> DUGStandard::getDUGNodesIterator()
const
469 OA_ptr<NodesIterator> retval;
470 retval =
new NodesIterator(getNodesIterator());
476 OA_ptr<NodesIteratorInterface>
477 DUGStandard::getDUGEntryNodesIterator( )
const
479 OA_ptr<NodesIterator> retval;
480 retval =
new NodesIterator(getEntryNodesIterator());
486 OA_ptr<NodesIteratorInterface>
487 DUGStandard::getDUGExitNodesIterator( )
const
489 OA_ptr<NodesIterator> retval;
490 retval =
new NodesIterator(getExitNodesIterator());
496 OA_ptr<EdgesIteratorInterface> DUGStandard::getDUGEdgesIterator()
const
498 OA_ptr<EdgesIterator> retval;
499 retval =
new EdgesIterator(getEdgesIterator());
506 OA_ptr<NodesIteratorInterface>
509 OA_ptr<NodesIterator> retval;
510 retval =
new NodesIterator(getReversePostDFSIterator(pOrient));
514 OA_ptr<NodesIteratorInterface>
515 DUGStandard::getDUGDFSIterator(OA_ptr<NodeInterface> n)
517 OA_ptr<NodesIterator> retval;
518 retval =
new NodesIterator(getDFSIterator(n));
525 DUGStandard::dump (ostream& os, OA_ptr<IRHandlesIRInterface> ir)
527 os <<
"===== DUGStandard: =====\n"
531 OA_ptr<NodesIteratorInterface> nodeIter = getDUGNodesIterator();
532 for ( ; nodeIter->isValid(); ++(*nodeIter)) {
533 OA_ptr<NodeInterface> node = nodeIter->currentDUGNode();
534 node->longdump(os, ir);
538 os <<
"====================" << endl;
545 DUGStandard::dumpdot(ostream& os, OA_ptr<DUGIRInterface> ir)
548 os <<
"digraph OA_DUG {" << endl;
549 os <<
"node [shape=rectangle];" << endl;
552 OA_ptr<EdgesIteratorInterface> iter;
553 iter = getDUGEdgesIterator();
554 for (; iter->isValid(); (*iter)++ ) {
555 OA_ptr<EdgeInterface> edge = iter->currentDUGEdge();
556 edge->dumpdot(os, ir);
570 std::cout <<
"getNode: " << mIR->toString(sym) <<
"("
571 << sym.
hval() <<
")@" << mIR->toString(proc) <<
"("
572 << proc.
hval() <<
") --- ";
579 std::cout <<
"found itself" << std::endl;
587 for ( ; symIter->isValid(); (*symIter)++) {
588 retval = mSymToNode[
IRSymHandle(ih,symIter->current())];
591 std::cout <<
"found FullOverlap" << std::endl;
597 symIter = nloc->getPartOverlapIter();
598 for ( ; symIter->isValid(); (*symIter)++) {
599 retval = mSymToNode[
IRSymHandle(ih,symIter->current())];
602 std::cout <<
"found PartOverlap" << std::endl;
611 retval =
new Node(temp, proc, ih, sym);
613 mSymToNode[key] = retval;
616 std::cout <<
"added" << std::endl;
618 if (isIndependent(proc, sym) || isDependent(proc, sym))
619 mInDepSymToNodes[sym].insert(retval);
631 std::cout <<
"isNode: " << mIR->toString(sym) <<
"("
632 << sym.
hval() <<
")@" << mIR->toString(proc) <<
"("
633 << proc.
hval() <<
") --- ";
635 std::pair<IRHandle, SymHandle> key(ih, sym);
640 std::cout <<
"found itself" << std::endl;
648 std::cout <<
"NULL location" << std::endl;
654 for ( ; symIter->isValid(); (*symIter)++) {
655 retval = mSymToNode[
IRSymHandle(ih,symIter->current())];
658 std::cout <<
"found FullOverlap" << std::endl;
665 for ( ; symIter->isValid(); (*symIter)++) {
666 retval = mSymToNode[
IRSymHandle(ih,symIter->current())];
669 std::cout <<
"found PartOverlap" << std::endl;
676 std::cout <<
"not found" << std::endl;
687 mUnknownLocActive =
true;
694 std::cout <<
"DUGStandard::insertActiveSymSet:(loc)";
695 loc->
dump(std::cout, mIR);
696 std::cout << std::endl;
701 for ( ; symIter->isValid(); (*symIter)++) {
703 std::cout <<
"\tFullOverlap: " << mIR->
toString(symIter->current());
704 std::cout << std::endl;
706 insertActiveSymSet( symIter->current());
709 for ( ; symIter->isValid(); (*symIter)++) {
711 std::cout <<
"\tPartialOverlap: ";
712 std::cout << std::endl;
714 insertActiveSymSet(symIter->current());
726 OA_ptr<InvisibleLoc> invLoc
728 OA_ptr<MemRefExpr> mre = invLoc->getMemRefExpr();
733 if (mre->isaNamed()) {
734 OA_ptr<NamedRef> namedRef
735 = namedRef.convert<NamedRef>();
736 insertActiveSymSet( namedRef->getSymHandle() );
747 insertActiveSymSet(baseLoc);
757 Node::setActive(SymHandle sym)
762 if (mDUG->mActiveMap[mProc].ptrEqual(0)) {
766 mDUG->insertActiveSymSet(sym);
768 std::set<MemRefHandle> mrefSet;
769 mrefSet = mDUG->getMemRefSet(sym);
770 if (!mrefSet.empty()){
771 std::set<MemRefHandle>::iterator i = mrefSet.begin();
772 for(; i != mrefSet.end(); i++) {
773 mDUG->insertActiveMemRefSet(*i, mProc);
778 std::set<StmtHandle> stmtSet;
779 stmtSet = mDUG->getStmtSet(sym);
780 if (!stmtSet.empty()){
781 std::set<StmtHandle>::iterator i = stmtSet.begin();
782 for(; i != stmtSet.end(); i++)
783 mDUG->insertActiveStmtSet(*i, mProc);
794 OA_ptr<Location> loc = mDUG->mIR->getLocation(getProc(), mSym);
795 OA_ptr<NamedLoc> nmloc = loc.convert<NamedLoc>();
796 assert(!nmloc.ptrEqual(0));
797 OA_ptr<SymHandleIterator> overlapIter = nmloc->getFullOverlapIter();
798 for ( ; overlapIter->isValid(); (*overlapIter)++ ) {
799 SymHandle sym = overlapIter->current();
803 overlapIter = nmloc->getPartOverlapIter();
804 for ( ; overlapIter->isValid(); (*overlapIter)++ ) {
805 SymHandle sym = overlapIter->current();
812 Node::markVaried(std::list<CallHandle>& callStack,
815 std::set<std::pair<unsigned,unsigned> >& onPath,
825 parenEType = parenEdge->getType();
826 parenCall = parenEdge->getCall();
833 std::cout <<
"NULL edge";
835 parenEdge->dumpdot(std::cout, mDUG->mIR);
836 std::cout << std::endl;
838 bool isVariedBefore = isVaried();
839 int nonParentSuccessors = 0;
842 bool valueThroughGlobals =
false;
843 if (callStack.front() ==
CallHandle(1)) valueThroughGlobals =
true;
847 succIterPtr = getDUGOutgoingEdgesIterator();
849 for (; succIterPtr->isValid(); ++(*succIterPtr)) {
855 unsigned succId = succNode->getId();
856 EdgeType etype = succEdge->getType();
858 std::pair<unsigned, unsigned> pathNode;
861 pathNode = std::pair<unsigned,unsigned>
862 (succEdge->getCall().hval(),succId);
break;
864 if (callStack.empty())
865 pathNode = std::pair<unsigned,unsigned>(1,succId);
867 pathNode = std::pair<unsigned,unsigned>
868 (callStack.front().hval(),succId);
break;
871 pathNode = std::pair<unsigned,unsigned>(1,succId);
break;
875 if (succSym != prevSym || parenCall != succEdge->getCall()) nonParentSuccessors++;
877 if (visited.find(succEdge) != visited.end() ||
878 onPath.find(pathNode) != onPath.end() )
883 onPath.insert(pathNode);
889 ProcHandle callerProc = succEdge->getSourceProc();
890 if (proc != callerProc){
892 std::cout <<
"valthruglobals: begin" << std::endl;
897 callStack.push_front(succEdge->getCall());
898 visited.insert(succEdge);
900 succNode->markVaried(callStack, ir, visited, onPath,
901 succEdge->getSinkProc(), currSym,
903 callStack.pop_front();
904 if (proc != callerProc){
906 std::cout <<
"valthruglobals: end" << std::endl;
908 callStack.pop_front();
913 if (callStack.front() == succEdge->getCall() || valueThroughGlobals){
914 if (!valueThroughGlobals) callStack.pop_front();
915 visited.insert(succEdge);
917 succNode->markVaried(callStack, ir, visited, onPath,
918 succEdge->getProc(), currSym,
920 if (!valueThroughGlobals) callStack.push_front(succEdge->getCall());
924 std::cout <<
"markVaried: stackTop(" << (unsigned)callStack.front().hval()
925 <<
") <-> edgeCallExp("
926 << (unsigned)succEdge->getCall().hval() <<
")" << std::endl;
932 visited.insert(succEdge);
935 if (proc != succProc) {
938 succNode->markVaried(callStack, ir, visited, onPath,
939 succProc, currSym, succEdge);
940 callStack.pop_front();
943 succNode->markVaried(callStack, ir, visited, onPath,
944 proc, currSym, succEdge);
949 onPath.erase(pathNode);
953 if (nonParentSuccessors == 0 && !isVariedBefore && !isSelfDependent() &&
955 !mDUG->isDependent(getProc(), getSym()) ){
958 std::cout <<
"unsetVaried("; dumpdot(std::cout, mDUG->mIR);
959 std::cout <<
")" << std::endl;
963 std::cout <<
"<-" << std::endl;
968 Node::markUseful(std::list<CallHandle>& callStack,
971 std::set<std::pair<unsigned,unsigned> >& onPath,
984 parenEType = parenEdge->getType();
985 parenCall = parenEdge->getCall();
991 std::cout <<
"NULL edge";
993 parenEdge->dumpdot(std::cout, mDUG->mIR);
994 std::cout <<
"(call:" << parenCall.
hval() <<
")" << std::endl;
996 bool isUsefulBefore = isUseful();
998 int nonChildAncestors = 0;
1000 bool valueThroughGlobals =
false;
1001 if (callStack.front() ==
CallHandle(1)) valueThroughGlobals =
true;
1005 predIterPtr = getDUGIncomingEdgesIterator();
1008 for (; predIterPtr->isValid(); ++(*predIterPtr)) {
1014 unsigned predId = predNode->getId();
1015 EdgeType etype = predEdge->getType();
1017 std::pair<unsigned, unsigned> pathNode;
1020 pathNode = std::pair<unsigned,unsigned>
1021 (predEdge->getCall().hval(),predId);
break;
1023 if (callStack.empty())
1024 pathNode = std::pair<unsigned,unsigned>(1,predId);
1026 pathNode = std::pair<unsigned,unsigned>
1027 (callStack.front().hval(),predId);
break;
1030 pathNode = std::pair<unsigned,unsigned>
1034 if (predSym != prevSym || parenCall != predEdge->getCall()) nonChildAncestors++;
1035 if (visited.find(predEdge) != visited.end() ||
1036 onPath.find(pathNode) != onPath.end() )
continue;
1037 onPath.insert(pathNode);
1041 if (callStack.front() == predEdge->getCall() || valueThroughGlobals ){
1042 if (!valueThroughGlobals) callStack.pop_front();
1043 visited.insert(predEdge);
1044 predNode->markUseful(callStack, ir, visited, onPath,
1045 predEdge->getProc(), currSym, predEdge);
1046 if (!valueThroughGlobals) callStack.push_front(predEdge->getCall());
1051 ProcHandle callerProc = predEdge->getSinkProc();
1052 if (proc != callerProc){
1055 std::cout <<
"valthruglobals: begin" << std::endl;
1059 callStack.push_front(predEdge->getCall());
1060 visited.insert(predEdge);
1061 predNode->markUseful(callStack, ir, visited, onPath,
1062 predEdge->getSourceProc(),
1064 callStack.pop_front();
1065 if (proc != callerProc){
1066 callStack.pop_front();
1068 std::cout <<
"valthruglobals: end" << std::endl;
1074 if (predEdge->getType() !=
PARAM_EDGE) visited.insert(predEdge);
1076 if (proc != predProc) {
1079 std::cout <<
"valthruglobals: begin" << std::endl;
1081 predNode->markUseful(callStack, ir, visited, onPath,
1082 predProc, currSym, predEdge);
1083 callStack.pop_front();
1085 std::cout <<
"valthruglobals: end" << std::endl;
1090 predNode->markUseful(callStack, ir, visited, onPath,
1091 proc, currSym, predEdge);
1096 onPath.erase(pathNode);
1099 unsigned currId = getId();
1102 if (nonChildAncestors == 0 && !isUsefulBefore && !isSelfDependent() &&
1104 !mDUG->isIndependent(getProc(), getSym()) ){
1106 std::cout <<
"unsetUseful(" << currId <<
")" << std::endl;
1111 std::cout <<
"setActive(" << currId <<
")" << std::endl;
1117 std::cout <<
"<-" << std::endl;
1122 bool DUGStandard::isActive(
SymHandle sym)
1125 if (mUnknownLocActive) {
1127 }
else if (mActiveSymSet->find(sym) != mActiveSymSet->end()) {
1137 bool DUGStandard::isActive(MemRefHandle memref)
1139 if (mActiveMemRefSet->find(memref) != mActiveMemRefSet->end()) {
1150 Node::isPathFrom(OA_ptr<NodeInterface> useNode,
1151 std::set<OA_ptr<NodeInterface> >& visited)
1153 if (useNode.ptrEqual(
this))
return true;
1156 OA_ptr<EdgesIteratorInterface> predIterPtr
1157 = getDUGIncomingEdgesIterator();
1158 for (; predIterPtr->isValid(); ++(*predIterPtr)) {
1159 OA_ptr<EdgeInterface> predEdge = predIterPtr->currentDUGEdge();
1160 OA_ptr<NodeInterface> predNode = predEdge->getDUGSource();
1162 if (visited.find(predNode) != visited.end())
continue;
1163 visited.insert(predNode);
1164 if (predNode->isPathFrom(useNode, visited))
return true;
1177 = getDUGOutgoingEdgesIterator();
1178 for (; succIterPtr->isValid(); ++(*succIterPtr)) {
1180 if (succEdge->getType() !=
CFLOW_EDGE)
continue;
1181 if (succEdge->getProc() != proc)
return true;
1192 std::set<IRSymHandle>& OutGoingNodeSet,
1193 std::set<IRSymHandle>& visited)
1196 if (visited.find(nodeKey) != visited.end())
return;
1197 visited.insert(nodeKey);
1199 if (hasOutgoingEdgesToOtherProcs(proc))
1200 OutGoingNodeSet.insert(nodeKey);
1204 = getDUGOutgoingEdgesIterator();
1205 for (; succIterPtr->isValid(); ++(*succIterPtr)) {
1209 if (succEdge->getType() !=
CFLOW_EDGE)
continue;
1210 if (succEdge->getProc() != proc)
continue;
1212 succNode->findOutgoingNodes(proc, OutGoingNodeSet, visited);
1223 = getDUGIncomingEdgesIterator();
1224 for (; predIterPtr->isValid(); ++(*predIterPtr)) {
1226 if (predEdge->getType() !=
CFLOW_EDGE)
continue;
1227 if (predEdge->getProc() != proc)
return true;
1237 std::set<IRSymHandle>& InComingNodeSet,
1238 std::set<IRSymHandle>& visited)
1241 if (visited.find(nodeKey) != visited.end())
return;
1242 visited.insert(nodeKey);
1244 if (hasIncomingEdgesFromOtherProcs(proc))
1245 InComingNodeSet.insert(nodeKey);
1249 for (; predIterPtr->isValid(); ++(*predIterPtr)) {
1253 if (predEdge->getType() !=
CFLOW_EDGE)
continue;
1254 if (predEdge->getProc() != proc)
continue;
1256 predNode->findIncomingNodes(proc, InComingNodeSet, visited);
1263 Node::hasEdgesToOtherProc(
ProcHandle proc, std::set<IRSymHandle>& visited)
1266 if (visited.find(ish) != visited.end())
return false;
1267 visited.insert(ish);
1271 for (; succIterPtr->isValid(); ++(*succIterPtr)) {
1275 EdgeType etype = succEdge->getType();
1277 if (succEdge->getProc() != proc)
return true;
1278 if (etype ==
CFLOW_EDGE && succNode->hasEdgesToOtherProc(proc, visited))
1288 Node::hasEdgesFromOtherProc(
ProcHandle proc, std::set<IRSymHandle>& visited)
1291 if (visited.find(ish) != visited.end())
return false;
1292 visited.insert(ish);
1296 for (; predIterPtr->isValid(); ++(*predIterPtr)) {
1300 EdgeType etype = predEdge->getType();
1302 if (predEdge->getProc() != proc)
return true;
1303 if (predNode->hasEdgesFromOtherProc(proc, visited))