Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / floating-point-small-iv.ll
blobbebd314f7375ab71986e74e8b7ae0ef78428c0c6
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(
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
10 ; CHECK:       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:%.*]]
18 ; CHECK:       cleanup:
19 ; CHECK-NEXT:    ret void
21 entry:
22   br label %for.body
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
36   ret void
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(
42 ; CHECK-NEXT:  entry:
43 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
44 ; CHECK:       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:%.*]]
54 ; CHECK:       cleanup:
55 ; CHECK-NEXT:    ret void
57 entry:
58   br label %for.body
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
72   ret void
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(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
81 ; CHECK:       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:%.*]]
89 ; CHECK:       cleanup:
90 ; CHECK-NEXT:    ret void
92 entry:
93   br label %for.body
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
107   ret void
110 define void @sitofp_fptosi_range_sext() {
112 ; CHECK-LABEL: @sitofp_fptosi_range_sext(
113 ; CHECK-NEXT:  entry:
114 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
115 ; CHECK:       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:%.*]]
124 ; CHECK:       cleanup:
125 ; CHECK-NEXT:    ret void
127 entry:
128   br label %for.body
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
142   ret void
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(
149 ; CHECK-NEXT:  entry:
150 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
151 ; CHECK:       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:%.*]]
160 ; CHECK:       cleanup:
161 ; CHECK-NEXT:    ret void
163 entry:
164   br label %for.body
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
178   ret void
181 ; Take care of the insertion point.
182 define void @sitofp_fptoui_range_zext_postinc() {
184 ; CHECK-LABEL: @sitofp_fptoui_range_zext_postinc(
185 ; CHECK-NEXT:  entry:
186 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
187 ; CHECK:       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:%.*]]
196 ; CHECK:       cleanup:
197 ; CHECK-NEXT:    ret void
199 entry:
200   br label %for.body
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
214   ret void
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(
221 ; CHECK-NEXT:  entry:
222 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
223 ; CHECK:       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:%.*]]
232 ; CHECK:       cleanup:
233 ; CHECK-NEXT:    ret void
235 entry:
236   br label %for.body
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
250   ret void
254 define void @sitofp_fptoui_range() {
255 ; CHECK-LABEL: @sitofp_fptoui_range(
256 ; CHECK-NEXT:  entry:
257 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
258 ; CHECK:       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:%.*]]
266 ; CHECK:       cleanup:
267 ; CHECK-NEXT:    ret void
269 entry:
270   br label %for.body
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
284   ret void
287 ; Range including negative value.
288 define void @sitofp_fptoui_range_with_negative () {
289 ; CHECK-LABEL: @sitofp_fptoui_range_with_negative(
290 ; CHECK-NEXT:  entry:
291 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
292 ; CHECK:       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:%.*]]
300 ; CHECK:       cleanup:
301 ; CHECK-NEXT:    ret void
303 entry:
304   br label %for.body
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
318   ret void
321 ; https://godbolt.org/z/51MrqYjEf
322 define void @uitofp_fptoui_range () {
323 ; CHECK-LABEL: @uitofp_fptoui_range(
324 ; CHECK-NEXT:  entry:
325 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
326 ; CHECK:       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:%.*]]
334 ; CHECK:       cleanup:
335 ; CHECK-NEXT:    ret void
337 entry:
338   br label %for.body
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
352   ret void
355 define void @uitofp_fptoui_range_with_negative() {
356 ; CHECK-LABEL: @uitofp_fptoui_range_with_negative(
357 ; CHECK-NEXT:  entry:
358 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
359 ; CHECK:       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:%.*]]
362 ; CHECK:       cleanup:
363 ; CHECK-NEXT:    ret void
365 entry:
366   br label %for.body
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
380   ret void
383 define void @uitofp_fptosi_range () {
384 ; CHECK-LABEL: @uitofp_fptosi_range(
385 ; CHECK-NEXT:  entry:
386 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
387 ; CHECK:       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:%.*]]
395 ; CHECK:       cleanup:
396 ; CHECK-NEXT:    ret void
398 entry:
399   br label %for.body
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
413   ret void
416 define void @uitofp_fptosi_range_with_negative () {
417 ; CHECK-LABEL: @uitofp_fptosi_range_with_negative(
418 ; CHECK-NEXT:  entry:
419 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
420 ; CHECK:       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:%.*]]
423 ; CHECK:       cleanup:
424 ; CHECK-NEXT:    ret void
426 entry:
427   br label %for.body
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
441   ret void