[PATCH] CGBuiltin: Use @llvm.fabs rather than fabs libcall when emitting builtins

Reid Kleckner rnk at google.com
Tue Sep 2 14:42:39 PDT 2014


Nice, lgtm!


On Tue, Sep 2, 2014 at 1:10 PM, Tom Stellard <thomas.stellard at amd.com>
wrote:

> Using the intrinsic allows the SelectionDAGBuilder to turn this call
> into the FABS Node and also the intrinsic is something the vectorizer knows
> how to vectorize.
>
> This patch also sets the readnone attribute on this call, which should
> enable additional optmizations.
> ---
>  lib/CodeGen/CGBuiltin.cpp | 21 ++++-----------------
>  test/CodeGen/builtins.c   | 10 +++++-----
>  2 files changed, 9 insertions(+), 22 deletions(-)
>
> diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp
> index b74038e..9fde1dc 100644
> --- a/lib/CodeGen/CGBuiltin.cpp
> +++ b/lib/CodeGen/CGBuiltin.cpp
> @@ -145,23 +145,10 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction
> &CGF,
>  /// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of
> ValTy,
>  /// which must be a scalar floating point type.
>  static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) {
> -  const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>();
> -  assert(ValTyP && "isn't scalar fp type!");
> -
> -  StringRef FnName;
> -  switch (ValTyP->getKind()) {
> -  default: llvm_unreachable("Isn't a scalar fp type!");
> -  case BuiltinType::Float:      FnName = "fabsf"; break;
> -  case BuiltinType::Double:     FnName = "fabs"; break;
> -  case BuiltinType::LongDouble: FnName = "fabsl"; break;
> -  }
> -
> -  // The prototype is something that takes and returns whatever V's type
> is.
> -  llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(),
> V->getType(),
> -                                                   false);
> -  llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName);
> -
> -  return CGF.EmitNounwindRuntimeCall(Fn, V, "abs");
> +  Value *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType());
> +  llvm::CallInst *Call = CGF.Builder.CreateCall(F, V);
> +  Call->setDoesNotAccessMemory();
> +  return Call;
>  }
>
>  static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl
> *Fn,
> diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c
> index 39bd84c..451ed07 100644
> --- a/test/CodeGen/builtins.c
> +++ b/test/CodeGen/builtins.c
> @@ -171,26 +171,26 @@ void bar() {
>  void test_float_builtins(float F, double D, long double LD) {
>    volatile int res;
>    res = __builtin_isinf(F);
> -  // CHECK:  call float @fabsf(float
> +  // CHECK:  call float @llvm.fabs.f32(float
>    // CHECK:  fcmp oeq float {{.*}}, 0x7FF0000000000000
>
>    res = __builtin_isinf(D);
> -  // CHECK:  call double @fabs(double
> +  // CHECK:  call double @llvm.fabs.f64(double
>    // CHECK:  fcmp oeq double {{.*}}, 0x7FF0000000000000
>
>    res = __builtin_isinf(LD);
> -  // CHECK:  call x86_fp80 @fabsl(x86_fp80
> +  // CHECK:  call x86_fp80 @llvm.fabs.f80(x86_fp80
>    // CHECK:  fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000000000000000
>
>    res = __builtin_isfinite(F);
>    // CHECK: fcmp oeq float
> -  // CHECK: call float @fabsf
> +  // CHECK: call float @llvm.fabs.f32(float
>    // CHECK: fcmp une float {{.*}}, 0x7FF0000000000000
>    // CHECK: and i1
>
>    res = __builtin_isnormal(F);
>    // CHECK: fcmp oeq float
> -  // CHECK: call float @fabsf
> +  // CHECK: call float @llvm.fabs.f32(float
>    // CHECK: fcmp ult float {{.*}}, 0x7FF0000000000000
>    // CHECK: fcmp uge float {{.*}}, 0x3810000000000000
>    // CHECK: and i1
> --
> 1.8.5.5
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140902/a40f87a6/attachment.html>


More information about the cfe-commits mailing list