Allow loop detection during debug in forwarding nodes, and revert auxcall patch as it make 176.gcc untenable

llvm-svn: 31510
This commit is contained in:
Andrew Lenharth 2006-11-07 20:36:02 +00:00
parent cb902c4942
commit 1ee904e503
1 changed files with 20 additions and 8 deletions

View File

@ -62,7 +62,17 @@ bool DSNodeHandle::isForwarding() const {
DSNode *DSNodeHandle::HandleForwarding() const { DSNode *DSNodeHandle::HandleForwarding() const {
assert(N->isForwarding() && "Can only be invoked if forwarding!"); 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! // Handle node forwarding here!
DSNode *Next = N->ForwardNH.getNode(); // Cause recursive shrinkage DSNode *Next = N->ForwardNH.getNode(); // Cause recursive shrinkage
Offset += N->ForwardNH.getOffset(); 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 DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset,
bool FoldIfIncompatible) { bool FoldIfIncompatible) {
DEBUG(std::cerr << "merging " << *NewTy << " at " << Offset
<< " with " << *Ty << "\n");
const TargetData &TD = getTargetData(); const TargetData &TD = getTargetData();
// Check to make sure the Size member is up-to-date. Size can be one of the // Check to make sure the Size member is up-to-date. Size can be one of the
// following: // 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) for (afc_iterator I = Graph.afc_begin(), E = Graph.afc_end(); I!=E; ++I)
if (SCCFinder.PathExistsToClonedNode(*I)) if (SCCFinder.PathExistsToClonedNode(*I))
AuxCallToCopy.push_back(&*I); AuxCallToCopy.push_back(&*I);
else if (I->isIndirectCall()){ // else if (I->isIndirectCall()){
//If the call node doesn't have any callees, clone it // //If the call node doesn't have any callees, clone it
std::vector< Function *> List; // std::vector< Function *> List;
I->getCalleeNode()->addFullFunctionList(List); // I->getCalleeNode()->addFullFunctionList(List);
if (!List.size()) // if (!List.size())
AuxCallToCopy.push_back(&*I); // AuxCallToCopy.push_back(&*I);
} // }
const DSScalarMap &GSM = Graph.getScalarMap(); const DSScalarMap &GSM = Graph.getScalarMap();
for (DSScalarMap::global_iterator GI = GSM.global_begin(), for (DSScalarMap::global_iterator GI = GSM.global_begin(),