1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=indvars -S | FileCheck %s
4 @array = dso_local global [16777219 x i32] zeroinitializer, align 4
6 define void @sitofp_fptosi_range() {
7 ; CHECK-LABEL: @sitofp_fptosi_range(
9 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
11 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
12 ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IV_INT]] to i64
13 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
14 ; CHECK-NEXT: store i32 [[IV_INT]], ptr [[ARRAYIDX]], align 4
15 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
16 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC_INT]], 0
17 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
19 ; CHECK-NEXT: ret void
24 for.body: ; preds = %for.body, %entry
25 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
26 %indvar.conv = sitofp i32 %iv.int to float
27 %conv = fptosi float %indvar.conv to i32
28 %idxprom = sext i32 %conv to i64
29 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
30 store i32 %conv, ptr %arrayidx, align 4
31 %dec.int = add nsw i32 %iv.int, -1
32 %cmp = icmp ugt i32 %dec.int, 0
33 br i1 %cmp, label %for.body, label %cleanup
35 cleanup: ; preds = %for.body
39 ; Negative test: The transform is *not* valid because there are too many significant bits
40 define void @sitofp_fptosi_range_overflow() {
41 ; CHECK-LABEL: @sitofp_fptosi_range_overflow(
43 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
45 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 16777218, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
46 ; CHECK-NEXT: [[INDVAR_CONV:%.*]] = sitofp i32 [[IV_INT]] to float
47 ; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[INDVAR_CONV]] to i32
48 ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[CONV]] to i64
49 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
50 ; CHECK-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4
51 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
52 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC_INT]], 0
53 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
55 ; CHECK-NEXT: ret void
60 for.body: ; preds = %for.body, %entry
61 %iv.int = phi i32 [ 16777218, %entry ], [ %dec.int, %for.body ] ; intermediate 16777218 (= 1 << 24 + 2)
62 %indvar.conv = sitofp i32 %iv.int to float
63 %conv = fptosi float %indvar.conv to i32
64 %idxprom = sext i32 %conv to i64
65 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
66 store i32 %conv, ptr %arrayidx, align 4
67 %dec.int = add nsw i32 %iv.int, -1
68 %cmp = icmp ugt i32 %dec.int, 0
69 br i1 %cmp, label %for.body, label %cleanup
71 cleanup: ; preds = %for.body
75 ; Type mismatch between the integer IV and the fptosi result
76 define void @sitofp_fptosi_range_trunc() {
78 ; CHECK-LABEL: @sitofp_fptosi_range_trunc(
80 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
82 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i64 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
83 ; CHECK-NEXT: [[IV_INT_TRUNC:%.*]] = trunc i64 [[IV_INT]] to i32
84 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IV_INT]]
85 ; CHECK-NEXT: store i32 [[IV_INT_TRUNC]], ptr [[ARRAYIDX]], align 4
86 ; CHECK-NEXT: [[DEC_INT]] = add nsw i64 [[IV_INT]], -1
87 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[DEC_INT]], 0
88 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
90 ; CHECK-NEXT: ret void
95 for.body: ; preds = %for.body, %entry
96 %iv.int = phi i64 [ 100, %entry ], [ %dec.int, %for.body ]
97 %indvar.conv = sitofp i64 %iv.int to float
98 %idxprom32 = fptosi float %indvar.conv to i32
99 %idxprom64 = fptosi float %indvar.conv to i64
100 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom64
101 store i32 %idxprom32, ptr %arrayidx, align 4
102 %dec.int = add nsw i64 %iv.int, -1
103 %cmp = icmp ugt i64 %dec.int, 0
104 br i1 %cmp, label %for.body, label %cleanup
106 cleanup: ; preds = %for.body
110 define void @sitofp_fptosi_range_sext() {
112 ; CHECK-LABEL: @sitofp_fptosi_range_sext(
114 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
116 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i16 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
117 ; CHECK-NEXT: [[IV_INT_SEXT1:%.*]] = sext i16 [[IV_INT]] to i32
118 ; CHECK-NEXT: [[IV_INT_SEXT:%.*]] = sext i16 [[IV_INT]] to i64
119 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IV_INT_SEXT]]
120 ; CHECK-NEXT: store i32 [[IV_INT_SEXT1]], ptr [[ARRAYIDX]], align 4
121 ; CHECK-NEXT: [[DEC_INT]] = add nsw i16 [[IV_INT]], -1
122 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[DEC_INT]], -3
123 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
125 ; CHECK-NEXT: ret void
130 for.body: ; preds = %for.body, %entry
131 %iv.int = phi i16 [ 100, %entry ], [ %dec.int, %for.body ]
132 %indvar.conv = sitofp i16 %iv.int to float
133 %idxprom32 = fptosi float %indvar.conv to i32
134 %idxprom64 = fptosi float %indvar.conv to i64
135 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom64
136 store i32 %idxprom32, ptr %arrayidx, align 4
137 %dec.int = add nsw i16 %iv.int, -1
138 %cmp = icmp sgt i16 %dec.int, -3
139 br i1 %cmp, label %for.body, label %cleanup
141 cleanup: ; preds = %for.body
145 ; If one of them is unsigned, then we can use zext.
146 define void @sitofp_fptoui_range_zext() {
148 ; CHECK-LABEL: @sitofp_fptoui_range_zext(
150 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
152 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i16 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
153 ; CHECK-NEXT: [[IV_INT_ZEXT1:%.*]] = zext i16 [[IV_INT]] to i32
154 ; CHECK-NEXT: [[IV_INT_ZEXT:%.*]] = zext i16 [[IV_INT]] to i64
155 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IV_INT_ZEXT]]
156 ; CHECK-NEXT: store i32 [[IV_INT_ZEXT1]], ptr [[ARRAYIDX]], align 4
157 ; CHECK-NEXT: [[DEC_INT]] = add nsw i16 [[IV_INT]], -1
158 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i16 [[DEC_INT]], 0
159 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
161 ; CHECK-NEXT: ret void
166 for.body: ; preds = %for.body, %entry
167 %iv.int = phi i16 [ 100, %entry ], [ %dec.int, %for.body ]
168 %indvar.conv = sitofp i16 %iv.int to float
169 %idxprom32 = fptoui float %indvar.conv to i32
170 %idxprom64 = fptoui float %indvar.conv to i64
171 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom64
172 store i32 %idxprom32, ptr %arrayidx, align 4
173 %dec.int = add nsw i16 %iv.int, -1
174 %cmp = icmp ugt i16 %dec.int, 0
175 br i1 %cmp, label %for.body, label %cleanup
177 cleanup: ; preds = %for.body
181 ; Take care of the insertion point.
182 define void @sitofp_fptoui_range_zext_postinc() {
184 ; CHECK-LABEL: @sitofp_fptoui_range_zext_postinc(
186 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
188 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i16 [ 100, [[ENTRY:%.*]] ], [ [[INC_INT:%.*]], [[FOR_BODY]] ]
189 ; CHECK-NEXT: [[INC_INT]] = add nuw nsw i16 [[IV_INT]], 2
190 ; CHECK-NEXT: [[INC_INT_ZEXT1:%.*]] = zext i16 [[INC_INT]] to i32
191 ; CHECK-NEXT: [[INC_INT_ZEXT:%.*]] = zext i16 [[INC_INT]] to i64
192 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[INC_INT_ZEXT]]
193 ; CHECK-NEXT: store i32 [[INC_INT_ZEXT1]], ptr [[ARRAYIDX]], align 4
194 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[INC_INT]], 200
195 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
197 ; CHECK-NEXT: ret void
202 for.body: ; preds = %for.body, %entry
203 %iv.int = phi i16 [ 100, %entry ], [ %inc.int, %for.body ]
204 %inc.int = add nsw i16 %iv.int, 2
205 %indvar.conv = sitofp i16 %inc.int to float ; The 'postinc IV' %inc.int passes to sitofp
206 %idxprom32 = fptoui float %indvar.conv to i32
207 %idxprom64 = fptoui float %indvar.conv to i64
208 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom64
209 store i32 %idxprom32, ptr %arrayidx, align 4
210 %cmp = icmp ult i16 %inc.int, 200
211 br i1 %cmp, label %for.body, label %cleanup
213 cleanup: ; preds = %for.body
217 ; If one of them is unsigned, then we can use zext.
218 define void @uitofp_fptosi_range_zext() {
220 ; CHECK-LABEL: @uitofp_fptosi_range_zext(
222 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
224 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i16 [ 100, [[ENTRY:%.*]] ], [ [[INC_INT:%.*]], [[FOR_BODY]] ]
225 ; CHECK-NEXT: [[IV_INT_ZEXT1:%.*]] = zext i16 [[IV_INT]] to i32
226 ; CHECK-NEXT: [[IV_INT_ZEXT:%.*]] = zext i16 [[IV_INT]] to i64
227 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IV_INT_ZEXT]]
228 ; CHECK-NEXT: store i32 [[IV_INT_ZEXT1]], ptr [[ARRAYIDX]], align 4
229 ; CHECK-NEXT: [[INC_INT]] = add nuw nsw i16 [[IV_INT]], 2
230 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[INC_INT]], 200
231 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
233 ; CHECK-NEXT: ret void
238 for.body: ; preds = %for.body, %entry
239 %iv.int = phi i16 [ 100, %entry ], [ %inc.int, %for.body ]
240 %indvar.conv = uitofp i16 %iv.int to float
241 %idxprom32 = fptosi float %indvar.conv to i32
242 %idxprom64 = fptosi float %indvar.conv to i64
243 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom64
244 store i32 %idxprom32, ptr %arrayidx, align 4
245 %inc.int = add nsw i16 %iv.int, 2
246 %cmp = icmp ult i16 %inc.int, 200
247 br i1 %cmp, label %for.body, label %cleanup
249 cleanup: ; preds = %for.body
254 define void @sitofp_fptoui_range() {
255 ; CHECK-LABEL: @sitofp_fptoui_range(
257 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
259 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
260 ; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[IV_INT]] to i64
261 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
262 ; CHECK-NEXT: store i32 [[IV_INT]], ptr [[ARRAYIDX]], align 4
263 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
264 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC_INT]], 0
265 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
267 ; CHECK-NEXT: ret void
272 for.body: ; preds = %for.body, %entry
273 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
274 %indvar.conv = sitofp i32 %iv.int to float
275 %conv = fptoui float %indvar.conv to i32
276 %idxprom = zext i32 %conv to i64
277 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
278 store i32 %conv, ptr %arrayidx, align 4
279 %dec.int = add nsw i32 %iv.int, -1
280 %cmp = icmp sgt i32 %dec.int, 0
281 br i1 %cmp, label %for.body, label %cleanup
283 cleanup: ; preds = %for.body
287 ; Range including negative value.
288 define void @sitofp_fptoui_range_with_negative () {
289 ; CHECK-LABEL: @sitofp_fptoui_range_with_negative(
291 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
293 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
294 ; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[IV_INT]] to i64
295 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
296 ; CHECK-NEXT: store i32 [[IV_INT]], ptr [[ARRAYIDX]], align 4
297 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
298 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[DEC_INT]], -100
299 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
301 ; CHECK-NEXT: ret void
306 for.body: ; preds = %for.body, %entry
307 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
308 %indvar.conv = sitofp i32 %iv.int to float
309 %conv = fptoui float %indvar.conv to i32
310 %idxprom = zext i32 %conv to i64
311 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
312 store i32 %conv, ptr %arrayidx, align 4
313 %dec.int = add nsw i32 %iv.int, -1
314 %cmp = icmp sgt i32 %dec.int, -100
315 br i1 %cmp, label %for.body, label %cleanup
317 cleanup: ; preds = %for.body
321 ; https://godbolt.org/z/51MrqYjEf
322 define void @uitofp_fptoui_range () {
323 ; CHECK-LABEL: @uitofp_fptoui_range(
325 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
327 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
328 ; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[IV_INT]] to i64
329 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
330 ; CHECK-NEXT: store i32 [[IV_INT]], ptr [[ARRAYIDX]], align 4
331 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
332 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC_INT]], 3
333 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
335 ; CHECK-NEXT: ret void
340 for.body: ; preds = %for.body, %entry
341 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
342 %indvar.conv = uitofp i32 %iv.int to float
343 %conv = fptoui float %indvar.conv to i32
344 %idxprom = zext i32 %conv to i64
345 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
346 store i32 %conv, ptr %arrayidx, align 4
347 %dec.int = add nsw i32 %iv.int, -1
348 %cmp = icmp ugt i32 %dec.int, 3
349 br i1 %cmp, label %for.body, label %cleanup
351 cleanup: ; preds = %for.body
355 define void @uitofp_fptoui_range_with_negative() {
356 ; CHECK-LABEL: @uitofp_fptoui_range_with_negative(
358 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
360 ; CHECK-NEXT: store i32 100, ptr getelementptr inbounds (i8, ptr @array, i64 400), align 4
361 ; CHECK-NEXT: br i1 false, label [[FOR_BODY]], label [[CLEANUP:%.*]]
363 ; CHECK-NEXT: ret void
368 for.body: ; preds = %for.body, %entry
369 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
370 %indvar.conv = uitofp i32 %iv.int to float
371 %conv = fptoui float %indvar.conv to i32
372 %idxprom = zext i32 %conv to i64
373 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
374 store i32 %conv, ptr %arrayidx, align 4
375 %dec.int = add nsw i32 %iv.int, -1
376 %cmp = icmp ugt i32 %dec.int, -100
377 br i1 %cmp, label %for.body, label %cleanup
379 cleanup: ; preds = %for.body
383 define void @uitofp_fptosi_range () {
384 ; CHECK-LABEL: @uitofp_fptosi_range(
386 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
388 ; CHECK-NEXT: [[IV_INT:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[DEC_INT:%.*]], [[FOR_BODY]] ]
389 ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IV_INT]] to i64
390 ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 [[IDXPROM]]
391 ; CHECK-NEXT: store i32 [[IV_INT]], ptr [[ARRAYIDX]], align 4
392 ; CHECK-NEXT: [[DEC_INT]] = add nsw i32 [[IV_INT]], -1
393 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[DEC_INT]], 3
394 ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
396 ; CHECK-NEXT: ret void
401 for.body: ; preds = %for.body, %entry
402 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
403 %indvar.conv = uitofp i32 %iv.int to float
404 %conv = fptosi float %indvar.conv to i32
405 %idxprom = sext i32 %conv to i64
406 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
407 store i32 %conv, ptr %arrayidx, align 4
408 %dec.int = add nsw i32 %iv.int, -1
409 %cmp = icmp ugt i32 %dec.int, 3
410 br i1 %cmp, label %for.body, label %cleanup
412 cleanup: ; preds = %for.body
416 define void @uitofp_fptosi_range_with_negative () {
417 ; CHECK-LABEL: @uitofp_fptosi_range_with_negative(
419 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
421 ; CHECK-NEXT: store i32 100, ptr getelementptr inbounds (i8, ptr @array, i64 400), align 4
422 ; CHECK-NEXT: br i1 false, label [[FOR_BODY]], label [[CLEANUP:%.*]]
424 ; CHECK-NEXT: ret void
429 for.body: ; preds = %for.body, %entry
430 %iv.int = phi i32 [ 100, %entry ], [ %dec.int, %for.body ]
431 %indvar.conv = uitofp i32 %iv.int to float
432 %conv = fptosi float %indvar.conv to i32
433 %idxprom = sext i32 %conv to i64
434 %arrayidx = getelementptr inbounds [16777219 x i32], ptr @array, i64 0, i64 %idxprom
435 store i32 %conv, ptr %arrayidx, align 4
436 %dec.int = add nsw i32 %iv.int, -1
437 %cmp = icmp ugt i32 %dec.int, -100
438 br i1 %cmp, label %for.body, label %cleanup
440 cleanup: ; preds = %for.body