brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · a60577b Raw
172 lines · plain
1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -S | FileCheck %s2 3target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"4target triple = "aarch64--linux-gnu"5 6; CHECK-LABEL: @reduction_i87;8; char reduction_i8(char *a, char *b, int n) {9;   char sum = 0;10;   for (int i = 0; i < n; ++i)11;     sum += (a[i] + b[i]);12;   return sum;13; }14;15; CHECK: vector.body:16; CHECK:   phi <16 x i8>17; CHECK:   load <16 x i8>18; CHECK:   load <16 x i8>19; CHECK:   add <16 x i8>20; CHECK:   add <16 x i8>21;22; CHECK: middle.block:23; CHECK:   [[Rdx:%[a-zA-Z0-9.]+]] = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8>24; CHECK:   zext i8 [[Rdx]] to i3225;26define i8 @reduction_i8(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %n) {27entry:28  %cmp.12 = icmp sgt i32 %n, 029  br i1 %cmp.12, label %for.body.preheader, label %for.cond.cleanup30 31for.body.preheader:32  br label %for.body33 34for.cond.for.cond.cleanup_crit_edge:35  %add5.lcssa = phi i32 [ %add5, %for.body ]36  %conv6 = trunc i32 %add5.lcssa to i837  br label %for.cond.cleanup38 39for.cond.cleanup:40  %sum.0.lcssa = phi i8 [ %conv6, %for.cond.for.cond.cleanup_crit_edge ], [ 0, %entry ]41  ret i8 %sum.0.lcssa42 43for.body:44  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]45  %sum.013 = phi i32 [ %add5, %for.body ], [ 0, %for.body.preheader ]46  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %indvars.iv47  %0 = load i8, ptr %arrayidx, align 148  %conv = zext i8 %0 to i3249  %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %indvars.iv50  %1 = load i8, ptr %arrayidx2, align 151  %conv3 = zext i8 %1 to i3252  %conv4 = and i32 %sum.013, 25553  %add = add nuw nsw i32 %conv, %conv454  %add5 = add nuw nsw i32 %add, %conv355  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 156  %lftr.wideiv = trunc i64 %indvars.iv.next to i3257  %exitcond = icmp eq i32 %lftr.wideiv, %n58  br i1 %exitcond, label %for.cond.for.cond.cleanup_crit_edge, label %for.body59}60 61; CHECK-LABEL: @reduction_i16_162;63; short reduction_i16_1(short *a, short *b, int n) {64;   short sum = 0;65;   for (int i = 0; i < n; ++i)66;     sum += (a[i] + b[i]);67;   return sum;68; }69;70; CHECK: vector.body:71; CHECK:   phi <8 x i16>72; CHECK:   load <8 x i16>73; CHECK:   load <8 x i16>74; CHECK:   add <8 x i16>75; CHECK:   add <8 x i16>76;77; CHECK: middle.block:78; CHECK:   [[Rdx:%[a-zA-Z0-9.]+]] = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16>79; CHECK:   zext i16 [[Rdx]] to i3280;81define i16 @reduction_i16_1(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %n) {82entry:83  %cmp.16 = icmp sgt i32 %n, 084  br i1 %cmp.16, label %for.body.preheader, label %for.cond.cleanup85 86for.body.preheader:87  br label %for.body88 89for.cond.for.cond.cleanup_crit_edge:90  %add5.lcssa = phi i32 [ %add5, %for.body ]91  %conv6 = trunc i32 %add5.lcssa to i1692  br label %for.cond.cleanup93 94for.cond.cleanup:95  %sum.0.lcssa = phi i16 [ %conv6, %for.cond.for.cond.cleanup_crit_edge ], [ 0, %entry ]96  ret i16 %sum.0.lcssa97 98for.body:99  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]100  %sum.017 = phi i32 [ %add5, %for.body ], [ 0, %for.body.preheader ]101  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %indvars.iv102  %0 = load i16, ptr %arrayidx, align 2103  %conv.14 = zext i16 %0 to i32104  %arrayidx2 = getelementptr inbounds i16, ptr %b, i64 %indvars.iv105  %1 = load i16, ptr %arrayidx2, align 2106  %conv3.15 = zext i16 %1 to i32107  %conv4.13 = and i32 %sum.017, 65535108  %add = add nuw nsw i32 %conv.14, %conv4.13109  %add5 = add nuw nsw i32 %add, %conv3.15110  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1111  %lftr.wideiv = trunc i64 %indvars.iv.next to i32112  %exitcond = icmp eq i32 %lftr.wideiv, %n113  br i1 %exitcond, label %for.cond.for.cond.cleanup_crit_edge, label %for.body114}115 116; CHECK-LABEL: @reduction_i16_2117;118; short reduction_i16_2(char *a, char *b, int n) {119;   short sum = 0;120;   for (int i = 0; i < n; ++i)121;     sum += (a[i] + b[i]);122;   return sum;123; }124;125; CHECK: vector.body:126; CHECK:   phi <16 x i16>127; CHECK:   [[Ld1:%[a-zA-Z0-9.]+]] = load <16 x i8>128; CHECK:   zext <16 x i8> [[Ld1]] to <16 x i16>129; CHECK:   [[Ld2:%[a-zA-Z0-9.]+]] = load <16 x i8>130; CHECK:   zext <16 x i8> [[Ld2]] to <16 x i16>131; CHECK:   add <16 x i16>132; CHECK:   add <16 x i16>133;134; CHECK: middle.block:135; CHECK:   [[Rdx:%[a-zA-Z0-9.]+]] = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16>136; CHECK:   zext i16 [[Rdx]] to i32137;138define i16 @reduction_i16_2(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %n) {139entry:140  %cmp.14 = icmp sgt i32 %n, 0141  br i1 %cmp.14, label %for.body.preheader, label %for.cond.cleanup142 143for.body.preheader:144  br label %for.body145 146for.cond.for.cond.cleanup_crit_edge:147  %add5.lcssa = phi i32 [ %add5, %for.body ]148  %conv6 = trunc i32 %add5.lcssa to i16149  br label %for.cond.cleanup150 151for.cond.cleanup:152  %sum.0.lcssa = phi i16 [ %conv6, %for.cond.for.cond.cleanup_crit_edge ], [ 0, %entry ]153  ret i16 %sum.0.lcssa154 155for.body:156  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]157  %sum.015 = phi i32 [ %add5, %for.body ], [ 0, %for.body.preheader ]158  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %indvars.iv159  %0 = load i8, ptr %arrayidx, align 1160  %conv = zext i8 %0 to i32161  %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %indvars.iv162  %1 = load i8, ptr %arrayidx2, align 1163  %conv3 = zext i8 %1 to i32164  %conv4.13 = and i32 %sum.015, 65535165  %add = add nuw nsw i32 %conv, %conv4.13166  %add5 = add nuw nsw i32 %add, %conv3167  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1168  %lftr.wideiv = trunc i64 %indvars.iv.next to i32169  %exitcond = icmp eq i32 %lftr.wideiv, %n170  br i1 %exitcond, label %for.cond.for.cond.cleanup_crit_edge, label %for.body171}172