xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/alloca-bonus.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "p:32:32"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr)
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker@glbl = external global i32
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine void @outer1() {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer1(
11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner1
12*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
13*9880d681SAndroid Build Coastguard Worker  call void @inner1(i32* %ptr)
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine void @inner1(i32 *%ptr) {
18*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* %ptr
19*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %ptr
20*9880d681SAndroid Build Coastguard Worker  %C = getelementptr inbounds i32, i32* %ptr, i32 0
21*9880d681SAndroid Build Coastguard Worker  %D = getelementptr inbounds i32, i32* %ptr, i32 1
22*9880d681SAndroid Build Coastguard Worker  %E = bitcast i32* %ptr to i8*
23*9880d681SAndroid Build Coastguard Worker  %F = select i1 false, i32* %ptr, i32* @glbl
24*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 0, i8* %E)
25*9880d681SAndroid Build Coastguard Worker  ret void
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine void @outer2() {
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer2(
30*9880d681SAndroid Build Coastguard Worker; CHECK: call void @inner2
31*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
32*9880d681SAndroid Build Coastguard Worker  call void @inner2(i32* %ptr)
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; %D poisons this call, scalar-repl can't handle that instruction.
37*9880d681SAndroid Build Coastguard Workerdefine void @inner2(i32 *%ptr) {
38*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* %ptr
39*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %ptr
40*9880d681SAndroid Build Coastguard Worker  %C = getelementptr inbounds i32, i32* %ptr, i32 0
41*9880d681SAndroid Build Coastguard Worker  %D = getelementptr inbounds i32, i32* %ptr, i32 %A
42*9880d681SAndroid Build Coastguard Worker  %E = bitcast i32* %ptr to i8*
43*9880d681SAndroid Build Coastguard Worker  %F = select i1 false, i32* %ptr, i32* @glbl
44*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 0, i8* %E)
45*9880d681SAndroid Build Coastguard Worker  ret void
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine void @outer3() {
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer3(
50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner3
51*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
52*9880d681SAndroid Build Coastguard Worker  call void @inner3(i32* %ptr, i1 undef)
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine void @inner3(i32 *%ptr, i1 %x) {
57*9880d681SAndroid Build Coastguard Worker  %A = icmp eq i32* %ptr, null
58*9880d681SAndroid Build Coastguard Worker  %B = and i1 %x, %A
59*9880d681SAndroid Build Coastguard Worker  br i1 %A, label %bb.true, label %bb.false
60*9880d681SAndroid Build Coastguard Workerbb.true:
61*9880d681SAndroid Build Coastguard Worker  ; This block musn't be counted in the inline cost.
62*9880d681SAndroid Build Coastguard Worker  %t1 = load i32, i32* %ptr
63*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, 1
64*9880d681SAndroid Build Coastguard Worker  %t3 = add i32 %t2, 1
65*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 %t3, 1
66*9880d681SAndroid Build Coastguard Worker  %t5 = add i32 %t4, 1
67*9880d681SAndroid Build Coastguard Worker  %t6 = add i32 %t5, 1
68*9880d681SAndroid Build Coastguard Worker  %t7 = add i32 %t6, 1
69*9880d681SAndroid Build Coastguard Worker  %t8 = add i32 %t7, 1
70*9880d681SAndroid Build Coastguard Worker  %t9 = add i32 %t8, 1
71*9880d681SAndroid Build Coastguard Worker  %t10 = add i32 %t9, 1
72*9880d681SAndroid Build Coastguard Worker  %t11 = add i32 %t10, 1
73*9880d681SAndroid Build Coastguard Worker  %t12 = add i32 %t11, 1
74*9880d681SAndroid Build Coastguard Worker  %t13 = add i32 %t12, 1
75*9880d681SAndroid Build Coastguard Worker  %t14 = add i32 %t13, 1
76*9880d681SAndroid Build Coastguard Worker  %t15 = add i32 %t14, 1
77*9880d681SAndroid Build Coastguard Worker  %t16 = add i32 %t15, 1
78*9880d681SAndroid Build Coastguard Worker  %t17 = add i32 %t16, 1
79*9880d681SAndroid Build Coastguard Worker  %t18 = add i32 %t17, 1
80*9880d681SAndroid Build Coastguard Worker  %t19 = add i32 %t18, 1
81*9880d681SAndroid Build Coastguard Worker  %t20 = add i32 %t19, 1
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Workerbb.false:
84*9880d681SAndroid Build Coastguard Worker  ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine void @outer4(i32 %A) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer4(
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner4
90*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
91*9880d681SAndroid Build Coastguard Worker  call void @inner4(i32* %ptr, i32 %A)
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; %B poisons this call, scalar-repl can't handle that instruction. However, we
96*9880d681SAndroid Build Coastguard Worker; still want to detect that the icmp and branch *can* be handled.
97*9880d681SAndroid Build Coastguard Workerdefine void @inner4(i32 *%ptr, i32 %A) {
98*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i32, i32* %ptr, i32 %A
99*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i32* %ptr, null
100*9880d681SAndroid Build Coastguard Worker  br i1 %C, label %bb.true, label %bb.false
101*9880d681SAndroid Build Coastguard Workerbb.true:
102*9880d681SAndroid Build Coastguard Worker  ; This block musn't be counted in the inline cost.
103*9880d681SAndroid Build Coastguard Worker  %t1 = load i32, i32* %ptr
104*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, 1
105*9880d681SAndroid Build Coastguard Worker  %t3 = add i32 %t2, 1
106*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 %t3, 1
107*9880d681SAndroid Build Coastguard Worker  %t5 = add i32 %t4, 1
108*9880d681SAndroid Build Coastguard Worker  %t6 = add i32 %t5, 1
109*9880d681SAndroid Build Coastguard Worker  %t7 = add i32 %t6, 1
110*9880d681SAndroid Build Coastguard Worker  %t8 = add i32 %t7, 1
111*9880d681SAndroid Build Coastguard Worker  %t9 = add i32 %t8, 1
112*9880d681SAndroid Build Coastguard Worker  %t10 = add i32 %t9, 1
113*9880d681SAndroid Build Coastguard Worker  %t11 = add i32 %t10, 1
114*9880d681SAndroid Build Coastguard Worker  %t12 = add i32 %t11, 1
115*9880d681SAndroid Build Coastguard Worker  %t13 = add i32 %t12, 1
116*9880d681SAndroid Build Coastguard Worker  %t14 = add i32 %t13, 1
117*9880d681SAndroid Build Coastguard Worker  %t15 = add i32 %t14, 1
118*9880d681SAndroid Build Coastguard Worker  %t16 = add i32 %t15, 1
119*9880d681SAndroid Build Coastguard Worker  %t17 = add i32 %t16, 1
120*9880d681SAndroid Build Coastguard Worker  %t18 = add i32 %t17, 1
121*9880d681SAndroid Build Coastguard Worker  %t19 = add i32 %t18, 1
122*9880d681SAndroid Build Coastguard Worker  %t20 = add i32 %t19, 1
123*9880d681SAndroid Build Coastguard Worker  ret void
124*9880d681SAndroid Build Coastguard Workerbb.false:
125*9880d681SAndroid Build Coastguard Worker  ret void
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine void @outer5() {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer5(
130*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner5
131*9880d681SAndroid Build Coastguard Worker  %ptr = alloca i32
132*9880d681SAndroid Build Coastguard Worker  call void @inner5(i1 false, i32* %ptr)
133*9880d681SAndroid Build Coastguard Worker  ret void
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; %D poisons this call, scalar-repl can't handle that instruction. However, if
137*9880d681SAndroid Build Coastguard Worker; the flag is set appropriately, the poisoning instruction is inside of dead
138*9880d681SAndroid Build Coastguard Worker; code, and so shouldn't be counted.
139*9880d681SAndroid Build Coastguard Workerdefine void @inner5(i1 %flag, i32 *%ptr) {
140*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* %ptr
141*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %ptr
142*9880d681SAndroid Build Coastguard Worker  %C = getelementptr inbounds i32, i32* %ptr, i32 0
143*9880d681SAndroid Build Coastguard Worker  br i1 %flag, label %if.then, label %exit
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerif.then:
146*9880d681SAndroid Build Coastguard Worker  %D = getelementptr inbounds i32, i32* %ptr, i32 %A
147*9880d681SAndroid Build Coastguard Worker  %E = bitcast i32* %ptr to i8*
148*9880d681SAndroid Build Coastguard Worker  %F = select i1 false, i32* %ptr, i32* @glbl
149*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 0, i8* %E)
150*9880d681SAndroid Build Coastguard Worker  ret void
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerexit:
153*9880d681SAndroid Build Coastguard Worker  ret void
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156