Inliner: Don't remove calls to readnone+nounwind (but not always_inline) functions in the AlwaysInliner

llvm-svn: 305245
This commit is contained in:
David Blaikie 2017-06-12 23:01:17 +00:00
parent f45e6462ca
commit ae8c4af4ac
2 changed files with 21 additions and 9 deletions

View File

@ -523,6 +523,16 @@ inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG,
if (!Callee || Callee->isDeclaration())
continue;
// FIXME for new PM: because of the old PM we currently generate ORE and
// in turn BFI on demand. With the new PM, the ORE dependency should
// just become a regular analysis dependency.
OptimizationRemarkEmitter ORE(Caller);
// If the policy determines that we should inline this function,
// delete the call instead.
if (!shouldInline(CS, GetInlineCost, ORE))
continue;
// If this call site is dead and it is to a readonly function, we should
// just delete the call instead of trying to inline it, regardless of
// size. This happens because IPSCCP propagates the result out of the
@ -548,15 +558,6 @@ inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG,
// Get DebugLoc to report. CS will be invalid after Inliner.
DebugLoc DLoc = CS.getInstruction()->getDebugLoc();
BasicBlock *Block = CS.getParent();
// FIXME for new PM: because of the old PM we currently generate ORE and
// in turn BFI on demand. With the new PM, the ORE dependency should
// just become a regular analysis dependency.
OptimizationRemarkEmitter ORE(Caller);
// If the policy determines that we should inline this function,
// try to do so.
if (!shouldInline(CS, GetInlineCost, ORE))
continue;
// Attempt to inline the function.
using namespace ore;

View File

@ -305,3 +305,14 @@ entry:
ret void
; CHECK: ret void
}
define void @inner14() readnone nounwind {
; CHECK: define void @inner14
ret void
}
define void @outer14() {
; CHECK: call void @inner14
call void @inner14()
ret void
}