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