Author: azanella Date: Thu May 16 06:43:25 2019 New Revision: 360896 URL: http://llvm.org/viewvc/llvm-project?rev=360896&view=rev Log: [clang] Handle lround/llround builtins
As for other floating-point rounding builtins that can be optimized when build with -fno-math-errno, this patch adds support for lround and llround. It currently only optimize for AArch64 backend. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D61392 Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/test/CodeGen/builtins.c cfe/trunk/test/CodeGen/math-builtins.c cfe/trunk/test/CodeGen/math-libcalls.c Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=360896&r1=360895&r2=360896&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Thu May 16 06:43:25 2019 @@ -1721,6 +1721,27 @@ RValue CodeGenFunction::EmitBuiltinExpr( case Builtin::BI__builtin_truncl: return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::trunc)); + case Builtin::BIlround: + case Builtin::BIlroundf: + case Builtin::BIlroundl: + case Builtin::BI__builtin_lround: + case Builtin::BI__builtin_lroundf: + case Builtin::BI__builtin_lroundl: { + llvm::Type *ResultType = ConvertType(E->getType()); + int Width = ResultType->getPrimitiveSizeInBits(); + return RValue::get(emitUnaryBuiltin(*this, E, + Width == 32 ? Intrinsic::lround_i32 + : Intrinsic::lround_i64)); + } + + case Builtin::BIllround: + case Builtin::BIllroundf: + case Builtin::BIllroundl: + case Builtin::BI__builtin_llround: + case Builtin::BI__builtin_llroundf: + case Builtin::BI__builtin_llroundl: + return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::llround)); + default: break; } Modified: cfe/trunk/test/CodeGen/builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins.c?rev=360896&r1=360895&r2=360896&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtins.c (original) +++ cfe/trunk/test/CodeGen/builtins.c Thu May 16 06:43:25 2019 @@ -256,6 +256,8 @@ void test_float_builtin_ops(float F, dou volatile float resf; volatile double resd; volatile long double resld; + volatile long int resli; + volatile long long int reslli; resf = __builtin_fmodf(F,F); // CHECK: frem float @@ -380,6 +382,14 @@ void test_float_builtin_ops(float F, dou resld = __builtin_roundl(LD); // CHECK: call x86_fp80 @llvm.round.f80 + resli = __builtin_lroundf (F); + // CHECK: call i64 @llvm.lround.i64.f32 + + resli = __builtin_lround (D); + // CHECK: call i64 @llvm.lround.i64.f64 + + resli = __builtin_lroundl (LD); + // CHECK: call i64 @llvm.lround.i64.f80 } // __builtin_longjmp isn't supported on all platforms, so only test it on X86. Modified: cfe/trunk/test/CodeGen/math-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/math-builtins.c?rev=360896&r1=360895&r2=360896&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/math-builtins.c (original) +++ cfe/trunk/test/CodeGen/math-builtins.c Thu May 16 06:43:25 2019 @@ -362,9 +362,9 @@ void foo(double *d, float f, float *fp, __builtin_llround(f); __builtin_llroundf(f); __builtin_llroundl(f); -// NO__ERRNO: declare i64 @llround(double) [[READNONE]] -// NO__ERRNO: declare i64 @llroundf(float) [[READNONE]] -// NO__ERRNO: declare i64 @llroundl(x86_fp80) [[READNONE]] +// NO__ERRNO: declare i64 @llvm.llround.f64(double) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.llround.f32(float) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.llround.f80(x86_fp80) [[READNONE_INTRINSIC]] // HAS_ERRNO: declare i64 @llround(double) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @llroundf(float) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @llroundl(x86_fp80) [[NOT_READNONE]] @@ -425,9 +425,9 @@ void foo(double *d, float f, float *fp, __builtin_lround(f); __builtin_lroundf(f); __builtin_lroundl(f); -// NO__ERRNO: declare i64 @lround(double) [[READNONE]] -// NO__ERRNO: declare i64 @lroundf(float) [[READNONE]] -// NO__ERRNO: declare i64 @lroundl(x86_fp80) [[READNONE]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f64(double) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f32(float) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f80(x86_fp80) [[READNONE_INTRINSIC]] // HAS_ERRNO: declare i64 @lround(double) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @lroundf(float) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @lroundl(x86_fp80) [[NOT_READNONE]] Modified: cfe/trunk/test/CodeGen/math-libcalls.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/math-libcalls.c?rev=360896&r1=360895&r2=360896&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/math-libcalls.c (original) +++ cfe/trunk/test/CodeGen/math-libcalls.c Thu May 16 06:43:25 2019 @@ -317,9 +317,9 @@ void foo(double *d, float f, float *fp, llround(f); llroundf(f); llroundl(f); -// NO__ERRNO: declare i64 @llround(double) [[READNONE]] -// NO__ERRNO: declare i64 @llroundf(float) [[READNONE]] -// NO__ERRNO: declare i64 @llroundl(x86_fp80) [[READNONE]] +// NO__ERRNO: declare i64 @llvm.llround.f64(double) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.llround.f32(float) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.llround.f80(x86_fp80) [[READNONE_INTRINSIC]] // HAS_ERRNO: declare i64 @llround(double) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @llroundf(float) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @llroundl(x86_fp80) [[NOT_READNONE]] @@ -380,9 +380,9 @@ void foo(double *d, float f, float *fp, lround(f); lroundf(f); lroundl(f); -// NO__ERRNO: declare i64 @lround(double) [[READNONE]] -// NO__ERRNO: declare i64 @lroundf(float) [[READNONE]] -// NO__ERRNO: declare i64 @lroundl(x86_fp80) [[READNONE]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f64(double) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f32(float) [[READNONE_INTRINSIC]] +// NO__ERRNO: declare i64 @llvm.lround.i64.f80(x86_fp80) [[READNONE_INTRINSIC]] // HAS_ERRNO: declare i64 @lround(double) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @lroundf(float) [[NOT_READNONE]] // HAS_ERRNO: declare i64 @lroundl(x86_fp80) [[NOT_READNONE]] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits