Changes in directory llvm/lib/Analysis/DataStructure:
DataStructure.cpp updated: 1.246 -> 1.247 --- Log message: Fix a bug, don't drop indirect call sites, especially if there is nothing known about them yet, and restore a simple version of a removed function --- Diffs of the changes: (+27 -1) DataStructure.cpp | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletion(-) Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.246 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.247 --- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.246 Wed May 24 12:04:03 2006 +++ llvm/lib/Analysis/DataStructure/DataStructure.cpp Mon Jun 19 10:42:47 2006 @@ -938,7 +938,10 @@ // two node handles, since "this" may get merged away at intermediate steps. DSNodeHandle CurNodeH(this, Offset); DSNodeHandle NHCopy(NH); - DSNode::MergeNodes(CurNodeH, NHCopy); + if (CurNodeH.getOffset() >= NHCopy.getOffset()) + DSNode::MergeNodes(CurNodeH, NHCopy); + else + DSNode::MergeNodes(NHCopy, CurNodeH); } @@ -1594,6 +1597,13 @@ 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); + } const DSScalarMap &GSM = Graph.getScalarMap(); for (DSScalarMap::global_iterator GI = GSM.global_begin(), @@ -2397,3 +2407,19 @@ computeNodeMapping(CalleeSM[*GI], CallerSM[*GI], NodeMap); } } + +/// updateFromGlobalGraph - This function rematerializes global nodes and +/// nodes reachable from them from the globals graph into the current graph. +/// +void DSGraph::updateFromGlobalGraph() { + TIME_REGION(X, "updateFromGlobalGraph"); + ReachabilityCloner RC(*this, *GlobalsGraph, 0); + + // Clone the non-up-to-date global nodes into this graph. + for (DSScalarMap::global_iterator I = getScalarMap().global_begin(), + E = getScalarMap().global_end(); I != E; ++I) { + DSScalarMap::iterator It = GlobalsGraph->ScalarMap.find(*I); + if (It != GlobalsGraph->ScalarMap.end()) + RC.merge(getNodeForValue(*I), It->second); + } +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits