[PATCH] D127899: [MLInliner] Don't inline call sites in unreachable basic blocks
Mircea Trofin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 16 09:14:50 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG7f24e574d434: [MLInliner] Don't inline call sites in unreachable basic blocks (authored by mtrofin).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127899/new/
https://reviews.llvm.org/D127899
Files:
llvm/include/llvm/Analysis/MLInlineAdvisor.h
llvm/lib/Analysis/MLInlineAdvisor.cpp
llvm/test/Transforms/Inline/ML/skip-unreachable.ll
Index: llvm/test/Transforms/Inline/ML/skip-unreachable.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/Inline/ML/skip-unreachable.ll
@@ -0,0 +1,46 @@
+; Test skipping inlining when the callsite is unreachable (for both mandatory
+; and non-mandatory cases)
+; REQUIRES: llvm_inliner_model_autogenerated
+; RUN: opt -passes=inliner-ml-advisor-release -S < %s | FileCheck %s --check-prefix=CHECK
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+; Mandatory case
+define i32 @f1() {
+entry:
+ br label %exit
+some_bb: ; unreachable - has no predecessors
+ %r = call i32 @f2()
+ br label %exit
+exit:
+ ret i32 1
+}
+
+define i32 @f2() #0 {
+ ret i32 2
+}
+
+; Non-mandatory case
+define i32 @f3() {
+entry:
+ br label %exit
+some_bb: ; unreachable - has no predecessors
+ %r = call i32 @f4()
+ br label %exit
+exit:
+ ret i32 1
+}
+
+define i32 @f4() {
+ ret i32 2
+}
+
+attributes #0 = { alwaysinline }
+
+; CHECK-LABEL: @f1
+; CHECK-LABEL: some_bb
+; CHECK-NEXT: call i32 @f2
+; CHECK-LABEL: @f3
+; CHECK-LABEL: some_bb
+; CHECK-NEXT: call i32 @f4
Index: llvm/lib/Analysis/MLInlineAdvisor.cpp
===================================================================
--- llvm/lib/Analysis/MLInlineAdvisor.cpp
+++ llvm/lib/Analysis/MLInlineAdvisor.cpp
@@ -277,6 +277,9 @@
}
std::unique_ptr<InlineAdvice> MLInlineAdvisor::getAdviceImpl(CallBase &CB) {
+ if (auto Skip = getSkipAdviceIfUnreachableCallsite(CB))
+ return Skip;
+
auto &Caller = *CB.getCaller();
auto &Callee = *CB.getCalledFunction();
@@ -376,9 +379,19 @@
this, CB, ORE, static_cast<bool>(ModelRunner->evaluate<int64_t>()));
}
+std::unique_ptr<InlineAdvice>
+MLInlineAdvisor::getSkipAdviceIfUnreachableCallsite(CallBase &CB) {
+ if (!FAM.getResult<DominatorTreeAnalysis>(*CB.getCaller())
+ .isReachableFromEntry(CB.getParent()))
+ return std::make_unique<InlineAdvice>(this, CB, getCallerORE(CB), false);
+ return nullptr;
+}
+
std::unique_ptr<InlineAdvice> MLInlineAdvisor::getMandatoryAdvice(CallBase &CB,
bool Advice) {
// Make sure we track inlinings in all cases - mandatory or not.
+ if (auto Skip = getSkipAdviceIfUnreachableCallsite(CB))
+ return Skip;
if (Advice && !ForceStop)
return getMandatoryAdviceImpl(CB);
Index: llvm/include/llvm/Analysis/MLInlineAdvisor.h
===================================================================
--- llvm/include/llvm/Analysis/MLInlineAdvisor.h
+++ llvm/include/llvm/Analysis/MLInlineAdvisor.h
@@ -65,7 +65,8 @@
private:
int64_t getModuleIRSize() const;
-
+ std::unique_ptr<InlineAdvice>
+ getSkipAdviceIfUnreachableCallsite(CallBase &CB);
void print(raw_ostream &OS) const override;
mutable DenseMap<const Function *, FunctionPropertiesInfo> FPICache;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127899.437572.patch
Type: text/x-patch
Size: 2963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220616/33ceeb86/attachment.bin>
More information about the llvm-commits
mailing list