--- /dev/null
+; RUN: opt < %s -loop-vectorize -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"
+target triple = "x86_64-unknown-linux-gnu"
+
+; This cannot be correctly vectorized with type i1.
+define i8 @test_01(i8 %c) #0 {
+
+; CHECK-LABEL: @test_01(
+; CHECK-NOT: vector.body:
+; CHECK-NOT: zext i1 {{.*}} to i8
+
+entry:
+ br label %loop
+
+exit: ; preds = %loop
+ ret i8 %accum.plus
+
+loop: ; preds = %loop, %entry
+ %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
+ %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
+ %accum.and = and i8 %accum.phi, 1
+ %accum.plus = add nuw nsw i8 %accum.and, 3
+ %iv.next = add nuw nsw i32 %iv, 1
+ %cond = icmp ugt i32 %iv, 191
+ br i1 %cond, label %exit, label %loop
+}
+
+; TODO: This can be vectorized with type i1 because the result is not used.
+define void @test_02(i8 %c) #0 {
+
+; CHECK-LABEL: @test_02(
+; CHECK-NOT: vector.body:
+
+entry:
+ br label %loop
+
+exit: ; preds = %loop
+ %lcssa = phi i8 [ %accum.plus, %loop ]
+ ret void
+
+loop: ; preds = %loop, %entry
+ %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
+ %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
+ %accum.and = and i8 %accum.phi, 1
+ %accum.plus = add nuw nsw i8 %accum.and, 3
+ %iv.next = add nuw nsw i32 %iv, 1
+ %cond = icmp ugt i32 %iv, 191
+ br i1 %cond, label %exit, label %loop
+}
+
+; This can be vectorized with type i1 because the result is truncated properly.
+define i1 @test_03(i8 %c) #0 {
+
+; CHECK-LABEL: @test_03(
+; CHECK: vector.body:
+; CHECK: zext i1 {{.*}} to i8
+
+entry:
+ br label %loop
+
+exit: ; preds = %loop
+ %lcssa = phi i8 [ %accum.plus, %loop ]
+ %trunc = trunc i8 %lcssa to i1
+ ret i1 %trunc
+
+loop: ; preds = %loop, %entry
+ %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
+ %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
+ %accum.and = and i8 %accum.phi, 1
+ %accum.plus = add nuw nsw i8 %accum.and, 3
+ %iv.next = add nuw nsw i32 %iv, 1
+ %cond = icmp ugt i32 %iv, 191
+ br i1 %cond, label %exit, label %loop
+}
+
+; This cannot be vectorized with type i1 because the result is truncated to a
+; wrong type.
+; TODO: It can also be vectorized with type i32 (or maybe i4?)
+define i4 @test_04(i8 %c) #0 {
+
+; CHECK-LABEL: @test_04(
+; CHECK-NOT: vector.body:
+; CHECK-NOT: zext i1 {{.*}} to i8
+
+entry:
+ br label %loop
+
+exit: ; preds = %loop
+ %lcssa = phi i8 [ %accum.plus, %loop ]
+ %trunc = trunc i8 %lcssa to i4
+ ret i4 %trunc
+
+loop: ; preds = %loop, %entry
+ %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
+ %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
+ %accum.and = and i8 %accum.phi, 1
+ %accum.plus = add nuw nsw i8 %accum.and, 3
+ %iv.next = add nuw nsw i32 %iv, 1
+ %cond = icmp ugt i32 %iv, 191
+ br i1 %cond, label %exit, label %loop
+}