@@ -217,6 +217,63 @@ fail:
217
217
ret i32 -1
218
218
}
219
219
220
+ ; Same as previous case, with commuted icmp.
221
+ ; FIXME: The load should get hoisted here as well.
222
+ define i32 @test3_commuted (ptr noalias nocapture readonly %a ) nounwind uwtable {
223
+ ; CHECK-LABEL: define i32 @test3_commuted(
224
+ ; CHECK-SAME: ptr noalias nocapture readonly [[A:%.*]]) #[[ATTR1]] {
225
+ ; CHECK-NEXT: entry:
226
+ ; CHECK-NEXT: [[LEN:%.*]] = load i32, ptr [[A]], align 4, !range [[RNG0]]
227
+ ; CHECK-NEXT: [[IS_ZERO:%.*]] = icmp eq i32 [[LEN]], 0
228
+ ; CHECK-NEXT: br i1 [[IS_ZERO]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
229
+ ; CHECK: preheader:
230
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
231
+ ; CHECK: for.body:
232
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[INC:%.*]], [[CONTINUE:%.*]] ]
233
+ ; CHECK-NEXT: [[ACC:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[ADD:%.*]], [[CONTINUE]] ]
234
+ ; CHECK-NEXT: [[R_CHK:%.*]] = icmp uge i32 [[LEN]], [[IV]]
235
+ ; CHECK-NEXT: br i1 [[R_CHK]], label [[CONTINUE]], label [[FAIL_LOOPEXIT:%.*]]
236
+ ; CHECK: continue:
237
+ ; CHECK-NEXT: [[I1:%.*]] = load i32, ptr [[A]], align 4
238
+ ; CHECK-NEXT: [[ADD]] = add nsw i32 [[I1]], [[ACC]]
239
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[IV]], 1
240
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000
241
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
242
+ ; CHECK: for.cond.cleanup:
243
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[CONTINUE]] ]
244
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
245
+ ; CHECK: fail.loopexit:
246
+ ; CHECK-NEXT: br label [[FAIL]]
247
+ ; CHECK: fail:
248
+ ; CHECK-NEXT: call void @f()
249
+ ; CHECK-NEXT: ret i32 -1
250
+ ;
251
+ entry:
252
+ %len = load i32 , ptr %a , align 4 , !range !{i32 0 , i32 512 }
253
+ %is.zero = icmp eq i32 %len , 0
254
+ br i1 %is.zero , label %fail , label %preheader
255
+ preheader:
256
+ br label %for.body
257
+ for.body:
258
+ %iv = phi i32 [ 0 , %preheader ], [ %inc , %continue ]
259
+ %acc = phi i32 [ 0 , %preheader ], [ %add , %continue ]
260
+ %r.chk = icmp uge i32 %len , %iv
261
+ br i1 %r.chk , label %continue , label %fail
262
+ continue:
263
+ %i1 = load i32 , ptr %a , align 4
264
+ %add = add nsw i32 %i1 , %acc
265
+ %inc = add nuw nsw i32 %iv , 1
266
+ %exitcond = icmp eq i32 %inc , 1000
267
+ br i1 %exitcond , label %for.cond.cleanup , label %for.body
268
+
269
+ for.cond.cleanup:
270
+ ret i32 %add
271
+
272
+ fail:
273
+ call void @f ()
274
+ ret i32 -1
275
+ }
276
+
220
277
; requires fact length is non-zero
221
278
define i32 @test4 (ptr noalias nocapture readonly %a ) nounwind uwtable {
222
279
; CHECK-LABEL: define i32 @test4(
0 commit comments