Skip to content

Commit b4ac9a1

Browse files
committed
[Test] One more IndVars test with inverted exit condition
1 parent 9224d32 commit b4ac9a1

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

llvm/test/Transforms/IndVarSimplify/predicated_ranges.ll

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,4 +673,58 @@ fail:
673673
unreachable
674674
}
675675

676+
define void @test_can_predicate_trunc_unsigned_inverted(i32* %p, i32* %arr) {
677+
; CHECK-LABEL: @test_can_predicate_trunc_unsigned_inverted(
678+
; CHECK-NEXT: preheader:
679+
; CHECK-NEXT: [[LEN:%.*]] = load i32, i32* [[P:%.*]], align 4
680+
; CHECK-NEXT: [[START:%.*]] = zext i32 [[LEN]] to i64
681+
; CHECK-NEXT: br label [[LOOP:%.*]]
682+
; CHECK: loop:
683+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[START]], [[PREHEADER:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
684+
; CHECK-NEXT: [[ZERO_COND:%.*]] = icmp eq i64 [[IV]], 0
685+
; CHECK-NEXT: br i1 [[ZERO_COND]], label [[EXIT:%.*]], label [[RANGE_CHECK_BLOCK:%.*]]
686+
; CHECK: range_check_block:
687+
; CHECK-NEXT: [[IV_NEXT]] = sub nsw i64 [[IV]], 1
688+
; CHECK-NEXT: [[NARROW:%.*]] = trunc i64 [[IV_NEXT]] to i32
689+
; CHECK-NEXT: [[RANGE_CHECK:%.*]] = icmp uge i32 [[NARROW]], [[LEN]]
690+
; CHECK-NEXT: br i1 [[RANGE_CHECK]], label [[FAIL:%.*]], label [[BACKEDGE]]
691+
; CHECK: backedge:
692+
; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, i32* [[ARR:%.*]], i64 [[IV]]
693+
; CHECK-NEXT: [[EL:%.*]] = load i32, i32* [[EL_PTR]], align 4
694+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp eq i32 [[EL]], 0
695+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT]]
696+
; CHECK: exit:
697+
; CHECK-NEXT: ret void
698+
; CHECK: fail:
699+
; CHECK-NEXT: unreachable
700+
;
701+
preheader:
702+
%len = load i32, i32* %p
703+
%start = zext i32 %len to i64
704+
br label %loop
705+
706+
loop:
707+
%iv = phi i64 [%start, %preheader], [%iv.next, %backedge]
708+
%zero_cond = icmp eq i64 %iv, 0
709+
br i1 %zero_cond, label %exit, label %range_check_block
710+
711+
range_check_block:
712+
%iv.next = sub i64 %iv, 1
713+
%narrow = trunc i64 %iv.next to i32
714+
%range_check = icmp uge i32 %narrow, %len
715+
br i1 %range_check, label %fail, label %backedge
716+
717+
backedge:
718+
%el.ptr = getelementptr i32, i32* %arr, i64 %iv
719+
%el = load i32, i32* %el.ptr
720+
%loop.cond = icmp eq i32 %el, 0
721+
br i1 %loop.cond, label %loop, label %exit
722+
723+
exit:
724+
ret void
725+
726+
fail:
727+
unreachable
728+
}
729+
676730
!0 = !{i32 0, i32 2147483647}

0 commit comments

Comments
 (0)