1 ; RUN: opt < %s -loop-vectorize -mcpu=pwr8 -mattr=+vsx -force-vector-interleave=1 -vectorizer-maximize-bandwidth=0 -S | FileCheck %s
3 target triple = "powerpc64-unknown-linux-gnu"
5 define signext i32 @foo(i8* readonly %ptr, i32 signext %l) {
7 %idx.ext = sext i32 %l to i64
8 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %idx.ext
9 %cmp7 = icmp sgt i32 %l, 0
10 br i1 %cmp7, label %while.body.preheader, label %while.end
12 while.body.preheader: ; preds = %entry
15 while.body: ; preds = %while.body.preheader, %while.body
16 %count.09 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]
17 %ptr.addr.08 = phi i8* [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
18 %0 = load i8, i8* %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, i8* %ptr.addr.08, i64 1
23 %cmp = icmp ult i8* %incdec.ptr, %add.ptr
24 br i1 %cmp, label %while.body, label %while.end.loopexit
26 while.end.loopexit: ; preds = %while.body
27 %add.lcssa = phi i32 [ %add, %while.body ]
30 while.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
34 ; CHECK: load <4 x i8>
35 ; CHECK: icmp slt <4 x i8>
39 define signext i16 @foo2(i8* readonly %ptr, i32 signext %l) {
41 %idx.ext = sext i32 %l to i64
42 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %idx.ext
43 %cmp7 = icmp sgt i32 %l, 0
44 br i1 %cmp7, label %while.body.preheader, label %while.end
46 while.body.preheader: ; preds = %entry
49 while.body: ; preds = %while.body.preheader, %while.body
50 %count.09 = phi i16 [ %add, %while.body ], [ 0, %while.body.preheader ]
51 %ptr.addr.08 = phi i8* [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
52 %0 = load i8, i8* %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, i8* %ptr.addr.08, i64 1
57 %cmp = icmp ult i8* %incdec.ptr, %add.ptr
58 br i1 %cmp, label %while.body, label %while.end.loopexit
60 while.end.loopexit: ; preds = %while.body
61 %add.lcssa = phi i16 [ %add, %while.body ]
64 while.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
69 ; CHECK: load <8 x i8>
70 ; CHECK: icmp slt <8 x i8>
73 define signext i32 @foo3(i16* readonly %ptr, i32 signext %l) {
75 %idx.ext = sext i32 %l to i64
76 %add.ptr = getelementptr inbounds i16, i16* %ptr, i64 %idx.ext
77 %cmp7 = icmp sgt i32 %l, 0
78 br i1 %cmp7, label %while.body.preheader, label %while.end
80 while.body.preheader: ; preds = %entry
83 while.body: ; preds = %while.body.preheader, %while.body
84 %count.09 = phi i32 [ %add, %while.body ], [ 0, %while.body.preheader ]
85 %ptr.addr.16 = phi i16* [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
86 %0 = load i16, i16* %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, i16* %ptr.addr.16, i64 1
91 %cmp = icmp ult i16* %incdec.ptr, %add.ptr
92 br i1 %cmp, label %while.body, label %while.end.loopexit
94 while.end.loopexit: ; preds = %while.body
95 %add.lcssa = phi i32 [ %add, %while.body ]
98 while.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
103 ; CHECK: load <4 x i16>
104 ; CHECK: icmp slt <4 x i16>
107 define i64 @foo4(i16* readonly %ptr, i32 signext %l) {
109 %idx.ext = sext i32 %l to i64
110 %add.ptr = getelementptr inbounds i16, i16* %ptr, i64 %idx.ext
111 %cmp7 = icmp sgt i32 %l, 0
112 br i1 %cmp7, label %while.body.preheader, label %while.end
114 while.body.preheader: ; preds = %entry
117 while.body: ; preds = %while.body.preheader, %while.body
118 %count.09 = phi i64 [ %add, %while.body ], [ 0, %while.body.preheader ]
119 %ptr.addr.16 = phi i16* [ %incdec.ptr, %while.body ], [ %ptr, %while.body.preheader ]
120 %0 = load i16, i16* %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, i16* %ptr.addr.16, i64 1
125 %cmp = icmp ult i16* %incdec.ptr, %add.ptr
126 br i1 %cmp, label %while.body, label %while.end.loopexit
128 while.end.loopexit: ; preds = %while.body
129 %add.lcssa = phi i64 [ %add, %while.body ]
132 while.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
137 ; CHECK: load <2 x i16>
138 ; CHECK: icmp slt <2 x i16>