1 ; RUN: llvm-as < %s | llc -march=x86 | not grep cmov
4 ; LSR should be able to eliminate the max computations by
5 ; making the loops use slt/ult comparisons instead of ne comparisons.
7 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
8 target triple = "i386-apple-darwin9"
10 define void @foo(i8* %r, i32 %s, i32 %w, i32 %x, i8* %j, i32 %d) nounwind {
12 %0 = mul i32 %x, %w ; <i32> [#uses=2]
13 %1 = mul i32 %x, %w ; <i32> [#uses=1]
14 %2 = sdiv i32 %1, 4 ; <i32> [#uses=1]
15 %.sum2 = add i32 %2, %0 ; <i32> [#uses=2]
16 %cond = icmp eq i32 %d, 1 ; <i1> [#uses=1]
17 br i1 %cond, label %bb29, label %bb10.preheader
19 bb10.preheader: ; preds = %entry
20 %3 = icmp sgt i32 %x, 0 ; <i1> [#uses=1]
21 br i1 %3, label %bb.nph9, label %bb18.loopexit
23 bb.nph7: ; preds = %bb7.preheader
24 %4 = mul i32 %y.08, %w ; <i32> [#uses=1]
25 %5 = mul i32 %y.08, %s ; <i32> [#uses=1]
26 %6 = add i32 %5, 1 ; <i32> [#uses=1]
27 %tmp8 = icmp sgt i32 1, %w ; <i1> [#uses=1]
28 %smax9 = select i1 %tmp8, i32 1, i32 %w ; <i32> [#uses=1]
31 bb6: ; preds = %bb7, %bb.nph7
32 %x.06 = phi i32 [ 0, %bb.nph7 ], [ %indvar.next7, %bb7 ] ; <i32> [#uses=3]
33 %7 = add i32 %x.06, %4 ; <i32> [#uses=1]
34 %8 = shl i32 %x.06, 1 ; <i32> [#uses=1]
35 %9 = add i32 %6, %8 ; <i32> [#uses=1]
36 %10 = getelementptr i8* %r, i32 %9 ; <i8*> [#uses=1]
37 %11 = load i8* %10, align 1 ; <i8> [#uses=1]
38 %12 = getelementptr i8* %j, i32 %7 ; <i8*> [#uses=1]
39 store i8 %11, i8* %12, align 1
43 %indvar.next7 = add i32 %x.06, 1 ; <i32> [#uses=2]
44 %exitcond10 = icmp ne i32 %indvar.next7, %smax9 ; <i1> [#uses=1]
45 br i1 %exitcond10, label %bb6, label %bb7.bb9_crit_edge
47 bb7.bb9_crit_edge: ; preds = %bb7
50 bb9: ; preds = %bb7.preheader, %bb7.bb9_crit_edge
54 %indvar.next11 = add i32 %y.08, 1 ; <i32> [#uses=2]
55 %exitcond12 = icmp ne i32 %indvar.next11, %x ; <i1> [#uses=1]
56 br i1 %exitcond12, label %bb7.preheader, label %bb10.bb18.loopexit_crit_edge
58 bb10.bb18.loopexit_crit_edge: ; preds = %bb10
59 br label %bb10.bb18.loopexit_crit_edge.split
61 bb10.bb18.loopexit_crit_edge.split: ; preds = %bb.nph9, %bb10.bb18.loopexit_crit_edge
62 br label %bb18.loopexit
64 bb.nph9: ; preds = %bb10.preheader
65 %13 = icmp sgt i32 %w, 0 ; <i1> [#uses=1]
66 br i1 %13, label %bb.nph9.split, label %bb10.bb18.loopexit_crit_edge.split
68 bb.nph9.split: ; preds = %bb.nph9
69 br label %bb7.preheader
71 bb7.preheader: ; preds = %bb.nph9.split, %bb10
72 %y.08 = phi i32 [ 0, %bb.nph9.split ], [ %indvar.next11, %bb10 ] ; <i32> [#uses=3]
73 br i1 true, label %bb.nph7, label %bb9
75 bb.nph5: ; preds = %bb18.loopexit
76 %14 = sdiv i32 %w, 2 ; <i32> [#uses=1]
77 %15 = icmp slt i32 %w, 2 ; <i1> [#uses=1]
78 %16 = sdiv i32 %x, 2 ; <i32> [#uses=2]
79 br i1 %15, label %bb18.bb20_crit_edge.split, label %bb.nph5.split
81 bb.nph5.split: ; preds = %bb.nph5
82 %tmp2 = icmp sgt i32 1, %16 ; <i1> [#uses=1]
83 %smax3 = select i1 %tmp2, i32 1, i32 %16 ; <i32> [#uses=1]
86 bb13: ; preds = %bb18, %bb.nph5.split
87 %y.14 = phi i32 [ 0, %bb.nph5.split ], [ %indvar.next1, %bb18 ] ; <i32> [#uses=4]
88 %17 = mul i32 %14, %y.14 ; <i32> [#uses=2]
89 %18 = shl i32 %y.14, 1 ; <i32> [#uses=1]
90 %19 = srem i32 %y.14, 2 ; <i32> [#uses=1]
91 %20 = add i32 %19, %18 ; <i32> [#uses=1]
92 %21 = mul i32 %20, %s ; <i32> [#uses=2]
93 br i1 true, label %bb.nph3, label %bb17
95 bb.nph3: ; preds = %bb13
96 %22 = add i32 %17, %0 ; <i32> [#uses=1]
97 %23 = add i32 %17, %.sum2 ; <i32> [#uses=1]
98 %24 = sdiv i32 %w, 2 ; <i32> [#uses=2]
99 %tmp = icmp sgt i32 1, %24 ; <i1> [#uses=1]
100 %smax = select i1 %tmp, i32 1, i32 %24 ; <i32> [#uses=1]
103 bb14: ; preds = %bb15, %bb.nph3
104 %x.12 = phi i32 [ 0, %bb.nph3 ], [ %indvar.next, %bb15 ] ; <i32> [#uses=5]
105 %25 = shl i32 %x.12, 2 ; <i32> [#uses=1]
106 %26 = add i32 %25, %21 ; <i32> [#uses=1]
107 %27 = getelementptr i8* %r, i32 %26 ; <i8*> [#uses=1]
108 %28 = load i8* %27, align 1 ; <i8> [#uses=1]
109 %.sum = add i32 %22, %x.12 ; <i32> [#uses=1]
110 %29 = getelementptr i8* %j, i32 %.sum ; <i8*> [#uses=1]
111 store i8 %28, i8* %29, align 1
112 %30 = shl i32 %x.12, 2 ; <i32> [#uses=1]
113 %31 = or i32 %30, 2 ; <i32> [#uses=1]
114 %32 = add i32 %31, %21 ; <i32> [#uses=1]
115 %33 = getelementptr i8* %r, i32 %32 ; <i8*> [#uses=1]
116 %34 = load i8* %33, align 1 ; <i8> [#uses=1]
117 %.sum6 = add i32 %23, %x.12 ; <i32> [#uses=1]
118 %35 = getelementptr i8* %j, i32 %.sum6 ; <i8*> [#uses=1]
119 store i8 %34, i8* %35, align 1
122 bb15: ; preds = %bb14
123 %indvar.next = add i32 %x.12, 1 ; <i32> [#uses=2]
124 %exitcond = icmp ne i32 %indvar.next, %smax ; <i1> [#uses=1]
125 br i1 %exitcond, label %bb14, label %bb15.bb17_crit_edge
127 bb15.bb17_crit_edge: ; preds = %bb15
130 bb17: ; preds = %bb15.bb17_crit_edge, %bb13
133 bb18.loopexit: ; preds = %bb10.bb18.loopexit_crit_edge.split, %bb10.preheader
134 %36 = icmp slt i32 %x, 2 ; <i1> [#uses=1]
135 br i1 %36, label %bb20, label %bb.nph5
137 bb18: ; preds = %bb17
138 %indvar.next1 = add i32 %y.14, 1 ; <i32> [#uses=2]
139 %exitcond4 = icmp ne i32 %indvar.next1, %smax3 ; <i1> [#uses=1]
140 br i1 %exitcond4, label %bb13, label %bb18.bb20_crit_edge
142 bb18.bb20_crit_edge: ; preds = %bb18
143 br label %bb18.bb20_crit_edge.split
145 bb18.bb20_crit_edge.split: ; preds = %bb18.bb20_crit_edge, %bb.nph5
148 bb20: ; preds = %bb18.bb20_crit_edge.split, %bb18.loopexit
149 switch i32 %d, label %return [
154 bb22: ; preds = %bb20
155 %37 = mul i32 %x, %w ; <i32> [#uses=1]
156 %38 = sdiv i32 %37, 4 ; <i32> [#uses=1]
157 %.sum3 = add i32 %38, %.sum2 ; <i32> [#uses=2]
158 %39 = add i32 %x, 15 ; <i32> [#uses=1]
159 %40 = and i32 %39, -16 ; <i32> [#uses=1]
160 %41 = add i32 %w, 15 ; <i32> [#uses=1]
161 %42 = and i32 %41, -16 ; <i32> [#uses=1]
162 %43 = mul i32 %40, %s ; <i32> [#uses=1]
163 %44 = icmp sgt i32 %x, 0 ; <i1> [#uses=1]
164 br i1 %44, label %bb.nph, label %bb26
166 bb.nph: ; preds = %bb22
169 bb23: ; preds = %bb24, %bb.nph
170 %y.21 = phi i32 [ 0, %bb.nph ], [ %indvar.next5, %bb24 ] ; <i32> [#uses=3]
171 %45 = mul i32 %y.21, %42 ; <i32> [#uses=1]
172 %.sum1 = add i32 %45, %43 ; <i32> [#uses=1]
173 %46 = getelementptr i8* %r, i32 %.sum1 ; <i8*> [#uses=1]
174 %47 = mul i32 %y.21, %w ; <i32> [#uses=1]
175 %.sum5 = add i32 %47, %.sum3 ; <i32> [#uses=1]
176 %48 = getelementptr i8* %j, i32 %.sum5 ; <i8*> [#uses=1]
177 tail call void @llvm.memcpy.i32(i8* %48, i8* %46, i32 %w, i32 1)
180 bb24: ; preds = %bb23
181 %indvar.next5 = add i32 %y.21, 1 ; <i32> [#uses=2]
182 %exitcond6 = icmp ne i32 %indvar.next5, %x ; <i1> [#uses=1]
183 br i1 %exitcond6, label %bb23, label %bb24.bb26_crit_edge
185 bb24.bb26_crit_edge: ; preds = %bb24
188 bb26: ; preds = %bb24.bb26_crit_edge, %bb22
189 %49 = mul i32 %x, %w ; <i32> [#uses=1]
190 %.sum4 = add i32 %.sum3, %49 ; <i32> [#uses=1]
191 %50 = getelementptr i8* %j, i32 %.sum4 ; <i8*> [#uses=1]
192 %51 = mul i32 %x, %w ; <i32> [#uses=1]
193 %52 = sdiv i32 %51, 2 ; <i32> [#uses=1]
194 tail call void @llvm.memset.i32(i8* %50, i8 -128, i32 %52, i32 1)
197 bb29: ; preds = %bb20, %entry
198 %53 = add i32 %w, 15 ; <i32> [#uses=1]
199 %54 = and i32 %53, -16 ; <i32> [#uses=1]
200 %55 = icmp sgt i32 %x, 0 ; <i1> [#uses=1]
201 br i1 %55, label %bb.nph11, label %bb33
203 bb.nph11: ; preds = %bb29
206 bb30: ; preds = %bb31, %bb.nph11
207 %y.310 = phi i32 [ 0, %bb.nph11 ], [ %indvar.next13, %bb31 ] ; <i32> [#uses=3]
208 %56 = mul i32 %y.310, %54 ; <i32> [#uses=1]
209 %57 = getelementptr i8* %r, i32 %56 ; <i8*> [#uses=1]
210 %58 = mul i32 %y.310, %w ; <i32> [#uses=1]
211 %59 = getelementptr i8* %j, i32 %58 ; <i8*> [#uses=1]
212 tail call void @llvm.memcpy.i32(i8* %59, i8* %57, i32 %w, i32 1)
215 bb31: ; preds = %bb30
216 %indvar.next13 = add i32 %y.310, 1 ; <i32> [#uses=2]
217 %exitcond14 = icmp ne i32 %indvar.next13, %x ; <i1> [#uses=1]
218 br i1 %exitcond14, label %bb30, label %bb31.bb33_crit_edge
220 bb31.bb33_crit_edge: ; preds = %bb31
223 bb33: ; preds = %bb31.bb33_crit_edge, %bb29
224 %60 = mul i32 %x, %w ; <i32> [#uses=1]
225 %61 = getelementptr i8* %j, i32 %60 ; <i8*> [#uses=1]
226 %62 = mul i32 %x, %w ; <i32> [#uses=1]
227 %63 = sdiv i32 %62, 2 ; <i32> [#uses=1]
228 tail call void @llvm.memset.i32(i8* %61, i8 -128, i32 %63, i32 1)
231 return: ; preds = %bb20
235 define void @bar(i8* %r, i32 %s, i32 %w, i32 %x, i8* %j, i32 %d) nounwind {
237 %0 = mul i32 %x, %w ; <i32> [#uses=2]
238 %1 = mul i32 %x, %w ; <i32> [#uses=1]
239 %2 = udiv i32 %1, 4 ; <i32> [#uses=1]
240 %.sum2 = add i32 %2, %0 ; <i32> [#uses=2]
241 %cond = icmp eq i32 %d, 1 ; <i1> [#uses=1]
242 br i1 %cond, label %bb29, label %bb10.preheader
244 bb10.preheader: ; preds = %entry
245 %3 = icmp ne i32 %x, 0 ; <i1> [#uses=1]
246 br i1 %3, label %bb.nph9, label %bb18.loopexit
248 bb.nph7: ; preds = %bb7.preheader
249 %4 = mul i32 %y.08, %w ; <i32> [#uses=1]
250 %5 = mul i32 %y.08, %s ; <i32> [#uses=1]
251 %6 = add i32 %5, 1 ; <i32> [#uses=1]
252 %tmp8 = icmp ugt i32 1, %w ; <i1> [#uses=1]
253 %smax9 = select i1 %tmp8, i32 1, i32 %w ; <i32> [#uses=1]
256 bb6: ; preds = %bb7, %bb.nph7
257 %x.06 = phi i32 [ 0, %bb.nph7 ], [ %indvar.next7, %bb7 ] ; <i32> [#uses=3]
258 %7 = add i32 %x.06, %4 ; <i32> [#uses=1]
259 %8 = shl i32 %x.06, 1 ; <i32> [#uses=1]
260 %9 = add i32 %6, %8 ; <i32> [#uses=1]
261 %10 = getelementptr i8* %r, i32 %9 ; <i8*> [#uses=1]
262 %11 = load i8* %10, align 1 ; <i8> [#uses=1]
263 %12 = getelementptr i8* %j, i32 %7 ; <i8*> [#uses=1]
264 store i8 %11, i8* %12, align 1
268 %indvar.next7 = add i32 %x.06, 1 ; <i32> [#uses=2]
269 %exitcond10 = icmp ne i32 %indvar.next7, %smax9 ; <i1> [#uses=1]
270 br i1 %exitcond10, label %bb6, label %bb7.bb9_crit_edge
272 bb7.bb9_crit_edge: ; preds = %bb7
275 bb9: ; preds = %bb7.preheader, %bb7.bb9_crit_edge
279 %indvar.next11 = add i32 %y.08, 1 ; <i32> [#uses=2]
280 %exitcond12 = icmp ne i32 %indvar.next11, %x ; <i1> [#uses=1]
281 br i1 %exitcond12, label %bb7.preheader, label %bb10.bb18.loopexit_crit_edge
283 bb10.bb18.loopexit_crit_edge: ; preds = %bb10
284 br label %bb10.bb18.loopexit_crit_edge.split
286 bb10.bb18.loopexit_crit_edge.split: ; preds = %bb.nph9, %bb10.bb18.loopexit_crit_edge
287 br label %bb18.loopexit
289 bb.nph9: ; preds = %bb10.preheader
290 %13 = icmp ugt i32 %w, 0 ; <i1> [#uses=1]
291 br i1 %13, label %bb.nph9.split, label %bb10.bb18.loopexit_crit_edge.split
293 bb.nph9.split: ; preds = %bb.nph9
294 br label %bb7.preheader
296 bb7.preheader: ; preds = %bb.nph9.split, %bb10
297 %y.08 = phi i32 [ 0, %bb.nph9.split ], [ %indvar.next11, %bb10 ] ; <i32> [#uses=3]
298 br i1 true, label %bb.nph7, label %bb9
300 bb.nph5: ; preds = %bb18.loopexit
301 %14 = udiv i32 %w, 2 ; <i32> [#uses=1]
302 %15 = icmp ult i32 %w, 2 ; <i1> [#uses=1]
303 %16 = udiv i32 %x, 2 ; <i32> [#uses=2]
304 br i1 %15, label %bb18.bb20_crit_edge.split, label %bb.nph5.split
306 bb.nph5.split: ; preds = %bb.nph5
307 %tmp2 = icmp ugt i32 1, %16 ; <i1> [#uses=1]
308 %smax3 = select i1 %tmp2, i32 1, i32 %16 ; <i32> [#uses=1]
311 bb13: ; preds = %bb18, %bb.nph5.split
312 %y.14 = phi i32 [ 0, %bb.nph5.split ], [ %indvar.next1, %bb18 ] ; <i32> [#uses=4]
313 %17 = mul i32 %14, %y.14 ; <i32> [#uses=2]
314 %18 = shl i32 %y.14, 1 ; <i32> [#uses=1]
315 %19 = urem i32 %y.14, 2 ; <i32> [#uses=1]
316 %20 = add i32 %19, %18 ; <i32> [#uses=1]
317 %21 = mul i32 %20, %s ; <i32> [#uses=2]
318 br i1 true, label %bb.nph3, label %bb17
320 bb.nph3: ; preds = %bb13
321 %22 = add i32 %17, %0 ; <i32> [#uses=1]
322 %23 = add i32 %17, %.sum2 ; <i32> [#uses=1]
323 %24 = udiv i32 %w, 2 ; <i32> [#uses=2]
324 %tmp = icmp ugt i32 1, %24 ; <i1> [#uses=1]
325 %smax = select i1 %tmp, i32 1, i32 %24 ; <i32> [#uses=1]
328 bb14: ; preds = %bb15, %bb.nph3
329 %x.12 = phi i32 [ 0, %bb.nph3 ], [ %indvar.next, %bb15 ] ; <i32> [#uses=5]
330 %25 = shl i32 %x.12, 2 ; <i32> [#uses=1]
331 %26 = add i32 %25, %21 ; <i32> [#uses=1]
332 %27 = getelementptr i8* %r, i32 %26 ; <i8*> [#uses=1]
333 %28 = load i8* %27, align 1 ; <i8> [#uses=1]
334 %.sum = add i32 %22, %x.12 ; <i32> [#uses=1]
335 %29 = getelementptr i8* %j, i32 %.sum ; <i8*> [#uses=1]
336 store i8 %28, i8* %29, align 1
337 %30 = shl i32 %x.12, 2 ; <i32> [#uses=1]
338 %31 = or i32 %30, 2 ; <i32> [#uses=1]
339 %32 = add i32 %31, %21 ; <i32> [#uses=1]
340 %33 = getelementptr i8* %r, i32 %32 ; <i8*> [#uses=1]
341 %34 = load i8* %33, align 1 ; <i8> [#uses=1]
342 %.sum6 = add i32 %23, %x.12 ; <i32> [#uses=1]
343 %35 = getelementptr i8* %j, i32 %.sum6 ; <i8*> [#uses=1]
344 store i8 %34, i8* %35, align 1
347 bb15: ; preds = %bb14
348 %indvar.next = add i32 %x.12, 1 ; <i32> [#uses=2]
349 %exitcond = icmp ne i32 %indvar.next, %smax ; <i1> [#uses=1]
350 br i1 %exitcond, label %bb14, label %bb15.bb17_crit_edge
352 bb15.bb17_crit_edge: ; preds = %bb15
355 bb17: ; preds = %bb15.bb17_crit_edge, %bb13
358 bb18.loopexit: ; preds = %bb10.bb18.loopexit_crit_edge.split, %bb10.preheader
359 %36 = icmp ult i32 %x, 2 ; <i1> [#uses=1]
360 br i1 %36, label %bb20, label %bb.nph5
362 bb18: ; preds = %bb17
363 %indvar.next1 = add i32 %y.14, 1 ; <i32> [#uses=2]
364 %exitcond4 = icmp ne i32 %indvar.next1, %smax3 ; <i1> [#uses=1]
365 br i1 %exitcond4, label %bb13, label %bb18.bb20_crit_edge
367 bb18.bb20_crit_edge: ; preds = %bb18
368 br label %bb18.bb20_crit_edge.split
370 bb18.bb20_crit_edge.split: ; preds = %bb18.bb20_crit_edge, %bb.nph5
373 bb20: ; preds = %bb18.bb20_crit_edge.split, %bb18.loopexit
374 switch i32 %d, label %return [
379 bb22: ; preds = %bb20
380 %37 = mul i32 %x, %w ; <i32> [#uses=1]
381 %38 = udiv i32 %37, 4 ; <i32> [#uses=1]
382 %.sum3 = add i32 %38, %.sum2 ; <i32> [#uses=2]
383 %39 = add i32 %x, 15 ; <i32> [#uses=1]
384 %40 = and i32 %39, -16 ; <i32> [#uses=1]
385 %41 = add i32 %w, 15 ; <i32> [#uses=1]
386 %42 = and i32 %41, -16 ; <i32> [#uses=1]
387 %43 = mul i32 %40, %s ; <i32> [#uses=1]
388 %44 = icmp ugt i32 %x, 0 ; <i1> [#uses=1]
389 br i1 %44, label %bb.nph, label %bb26
391 bb.nph: ; preds = %bb22
394 bb23: ; preds = %bb24, %bb.nph
395 %y.21 = phi i32 [ 0, %bb.nph ], [ %indvar.next5, %bb24 ] ; <i32> [#uses=3]
396 %45 = mul i32 %y.21, %42 ; <i32> [#uses=1]
397 %.sum1 = add i32 %45, %43 ; <i32> [#uses=1]
398 %46 = getelementptr i8* %r, i32 %.sum1 ; <i8*> [#uses=1]
399 %47 = mul i32 %y.21, %w ; <i32> [#uses=1]
400 %.sum5 = add i32 %47, %.sum3 ; <i32> [#uses=1]
401 %48 = getelementptr i8* %j, i32 %.sum5 ; <i8*> [#uses=1]
402 tail call void @llvm.memcpy.i32(i8* %48, i8* %46, i32 %w, i32 1)
405 bb24: ; preds = %bb23
406 %indvar.next5 = add i32 %y.21, 1 ; <i32> [#uses=2]
407 %exitcond6 = icmp ne i32 %indvar.next5, %x ; <i1> [#uses=1]
408 br i1 %exitcond6, label %bb23, label %bb24.bb26_crit_edge
410 bb24.bb26_crit_edge: ; preds = %bb24
413 bb26: ; preds = %bb24.bb26_crit_edge, %bb22
414 %49 = mul i32 %x, %w ; <i32> [#uses=1]
415 %.sum4 = add i32 %.sum3, %49 ; <i32> [#uses=1]
416 %50 = getelementptr i8* %j, i32 %.sum4 ; <i8*> [#uses=1]
417 %51 = mul i32 %x, %w ; <i32> [#uses=1]
418 %52 = udiv i32 %51, 2 ; <i32> [#uses=1]
419 tail call void @llvm.memset.i32(i8* %50, i8 -128, i32 %52, i32 1)
422 bb29: ; preds = %bb20, %entry
423 %53 = add i32 %w, 15 ; <i32> [#uses=1]
424 %54 = and i32 %53, -16 ; <i32> [#uses=1]
425 %55 = icmp ugt i32 %x, 0 ; <i1> [#uses=1]
426 br i1 %55, label %bb.nph11, label %bb33
428 bb.nph11: ; preds = %bb29
431 bb30: ; preds = %bb31, %bb.nph11
432 %y.310 = phi i32 [ 0, %bb.nph11 ], [ %indvar.next13, %bb31 ] ; <i32> [#uses=3]
433 %56 = mul i32 %y.310, %54 ; <i32> [#uses=1]
434 %57 = getelementptr i8* %r, i32 %56 ; <i8*> [#uses=1]
435 %58 = mul i32 %y.310, %w ; <i32> [#uses=1]
436 %59 = getelementptr i8* %j, i32 %58 ; <i8*> [#uses=1]
437 tail call void @llvm.memcpy.i32(i8* %59, i8* %57, i32 %w, i32 1)
440 bb31: ; preds = %bb30
441 %indvar.next13 = add i32 %y.310, 1 ; <i32> [#uses=2]
442 %exitcond14 = icmp ne i32 %indvar.next13, %x ; <i1> [#uses=1]
443 br i1 %exitcond14, label %bb30, label %bb31.bb33_crit_edge
445 bb31.bb33_crit_edge: ; preds = %bb31
448 bb33: ; preds = %bb31.bb33_crit_edge, %bb29
449 %60 = mul i32 %x, %w ; <i32> [#uses=1]
450 %61 = getelementptr i8* %j, i32 %60 ; <i8*> [#uses=1]
451 %62 = mul i32 %x, %w ; <i32> [#uses=1]
452 %63 = udiv i32 %62, 2 ; <i32> [#uses=1]
453 tail call void @llvm.memset.i32(i8* %61, i8 -128, i32 %63, i32 1)
456 return: ; preds = %bb20
460 declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) nounwind
462 declare void @llvm.memset.i32(i8*, i8, i32, i32) nounwind