@@ -517,6 +517,58 @@ fail:
517
517
unreachable
518
518
}
519
519
520
+ define void @test_can_predicate_simple_unsigned_inverted (i32* %p , i32* %arr ) {
521
+ ; CHECK-LABEL: @test_can_predicate_simple_unsigned_inverted(
522
+ ; CHECK-NEXT: preheader:
523
+ ; CHECK-NEXT: [[LEN:%.*]] = load i32, i32* [[P:%.*]], align 4
524
+ ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], -1
525
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
526
+ ; CHECK: loop:
527
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[LEN]], [[PREHEADER:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
528
+ ; CHECK-NEXT: [[ZERO_COND:%.*]] = icmp eq i32 [[IV]], 0
529
+ ; CHECK-NEXT: br i1 [[ZERO_COND]], label [[EXIT:%.*]], label [[RANGE_CHECK_BLOCK:%.*]]
530
+ ; CHECK: range_check_block:
531
+ ; CHECK-NEXT: [[IV_NEXT]] = sub i32 [[IV]], 1
532
+ ; CHECK-NEXT: [[RANGE_CHECK1:%.*]] = icmp ult i32 [[TMP0]], [[LEN]]
533
+ ; CHECK-NEXT: br i1 [[RANGE_CHECK1]], label [[FAIL:%.*]], label [[BACKEDGE]]
534
+ ; CHECK: backedge:
535
+ ; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, i32* [[P]], i32 [[IV]]
536
+ ; CHECK-NEXT: [[EL:%.*]] = load i32, i32* [[EL_PTR]], align 4
537
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp eq i32 [[EL]], 0
538
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT]]
539
+ ; CHECK: exit:
540
+ ; CHECK-NEXT: ret void
541
+ ; CHECK: fail:
542
+ ; CHECK-NEXT: unreachable
543
+ ;
544
+ preheader:
545
+ %len = load i32 , i32* %p
546
+ br label %loop
547
+
548
+ loop:
549
+ %iv = phi i32 [%len , %preheader ], [%iv.next , %backedge ]
550
+ %zero_cond = icmp eq i32 %iv , 0
551
+ br i1 %zero_cond , label %exit , label %range_check_block
552
+
553
+ range_check_block:
554
+ %iv.next = sub i32 %iv , 1
555
+ %range_check = icmp uge i32 %iv.next , %len
556
+ br i1 %range_check , label %fail , label %backedge
557
+
558
+ backedge:
559
+ %el.ptr = getelementptr i32 , i32* %p , i32 %iv
560
+ %el = load i32 , i32* %el.ptr
561
+ %loop.cond = icmp eq i32 %el , 0
562
+ br i1 %loop.cond , label %loop , label %exit
563
+
564
+ exit:
565
+ ret void
566
+
567
+ fail:
568
+ unreachable
569
+ }
570
+
571
+
520
572
define void @test_can_predicate_simple_signed (i32* %p , i32* %arr ) {
521
573
; CHECK-LABEL: @test_can_predicate_simple_signed(
522
574
; CHECK-NEXT: preheader:
0 commit comments