xref: /llvm-project/llvm/test/Transforms/LoopVectorize/PowerPC/pr30990.ll (revision 2fab927546b34f5af7770541a9bbb974d9818c5c)
1; RUN: opt < %s -passes=loop-vectorize -mcpu=pwr8 -mattr=+vsx -force-vector-interleave=1 -vectorizer-maximize-bandwidth=0 -S | FileCheck %s
2
3target triple = "powerpc64-unknown-linux-gnu"
4
5define signext i32 @foo(ptr readonly %ptr, i32 signext %l) {
6entry:
7  %idx.ext = sext i32 %l to i64
8  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %idx.ext
9  %cmp7 = icmp sgt i32 %l, 0
10  br i1 %cmp7, label %while.body.preheader, label %while.end
11
12while.body.preheader:                             ; preds = %entry
13  br label %while.body
14
15while.body:                                       ; preds = %while.body.preheader, %while.body
16  %count.09 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]
17  %ptr.addr.08 = phi ptr [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
18  %0 = load i8, ptr %ptr.addr.08, align 1
19  %cmp1 = icmp slt i8 %0, -64
20  %cond = zext i1 %cmp1 to i32
21  %add = add nsw i32 %cond, %count.09
22  %incdec.ptr = getelementptr inbounds i8, ptr %ptr.addr.08, i64 1
23  %cmp = icmp ult ptr %incdec.ptr, %add.ptr
24  br i1 %cmp, label %while.body, label %while.end.loopexit
25
26while.end.loopexit:                               ; preds = %while.body
27  %add.lcssa = phi i32 [ %add, %while.body ]
28  br label %while.end
29
30while.end:                                        ; preds = %while.end.loopexit, %entry
31  %count.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]
32  ret i32 %count.0.lcssa
33
34; CHECK: load <4 x i8>
35; CHECK: icmp slt <4 x i8>
36}
37
38
39define signext i16 @foo2(ptr readonly %ptr, i32 signext %l) {
40entry:
41  %idx.ext = sext i32 %l to i64
42  %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %idx.ext
43  %cmp7 = icmp sgt i32 %l, 0
44  br i1 %cmp7, label %while.body.preheader, label %while.end
45
46while.body.preheader:                             ; preds = %entry
47  br label %while.body
48
49while.body:                                       ; preds = %while.body.preheader, %while.body
50  %count.09 = phi i16 [ %add, %while.body ], [ 0, %while.body.preheader ]
51  %ptr.addr.08 = phi ptr [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
52  %0 = load i8, ptr %ptr.addr.08, align 1
53  %cmp1 = icmp slt i8 %0, -64
54  %cond = zext i1 %cmp1 to i16
55  %add = add nsw i16 %cond, %count.09
56  %incdec.ptr = getelementptr inbounds i8, ptr %ptr.addr.08, i64 1
57  %cmp = icmp ult ptr %incdec.ptr, %add.ptr
58  br i1 %cmp, label %while.body, label %while.end.loopexit
59
60while.end.loopexit:                               ; preds = %while.body
61  %add.lcssa = phi i16 [ %add, %while.body ]
62  br label %while.end
63
64while.end:                                        ; preds = %while.end.loopexit, %entry
65  %count.0.lcssa = phi i16 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]
66  ret i16 %count.0.lcssa
67
68; CHECK-LABEL: foo2
69; CHECK: load <8 x i8>
70; CHECK: icmp slt <8 x i8>
71}
72
73define signext i32 @foo3(ptr readonly %ptr, i32 signext %l) {
74entry:
75  %idx.ext = sext i32 %l to i64
76  %add.ptr = getelementptr inbounds i16, ptr %ptr, i64 %idx.ext
77  %cmp7 = icmp sgt i32 %l, 0
78  br i1 %cmp7, label %while.body.preheader, label %while.end
79
80while.body.preheader:                             ; preds = %entry
81  br label %while.body
82
83while.body:                                       ; preds = %while.body.preheader, %while.body
84  %count.09 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]
85  %ptr.addr.16 = phi ptr [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
86  %0 = load i16, ptr %ptr.addr.16, align 1
87  %cmp1 = icmp slt i16 %0, -64
88  %cond = zext i1 %cmp1 to i32
89  %add = add nsw i32 %cond, %count.09
90  %incdec.ptr = getelementptr inbounds i16, ptr %ptr.addr.16, i64 1
91  %cmp = icmp ult ptr %incdec.ptr, %add.ptr
92  br i1 %cmp, label %while.body, label %while.end.loopexit
93
94while.end.loopexit:                               ; preds = %while.body
95  %add.lcssa = phi i32 [ %add, %while.body ]
96  br label %while.end
97
98while.end:                                        ; preds = %while.end.loopexit, %entry
99  %count.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]
100  ret i32 %count.0.lcssa
101
102; CHECK-LABEL: foo3
103; CHECK: load <4 x i16>
104; CHECK: icmp slt <4 x i16>
105}
106
107define i64 @foo4(ptr readonly %ptr, i32 signext %l) {
108entry:
109  %idx.ext = sext i32 %l to i64
110  %add.ptr = getelementptr inbounds i16, ptr %ptr, i64 %idx.ext
111  %cmp7 = icmp sgt i32 %l, 0
112  br i1 %cmp7, label %while.body.preheader, label %while.end
113
114while.body.preheader:                             ; preds = %entry
115  br label %while.body
116
117while.body:                                       ; preds = %while.body.preheader, %while.body
118  %count.09 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]
119  %ptr.addr.16 = phi ptr [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
120  %0 = load i16, ptr %ptr.addr.16, align 1
121  %cmp1 = icmp slt i16 %0, -64
122  %cond = zext i1 %cmp1 to i64
123  %add = add nsw i64 %cond, %count.09
124  %incdec.ptr = getelementptr inbounds i16, ptr %ptr.addr.16, i64 1
125  %cmp = icmp ult ptr %incdec.ptr, %add.ptr
126  br i1 %cmp, label %while.body, label %while.end.loopexit
127
128while.end.loopexit:                               ; preds = %while.body
129  %add.lcssa = phi i64 [ %add, %while.body ]
130  br label %while.end
131
132while.end:                                        ; preds = %while.end.loopexit, %entry
133  %count.0.lcssa = phi i64 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]
134  ret i64 %count.0.lcssa
135
136; CHECK-LABEL: foo4
137; CHECK: load <2 x i16>
138; CHECK: icmp slt <2 x i16>
139}
140
141