aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/EquivClassGraphs.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-11-02 20:31:06 +0000
committerChris Lattner <sabre@nondot.org>2004-11-02 20:31:06 +0000
commitf1de30acce29e5ea9c21b611cd1f963a4bbaef94 (patch)
tree42fb0b806a42778fe89e54886e48c08e936f30c4 /lib/Analysis/DataStructure/EquivClassGraphs.cpp
parentcaa35bc0b6425bc019bb7e4ce08d20e8ba615139 (diff)
Graphs that are part of equivalence sets can be multi-function SCC's
themselves. Make sure to update DSInfo correctly. This fixes a testcase reduced from Prolangs-C++/objects git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17439 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DataStructure/EquivClassGraphs.cpp')
-rw-r--r--lib/Analysis/DataStructure/EquivClassGraphs.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/Analysis/DataStructure/EquivClassGraphs.cpp b/lib/Analysis/DataStructure/EquivClassGraphs.cpp
index 6a2c29836b..40c6a218ba 100644
--- a/lib/Analysis/DataStructure/EquivClassGraphs.cpp
+++ b/lib/Analysis/DataStructure/EquivClassGraphs.cpp
@@ -214,16 +214,21 @@ void PA::EquivClassGraphs::buildIndirectFunctionSets(Module &M) {
DSGraph &CBUGraph = CBU->getDSGraph(*F);
if (!GraphsMerged.insert(&CBUGraph).second)
continue;
- assert(FG == 0 && "Remerged a graph?");
// Record the "folded" graph for the function.
- FG = &MergedG;
+ for (DSGraph::ReturnNodesTy::iterator
+ I = CBUGraph.getReturnNodes().begin(),
+ E = CBUGraph.getReturnNodes().end();
+ I != E; ++I) {
+ assert(DSInfo[I->first] == 0 && "Graph already exists for Fn!");
+ DSInfo[I->first] = &MergedG;
+ }
// Clone this member of the equivalence class into MergedG.
DSGraph::NodeMapTy NodeMap;
MergedG.cloneInto(CBUGraph, MergedG.getScalarMap(),
- MergedG.getReturnNodes(), NodeMap, 0);
+ MergedG.getReturnNodes(), NodeMap, 0);
// Merge the return nodes of all functions together.
MergedG.getReturnNodes()[LF].mergeWith(MergedG.getReturnNodes()[F]);