llvm-project/llvm/test/Transforms/Inline/ML/skip-unreachable.ll
Mircea Trofin 7f24e574d4 [MLInliner] Don't inline call sites in unreachable basic blocks
This requires DominatorTree be updated, which we do in the ml inliner
case, but not in the default case, and the cost of doing so is
noticeable to compile time for the latter[1]. So the patch only affects
the ML inliner.

[1] https://llvm-compile-time-tracker.com/compare.php?from=9fc0aa45e3312944431ba7e1ca0cec99c613992b&to=7af461b1ce0d9138211ef5f883f35d5b9ddf47be&stat=wall-time

Differential Revision: https://reviews.llvm.org/D127899
2022-06-16 09:14:22 -07:00

47 lines
956 B
LLVM

; 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