From: Reid Kleckner Date: Mon, 3 Nov 2014 23:52:09 +0000 (+0000) Subject: Lower __builtin_fabs* to @llvm.fabs.* X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=580ce364df0484cffd0189ac74714bf443953d49;p=clang Lower __builtin_fabs* to @llvm.fabs.* mingw64's headers implement fabs by calling __builtin_fabs, so using the library call results in an infinite loop. If the backend legalizes @llvm.fabs as a call to fabs later, things should work out, as the crt provides a definition. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221206 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 0972e28069..aa11a906f4 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -245,6 +245,13 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, return RValue::get(Result); } + case Builtin::BI__builtin_fabs: + case Builtin::BI__builtin_fabsf: + case Builtin::BI__builtin_fabsl: { + Value *Arg1 = EmitScalarExpr(E->getArg(0)); + Value *Result = EmitFAbs(*this, Arg1); + return RValue::get(Result); + } case Builtin::BI__builtin_fmod: case Builtin::BI__builtin_fmodf: case Builtin::BI__builtin_fmodl: { diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c index 6dd749a90b..1ab29a659b 100644 --- a/test/CodeGen/builtins.c +++ b/test/CodeGen/builtins.c @@ -211,6 +211,13 @@ void test_float_builtin_ops(float F, double D, long double LD) { resld = __builtin_fmodl(LD,LD); // CHECK: frem x86_fp80 + + resf = __builtin_fabsf(F); + resd = __builtin_fabs(D); + resld = __builtin_fabsl(LD); + // CHECK: call float @llvm.fabs.f32(float + // CHECK: call double @llvm.fabs.f64(double + // CHECK: call x86_fp80 @llvm.fabs.f80(x86_fp80 } // CHECK-LABEL: define void @test_builtin_longjmp