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