xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/always-inline.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -inline-threshold=0 -always-inline -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; Ensure the threshold has no impact on these decisions.
4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -inline-threshold=20000000 -always-inline -S | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -inline-threshold=-20000000 -always-inline -S | FileCheck %s
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine i32 @inner1() alwaysinline {
8*9880d681SAndroid Build Coastguard Worker  ret i32 1
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Workerdefine i32 @outer1() {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer1(
12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call
13*9880d681SAndroid Build Coastguard Worker; CHECK: ret
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker   %r = call i32 @inner1()
16*9880d681SAndroid Build Coastguard Worker   ret i32 %r
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; The always inliner can't DCE internal functions. PR2945
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr2945(
21*9880d681SAndroid Build Coastguard Workerdefine internal i32 @pr2945() nounwind {
22*9880d681SAndroid Build Coastguard Worker  ret i32 0
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine internal void @inner2(i32 %N) alwaysinline {
26*9880d681SAndroid Build Coastguard Worker  %P = alloca i32, i32 %N
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Workerdefine void @outer2(i32 %N) {
30*9880d681SAndroid Build Coastguard Worker; The always inliner (unlike the normal one) should be willing to inline
31*9880d681SAndroid Build Coastguard Worker; a function with a dynamic alloca into one without a dynamic alloca.
32*9880d681SAndroid Build Coastguard Worker; rdar://6655932
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer2(
35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner2
36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner2
37*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  call void @inner2( i32 %N )
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdeclare i32 @a() returns_twice
44*9880d681SAndroid Build Coastguard Workerdeclare i32 @b() returns_twice
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i32 @inner3() alwaysinline {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker  %call = call i32 @a() returns_twice
49*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 1, %call
50*9880d681SAndroid Build Coastguard Worker  ret i32 %add
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Workerdefine i32 @outer3() {
53*9880d681SAndroid Build Coastguard Workerentry:
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer3(
55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @a
56*9880d681SAndroid Build Coastguard Worker; CHECK: ret
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker  %call = call i32 @inner3()
59*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 1, %call
60*9880d681SAndroid Build Coastguard Worker  ret i32 %add
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i32 @inner4() alwaysinline returns_twice {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %call = call i32 @b() returns_twice
66*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 1, %call
67*9880d681SAndroid Build Coastguard Worker  ret i32 %add
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine i32 @outer4() {
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer4(
73*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @b()
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker  %call = call i32 @inner4() returns_twice
77*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 1, %call
78*9880d681SAndroid Build Coastguard Worker  ret i32 %add
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i32 @inner5(i8* %addr) alwaysinline {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  indirectbr i8* %addr, [ label %one, label %two ]
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerone:
86*9880d681SAndroid Build Coastguard Worker  ret i32 42
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workertwo:
89*9880d681SAndroid Build Coastguard Worker  ret i32 44
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Workerdefine i32 @outer5(i32 %x) {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer5(
93*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @inner5
94*9880d681SAndroid Build Coastguard Worker; CHECK: ret
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %x, 42
97*9880d681SAndroid Build Coastguard Worker  %addr = select i1 %cmp, i8* blockaddress(@inner5, %one), i8* blockaddress(@inner5, %two)
98*9880d681SAndroid Build Coastguard Worker  %call = call i32 @inner5(i8* %addr)
99*9880d681SAndroid Build Coastguard Worker  ret i32 %call
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine void @inner6(i32 %x) alwaysinline {
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker  %icmp = icmp slt i32 %x, 0
105*9880d681SAndroid Build Coastguard Worker  br i1 %icmp, label %return, label %bb
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerbb:
108*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %x, 1
109*9880d681SAndroid Build Coastguard Worker  call void @inner6(i32 %sub)
110*9880d681SAndroid Build Coastguard Worker  ret void
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerreturn:
113*9880d681SAndroid Build Coastguard Worker  ret void
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Workerdefine void @outer6() {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer6(
117*9880d681SAndroid Build Coastguard Worker; CHECK: call void @inner6(i32 42)
118*9880d681SAndroid Build Coastguard Worker; CHECK: ret
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  call void @inner6(i32 42)
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine i32 @inner7() {
126*9880d681SAndroid Build Coastguard Worker  ret i32 1
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Workerdefine i32 @outer7() {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer7(
130*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call
131*9880d681SAndroid Build Coastguard Worker; CHECK: ret
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker   %r = call i32 @inner7() alwaysinline
134*9880d681SAndroid Build Coastguard Worker   ret i32 %r
135*9880d681SAndroid Build Coastguard Worker}
136