@@ -373,4 +373,66 @@ loop:
373
373
br i1 %loopcond , label %loopexit , label %loop
374
374
}
375
375
376
+ define void @promote_latch_condition_decrementing_loop_05 (i32* %p , i32* %a , i1 %cond ) {
377
+ ; CHECK-LABEL: @promote_latch_condition_decrementing_loop_05(
378
+ ; CHECK-NEXT: entry:
379
+ ; CHECK-NEXT: [[LEN:%.*]] = load i32, i32* [[P:%.*]], align 4, [[RNG0]]
380
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
381
+ ; CHECK: if.true:
382
+ ; CHECK-NEXT: br label [[MERGE:%.*]]
383
+ ; CHECK: if.false:
384
+ ; CHECK-NEXT: [[LEN_MINUS_1:%.*]] = add nsw i32 [[LEN]], -1
385
+ ; CHECK-NEXT: br label [[MERGE]]
386
+ ; CHECK: merge:
387
+ ; CHECK-NEXT: [[IV_START:%.*]] = phi i32 [ [[LEN]], [[IF_TRUE]] ], [ [[LEN_MINUS_1]], [[IF_FALSE]] ]
388
+ ; CHECK-NEXT: [[ZERO_CHECK:%.*]] = icmp eq i32 [[LEN]], 0
389
+ ; CHECK-NEXT: br i1 [[ZERO_CHECK]], label [[LOOPEXIT:%.*]], label [[PREHEADER:%.*]]
390
+ ; CHECK: preheader:
391
+ ; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[IV_START]] to i64
392
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
393
+ ; CHECK: loopexit.loopexit:
394
+ ; CHECK-NEXT: br label [[LOOPEXIT]]
395
+ ; CHECK: loopexit:
396
+ ; CHECK-NEXT: ret void
397
+ ; CHECK: loop:
398
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ], [ [[TMP0]], [[PREHEADER]] ]
399
+ ; CHECK-NEXT: [[EL:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
400
+ ; CHECK-NEXT: store atomic i32 0, i32* [[EL]] unordered, align 4
401
+ ; CHECK-NEXT: [[LOOPCOND:%.*]] = icmp slt i64 [[INDVARS_IV]], 1
402
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
403
+ ; CHECK-NEXT: br i1 [[LOOPCOND]], label [[LOOPEXIT_LOOPEXIT:%.*]], label [[LOOP]]
404
+ ;
405
+
406
+ entry:
407
+ %len = load i32 , i32* %p , align 4 , !range !0
408
+ br i1 %cond , label %if.true , label %if.false
409
+
410
+ if.true:
411
+ br label %merge
412
+
413
+ if.false:
414
+ %len.minus.1 = add nsw i32 %len , -1
415
+ br label %merge
416
+
417
+ merge:
418
+ %iv_start = phi i32 [ %len , %if.true ], [%len.minus.1 , %if.false ]
419
+ %zero_check = icmp eq i32 %len , 0
420
+ br i1 %zero_check , label %loopexit , label %preheader
421
+
422
+ preheader:
423
+ br label %loop
424
+
425
+ loopexit:
426
+ ret void
427
+
428
+ loop:
429
+ %iv = phi i32 [ %iv.next , %loop ], [ %iv_start , %preheader ]
430
+ %iv.wide = zext i32 %iv to i64
431
+ %el = getelementptr inbounds i32 , i32* %a , i64 %iv.wide
432
+ store atomic i32 0 , i32* %el unordered , align 4
433
+ %iv.next = add nsw i32 %iv , -1
434
+ %loopcond = icmp slt i32 %iv , 1
435
+ br i1 %loopcond , label %loopexit , label %loop
436
+ }
437
+
376
438
!0 = !{i32 0 , i32 2147483647 }
0 commit comments