[PATCH] D11144: ConstantFolding- Trunc, rint and nearbyint

Nick Lewycky nicholas at mxc.ca
Tue Jul 14 21:28:52 PDT 2015


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




More information about the llvm-commits mailing list