mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 03:53:04 +02:00
Fix a use-after-free bug introduced in r262636
llvm-svn: 262679
This commit is contained in:
parent
be253c0570
commit
587391856c
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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...
|
||||
|
Loading…
Reference in New Issue
Block a user