141 lines · plain
1; RUN: opt < %s -passes=loop-vectorize -mcpu=pwr8 -mattr=+vsx -force-vector-interleave=1 -vectorizer-maximize-bandwidth=0 -S | FileCheck %s2 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 i648 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %idx.ext9 %cmp7 = icmp sgt i32 %l, 010 br i1 %cmp7, label %while.body.preheader, label %while.end11 12while.body.preheader: ; preds = %entry13 br label %while.body14 15while.body: ; preds = %while.body.preheader, %while.body16 %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 119 %cmp1 = icmp slt i8 %0, -6420 %cond = zext i1 %cmp1 to i3221 %add = add nsw i32 %cond, %count.0922 %incdec.ptr = getelementptr inbounds i8, ptr %ptr.addr.08, i64 123 %cmp = icmp ult ptr %incdec.ptr, %add.ptr24 br i1 %cmp, label %while.body, label %while.end.loopexit25 26while.end.loopexit: ; preds = %while.body27 %add.lcssa = phi i32 [ %add, %while.body ]28 br label %while.end29 30while.end: ; preds = %while.end.loopexit, %entry31 %count.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]32 ret i32 %count.0.lcssa33 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 i6442 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %idx.ext43 %cmp7 = icmp sgt i32 %l, 044 br i1 %cmp7, label %while.body.preheader, label %while.end45 46while.body.preheader: ; preds = %entry47 br label %while.body48 49while.body: ; preds = %while.body.preheader, %while.body50 %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 153 %cmp1 = icmp slt i8 %0, -6454 %cond = zext i1 %cmp1 to i1655 %add = add nsw i16 %cond, %count.0956 %incdec.ptr = getelementptr inbounds i8, ptr %ptr.addr.08, i64 157 %cmp = icmp ult ptr %incdec.ptr, %add.ptr58 br i1 %cmp, label %while.body, label %while.end.loopexit59 60while.end.loopexit: ; preds = %while.body61 %add.lcssa = phi i16 [ %add, %while.body ]62 br label %while.end63 64while.end: ; preds = %while.end.loopexit, %entry65 %count.0.lcssa = phi i16 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]66 ret i16 %count.0.lcssa67 68; CHECK-LABEL: foo269; 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 i6476 %add.ptr = getelementptr inbounds i16, ptr %ptr, i64 %idx.ext77 %cmp7 = icmp sgt i32 %l, 078 br i1 %cmp7, label %while.body.preheader, label %while.end79 80while.body.preheader: ; preds = %entry81 br label %while.body82 83while.body: ; preds = %while.body.preheader, %while.body84 %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 187 %cmp1 = icmp slt i16 %0, -6488 %cond = zext i1 %cmp1 to i3289 %add = add nsw i32 %cond, %count.0990 %incdec.ptr = getelementptr inbounds i16, ptr %ptr.addr.16, i64 191 %cmp = icmp ult ptr %incdec.ptr, %add.ptr92 br i1 %cmp, label %while.body, label %while.end.loopexit93 94while.end.loopexit: ; preds = %while.body95 %add.lcssa = phi i32 [ %add, %while.body ]96 br label %while.end97 98while.end: ; preds = %while.end.loopexit, %entry99 %count.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]100 ret i32 %count.0.lcssa101 102; CHECK-LABEL: foo3103; 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 i64110 %add.ptr = getelementptr inbounds i16, ptr %ptr, i64 %idx.ext111 %cmp7 = icmp sgt i32 %l, 0112 br i1 %cmp7, label %while.body.preheader, label %while.end113 114while.body.preheader: ; preds = %entry115 br label %while.body116 117while.body: ; preds = %while.body.preheader, %while.body118 %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 1121 %cmp1 = icmp slt i16 %0, -64122 %cond = zext i1 %cmp1 to i64123 %add = add nsw i64 %cond, %count.09124 %incdec.ptr = getelementptr inbounds i16, ptr %ptr.addr.16, i64 1125 %cmp = icmp ult ptr %incdec.ptr, %add.ptr126 br i1 %cmp, label %while.body, label %while.end.loopexit127 128while.end.loopexit: ; preds = %while.body129 %add.lcssa = phi i64 [ %add, %while.body ]130 br label %while.end131 132while.end: ; preds = %while.end.loopexit, %entry133 %count.0.lcssa = phi i64 [ 0, %entry ], [ %add.lcssa, %while.end.loopexit ]134 ret i64 %count.0.lcssa135 136; CHECK-LABEL: foo4137; CHECK: load <2 x i16>138; CHECK: icmp slt <2 x i16>139}140 141