1; RUN: opt < %s -loop-vectorize -debug-only=loop-vectorize -S -disable-output 2>&1 | FileCheck %s 2; REQUIRES: asserts 3 4; Make sure LV legal bails out when the exiting block != loop latch. 5; CHECK-LABEL: "latch_is_not_exiting" 6; CHECK: LV: Not vectorizing: The exiting block is not the loop latch. 7define i32 @latch_is_not_exiting() { 8entry: 9 br label %for.body 10 11for.body: 12 %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ], [%inc, %for.second] 13 %inc = add nsw i32 %i.02, 1 14 %cmp = icmp slt i32 %inc, 16 15 br i1 %cmp, label %for.body, label %for.second 16 17for.second: 18 %cmps = icmp sgt i32 %inc, 16 19 br i1 %cmps, label %for.body, label %for.end 20 21for.end: 22 ret i32 0 23} 24 25; Make sure LV legal bails out when there is no exiting block 26; CHECK-LABEL: "no_exiting_block" 27; CHECK: LV: Not vectorizing: The loop must have an exiting block. 28define i32 @no_exiting_block() { 29entry: 30 br label %for.body 31 32for.body: 33 %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ], [%inc, %for.second] 34 %inc = add nsw i32 %i.02, 1 35 %cmp = icmp slt i32 %inc, 16 36 br i1 %cmp, label %for.body, label %for.second 37 38for.second: 39 br label %for.body 40} 41 42; Make sure LV legal bails out when there is a non-int, non-ptr phi 43; CHECK-LABEL: "invalid_phi_types" 44; CHECK: LV: Not vectorizing: Found a non-int non-pointer PHI. 45define i32 @invalid_phi_types() { 46entry: 47 br label %for.body 48 49for.body: 50 %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 51 %vec.sum.02 = phi <2 x i32> [ zeroinitializer, %entry ], [ <i32 8, i32 8>, %for.body ] 52 %inc = add nsw i32 %i.02, 1 53 %cmp = icmp slt i32 %inc, 16 54 br i1 %cmp, label %for.body, label %for.end 55 56for.end: 57 ret i32 0 58} 59 60; D40973 61; Make sure LV legal bails out when the loop doesn't have a legal pre-header. 62; CHECK-LABEL: "inc" 63; CHECK: LV: Not vectorizing: Loop doesn't have a legal pre-header. 64define void @inc(i32 %n, i8* %P) { 65 %1 = icmp sgt i32 %n, 0 66 br i1 %1, label %BB1, label %BB2 67 68BB1: 69 indirectbr i8* %P, [label %.lr.ph] 70 71BB2: 72 br label %.lr.ph 73 74.lr.ph: 75 %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %BB1 ], [ 0, %BB2 ] 76 %indvars.iv.next = add i32 %indvars.iv, 1 77 %exitcond = icmp eq i32 %indvars.iv.next, %n 78 br i1 %exitcond, label %._crit_edge, label %.lr.ph 79 80._crit_edge: 81 ret void 82} 83