xref: /llvm-project/llvm/test/Transforms/LoopVectorize/multi_early_exit.ll (revision 13107cb09441dfeab24fcbcae9f4d3ba4cfc2703)
176f37761SDavid Sherwood; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*13107cb0SDavid Sherwood; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization | FileCheck %s
376f37761SDavid Sherwood
476f37761SDavid Sherwooddeclare void @init_mem(ptr, i64);
576f37761SDavid Sherwood
676f37761SDavid Sherwooddefine i64 @one_uncountable_two_countable_same_exit_phi_of_consts() {
776f37761SDavid Sherwood; CHECK-LABEL: define i64 @one_uncountable_two_countable_same_exit_phi_of_consts() {
876f37761SDavid Sherwood; CHECK-NEXT:  entry:
976f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
1076f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
1176f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
1276f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
1376f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
1476f37761SDavid Sherwood; CHECK:       loop:
1576f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
1676f37761SDavid Sherwood; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i64 [[INDEX]], 64
1776f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP1]], label [[SEARCH:%.*]], label [[LOOP_END:%.*]]
1876f37761SDavid Sherwood; CHECK:       search:
1976f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
2076f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
2176f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
2276f37761SDavid Sherwood; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
2376f37761SDavid Sherwood; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
2476f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_END]], label [[LOOP_INC]]
2576f37761SDavid Sherwood; CHECK:       loop.inc:
2676f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
2776f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 128
2876f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
2976f37761SDavid Sherwood; CHECK:       loop.end:
3076f37761SDavid Sherwood; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ 0, [[LOOP]] ], [ 1, [[SEARCH]] ], [ 0, [[LOOP_INC]] ]
3176f37761SDavid Sherwood; CHECK-NEXT:    ret i64 [[RETVAL]]
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, %loop.inc ], [ 3, %entry ]
4276f37761SDavid Sherwood  %cmp1 = icmp ne i64 %index, 64
4376f37761SDavid Sherwood  br i1 %cmp1, label %search, label %loop.end
4476f37761SDavid Sherwood
4576f37761SDavid Sherwoodsearch:
4676f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
4776f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
4876f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
4976f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
5076f37761SDavid Sherwood  %cmp3 = icmp eq i8 %ld1, %ld2
5176f37761SDavid Sherwood  br i1 %cmp3, label %loop.end, label %loop.inc
5276f37761SDavid Sherwood
5376f37761SDavid Sherwoodloop.inc:
5476f37761SDavid Sherwood  %index.next = add i64 %index, 1
5576f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 128
5676f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
5776f37761SDavid Sherwood
5876f37761SDavid Sherwoodloop.end:
5976f37761SDavid Sherwood  %retval = phi i64 [ 0, %loop ], [ 1, %search ], [ 0, %loop.inc ]
6076f37761SDavid Sherwood  ret i64 %retval
6176f37761SDavid Sherwood}
6276f37761SDavid Sherwood
6376f37761SDavid Sherwood
6476f37761SDavid Sherwooddefine i64 @one_uncountable_two_countable_diff_exit_no_phis() {
6576f37761SDavid Sherwood; CHECK-LABEL: define i64 @one_uncountable_two_countable_diff_exit_no_phis() {
6676f37761SDavid Sherwood; CHECK-NEXT:  entry:
6776f37761SDavid Sherwood; CHECK-NEXT:    [[P1:%.*]] = alloca [1024 x i8], align 1
6876f37761SDavid Sherwood; CHECK-NEXT:    [[P2:%.*]] = alloca [1024 x i8], align 1
6976f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
7076f37761SDavid Sherwood; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
7176f37761SDavid Sherwood; CHECK-NEXT:    br label [[LOOP:%.*]]
7276f37761SDavid Sherwood; CHECK:       loop:
7376f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
7476f37761SDavid Sherwood; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i64 [[INDEX]], 64
7576f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP1]], label [[SEARCH:%.*]], label [[LOOP_END:%.*]]
7676f37761SDavid Sherwood; CHECK:       search:
7776f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
7876f37761SDavid Sherwood; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
7976f37761SDavid Sherwood; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
8076f37761SDavid Sherwood; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
8176f37761SDavid Sherwood; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
8276f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_END_EARLY:%.*]], label [[LOOP_INC]]
8376f37761SDavid Sherwood; CHECK:       loop.inc:
8476f37761SDavid Sherwood; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
8576f37761SDavid Sherwood; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 128
8676f37761SDavid Sherwood; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
8776f37761SDavid Sherwood; CHECK:       loop.end.early:
8876f37761SDavid Sherwood; CHECK-NEXT:    ret i64 1
8976f37761SDavid Sherwood; CHECK:       loop.end:
9076f37761SDavid Sherwood; CHECK-NEXT:    ret i64 0
9176f37761SDavid Sherwood;
9276f37761SDavid Sherwoodentry:
9376f37761SDavid Sherwood  %p1 = alloca [1024 x i8]
9476f37761SDavid Sherwood  %p2 = alloca [1024 x i8]
9576f37761SDavid Sherwood  call void @init_mem(ptr %p1, i64 1024)
9676f37761SDavid Sherwood  call void @init_mem(ptr %p2, i64 1024)
9776f37761SDavid Sherwood  br label %loop
9876f37761SDavid Sherwood
9976f37761SDavid Sherwoodloop:
10076f37761SDavid Sherwood  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
10176f37761SDavid Sherwood  %cmp1 = icmp ne i64 %index, 64
10276f37761SDavid Sherwood  br i1 %cmp1, label %search, label %loop.end
10376f37761SDavid Sherwood
10476f37761SDavid Sherwoodsearch:
10576f37761SDavid Sherwood  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
10676f37761SDavid Sherwood  %ld1 = load i8, ptr %arrayidx, align 1
10776f37761SDavid Sherwood  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
10876f37761SDavid Sherwood  %ld2 = load i8, ptr %arrayidx1, align 1
10976f37761SDavid Sherwood  %cmp3 = icmp eq i8 %ld1, %ld2
11076f37761SDavid Sherwood  br i1 %cmp3, label %loop.end.early, label %loop.inc
11176f37761SDavid Sherwood
11276f37761SDavid Sherwoodloop.inc:
11376f37761SDavid Sherwood  %index.next = add i64 %index, 1
11476f37761SDavid Sherwood  %exitcond = icmp ne i64 %index.next, 128
11576f37761SDavid Sherwood  br i1 %exitcond, label %loop, label %loop.end
11676f37761SDavid Sherwood
11776f37761SDavid Sherwoodloop.end.early:
11876f37761SDavid Sherwood  ret i64 1
11976f37761SDavid Sherwood
12076f37761SDavid Sherwoodloop.end:
12176f37761SDavid Sherwood  ret i64 0
12276f37761SDavid Sherwood}
123