xref: /llvm-project/llvm/test/Transforms/LoopVectorize/unsupported_early_exit.ll (revision 5fae408d3a4c073ee43aec9906fa44ffe4026301)
176f37761SDavid Sherwood; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*5fae408dSFlorian Hahn; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization  -force-vector-width=4 | FileCheck %s
376f37761SDavid Sherwood
476f37761SDavid Sherwooddeclare void @init_mem(ptr, i64);
576f37761SDavid Sherwood
676f37761SDavid Sherwood
776f37761SDavid Sherwood; The early exit (i.e. unknown exit-not-taken count) is the latch - we don't
876f37761SDavid Sherwood; support this yet.
976f37761SDavid Sherwooddefine i64 @early_exit_on_last_block() {
1076f37761SDavid Sherwood; CHECK-LABEL: define i64 @early_exit_on_last_block() {
1176f37761SDavid Sherwood; CHECK-NEXT:  entry:
1276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
1376f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
1476f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
1576f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
1676f37761SDavid Sherwood; CHECK-NEXT:    br label [[LAND_RHS:%.*]]
1776f37761SDavid Sherwood; CHECK:       loop:
1876f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[SEARCH:%.*]] ], [ 3, [[ENTRY:%.*]] ]
1976f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
2076f37761SDavid Sherwood; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
2176f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP1]], label [[SEARCH]], label [[FOR_END_LOOPEXIT:%.*]]
2276f37761SDavid Sherwood; CHECK:       search:
2376f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
2476f37761SDavid Sherwood; CHECK-NEXT:    [[TMP41:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
2576f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
2676f37761SDavid Sherwood; CHECK-NEXT:    [[TMP42:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
2776f37761SDavid Sherwood; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[TMP41]], [[TMP42]]
2876f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP3]], label [[FOR_END_LOOPEXIT]], label [[LAND_RHS]]
2976f37761SDavid Sherwood; CHECK:       loop.end:
3076f37761SDavid Sherwood; CHECK-NEXT:    [[START_0_LCSSA:%.*]] = phi i64 [ 64, [[LAND_RHS]] ], [ [[INDEX]], [[SEARCH]] ]
3176f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[START_0_LCSSA]]
3276f37761SDavid Sherwood;
3376f37761SDavid Sherwoodentry:
3476f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
3576f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
3676f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
3776f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
3876f37761SDavid Sherwood  br label %loop
3976f37761SDavid Sherwood
4076f37761SDavid Sherwoodloop:
4176f37761SDavid Sherwood  %index = phi i64 [ %index.next, %search ], [ 3, %entry ]
4276f37761SDavid Sherwood  %index.next = add i64 %index, 1
4376f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
4476f37761SDavid Sherwood  br i1 %exitcond, label %search, label %loop.end
4576f37761SDavid Sherwood
4676f37761SDavid Sherwoodsearch:
4776f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
4876f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
4976f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
5076f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
5176f37761SDavid Sherwood  %cmp3 = icmp eq i8 %ld1, %ld2
5276f37761SDavid Sherwood  br i1 %cmp3, label %loop.end, label %loop
5376f37761SDavid Sherwood
5476f37761SDavid Sherwoodloop.end:
5576f37761SDavid Sherwood  %retval = phi i64 [ 64, %loop ], [ %index, %search ]
5676f37761SDavid Sherwood  ret i64 %retval
5776f37761SDavid Sherwood}
5876f37761SDavid Sherwood
5976f37761SDavid Sherwood
6076f37761SDavid Sherwood; We don't currently support multiple early exits.
6176f37761SDavid Sherwooddefine i64 @multiple_uncountable_exits() {
6276f37761SDavid Sherwood; CHECK-LABEL: define i64 @multiple_uncountable_exits() {
6376f37761SDavid Sherwood; CHECK-NEXT:  entry:
6476f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
6576f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
6676f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
6776f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
6876f37761SDavid Sherwood; CHECK-NEXT:    br label [[SEARCH1:%.*]]
6976f37761SDavid Sherwood; CHECK:       search1:
7076f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
7176f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
7276f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
7376f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
7476f37761SDavid Sherwood; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
7576f37761SDavid Sherwood; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
7676f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOP_END:%.*]], label [[SEARCH2:%.*]]
7776f37761SDavid Sherwood; CHECK:       search2:
7876f37761SDavid Sherwood; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 [[LD1]], 34
7976f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP_END]], label [[LOOP_INC]]
8076f37761SDavid Sherwood; CHECK:       loop.inc:
8176f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
8276f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
8376f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[SEARCH1]], label [[LOOP_END]]
8476f37761SDavid Sherwood; CHECK:       loop.end:
8576f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[SEARCH1]] ], [ 100, [[SEARCH2]] ], [ 43, [[LOOP_INC]] ]
8676f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
8776f37761SDavid Sherwood;
8876f37761SDavid Sherwoodentry:
8976f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
9076f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
9176f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
9276f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
9376f37761SDavid Sherwood  br label %search1
9476f37761SDavid Sherwood
9576f37761SDavid Sherwoodsearch1:
9676f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
9776f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
9876f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
9976f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
10076f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
10176f37761SDavid Sherwood  %cmp1 = icmp eq i8 %ld1, %ld2
10276f37761SDavid Sherwood  br i1 %cmp1, label %loop.end, label %search2
10376f37761SDavid Sherwood
10476f37761SDavid Sherwoodsearch2:
10576f37761SDavid Sherwood  %cmp2 = icmp ult i8 %ld1, 34
10676f37761SDavid Sherwood  br i1 %cmp2, label %loop.end, label %loop.inc
10776f37761SDavid Sherwood
10876f37761SDavid Sherwoodloop.inc:
10976f37761SDavid Sherwood  %index.next = add i64 %index, 1
11076f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
11176f37761SDavid Sherwood  br i1 %exitcond, label %search1, label %loop.end
11276f37761SDavid Sherwood
11376f37761SDavid Sherwoodloop.end:
11476f37761SDavid Sherwood  %retval = phi i64 [ %index, %search1 ], [ 100, %search2 ], [ 43, %loop.inc ]
11576f37761SDavid Sherwood  ret i64 %retval
11676f37761SDavid Sherwood}
11776f37761SDavid Sherwood
11876f37761SDavid Sherwood
11976f37761SDavid Sherwooddefine i64 @uncountable_exit_infinite_loop() {
12076f37761SDavid Sherwood; CHECK-LABEL: define i64 @uncountable_exit_infinite_loop() {
12176f37761SDavid Sherwood; CHECK-NEXT:  entry:
12276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
12376f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
12476f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
12576f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
12676f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
12776f37761SDavid Sherwood; CHECK:       loop:
12876f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
12976f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
13076f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
13176f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
13276f37761SDavid Sherwood; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
13376f37761SDavid Sherwood; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
13476f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
13576f37761SDavid Sherwood; CHECK:       loop.inc:
13676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
13776f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
13876f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP]]
13976f37761SDavid Sherwood; CHECK:       loop.end:
14076f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ]
14176f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
14276f37761SDavid Sherwood;
14376f37761SDavid Sherwoodentry:
14476f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
14576f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
14676f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
14776f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
14876f37761SDavid Sherwood  br label %loop
14976f37761SDavid Sherwood
15076f37761SDavid Sherwoodloop:
15176f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
15276f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
15376f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
15476f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
15576f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
15676f37761SDavid Sherwood  %cmp3 = icmp eq i8 %ld1, %ld2
15776f37761SDavid Sherwood  br i1 %cmp3, label %loop.inc, label %loop.end
15876f37761SDavid Sherwood
15976f37761SDavid Sherwoodloop.inc:
16076f37761SDavid Sherwood  %index.next = add i64 %index, 1
16176f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
16276f37761SDavid Sherwood  br label %loop
16376f37761SDavid Sherwood
16476f37761SDavid Sherwoodloop.end:
16576f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop ]
16676f37761SDavid Sherwood  ret i64 %retval
16776f37761SDavid Sherwood}
16876f37761SDavid Sherwood
16976f37761SDavid Sherwood
17076f37761SDavid Sherwooddefine i64 @loop_contains_unsafe_call() {
17176f37761SDavid Sherwood; CHECK-LABEL: define i64 @loop_contains_unsafe_call() {
17276f37761SDavid Sherwood; CHECK-NEXT:  entry:
17376f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
17476f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
17576f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
17676f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
17776f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
17876f37761SDavid Sherwood; CHECK:       loop:
17976f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
18076f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
18176f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 1
18276f37761SDavid Sherwood; CHECK-NEXT:    [[BAD_CALL:%.*]] = call i32 @foo(i32 [[LD1]]) #[[ATTR1:[0-9]+]]
18376f37761SDavid Sherwood; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[BAD_CALL]], 34
18476f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
18576f37761SDavid Sherwood; CHECK:       loop.inc:
18676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
18776f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
18876f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
18976f37761SDavid Sherwood; CHECK:       loop.end:
19076f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
19176f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
19276f37761SDavid Sherwood;
19376f37761SDavid Sherwoodentry:
19476f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
19576f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
19676f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
19776f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
19876f37761SDavid Sherwood  br label %loop
19976f37761SDavid Sherwood
20076f37761SDavid Sherwoodloop:
20176f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
20276f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i32, ptr %p1, i64 %index
20376f37761SDavid Sherwood  %ld1 = load i32, ptr %arrayidx, align 1
20476f37761SDavid Sherwood  %bad_call = call i32 @foo(i32 %ld1) #0
20576f37761SDavid Sherwood  %cmp = icmp eq i32 %bad_call, 34
20676f37761SDavid Sherwood  br i1 %cmp, label %loop.inc, label %loop.end
20776f37761SDavid Sherwood
20876f37761SDavid Sherwoodloop.inc:
20976f37761SDavid Sherwood  %index.next = add i64 %index, 1
21076f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
21176f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
21276f37761SDavid Sherwood
21376f37761SDavid Sherwoodloop.end:
21476f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
21576f37761SDavid Sherwood  ret i64 %retval
21676f37761SDavid Sherwood}
21776f37761SDavid Sherwood
21876f37761SDavid Sherwood
21976f37761SDavid Sherwooddefine i64 @loop_contains_unsafe_div() {
22076f37761SDavid Sherwood; CHECK-LABEL: define i64 @loop_contains_unsafe_div() {
22176f37761SDavid Sherwood; CHECK-NEXT:  entry:
22276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
22376f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
22476f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
22576f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
22676f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
22776f37761SDavid Sherwood; CHECK:       loop:
22876f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
22976f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
23076f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 1
23176f37761SDavid Sherwood; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 20000, [[LD1]]
23276f37761SDavid Sherwood; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[DIV]], 1
23376f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
23476f37761SDavid Sherwood; CHECK:       loop.inc:
23576f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
23676f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
23776f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
23876f37761SDavid Sherwood; CHECK:       loop.end:
23976f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
24076f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
24176f37761SDavid Sherwood;
24276f37761SDavid Sherwoodentry:
24376f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
24476f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
24576f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
24676f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
24776f37761SDavid Sherwood  br label %loop
24876f37761SDavid Sherwood
24976f37761SDavid Sherwoodloop:
25076f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
25176f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
25276f37761SDavid Sherwood  %ld1 = load i32, ptr %arrayidx, align 1
25376f37761SDavid Sherwood  %div = udiv i32 20000, %ld1
25476f37761SDavid Sherwood  %cmp = icmp eq i32 %div, 1
25576f37761SDavid Sherwood  br i1 %cmp, label %loop.inc, label %loop.end
25676f37761SDavid Sherwood
25776f37761SDavid Sherwoodloop.inc:
25876f37761SDavid Sherwood  %index.next = add i64 %index, 1
25976f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
26076f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
26176f37761SDavid Sherwood
26276f37761SDavid Sherwoodloop.end:
26376f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
26476f37761SDavid Sherwood  ret i64 %retval
26576f37761SDavid Sherwood}
26676f37761SDavid Sherwood
26776f37761SDavid Sherwood
26876f37761SDavid Sherwooddefine i64 @loop_contains_store(ptr %dest) {
26976f37761SDavid Sherwood; CHECK-LABEL: define i64 @loop_contains_store(
27076f37761SDavid Sherwood; CHECK-SAME: ptr [[DEST:%.*]]) {
27176f37761SDavid Sherwood; CHECK-NEXT:  entry:
27276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
27376f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
27476f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
27576f37761SDavid Sherwood; CHECK:       loop:
27676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
27776f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P1]], i64 [[INDEX]]
27876f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i32, ptr [[ARRAYIDX]], align 1
27976f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[DEST]], i64 [[INDEX]]
28076f37761SDavid Sherwood; CHECK-NEXT:    store i32 [[LD1]], ptr [[ARRAYIDX2]], align 4
28176f37761SDavid Sherwood; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[LD1]], 1
28276f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
28376f37761SDavid Sherwood; CHECK:       loop.inc:
28476f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
28576f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
28676f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
28776f37761SDavid Sherwood; CHECK:       loop.end:
28876f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
28976f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
29076f37761SDavid Sherwood;
29176f37761SDavid Sherwoodentry:
29276f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
29376f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
29476f37761SDavid Sherwood  br label %loop
29576f37761SDavid Sherwood
29676f37761SDavid Sherwoodloop:
29776f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
29876f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i32, ptr %p1, i64 %index
29976f37761SDavid Sherwood  %ld1 = load i32, ptr %arrayidx, align 1
30076f37761SDavid Sherwood  %arrayidx2 = getelementptr inbounds i32, ptr %dest, i64 %index
30176f37761SDavid Sherwood  store i32 %ld1, ptr %arrayidx2, align 4
30276f37761SDavid Sherwood  %cmp = icmp eq i32 %ld1, 1
30376f37761SDavid Sherwood  br i1 %cmp, label %loop.inc, label %loop.end
30476f37761SDavid Sherwood
30576f37761SDavid Sherwoodloop.inc:
30676f37761SDavid Sherwood  %index.next = add i64 %index, 1
30776f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
30876f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
30976f37761SDavid Sherwood
31076f37761SDavid Sherwoodloop.end:
31176f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
31276f37761SDavid Sherwood  ret i64 %retval
31376f37761SDavid Sherwood}
31476f37761SDavid Sherwood
31576f37761SDavid Sherwood
31676f37761SDavid Sherwooddefine i64 @uncountable_exit_in_conditional_block(ptr %mask) {
31776f37761SDavid Sherwood; CHECK-LABEL: define i64 @uncountable_exit_in_conditional_block(
31876f37761SDavid Sherwood; CHECK-SAME: ptr [[MASK:%.*]]) {
31976f37761SDavid Sherwood; CHECK-NEXT:  entry:
32076f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
32176f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
32276f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
32376f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
32476f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
32576f37761SDavid Sherwood; CHECK:       loop:
32676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
32776f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[MASK]], i64 [[INDEX]]
32876f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
32976f37761SDavid Sherwood; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i8 [[LD1]], 0
33076f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOP_SEARCH:%.*]], label [[LOOP_INC]]
33176f37761SDavid Sherwood; CHECK:       loop.search:
33276f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
33376f37761SDavid Sherwood; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1
33476f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
33576f37761SDavid Sherwood; CHECK-NEXT:    [[LD3:%.*]] = load i8, ptr [[ARRAYIDX3]], align 1
33676f37761SDavid Sherwood; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[LD2]], [[LD3]]
33776f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
33876f37761SDavid Sherwood; CHECK:       loop.inc:
33976f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
34076f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
34176f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
34276f37761SDavid Sherwood; CHECK:       loop.end:
34376f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP_SEARCH]] ], [ 67, [[LOOP_INC]] ]
34476f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
34576f37761SDavid Sherwood;
34676f37761SDavid Sherwoodentry:
34776f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
34876f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
34976f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
35076f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
35176f37761SDavid Sherwood  br label %loop
35276f37761SDavid Sherwood
35376f37761SDavid Sherwoodloop:
35476f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
35576f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %mask, i64 %index
35676f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx1, align 1
35776f37761SDavid Sherwood  %cmp1 = icmp ne i8 %ld1, 0
35876f37761SDavid Sherwood  br i1 %cmp1, label %loop.search, label %loop.inc
35976f37761SDavid Sherwood
36076f37761SDavid Sherwoodloop.search:
36176f37761SDavid Sherwood  %arrayidx2 = getelementptr inbounds i8, ptr %p1, i64 %index
36276f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx2, align 1
36376f37761SDavid Sherwood  %arrayidx3 = getelementptr inbounds i8, ptr %p2, i64 %index
36476f37761SDavid Sherwood  %ld3 = load i8, ptr %arrayidx3, align 1
36576f37761SDavid Sherwood  %cmp2 = icmp eq i8 %ld2, %ld3
36676f37761SDavid Sherwood  br i1 %cmp2, label %loop.inc, label %loop.end
36776f37761SDavid Sherwood
36876f37761SDavid Sherwoodloop.inc:
36976f37761SDavid Sherwood  %index.next = add i64 %index, 1
37076f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
37176f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
37276f37761SDavid Sherwood
37376f37761SDavid Sherwoodloop.end:
37476f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop.search ], [ 67, %loop.inc ]
37576f37761SDavid Sherwood  ret i64 %retval
37676f37761SDavid Sherwood}
37776f37761SDavid Sherwood
37876f37761SDavid Sherwood
37976f37761SDavid Sherwooddefine i64 @same_exit_block_pre_inc_use1_with_reduction() {
38076f37761SDavid Sherwood; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_with_reduction() {
38176f37761SDavid Sherwood; CHECK-NEXT:  entry:
38276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
38376f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
38476f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
38576f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
38676f37761SDavid Sherwood; CHECK-NEXT:    br label [[LAND_RHS:%.*]]
38776f37761SDavid Sherwood; CHECK:       loop:
38876f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
38976f37761SDavid Sherwood; CHECK-NEXT:    [[RED:%.*]] = phi i64 [ [[RED_NEXT:%.*]], [[FOR_INC]] ], [ 0, [[ENTRY]] ]
39076f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
39176f37761SDavid Sherwood; CHECK-NEXT:    [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
39276f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
39376f37761SDavid Sherwood; CHECK-NEXT:    [[TMP39:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
39476f37761SDavid Sherwood; CHECK-NEXT:    [[LD2_ZEXT:%.*]] = zext i8 [[TMP39]] to i64
39576f37761SDavid Sherwood; CHECK-NEXT:    [[RED_NEXT]] = add i64 [[RED]], [[LD2_ZEXT]]
39676f37761SDavid Sherwood; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[TMP38]], [[TMP39]]
39776f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP3]], label [[FOR_INC]], label [[FOR_END_LOOPEXIT:%.*]]
39876f37761SDavid Sherwood; CHECK:       loop.inc:
39976f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
40076f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
40176f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LAND_RHS]], label [[FOR_END_LOOPEXIT]]
40276f37761SDavid Sherwood; CHECK:       loop.end:
40376f37761SDavid Sherwood; CHECK-NEXT:    [[RED_NEXT_LCSSA:%.*]] = phi i64 [ [[RED_NEXT]], [[FOR_INC]] ], [ [[RED_NEXT]], [[LAND_RHS]] ]
40476f37761SDavid Sherwood; CHECK-NEXT:    [[FINAL_IND:%.*]] = phi i64 [ [[INDEX]], [[LAND_RHS]] ], [ 67, [[FOR_INC]] ]
40576f37761SDavid Sherwood; CHECK-NEXT:    [[START_0_LCSSA:%.*]] = add i64 [[RED_NEXT_LCSSA]], [[FINAL_IND]]
40676f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[START_0_LCSSA]]
40776f37761SDavid Sherwood;
40876f37761SDavid Sherwoodentry:
40976f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
41076f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
41176f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
41276f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
41376f37761SDavid Sherwood  br label %loop
41476f37761SDavid Sherwood
41576f37761SDavid Sherwoodloop:
41676f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
41776f37761SDavid Sherwood  %red = phi i64 [ %red.next, %loop.inc ], [ 0, %entry ]
41876f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
41976f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
42076f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
42176f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
42276f37761SDavid Sherwood  %ld2.zext = zext i8 %ld2 to i64
42376f37761SDavid Sherwood  %red.next = add i64 %red, %ld2.zext
42476f37761SDavid Sherwood  %cmp3 = icmp eq i8 %ld1, %ld2
42576f37761SDavid Sherwood  br i1 %cmp3, label %loop.inc, label %loop.end
42676f37761SDavid Sherwood
42776f37761SDavid Sherwoodloop.inc:
42876f37761SDavid Sherwood  %index.next = add i64 %index, 1
42976f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
43076f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
43176f37761SDavid Sherwood
43276f37761SDavid Sherwoodloop.end:
43376f37761SDavid Sherwood  %final.ind = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
43476f37761SDavid Sherwood  %retval = add i64 %red.next, %final.ind
43576f37761SDavid Sherwood  ret i64 %retval
43676f37761SDavid Sherwood}
43776f37761SDavid Sherwood
43876f37761SDavid Sherwood
43976f37761SDavid Sherwooddefine i64 @uncountable_exit_has_multiple_outside_successors() {
44076f37761SDavid Sherwood; CHECK-LABEL: define i64 @uncountable_exit_has_multiple_outside_successors() {
44176f37761SDavid Sherwood; CHECK-NEXT:  entry:
44276f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
44376f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
44476f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
44576f37761SDavid Sherwood; CHECK:       loop:
44676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
44776f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
44876f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
44976f37761SDavid Sherwood; CHECK-NEXT:    switch i8 [[LD1]], label [[LOOP_INC]] [
45076f37761SDavid Sherwood; CHECK-NEXT:      i8 2, label [[LOOP_END:%.*]]
45176f37761SDavid Sherwood; CHECK-NEXT:      i8 3, label [[LOOP_SURPRISE:%.*]]
45276f37761SDavid Sherwood; CHECK-NEXT:    ]
45376f37761SDavid Sherwood; CHECK:       loop.inc:
45476f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
45576f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
45676f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
45776f37761SDavid Sherwood; CHECK:       loop.surprise:
45876f37761SDavid Sherwood; CHECK-NEXT:    ret i64 3
45976f37761SDavid Sherwood; CHECK:       loop.end:
46076f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
46176f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
46276f37761SDavid Sherwood;
46376f37761SDavid Sherwoodentry:
46476f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
46576f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
46676f37761SDavid Sherwood  br label %loop
46776f37761SDavid Sherwood
46876f37761SDavid Sherwoodloop:
46976f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
47076f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
47176f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
47276f37761SDavid Sherwood  switch i8 %ld1, label %loop.inc [
47376f37761SDavid Sherwood  i8 2, label %loop.end
47476f37761SDavid Sherwood  i8 3, label %loop.surprise
47576f37761SDavid Sherwood  ]
47676f37761SDavid Sherwood
47776f37761SDavid Sherwoodloop.inc:
47876f37761SDavid Sherwood  %index.next = add i64 %index, 1
47976f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 67
48076f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
48176f37761SDavid Sherwood
48276f37761SDavid Sherwoodloop.surprise:
48376f37761SDavid Sherwood  ret i64 3
48476f37761SDavid Sherwood
48576f37761SDavid Sherwoodloop.end:
48676f37761SDavid Sherwood  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
48776f37761SDavid Sherwood  ret i64 %retval
48876f37761SDavid Sherwood}
48976f37761SDavid Sherwood
49076f37761SDavid Sherwood
49176f37761SDavid Sherwooddeclare i32 @foo(i32) readonly
49276f37761SDavid Sherwooddeclare <vscale x 4 x i32> @foo_vec(<vscale x 4 x i32>)
49376f37761SDavid Sherwood
49476f37761SDavid Sherwoodattributes #0 = { "vector-function-abi-variant"="_ZGVsNxv_foo(foo_vec)" }
495