From f275070568ad8f115e515c35bb63def406e8e144 Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Wed, 14 Sep 2016 17:34:14 +0000 Subject: [PATCH] Convert finite to builtin Summary: This patch converts finite/__finite to builtin functions so that it will be inlined by compiler. Reviewers: hfinkel, davidxl, efriedma Subscribers: efriedma, llvm-commits Differential Revision: https://reviews.llvm.org/D24483 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281509 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Builtins.def | 8 ++++++++ lib/CodeGen/CGBuiltin.cpp | 6 ++++++ test/CodeGen/builtins.c | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/include/clang/Basic/Builtins.def b/include/clang/Basic/Builtins.def index 5112284866..7316901ab8 100644 --- a/include/clang/Basic/Builtins.def +++ b/include/clang/Basic/Builtins.def @@ -937,6 +937,14 @@ LIBBUILTIN(fabs, "dd", "fnc", "math.h", ALL_LANGUAGES) LIBBUILTIN(fabsf, "ff", "fnc", "math.h", ALL_LANGUAGES) LIBBUILTIN(fabsl, "LdLd", "fnc", "math.h", ALL_LANGUAGES) +LIBBUILTIN(finite, "id", "fnc", "math.h", GNU_LANG) +LIBBUILTIN(finitef, "if", "fnc", "math.h", GNU_LANG) +LIBBUILTIN(finitel, "iLd", "fnc", "math.h", GNU_LANG) +// glibc's math.h generates calls to __finite +LIBBUILTIN(__finite, "id", "fnc", "math.h", ALL_LANGUAGES) +LIBBUILTIN(__finitef, "if", "fnc", "math.h", ALL_LANGUAGES) +LIBBUILTIN(__finitel, "iLd", "fnc", "math.h", ALL_LANGUAGES) + LIBBUILTIN(fmod, "ddd", "fne", "math.h", ALL_LANGUAGES) LIBBUILTIN(fmodf, "fff", "fne", "math.h", ALL_LANGUAGES) LIBBUILTIN(fmodl, "LdLdLd", "fne", "math.h", ALL_LANGUAGES) diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 94be5361e9..27c0b83776 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -903,6 +903,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, return RValue::get(Builder.CreateZExt(V, ConvertType(E->getType()))); } + case Builtin::BIfinite: + case Builtin::BI__finite: + case Builtin::BIfinitef: + case Builtin::BI__finitef: + case Builtin::BIfinitel: + case Builtin::BI__finitel: case Builtin::BI__builtin_isinf: case Builtin::BI__builtin_isfinite: { // isinf(x) --> fabs(x) == infinity diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c index 405f2199af..7d2a5d80e4 100644 --- a/test/CodeGen/builtins.c +++ b/test/CodeGen/builtins.c @@ -220,6 +220,10 @@ void test_float_builtins(float F, double D, long double LD) { // CHECK: call float @llvm.fabs.f32(float // CHECK: fcmp one float {{.*}}, 0x7FF0000000000000 + res = finite(D); + // CHECK: call double @llvm.fabs.f64(double + // CHECK: fcmp one double {{.*}}, 0x7FF0000000000000 + res = __builtin_isnormal(F); // CHECK: fcmp oeq float // CHECK: call float @llvm.fabs.f32(float -- 2.40.0