diff options
Diffstat (limited to 'test/Transforms/LoopVectorize/intrinsic.ll')
-rw-r--r-- | test/Transforms/LoopVectorize/intrinsic.ll | 229 |
1 files changed, 196 insertions, 33 deletions
diff --git a/test/Transforms/LoopVectorize/intrinsic.ll b/test/Transforms/LoopVectorize/intrinsic.ll index defbb5bd94ba0..c3d570c03a77f 100644 --- a/test/Transforms/LoopVectorize/intrinsic.ll +++ b/test/Transforms/LoopVectorize/intrinsic.ll @@ -3,7 +3,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -;CHECK: @sqrt_f32 +;CHECK-LABEL: @sqrt_f32( ;CHECK: llvm.sqrt.v4f32 ;CHECK: ret void define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -29,7 +29,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.sqrt.f32(float) nounwind readnone -;CHECK: @sqrt_f64 +;CHECK-LABEL: @sqrt_f64( ;CHECK: llvm.sqrt.v4f64 ;CHECK: ret void define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -55,7 +55,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.sqrt.f64(double) nounwind readnone -;CHECK: @sin_f32 +;CHECK-LABEL: @sin_f32( ;CHECK: llvm.sin.v4f32 ;CHECK: ret void define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -81,7 +81,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.sin.f32(float) nounwind readnone -;CHECK: @sin_f64 +;CHECK-LABEL: @sin_f64( ;CHECK: llvm.sin.v4f64 ;CHECK: ret void define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -107,7 +107,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.sin.f64(double) nounwind readnone -;CHECK: @cos_f32 +;CHECK-LABEL: @cos_f32( ;CHECK: llvm.cos.v4f32 ;CHECK: ret void define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -133,7 +133,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.cos.f32(float) nounwind readnone -;CHECK: @cos_f64 +;CHECK-LABEL: @cos_f64( ;CHECK: llvm.cos.v4f64 ;CHECK: ret void define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -159,7 +159,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.cos.f64(double) nounwind readnone -;CHECK: @exp_f32 +;CHECK-LABEL: @exp_f32( ;CHECK: llvm.exp.v4f32 ;CHECK: ret void define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -185,7 +185,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.exp.f32(float) nounwind readnone -;CHECK: @exp_f64 +;CHECK-LABEL: @exp_f64( ;CHECK: llvm.exp.v4f64 ;CHECK: ret void define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -211,7 +211,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.exp.f64(double) nounwind readnone -;CHECK: @exp2_f32 +;CHECK-LABEL: @exp2_f32( ;CHECK: llvm.exp2.v4f32 ;CHECK: ret void define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -237,7 +237,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.exp2.f32(float) nounwind readnone -;CHECK: @exp2_f64 +;CHECK-LABEL: @exp2_f64( ;CHECK: llvm.exp2.v4f64 ;CHECK: ret void define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -263,7 +263,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.exp2.f64(double) nounwind readnone -;CHECK: @log_f32 +;CHECK-LABEL: @log_f32( ;CHECK: llvm.log.v4f32 ;CHECK: ret void define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -289,7 +289,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.log.f32(float) nounwind readnone -;CHECK: @log_f64 +;CHECK-LABEL: @log_f64( ;CHECK: llvm.log.v4f64 ;CHECK: ret void define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -315,7 +315,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.log.f64(double) nounwind readnone -;CHECK: @log10_f32 +;CHECK-LABEL: @log10_f32( ;CHECK: llvm.log10.v4f32 ;CHECK: ret void define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -341,7 +341,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.log10.f32(float) nounwind readnone -;CHECK: @log10_f64 +;CHECK-LABEL: @log10_f64( ;CHECK: llvm.log10.v4f64 ;CHECK: ret void define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -367,7 +367,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.log10.f64(double) nounwind readnone -;CHECK: @log2_f32 +;CHECK-LABEL: @log2_f32( ;CHECK: llvm.log2.v4f32 ;CHECK: ret void define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -393,7 +393,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.log2.f32(float) nounwind readnone -;CHECK: @log2_f64 +;CHECK-LABEL: @log2_f64( ;CHECK: llvm.log2.v4f64 ;CHECK: ret void define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -419,7 +419,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.log2.f64(double) nounwind readnone -;CHECK: @fabs_f32 +;CHECK-LABEL: @fabs_f32( ;CHECK: llvm.fabs.v4f32 ;CHECK: ret void define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -468,7 +468,60 @@ for.end: ; preds = %for.body, %entry declare double @llvm.fabs(double) nounwind readnone -;CHECK: @floor_f32 +;CHECK-LABEL: @copysign_f32( +;CHECK: llvm.copysign.v4f32 +;CHECK: ret void +define void @copysign_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4 + %arrayidx1 = getelementptr inbounds float* %z, i64 %indvars.iv + %1 = load float* %arrayidx1, align 4 + %call = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.copysign.f32(float, float) nounwind readnone + +define void @copysign_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8 + %arrayidx1 = getelementptr inbounds double* %z, i64 %indvars.iv + %1 = load double* %arrayidx, align 8 + %call = tail call double @llvm.copysign(double %0, double %1) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.copysign(double, double) nounwind readnone + +;CHECK-LABEL: @floor_f32( ;CHECK: llvm.floor.v4f32 ;CHECK: ret void define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -494,7 +547,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.floor.f32(float) nounwind readnone -;CHECK: @floor_f64 +;CHECK-LABEL: @floor_f64( ;CHECK: llvm.floor.v4f64 ;CHECK: ret void define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -520,7 +573,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.floor.f64(double) nounwind readnone -;CHECK: @ceil_f32 +;CHECK-LABEL: @ceil_f32( ;CHECK: llvm.ceil.v4f32 ;CHECK: ret void define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -546,7 +599,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.ceil.f32(float) nounwind readnone -;CHECK: @ceil_f64 +;CHECK-LABEL: @ceil_f64( ;CHECK: llvm.ceil.v4f64 ;CHECK: ret void define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -572,7 +625,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.ceil.f64(double) nounwind readnone -;CHECK: @trunc_f32 +;CHECK-LABEL: @trunc_f32( ;CHECK: llvm.trunc.v4f32 ;CHECK: ret void define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -598,7 +651,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.trunc.f32(float) nounwind readnone -;CHECK: @trunc_f64 +;CHECK-LABEL: @trunc_f64( ;CHECK: llvm.trunc.v4f64 ;CHECK: ret void define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -624,7 +677,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.trunc.f64(double) nounwind readnone -;CHECK: @rint_f32 +;CHECK-LABEL: @rint_f32( ;CHECK: llvm.rint.v4f32 ;CHECK: ret void define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -650,7 +703,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.rint.f32(float) nounwind readnone -;CHECK: @rint_f64 +;CHECK-LABEL: @rint_f64( ;CHECK: llvm.rint.v4f64 ;CHECK: ret void define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -676,7 +729,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.rint.f64(double) nounwind readnone -;CHECK: @nearbyint_f32 +;CHECK-LABEL: @nearbyint_f32( ;CHECK: llvm.nearbyint.v4f32 ;CHECK: ret void define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { @@ -702,7 +755,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.nearbyint.f32(float) nounwind readnone -;CHECK: @nearbyint_f64 +;CHECK-LABEL: @nearbyint_f64( ;CHECK: llvm.nearbyint.v4f64 ;CHECK: ret void define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { @@ -728,7 +781,59 @@ for.end: ; preds = %for.body, %entry declare double @llvm.nearbyint.f64(double) nounwind readnone -;CHECK: @fma_f32 +;CHECK-LABEL: @round_f32( +;CHECK: llvm.round.v4f32 +;CHECK: ret void +define void @round_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv + %0 = load float* %arrayidx, align 4 + %call = tail call float @llvm.round.f32(float %0) nounwind readnone + %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv + store float %call, float* %arrayidx2, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare float @llvm.round.f32(float) nounwind readnone + +;CHECK-LABEL: @round_f64( +;CHECK: llvm.round.v4f64 +;CHECK: ret void +define void @round_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable { +entry: + %cmp6 = icmp sgt i32 %n, 0 + br i1 %cmp6, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv + %0 = load double* %arrayidx, align 8 + %call = tail call double @llvm.round.f64(double %0) nounwind readnone + %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv + store double %call, double* %arrayidx2, align 8 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + ret void +} + +declare double @llvm.round.f64(double) nounwind readnone + +;CHECK-LABEL: @fma_f32( ;CHECK: llvm.fma.v4f32 ;CHECK: ret void define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable { @@ -758,7 +863,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.fma.f32(float, float, float) nounwind readnone -;CHECK: @fma_f64 +;CHECK-LABEL: @fma_f64( ;CHECK: llvm.fma.v4f64 ;CHECK: ret void define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable { @@ -788,7 +893,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.fma.f64(double, double, double) nounwind readnone -;CHECK: @fmuladd_f32 +;CHECK-LABEL: @fmuladd_f32( ;CHECK: llvm.fmuladd.v4f32 ;CHECK: ret void define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable { @@ -818,7 +923,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.fmuladd.f32(float, float, float) nounwind readnone -;CHECK: @fmuladd_f64 +;CHECK-LABEL: @fmuladd_f64( ;CHECK: llvm.fmuladd.v4f64 ;CHECK: ret void define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable { @@ -848,7 +953,7 @@ for.end: ; preds = %for.body, %entry declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone -;CHECK: @pow_f32 +;CHECK-LABEL: @pow_f32( ;CHECK: llvm.pow.v4f32 ;CHECK: ret void define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable { @@ -876,7 +981,7 @@ for.end: ; preds = %for.body, %entry declare float @llvm.pow.f32(float, float) nounwind readnone -;CHECK: @pow_f64 +;CHECK-LABEL: @pow_f64( ;CHECK: llvm.pow.v4f64 ;CHECK: ret void define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable { @@ -927,3 +1032,61 @@ for.end: ; preds = %for.body declare float @fabsf(float) nounwind readnone declare double @llvm.pow.f64(double, double) nounwind readnone + + + +; Make sure we don't replace calls to functions with standard library function +; signatures but defined with internal linkage. + +define internal float @roundf(float %x) nounwind readnone { + ret float 0.00000000 +} +; CHECK-LABEL: internal_round +; CHECK-NOT: load <4 x float> + +define void @internal_round(float* nocapture %x) nounwind { +entry: + br label %for.body + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds float* %x, i64 %indvars.iv + %0 = load float* %arrayidx, align 4 + %call = tail call float @roundf(float %0) nounwind readnone + store float %call, float* %arrayidx, align 4 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + +; Make sure we don't replace calls to functions with standard library names but +; different signatures. + +declare void @round(double %f) + +; CHECK-LABEL: wrong_signature +; CHECK-NOT: load <4 x double> + +define void @wrong_signature(double* nocapture %x) nounwind { +entry: + br label %for.body + +for.body: ; preds = %entry, %for.body + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds double* %x, i64 %indvars.iv + %0 = load double* %arrayidx, align 4 + store double %0, double* %arrayidx, align 4 + tail call void @round(double %0) nounwind readnone + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 1024 + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} + |