[PATCH] D11144: ConstantFolding- Trunc, rint and nearbyint
Nick Lewycky
nicholas at mxc.ca
Tue Jul 14 21:29:04 PDT 2015
nicholas added a subscriber: nicholas.
nicholas added a comment.
Chakshu Grover wrote:
> chakshugrover created this revision.
> chakshugrover added a subscriber: llvm-commits.
>
> Allow constfolding of llvm.trunc.*, llvm.rint.* and llvm.nearbyint.* intrinsics
> This patch const folds llvm.trunc.*, llvm.rint.* and llvm.nearbyint.* intrinsics whenever feasible.
>
> http://reviews.llvm.org/D11144
>
> Files:
>
> lib/Analysis/ConstantFolding.cpp
> test/Transforms/InstCombine/intrinsics.ll
>
> Index: test/Transforms/InstCombine/intrinsics.ll
> ===================================================================
>
> - test/Transforms/InstCombine/intrinsics.ll +++ test/Transforms/InstCombine/intrinsics.ll @@ -19,6 +19,9 @@ declare i8 @llvm.ctlz.i8(i8, i1) nounwind readnone declare double @llvm.cos.f64(double %Val) nounwind readonly declare double @llvm.sin.f64(double %Val) nounwind readonly +declare double @llvm.trunc.f64(double %Val) nounwind readonly +declare double @llvm.rint.f64(double %Val) nounwind readonly +declare double @llvm.nearbyint.f64(double %Val) nounwind readonly
>
> define i8 @uaddtest1(i8 %A, i8 %B) { %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B) @@ -447,3 +450,39 @@ ; CHECK-LABEL: @sin( ; CHECK: store volatile double 0.000000e+00, double* %P } + +define void @trunc(double *%P) { +entry: + %B = tail call double @llvm.trunc.f64(double 1.5) nounwind + store volatile double %B, double* %P + %C = tail call double @llvm.trunc.f64(double -1.5) nounwind + store volatile double %C, double* %P + ret void +; CHECK-LABEL: @trunc( +; CHECK: store volatile double 1.000000e+00, double* %P, align 8 +; CHECK: store volatile double -1.000000e+00, double* %P, align 8 +} + +define void @rint(double *%P) { +entry: + %B = tail call double @llvm.rint.f64(double 1.5) nounwind + store volatile double %B, double* %P + %C = tail call double @llvm.rint.f64(double -1.5) nounwind + store volatile double %C, double* %P + ret void +; CHECK-LABEL: @rint( +; CHECK: store volatile double 2.000000e+00, double* %P, align 8 +; CHECK: store volatile double -2.000000e+00, double* %P, align 8 +} + +define void @nearbyint(double *%P) { +entry: + %B = tail call double @llvm.nearbyint.f64(double 1.5) nounwind + store volatile double %B, double* %P + %C = tail call double @llvm.nearbyint.f64(double -1.5) nounwind + store volatile double %C, double* %P + ret void +; CHECK-LABEL: @nearbyint( +; CHECK: store volatile double 2.000000e+00, double* %P, align 8 +; CHECK: store volatile double -2.000000e+00, double* %P, align 8 +} Index: lib/Analysis/ConstantFolding.cpp ===================================================================
> - lib/Analysis/ConstantFolding.cpp +++ lib/Analysis/ConstantFolding.cpp @@ -1236,6 +1236,9 @@ case Intrinsic::sqrt: case Intrinsic::sin: case Intrinsic::cos: + case Intrinsic::trunc: + case Intrinsic::rint: + case Intrinsic::nearbyint: case Intrinsic::pow: case Intrinsic::powi: case Intrinsic::bswap: @@ -1456,6 +1459,12 @@ return ConstantFoldFP(sin, V, Ty); case Intrinsic::cos: return ConstantFoldFP(cos, V, Ty); + case Intrinsic::trunc: + return ConstantFoldFP(trunc, V, Ty); + case Intrinsic::rint: + return ConstantFoldFP(rint, V, Ty); + case Intrinsic::nearbyint: + return ConstantFoldFP(nearbyint, V, Ty);
I realize you're continuing an existing pattern, but I want to complain
about all of these: they will have different results when run on
different host machines. That's really not acceptable, but it's
something we've tolerated for expedience.
Can you implement these in terms of the llvm::APInt API, so that they
don't depend on the host math library?
Nick
> }
>
> if (!TLI)
>
> _______________________________________________
>
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
http://reviews.llvm.org/D11144
More information about the llvm-commits
mailing list