[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