146 lines · plain
1; REQUIRES: asserts2; RUN: opt < %s -S -debug -passes=loop-vectorize -mcpu=slm 2>&1 | FileCheck %s --check-prefix=SLM3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7define i8 @mul_i8(ptr %dataA, ptr %dataB, i32 %N) {8entry:9 %cmp12 = icmp eq i32 %N, 010 br i1 %cmp12, label %for.cond.cleanup, label %for.body.preheader11 12for.body.preheader: ; preds = %entry13 %wide.trip.count = zext i32 %N to i6414 br label %for.body15 16for.cond.cleanup.loopexit: ; preds = %for.body17 %phitmp = trunc i32 %add4 to i818 br label %for.cond.cleanup19 20for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry21 %acc.0.lcssa = phi i8 [ 0, %entry ], [ %phitmp, %for.cond.cleanup.loopexit ]22 ret i8 %acc.0.lcssa23 24for.body: ; preds = %for.body.preheader, %for.body25 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]26 %acc.013 = phi i32 [ %add4, %for.body ], [ 0, %for.body.preheader ]27 %arrayidx = getelementptr inbounds i8, ptr %dataA, i64 %indvars.iv28 %0 = load i8, ptr %arrayidx, align 129 %conv = sext i8 %0 to i3230 %arrayidx2 = getelementptr inbounds i8, ptr %dataB, i64 %indvars.iv31 %1 = load i8, ptr %arrayidx2, align 132 %conv3 = sext i8 %1 to i3233; sources of the mul is sext\sext from i834; use pmullw\sext seq.35; SLM: Cost of 3 for VF 2: WIDEN ir<%mul> = mul nsw ir<%conv3>, ir<%conv>36 %mul = mul nsw i32 %conv3, %conv37; sources of the mul is zext\sext from i838; use pmulhw\pmullw\pshuf39; SLM: Cost of 2 for VF 2: WIDEN ir<%mul2> = mul nsw ir<%conv4>, ir<%conv>40 %conv4 = zext i8 %1 to i3241 %mul2 = mul nsw i32 %conv4, %conv42 %sum0 = add i32 %mul, %mul243; sources of the mul is zext\zext from i844; use pmullw\zext45; SLM: Cost of 2 for VF 2: WIDEN ir<%mul3> = mul nsw ir<%conv5>, ir<%conv4>46 %conv5 = zext i8 %0 to i3247 %mul3 = mul nsw i32 %conv5, %conv448 %sum1 = add i32 %sum0, %mul349; sources of the mul is sext\-12050; use pmullw\sext51; SLM: Cost of 3 for VF 2: WIDEN ir<%mul4> = mul nsw ir<-120>, ir<%conv3>52 %mul4 = mul nsw i32 -120, %conv353 %sum2 = add i32 %sum1, %mul454; sources of the mul is sext\25055; use pmulhw\pmullw\pshuf56; SLM: Cost of 2 for VF 2: WIDEN ir<%mul5> = mul nsw ir<250>, ir<%conv3>57 %mul5 = mul nsw i32 250, %conv358 %sum3 = add i32 %sum2, %mul559; sources of the mul is zext\-12060; use pmulhw\pmullw\pshuf61; SLM: Cost of 2 for VF 2: WIDEN ir<%mul6> = mul nsw ir<-120>, ir<%conv4>62 %mul6 = mul nsw i32 -120, %conv463 %sum4 = add i32 %sum3, %mul664; sources of the mul is zext\25065; use pmullw\zext66; SLM: Cost of 2 for VF 2: WIDEN ir<%mul7> = mul nsw ir<250>, ir<%conv4>67 %mul7 = mul nsw i32 250, %conv468 %sum5 = add i32 %sum4, %mul769 %add = add i32 %acc.013, 570 %add4 = add i32 %add, %sum571 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 172 %exitcond = icmp eq i64 %indvars.iv.next, %wide.trip.count73 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body74}75 76define i16 @mul_i16(ptr %dataA, ptr %dataB, i32 %N) {77entry:78 %cmp12 = icmp eq i32 %N, 079 br i1 %cmp12, label %for.cond.cleanup, label %for.body.preheader80 81for.body.preheader: ; preds = %entry82 %wide.trip.count = zext i32 %N to i6483 br label %for.body84 85for.cond.cleanup.loopexit: ; preds = %for.body86 %phitmp = trunc i32 %add4 to i1687 br label %for.cond.cleanup88 89for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry90 %acc.0.lcssa = phi i16 [ 0, %entry ], [ %phitmp, %for.cond.cleanup.loopexit ]91 ret i16 %acc.0.lcssa92 93for.body: ; preds = %for.body.preheader, %for.body94 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %for.body.preheader ]95 %acc.013 = phi i32 [ %add4, %for.body ], [ 0, %for.body.preheader ]96 %arrayidx = getelementptr inbounds i16, ptr %dataA, i64 %indvars.iv97 %0 = load i16, ptr %arrayidx, align 198 %conv = sext i16 %0 to i3299 %arrayidx2 = getelementptr inbounds i16, ptr %dataB, i64 %indvars.iv100 %1 = load i16, ptr %arrayidx2, align 1101 %conv3 = sext i16 %1 to i32102; sources of the mul is sext\sext from i16103; use pmulhw\pmullw\pshuf seq.104; SLM: Cost of 2 for VF 4: WIDEN ir<%mul> = mul nsw ir<%conv3>, ir<%conv>105 %mul = mul nsw i32 %conv3, %conv106; sources of the mul is zext\sext from i16107; use pmulld108; SLM: Cost of 11 for VF 4: WIDEN ir<%mul2> = mul nsw ir<%conv4>, ir<%conv>109 %conv4 = zext i16 %1 to i32110 %mul2 = mul nsw i32 %conv4, %conv111 %sum0 = add i32 %mul, %mul2112; sources of the mul is zext\zext from i16113; use pmulhw\pmullw\zext114; SLM: Cost of 5 for VF 4: WIDEN ir<%mul3> = mul nsw ir<%conv5>, ir<%conv4>115 %conv5 = zext i16 %0 to i32116 %mul3 = mul nsw i32 %conv5, %conv4117 %sum1 = add i32 %sum0, %mul3118; sources of the mul is sext\-32000119; use pmulhw\pmullw\sext120; SLM: Cost of 2 for VF 4: WIDEN ir<%mul4> = mul nsw ir<-32000>, ir<%conv3>121 %mul4 = mul nsw i32 -32000, %conv3122 %sum2 = add i32 %sum1, %mul4123; sources of the mul is sext\64000124; use pmulld125; SLM: Cost of 11 for VF 4: WIDEN ir<%mul5> = mul nsw ir<64000>, ir<%conv3>126 %mul5 = mul nsw i32 64000, %conv3127 %sum3 = add i32 %sum2, %mul5128; sources of the mul is zext\-32000129; use pmulld130; SLM: Cost of 11 for VF 4: WIDEN ir<%mul6> = mul nsw ir<-32000>, ir<%conv4>131 %mul6 = mul nsw i32 -32000, %conv4132 %sum4 = add i32 %sum3, %mul6133; sources of the mul is zext\64000134; use pmulhw\pmullw\zext135; SLM: Cost of 5 for VF 4: WIDEN ir<%mul7> = mul nsw ir<250>, ir<%conv4>136 %mul7 = mul nsw i32 250, %conv4137 %sum5 = add i32 %sum4, %mul7138 %add = add i32 %acc.013, 5139 %add4 = add i32 %add, %sum5140 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1141 %exitcond = icmp eq i64 %indvars.iv.next, %wide.trip.count142 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body143}144 145 146