Skip to content

Commit

Permalink
[AlwaysInliner] Check inliner errors even without assserts
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ellishg committed Mar 17, 2022
1 parent 54b145d commit 84c6689
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
20 changes: 15 additions & 5 deletions llvm/lib/Transforms/IPO/AlwaysInliner.cpp
Expand Up @@ -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);
Expand Down
20 changes: 20 additions & 0 deletions llvm/test/Transforms/Inline/always-inline-remark.ll
@@ -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
}

0 comments on commit 84c6689

Please sign in to comment.