From f1de30acce29e5ea9c21b611cd1f963a4bbaef94 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 2 Nov 2004 20:31:06 +0000 Subject: [PATCH] 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 --- lib/Analysis/DataStructure/EquivClassGraphs.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/DataStructure/EquivClassGraphs.cpp b/lib/Analysis/DataStructure/EquivClassGraphs.cpp index 6a2c29836bc..40c6a218bac 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]);