blob: 7dc67e4a9b6bc4e68c9fa2136d8927b749b0f94b [file] [log] [blame]
Max Kazantsevf7667482018-02-05 08:09:49 +00001; RUN: opt < %s -loop-vectorize -S | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:1"
4target triple = "x86_64-unknown-linux-gnu"
5
6; This cannot be correctly vectorized with type i1.
7define i8 @test_01(i8 %c) #0 {
8
9; CHECK-LABEL: @test_01(
10; CHECK-NOT: vector.body:
11; CHECK-NOT: zext i1 {{.*}} to i8
12
13entry:
14 br label %loop
15
16exit: ; preds = %loop
17 ret i8 %accum.plus
18
19loop: ; preds = %loop, %entry
20 %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
21 %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
22 %accum.and = and i8 %accum.phi, 1
23 %accum.plus = add nuw nsw i8 %accum.and, 3
24 %iv.next = add nuw nsw i32 %iv, 1
25 %cond = icmp ugt i32 %iv, 191
26 br i1 %cond, label %exit, label %loop
27}
28
29; TODO: This can be vectorized with type i1 because the result is not used.
30define void @test_02(i8 %c) #0 {
31
32; CHECK-LABEL: @test_02(
33; CHECK-NOT: vector.body:
34
35entry:
36 br label %loop
37
38exit: ; preds = %loop
39 %lcssa = phi i8 [ %accum.plus, %loop ]
40 ret void
41
42loop: ; preds = %loop, %entry
43 %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
44 %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
45 %accum.and = and i8 %accum.phi, 1
46 %accum.plus = add nuw nsw i8 %accum.and, 3
47 %iv.next = add nuw nsw i32 %iv, 1
48 %cond = icmp ugt i32 %iv, 191
49 br i1 %cond, label %exit, label %loop
50}
51
52; This can be vectorized with type i1 because the result is truncated properly.
53define i1 @test_03(i8 %c) #0 {
54
55; CHECK-LABEL: @test_03(
56; CHECK: vector.body:
57; CHECK: zext i1 {{.*}} to i8
58
59entry:
60 br label %loop
61
62exit: ; preds = %loop
63 %lcssa = phi i8 [ %accum.plus, %loop ]
64 %trunc = trunc i8 %lcssa to i1
65 ret i1 %trunc
66
67loop: ; preds = %loop, %entry
68 %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
69 %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
70 %accum.and = and i8 %accum.phi, 1
71 %accum.plus = add nuw nsw i8 %accum.and, 3
72 %iv.next = add nuw nsw i32 %iv, 1
73 %cond = icmp ugt i32 %iv, 191
74 br i1 %cond, label %exit, label %loop
75}
76
77; This cannot be vectorized with type i1 because the result is truncated to a
78; wrong type.
79; TODO: It can also be vectorized with type i32 (or maybe i4?)
80define i4 @test_04(i8 %c) #0 {
81
82; CHECK-LABEL: @test_04(
83; CHECK-NOT: vector.body:
84; CHECK-NOT: zext i1 {{.*}} to i8
85
86entry:
87 br label %loop
88
89exit: ; preds = %loop
90 %lcssa = phi i8 [ %accum.plus, %loop ]
91 %trunc = trunc i8 %lcssa to i4
92 ret i4 %trunc
93
94loop: ; preds = %loop, %entry
95 %accum.phi = phi i8 [ %c, %entry ], [ %accum.plus, %loop ]
96 %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
97 %accum.and = and i8 %accum.phi, 1
98 %accum.plus = add nuw nsw i8 %accum.and, 3
99 %iv.next = add nuw nsw i32 %iv, 1
100 %cond = icmp ugt i32 %iv, 191
101 br i1 %cond, label %exit, label %loop
102}