[AlwaysInliner] Check inliner errors even without assserts

When we build clang without asserts we should still check the result of
`InlineFunction()` to be sure there wasn't an error. Otherwise we could
incorrectly merge attributes in the next line.

This also removes a redundent call to `getCaller()`.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D121722
This commit is contained in:
Ellis Hoag 2022-03-15 11:10:32 -07:00
parent 54b145d5ca
commit 84c6689b15
2 changed files with 35 additions and 5 deletions

View File

@ -75,18 +75,28 @@ PreservedAnalyses AlwaysInlinerPass::run(Module &M,
},
ORE);
assert(OIC);
emitInlinedIntoBasedOnCost(ORE, CB->getDebugLoc(), CB->getParent(), F,
*Caller, *OIC, false, DEBUG_TYPE);
DebugLoc DLoc = CB->getDebugLoc();
BasicBlock *Block = CB->getParent();
emitInlinedIntoBasedOnCost(ORE, DLoc, Block, F, *Caller, *OIC, false,
DEBUG_TYPE);
InlineFunctionInfo IFI(
/*cg=*/nullptr, GetAssumptionCache, &PSI,
&FAM.getResult<BlockFrequencyAnalysis>(*(CB->getCaller())),
&FAM.getResult<BlockFrequencyAnalysis>(*Caller),
&FAM.getResult<BlockFrequencyAnalysis>(F));
InlineResult Res = InlineFunction(
*CB, IFI, &FAM.getResult<AAManager>(F), InsertLifetime);
assert(Res.isSuccess() && "unexpected failure to inline");
(void)Res;
if (!Res.isSuccess()) {
ORE.emit([&]() {
return OptimizationRemarkMissed(DEBUG_TYPE, "NotInlined", DLoc,
Block)
<< "'" << ore::NV("Callee", &F) << "' is not inlined into '"
<< ore::NV("Caller", Caller)
<< "': " << ore::NV("Reason", Res.getFailureReason());
});
continue;
}
// Merge the attributes based on the inlining.
AttributeFuncs::mergeAttributesForInlining(*Caller, F);

View File

@ -0,0 +1,20 @@
; RUN: opt -passes="always-inline" -pass-remarks-missed=inline -S < %s 2>&1 | FileCheck %s
declare void @personalityFn1();
declare void @personalityFn2();
define void @foo() alwaysinline {
ret void
}
define void @bar() alwaysinline personality void ()* @personalityFn1 {
ret void
}
define void @goo() personality void ()* @personalityFn2 {
; CHECK-DAG: 'bar' is not inlined into 'goo': incompatible personality
call void @bar()
; CHECK-DAG: 'foo' is not inlined into 'goo': unsupported operand bundle
call void @foo() [ "CUSTOM_OPERAND_BUNDLE"() ]
ret void
}