diff options
author | Andrew Lenharth <andrewl@lenharth.org> | 2006-11-07 20:36:02 +0000 |
---|---|---|
committer | Andrew Lenharth <andrewl@lenharth.org> | 2006-11-07 20:36:02 +0000 |
commit | 1ee904e503faf7df5da414e92c7b24d9b770168c (patch) | |
tree | 6719ed00450e64590864271fe41937d4b1076c71 /llvm/lib/Analysis | |
parent | cb902c4942c7d667a50f808f8e4e276437225c3f (diff) | |
download | bcm5719-llvm-1ee904e503faf7df5da414e92c7b24d9b770168c.tar.gz bcm5719-llvm-1ee904e503faf7df5da414e92c7b24d9b770168c.zip |
Allow loop detection during debug in forwarding nodes, and revert auxcall patch as it make 176.gcc untenable
llvm-svn: 31510
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/DataStructure/DataStructure.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/DataStructure/DataStructure.cpp b/llvm/lib/Analysis/DataStructure/DataStructure.cpp index 169cd659e5d..15c6c75dc6a 100644 --- a/llvm/lib/Analysis/DataStructure/DataStructure.cpp +++ b/llvm/lib/Analysis/DataStructure/DataStructure.cpp @@ -62,7 +62,17 @@ bool DSNodeHandle::isForwarding() const { DSNode *DSNodeHandle::HandleForwarding() const { assert(N->isForwarding() && "Can only be invoked if forwarding!"); - + DEBUG( + { //assert not looping + DSNode* NH = N; + std::set<DSNode*> seen; + while(NH && NH->isForwarding()) { + assert(seen.find(NH) == seen.end() && "Loop detected"); + seen.insert(NH); + NH = NH->ForwardNH.N; + } + } + ); // Handle node forwarding here! DSNode *Next = N->ForwardNH.getNode(); // Cause recursive shrinkage Offset += N->ForwardNH.getOffset(); @@ -421,6 +431,8 @@ static bool ElementTypesAreCompatible(const Type *T1, const Type *T2, /// bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset, bool FoldIfIncompatible) { + DEBUG(std::cerr << "merging " << *NewTy << " at " << Offset + << " with " << *Ty << "\n"); const TargetData &TD = getTargetData(); // Check to make sure the Size member is up-to-date. Size can be one of the // following: @@ -1595,13 +1607,13 @@ void DSGraph::mergeInGraph(const DSCallSite &CS, for (afc_iterator I = Graph.afc_begin(), E = Graph.afc_end(); I!=E; ++I) if (SCCFinder.PathExistsToClonedNode(*I)) AuxCallToCopy.push_back(&*I); - else if (I->isIndirectCall()){ - //If the call node doesn't have any callees, clone it - std::vector< Function *> List; - I->getCalleeNode()->addFullFunctionList(List); - if (!List.size()) - AuxCallToCopy.push_back(&*I); - } +// else if (I->isIndirectCall()){ +// //If the call node doesn't have any callees, clone it +// std::vector< Function *> List; +// I->getCalleeNode()->addFullFunctionList(List); +// if (!List.size()) +// AuxCallToCopy.push_back(&*I); +// } const DSScalarMap &GSM = Graph.getScalarMap(); for (DSScalarMap::global_iterator GI = GSM.global_begin(), |