From fec2c2bf5ea14679f8a2d74a72bdec76f05fa001 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Sat, 6 Sep 2008 17:19:29 +0000 Subject: When PruneEH turned an invoke into an ordinary call (thus changing the call site) it didn't inform the callgraph about this. But the call site does matter - as shown by the testcase, the callgraph become invalid after the inliner ran (with an edge between two functions simply missing), resulting in wrong deductions by GlobalsModRef. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55872 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/PruneEH.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib/Transforms') diff --git a/lib/Transforms/IPO/PruneEH.cpp b/lib/Transforms/IPO/PruneEH.cpp index 8fb904b1ea..630768fbdc 100644 --- a/lib/Transforms/IPO/PruneEH.cpp +++ b/lib/Transforms/IPO/PruneEH.cpp @@ -156,6 +156,9 @@ bool PruneEH::runOnSCC(const std::vector &SCC) { // function if we have invokes to non-unwinding functions or code after calls to // no-return functions. bool PruneEH::SimplifyFunction(Function *F) { + CallGraph &CG = getAnalysis(); + CallGraphNode *CGN = CG[F]; + bool MadeChange = false; for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { if (InvokeInst *II = dyn_cast(BB->getTerminator())) @@ -174,6 +177,9 @@ bool PruneEH::SimplifyFunction(Function *F) { BasicBlock *UnwindBlock = II->getUnwindDest(); UnwindBlock->removePredecessor(II->getParent()); + // Fix up the call graph. + CGN->replaceCallSite(II, Call); + // Insert a branch to the normal destination right before the // invoke. BranchInst::Create(II->getNormalDest(), II); -- cgit v1.2.3