1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -S < %s -p loop-vectorize | FileCheck %s 3 4declare void @init_mem(ptr, i64); 5 6 7define i64 @same_exit_block_pre_inc_use1_too_small_allocas() { 8; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_allocas() { 9; CHECK-NEXT: entry: 10; CHECK-NEXT: [[P1:%.*]] = alloca [42 x i8], align 1 11; CHECK-NEXT: [[P2:%.*]] = alloca [42 x i8], align 1 12; CHECK-NEXT: call void @init_mem(ptr [[P1]], i64 1024) 13; CHECK-NEXT: call void @init_mem(ptr [[P2]], i64 1024) 14; CHECK-NEXT: br label [[LOOP:%.*]] 15; CHECK: loop: 16; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ] 17; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]] 18; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 19; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]] 20; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1 21; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]] 22; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]] 23; CHECK: loop.inc: 24; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1 25; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67 26; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]] 27; CHECK: loop.end: 28; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ] 29; CHECK-NEXT: ret i64 [[RETVAL]] 30; 31entry: 32 %p1 = alloca [42 x i8] 33 %p2 = alloca [42 x i8] 34 call void @init_mem(ptr %p1, i64 1024) 35 call void @init_mem(ptr %p2, i64 1024) 36 br label %loop 37 38loop: 39 %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ] 40 %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index 41 %ld1 = load i8, ptr %arrayidx, align 1 42 %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index 43 %ld2 = load i8, ptr %arrayidx1, align 1 44 %cmp3 = icmp eq i8 %ld1, %ld2 45 br i1 %cmp3, label %loop.inc, label %loop.end 46 47loop.inc: 48 %index.next = add i64 %index, 1 49 %exitcond = icmp ne i64 %index.next, 67 50 br i1 %exitcond, label %loop, label %loop.end 51 52loop.end: 53 %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ] 54 ret i64 %retval 55} 56 57 58define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs(ptr dereferenceable(42) %p1, ptr dereferenceable(42) %p2) { 59; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs( 60; CHECK-SAME: ptr dereferenceable(42) [[P1:%.*]], ptr dereferenceable(42) [[P2:%.*]]) { 61; CHECK-NEXT: entry: 62; CHECK-NEXT: br label [[LOOP:%.*]] 63; CHECK: loop: 64; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ] 65; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]] 66; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 67; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]] 68; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1 69; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]] 70; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]] 71; CHECK: loop.inc: 72; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1 73; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67 74; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]] 75; CHECK: loop.end: 76; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ] 77; CHECK-NEXT: ret i64 [[RETVAL]] 78; 79entry: 80 br label %loop 81 82loop: 83 %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ] 84 %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index 85 %ld1 = load i8, ptr %arrayidx, align 1 86 %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index 87 %ld2 = load i8, ptr %arrayidx1, align 1 88 %cmp3 = icmp eq i8 %ld1, %ld2 89 br i1 %cmp3, label %loop.inc, label %loop.end 90 91loop.inc: 92 %index.next = add i64 %index, 1 93 %exitcond = icmp ne i64 %index.next, 67 94 br i1 %exitcond, label %loop, label %loop.end 95 96loop.end: 97 %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ] 98 ret i64 %retval 99} 100 101 102define i64 @same_exit_block_pre_inc_use1_unknown_ptrs(ptr %p1, ptr %p2) { 103; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_unknown_ptrs( 104; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) { 105; CHECK-NEXT: entry: 106; CHECK-NEXT: br label [[LOOP:%.*]] 107; CHECK: loop: 108; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ] 109; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]] 110; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 111; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]] 112; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1 113; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]] 114; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]] 115; CHECK: loop.inc: 116; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1 117; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67 118; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]] 119; CHECK: loop.end: 120; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ] 121; CHECK-NEXT: ret i64 [[RETVAL]] 122; 123entry: 124 br label %loop 125 126loop: 127 %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ] 128 %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index 129 %ld1 = load i8, ptr %arrayidx, align 1 130 %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index 131 %ld2 = load i8, ptr %arrayidx1, align 1 132 %cmp3 = icmp eq i8 %ld1, %ld2 133 br i1 %cmp3, label %loop.inc, label %loop.end 134 135loop.inc: 136 %index.next = add i64 %index, 1 137 %exitcond = icmp ne i64 %index.next, 67 138 br i1 %exitcond, label %loop, label %loop.end 139 140loop.end: 141 %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ] 142 ret i64 %retval 143} 144