• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; 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}
103