[llvm-commits] CVS: poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp EquivClassGraphs.h
Chris Lattner
lattner at cs.uiuc.edu
Sun Oct 31 15:41:36 PST 2004
Changes in directory poolalloc/lib/PoolAllocate:
EquivClassGraphs.cpp updated: 1.8 -> 1.9
EquivClassGraphs.h updated: 1.6 -> 1.7
---
Log message:
* Do not refer to ActualCallees in CBU, when we can do it locally.
* *DO NOT* print CBU graphs when asked to print our own. This is just
FREAKING confusing and misleading: it's better to not print anything.
* Simplify and clean up some code
* Add some more paranoia assertion checking code that I found to track
down this bug:
* Fix a nasty bug that was causing us to crash on Prolangs-C++/objects,
where we were missing processing some graphs. This hunk is the bugfix:
- if (!I->isExternal() && !FoldedGraphsMap.count(I))
+ if (!I->isExternal() && !ValMap.count(I))
urg!
---
Diffs of the changes: (+47 -30)
Index: poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp
diff -u poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp:1.8 poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp:1.9
--- poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp:1.8 Sun Oct 31 17:01:34 2004
+++ poolalloc/lib/PoolAllocate/EquivClassGraphs.cpp Sun Oct 31 17:41:26 2004
@@ -37,6 +37,25 @@
"Number of graphs inlined");
}
+#ifndef NDEBUG
+template<typename GT>
+static void CheckAllGraphs(Module *M, GT &ECGraphs) {
+ DSGraph &GG = ECGraphs.getGlobalsGraph();
+
+ for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
+ if (!I->isExternal()) {
+ DSGraph &G = ECGraphs.getDSGraph(*I);
+
+ DSGraph::NodeMapTy GlobalsGraphNodeMapping;
+ for (DSScalarMap::global_iterator I = G.getScalarMap().global_begin(),
+ E = G.getScalarMap().global_end(); I != E; ++I)
+ DSGraph::computeNodeMapping(G.getNodeForValue(*I),
+ GG.getNodeForValue(*I),
+ GlobalsGraphNodeMapping);
+ }
+}
+#endif
+
// getDSGraphForCallSite - Return the common data structure graph for
// callees at the specified call site.
//
@@ -56,10 +75,13 @@
//
bool PA::EquivClassGraphs::runOnModule(Module &M) {
CBU = &getAnalysis<CompleteBUDataStructures>();
+ CheckAllGraphs(&M, *CBU);
GlobalsGraph = new DSGraph(CBU->getGlobalsGraph());
GlobalsGraph->setPrintAuxCalls();
+ ActualCallees = CBU->getActualCallees();
+
// Find equivalence classes of functions called from common call sites.
// Fold the CBU graphs for all functions in an equivalence class.
buildIndirectFunctionSets(M);
@@ -77,9 +99,11 @@
}
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
- if (!I->isExternal() && !FoldedGraphsMap.count(I))
+ if (!I->isExternal() && !ValMap.count(I))
processSCC(getOrCreateGraph(*I), *I, Stack, NextID, ValMap);
+ DEBUG(CheckAllGraphs(&M, *this));
+
getGlobalsGraph().removeTriviallyDeadNodes();
return false;
}
@@ -237,7 +261,7 @@
DSGraph *PA::EquivClassGraphs::cloneGraph(Function &F) {
DSGraph *&Graph = FoldedGraphsMap[&F];
DSGraph &CBUGraph = CBU->getDSGraph(F);
- assert((Graph == NULL || Graph == &CBUGraph) && "Cloning a graph twice?");
+ assert(Graph == 0 && "Cloning a graph twice?");
// Copy the CBU graph...
Graph = new DSGraph(CBUGraph); // updates the map via reference
@@ -280,11 +304,9 @@
ActualCalleesTy::const_iterator I, E;
for (tie(I, E) = getActualCallees().equal_range(Call); I != E; ++I)
if (!I->second->isExternal()) {
- DSGraph &CalleeG = getOrCreateGraph(*I->second);
-
- // Have we visited the destination function yet?
- std::map<Function*, unsigned>::iterator It = ValMap.find(I->second);
- unsigned M = processSCC(CalleeG, *I->second, Stack, NextID, ValMap);
+ // Process the callee as necessary.
+ unsigned M = processSCC(getOrCreateGraph(*I->second), *I->second,
+ Stack, NextID, ValMap);
if (M < Min) Min = M;
}
}
@@ -296,22 +318,17 @@
// If this is a new SCC, process it now.
bool IsMultiNodeSCC = false;
while (Stack.back() != &F) {
- DSGraph *NG = &getOrCreateGraph(* Stack.back());
+ DSGraph *NG = &getOrCreateGraph(*Stack.back());
ValMap[Stack.back()] = ~0U;
// Since all SCCs must be the same as those found in CBU, we do not need to
// do any merging. Make sure all functions in the SCC share the same graph.
- assert(NG == &FG &&
- "FoldGraphs: Functions in the same SCC have different graphs?");
+ assert(NG == &FG && "ECG discovered different SCC's than the CBU pass?");
Stack.pop_back();
IsMultiNodeSCC = true;
}
- // Clean up the graph before we start inlining a bunch again...
- if (IsMultiNodeSCC)
- FG.removeTriviallyDeadNodes();
-
Stack.pop_back();
processGraph(FG, F);
@@ -392,17 +409,14 @@
#endif
}
- // Recompute the Incomplete markers
- if (CallerGraph != NULL) {
- assert(CallerGraph->getInlinedGlobals().empty());
- CallerGraph->maskIncompleteMarkers();
- CallerGraph->markIncompleteNodes(DSGraph::MarkFormalArgs);
-
- // Delete dead nodes. Treat globals that are unreachable but that can
- // reach live nodes as live.
- CallerGraph->removeDeadNodes(DSGraph::KeepUnreachableGlobals);
- }
-
+ // Recompute the Incomplete markers.
+ assert(CallerGraph->getInlinedGlobals().empty());
+ CallerGraph->maskIncompleteMarkers();
+ CallerGraph->markIncompleteNodes(DSGraph::MarkFormalArgs);
+
+ // Delete dead nodes. Treat globals that are unreachable but that can
+ // reach live nodes as live.
+ CallerGraph->removeDeadNodes(DSGraph::KeepUnreachableGlobals);
// When this graph is finalized, clone the globals in the graph into the
// globals graph to make sure it has everything, from all graphs.
@@ -416,7 +430,6 @@
E = MainSM.global_end(); I != E; ++I)
RC.getClonedNH(MainSM[*I]);
-
- DEBUG(std::cerr << " --DONE ProcessGraph for function "
+ DEBUG(std::cerr << " -- DONE ProcessGraph for function "
<< F.getName() << "\n");
}
Index: poolalloc/lib/PoolAllocate/EquivClassGraphs.h
diff -u poolalloc/lib/PoolAllocate/EquivClassGraphs.h:1.6 poolalloc/lib/PoolAllocate/EquivClassGraphs.h:1.7
--- poolalloc/lib/PoolAllocate/EquivClassGraphs.h:1.6 Sun Oct 31 17:01:34 2004
+++ poolalloc/lib/PoolAllocate/EquivClassGraphs.h Sun Oct 31 17:41:26 2004
@@ -52,6 +52,10 @@
// FoldedGraphsMap, one graph for each function
hash_map<const Function*, DSGraph*> FoldedGraphsMap;
+
+ /// ActualCallees - The actual functions callable from indirect call sites.
+ ///
+ hash_multimap<Instruction*, Function*> ActualCallees;
// Equivalence class where functions that can potentially be called via the
// same function pointer are in the same class.
@@ -122,9 +126,9 @@
return *GlobalsGraph;
}
- typedef llvm::BUDataStructures::ActualCalleesTy ActualCalleesTy;
+ typedef hash_multimap<Instruction*, Function*> ActualCalleesTy;
const ActualCalleesTy &getActualCallees() const {
- return CBU->getActualCallees();
+ return ActualCallees;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
@@ -134,7 +138,7 @@
/// print - Print out the analysis results...
///
- void print(std::ostream &O, const Module *M) const { CBU->print(O, M); }
+ void print(std::ostream &O, const Module *M) const {}
private:
void buildIndirectFunctionSets(Module &M);
More information about the llvm-commits
mailing list