1 ; RUN: opt -O2 -S < %s | FileCheck %s
3 @data = common global i32* null, align 8
5 define i32 @fct1(i32 %a) nounwind uwtable ssp {
7 %a.addr = alloca i32, align 4
8 %res = alloca i32, align 4
9 %i = alloca i32, align 4
10 store i32 %a, i32* %a.addr, align 4
11 %tmp = load i32, i32* %a.addr, align 4
12 %idxprom = sext i32 %tmp to i64
13 %tmp1 = load i32*, i32** @data, align 8
14 %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
15 %tmp2 = load i32, i32* %arrayidx, align 4
16 %tmp3 = load i32, i32* %a.addr, align 4
17 %add = add nsw i32 %tmp3, 1
18 %idxprom1 = sext i32 %add to i64
19 %tmp4 = load i32*, i32** @data, align 8
20 %arrayidx2 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom1
21 %tmp5 = load i32, i32* %arrayidx2, align 4
22 %mul = mul nsw i32 %tmp2, %tmp5
23 store i32 %mul, i32* %res, align 4
24 store i32 0, i32* %i, align 4
25 store i32 0, i32* %i, align 4
28 for.cond: ; preds = %for.inc, %entry
29 %tmp6 = load i32, i32* %i, align 4
30 %tmp7 = load i32, i32* %res, align 4
31 %cmp = icmp slt i32 %tmp6, %tmp7
32 br i1 %cmp, label %for.body, label %for.end
34 for.body: ; preds = %for.cond
35 %tmp8 = load i32, i32* %i, align 4
36 %idxprom3 = sext i32 %tmp8 to i64
37 %tmp9 = load i32*, i32** @data, align 8
38 %arrayidx4 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom3
39 call void @fct0(i32* %arrayidx4)
42 for.inc: ; preds = %for.body
43 %tmp10 = load i32, i32* %i, align 4
44 %inc = add nsw i32 %tmp10, 1
45 store i32 %inc, i32* %i, align 4
48 for.end: ; preds = %for.cond
49 store i32 0, i32* %i, align 4
52 for.cond5: ; preds = %for.inc10, %for.end
53 %tmp11 = load i32, i32* %i, align 4
54 %tmp12 = load i32, i32* %res, align 4
55 %cmp6 = icmp slt i32 %tmp11, %tmp12
56 br i1 %cmp6, label %for.body7, label %for.end12
58 for.body7: ; preds = %for.cond5
59 %tmp13 = load i32, i32* %i, align 4
60 %idxprom8 = sext i32 %tmp13 to i64
61 %tmp14 = load i32*, i32** @data, align 8
62 %arrayidx9 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom8
63 call void @fct0(i32* %arrayidx9)
66 for.inc10: ; preds = %for.body7
67 %tmp15 = load i32, i32* %i, align 4
68 %inc11 = add nsw i32 %tmp15, 1
69 store i32 %inc11, i32* %i, align 4
72 for.end12: ; preds = %for.cond5
73 store i32 0, i32* %i, align 4
76 for.cond13: ; preds = %for.inc18, %for.end12
77 %tmp16 = load i32, i32* %i, align 4
78 %tmp17 = load i32, i32* %res, align 4
79 %cmp14 = icmp slt i32 %tmp16, %tmp17
80 br i1 %cmp14, label %for.body15, label %for.end20
82 for.body15: ; preds = %for.cond13
83 %tmp18 = load i32, i32* %i, align 4
84 %idxprom16 = sext i32 %tmp18 to i64
85 %tmp19 = load i32*, i32** @data, align 8
86 %arrayidx17 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom16
87 call void @fct0(i32* %arrayidx17)
90 for.inc18: ; preds = %for.body15
91 %tmp20 = load i32, i32* %i, align 4
92 %inc19 = add nsw i32 %tmp20, 1
93 store i32 %inc19, i32* %i, align 4
96 for.end20: ; preds = %for.cond13
97 %tmp21 = load i32, i32* %res, align 4
101 declare void @fct0(i32*)
103 define i32 @fct2(i32 %a) nounwind uwtable inlinehint ssp {
105 %a.addr = alloca i32, align 4
106 %res = alloca i32, align 4
107 %i = alloca i32, align 4
108 store i32 %a, i32* %a.addr, align 4
109 %tmp = load i32, i32* %a.addr, align 4
110 %shl = shl i32 %tmp, 1
111 %idxprom = sext i32 %shl to i64
112 %tmp1 = load i32*, i32** @data, align 8
113 %arrayidx = getelementptr inbounds i32, i32* %tmp1, i64 %idxprom
114 %tmp2 = load i32, i32* %arrayidx, align 4
115 %tmp3 = load i32, i32* %a.addr, align 4
116 %shl1 = shl i32 %tmp3, 1
117 %add = add nsw i32 %shl1, 13
118 %idxprom2 = sext i32 %add to i64
119 %tmp4 = load i32*, i32** @data, align 8
120 %arrayidx3 = getelementptr inbounds i32, i32* %tmp4, i64 %idxprom2
121 %tmp5 = load i32, i32* %arrayidx3, align 4
122 %mul = mul nsw i32 %tmp2, %tmp5
123 store i32 %mul, i32* %res, align 4
124 store i32 0, i32* %i, align 4
125 store i32 0, i32* %i, align 4
128 for.cond: ; preds = %for.inc, %entry
129 %tmp6 = load i32, i32* %i, align 4
130 %tmp7 = load i32, i32* %res, align 4
131 %cmp = icmp slt i32 %tmp6, %tmp7
132 br i1 %cmp, label %for.body, label %for.end
134 for.body: ; preds = %for.cond
135 %tmp8 = load i32, i32* %i, align 4
136 %idxprom4 = sext i32 %tmp8 to i64
137 %tmp9 = load i32*, i32** @data, align 8
138 %arrayidx5 = getelementptr inbounds i32, i32* %tmp9, i64 %idxprom4
139 call void @fct0(i32* %arrayidx5)
142 for.inc: ; preds = %for.body
143 %tmp10 = load i32, i32* %i, align 4
144 %inc = add nsw i32 %tmp10, 1
145 store i32 %inc, i32* %i, align 4
148 for.end: ; preds = %for.cond
149 store i32 0, i32* %i, align 4
152 for.cond6: ; preds = %for.inc11, %for.end
153 %tmp11 = load i32, i32* %i, align 4
154 %tmp12 = load i32, i32* %res, align 4
155 %cmp7 = icmp slt i32 %tmp11, %tmp12
156 br i1 %cmp7, label %for.body8, label %for.end13
158 for.body8: ; preds = %for.cond6
159 %tmp13 = load i32, i32* %i, align 4
160 %idxprom9 = sext i32 %tmp13 to i64
161 %tmp14 = load i32*, i32** @data, align 8
162 %arrayidx10 = getelementptr inbounds i32, i32* %tmp14, i64 %idxprom9
163 call void @fct0(i32* %arrayidx10)
166 for.inc11: ; preds = %for.body8
167 %tmp15 = load i32, i32* %i, align 4
168 %inc12 = add nsw i32 %tmp15, 1
169 store i32 %inc12, i32* %i, align 4
172 for.end13: ; preds = %for.cond6
173 store i32 0, i32* %i, align 4
176 for.cond14: ; preds = %for.inc19, %for.end13
177 %tmp16 = load i32, i32* %i, align 4
178 %tmp17 = load i32, i32* %res, align 4
179 %cmp15 = icmp slt i32 %tmp16, %tmp17
180 br i1 %cmp15, label %for.body16, label %for.end21
182 for.body16: ; preds = %for.cond14
183 %tmp18 = load i32, i32* %i, align 4
184 %idxprom17 = sext i32 %tmp18 to i64
185 %tmp19 = load i32*, i32** @data, align 8
186 %arrayidx18 = getelementptr inbounds i32, i32* %tmp19, i64 %idxprom17
187 call void @fct0(i32* %arrayidx18)
190 for.inc19: ; preds = %for.body16
191 %tmp20 = load i32, i32* %i, align 4
192 %inc20 = add nsw i32 %tmp20, 1
193 store i32 %inc20, i32* %i, align 4
196 for.end21: ; preds = %for.cond14
197 %tmp21 = load i32, i32* %res, align 4
201 define i32 @fct3(i32 %c) nounwind uwtable ssp {
204 ;CHECK: call i32 @fct1
205 ; The inline keyword gives a sufficient benefits to inline fct2
206 ;CHECK-NOT: call i32 @fct2
207 %c.addr = alloca i32, align 4
208 store i32 %c, i32* %c.addr, align 4
209 %tmp = load i32, i32* %c.addr, align 4
210 %call = call i32 @fct1(i32 %tmp)
211 %tmp1 = load i32, i32* %c.addr, align 4
212 %call1 = call i32 @fct2(i32 %tmp1)
213 %add = add nsw i32 %call, %call1
217 define i32 @fct4(i32 %c) minsize nounwind uwtable ssp {
220 ;CHECK: call i32 @fct1
221 ; With Oz (minsize attribute), the benefit of inlining fct2
222 ; is the same as fct1, thus no inlining for fct2
223 ;CHECK: call i32 @fct2
224 %c.addr = alloca i32, align 4
225 store i32 %c, i32* %c.addr, align 4
226 %tmp = load i32, i32* %c.addr, align 4
227 %call = call i32 @fct1(i32 %tmp)
228 %tmp1 = load i32, i32* %c.addr, align 4
229 %call1 = call i32 @fct2(i32 %tmp1)
230 %add = add nsw i32 %call, %call1