diff options
-rw-r--r-- | llvm/include/llvm/Transforms/Utils/Cloning.h | 6 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/Inliner.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 5 |
3 files changed, 16 insertions, 7 deletions
diff --git a/llvm/include/llvm/Transforms/Utils/Cloning.h b/llvm/include/llvm/Transforms/Utils/Cloning.h index 8f6502e1218..b934a56b288 100644 --- a/llvm/include/llvm/Transforms/Utils/Cloning.h +++ b/llvm/include/llvm/Transforms/Utils/Cloning.h @@ -189,7 +189,7 @@ public: explicit InlineFunctionInfo(CallGraph *cg = nullptr, AssumptionCacheTracker *ACT = nullptr, BlockCloningFunctor Ftor = nullptr) - : CG(cg), ACT(ACT), Ftor(Ftor) {} + : CG(cg), ACT(ACT), Ftor(Ftor), CallSuccessorBlockDeleted(false) {} /// CG - If non-null, InlineFunction will update the callgraph to reflect the /// changes it makes. @@ -198,6 +198,10 @@ public: // Functor that is invoked when a block is cloned into the new function. BlockCloningFunctor Ftor; + /// CallSuccessorBlockDeleted - whether the block immediately following the + /// call has been deleted during inlining + bool CallSuccessorBlockDeleted; + /// StaticAllocas - InlineFunction fills this in with all static allocas that /// get copied into the caller. SmallVector<AllocaInst *, 4> StaticAllocas; diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp index 8ed4bda54ad..c82c7dfe4cf 100644 --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -580,11 +580,13 @@ bool Inliner::runOnSCC(CallGraphSCC &SCC) { continue; } updateEntryCount(CallSiteBlock, Callee); - // The instruction following the call is part of a new basic block - // created during the inlining process. This does not have an entry in - // the BFI. We create an entry by copying the frequency of the original - // block containing the call. - copyBlockFrequency(CallSiteBlock, CallSuccessor->getParent()); + if (!InlineInfo.CallSuccessorBlockDeleted) { + // The instruction following the call is part of a new basic block + // created during the inlining process. This does not have an entry in + // the BFI. We create an entry by copying the frequency of the + // original block containing the call. + copyBlockFrequency(CallSiteBlock, CallSuccessor->getParent()); + } ++NumInlined; diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 923e5b231c4..251afb57b1f 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1994,8 +1994,11 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, // If we inlined any musttail calls and the original return is now // unreachable, delete it. It can only contain a bitcast and ret. - if (InlinedMustTailCalls && pred_begin(AfterCallBB) == pred_end(AfterCallBB)) + if (InlinedMustTailCalls && + pred_begin(AfterCallBB) == pred_end(AfterCallBB)) { + IFI.CallSuccessorBlockDeleted = true; AfterCallBB->eraseFromParent(); + } // We should always be able to fold the entry block of the function into the // single predecessor of the block... |