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