[cfe-commits] [PATCH] CodeGen: Expand creal and cimag into complex field loads
Chris Lattner
clattner at apple.com
Sun Dec 16 21:38:50 PST 2012
On Dec 13, 2012, at 7:36 PM, Meador Inge <meadori at codesourcery.com> wrote:
> PR 14529 was opened because neither Clang or LLVM was expanding
> calls to creal* or cimag* into instructions that just load the
> respective complex field. After some discussion, it was not
> considered realistic to do this in LLVM because of the platform
> specific way complex types are expanded. Thus a way to solve
> this in Clang was pursued. GCC does a similar expansion.
>
> This patch adds the feature to Clang by making the creal* and
> cimag* functions library builtins and modifying the builtin code
> generator to look for the new builtin types.
LGTM, please commit!
-Chris
>
> OK?
>
> ---
> include/clang/Basic/Builtins.def | 8 +++++++
> lib/CodeGen/CGBuiltin.cpp | 10 +++++++--
> test/CodeGen/libcalls-complex.c | 46 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 62 insertions(+), 2 deletions(-)
> create mode 100644 test/CodeGen/libcalls-complex.c
>
> diff --git a/include/clang/Basic/Builtins.def b/include/clang/Basic/Builtins.def
> index d48eadc..d485cbd 100644
> --- a/include/clang/Basic/Builtins.def
> +++ b/include/clang/Basic/Builtins.def
> @@ -833,6 +833,14 @@ LIBBUILTIN(ceil, "dd", "fc", "math.h", ALL_LANGUAGES)
> LIBBUILTIN(ceill, "LdLd", "fc", "math.h", ALL_LANGUAGES)
> LIBBUILTIN(ceilf, "ff", "fc", "math.h", ALL_LANGUAGES)
>
> +LIBBUILTIN(cimag, "dXd", "fnc", "complex.h", ALL_LANGUAGES)
> +LIBBUILTIN(cimagf, "fXf", "fnc", "complex.h", ALL_LANGUAGES)
> +LIBBUILTIN(cimagl, "LdXLd", "fnc", "complex.h", ALL_LANGUAGES)
> +
> +LIBBUILTIN(creal, "dXd", "fnc", "complex.h", ALL_LANGUAGES)
> +LIBBUILTIN(crealf, "fXf", "fnc", "complex.h", ALL_LANGUAGES)
> +LIBBUILTIN(creall, "LdXLd", "fnc", "complex.h", ALL_LANGUAGES)
> +
> LIBBUILTIN(copysign, "ddd", "fc", "math.h", ALL_LANGUAGES)
> LIBBUILTIN(copysignl, "LdLdLd", "fc", "math.h", ALL_LANGUAGES)
> LIBBUILTIN(copysignf, "fff", "fc", "math.h", ALL_LANGUAGES)
> diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp
> index a1a6ef6..d2824e9 100644
> --- a/lib/CodeGen/CGBuiltin.cpp
> +++ b/lib/CodeGen/CGBuiltin.cpp
> @@ -244,14 +244,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
> }
> case Builtin::BI__builtin_creal:
> case Builtin::BI__builtin_crealf:
> - case Builtin::BI__builtin_creall: {
> + case Builtin::BI__builtin_creall:
> + case Builtin::BIcreal:
> + case Builtin::BIcrealf:
> + case Builtin::BIcreall: {
> ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
> return RValue::get(ComplexVal.first);
> }
>
> case Builtin::BI__builtin_cimag:
> case Builtin::BI__builtin_cimagf:
> - case Builtin::BI__builtin_cimagl: {
> + case Builtin::BI__builtin_cimagl:
> + case Builtin::BIcimag:
> + case Builtin::BIcimagf:
> + case Builtin::BIcimagl: {
> ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0));
> return RValue::get(ComplexVal.second);
> }
> diff --git a/test/CodeGen/libcalls-complex.c b/test/CodeGen/libcalls-complex.c
> new file mode 100644
> index 0000000..7bcfa60
> --- /dev/null
> +++ b/test/CodeGen/libcalls-complex.c
> @@ -0,0 +1,46 @@
> +// RUN: %clang_cc1 -fno-builtin -emit-llvm -o - %s -triple i386-unknown-unknown | FileCheck -check-prefix YES %s
> +// RUN: %clang_cc1 -emit-llvm -o - %s -triple i386-unknown-unknown | FileCheck -check-prefix NO %s
> +
> +extern float crealf(float _Complex);
> +extern double creal(double _Complex);
> +extern long double creall(long double _Complex);
> +
> +extern float cimagf(float _Complex);
> +extern double cimag(double _Complex);
> +extern long double cimagl(long double _Complex);
> +
> +double test_creal(double _Complex z) {
> + return creal(z);
> + // CHECK-NO-NOT: call double @creal
> + // CHECK-YES: call double @creal
> +}
> +
> +long double test_creall(double _Complex z) {
> + return creall(z);
> + // CHECK-NO-NOT: call x86_fp80 @creall
> + // CHECK-YES: call x86_fp80 @creall
> +}
> +
> +float test_crealf(double _Complex z) {
> + return crealf(z);
> + // CHECK-NO-NOT: call float @crealf
> + // CHECK-YES: call float @crealf
> +}
> +
> +double test_cimag(double _Complex z) {
> + return cimag(z);
> + // CHECK-NO-NOT: call double @cimag
> + // CHECK-YES: call double @cimag
> +}
> +
> +long double test_cimagl(double _Complex z) {
> + return cimagl(z);
> + // CHECK-NO-NOT: call x86_fp80 @cimagl
> + // CHECK-YES: call x86_fp80 @cimagl
> +}
> +
> +float test_cimagf(double _Complex z) {
> + return cimagf(z);
> + // CHECK-NO-NOT: call float @cimagf
> + // CHECK-YES: call float @cimagf
> +}
> --
> 1.7.10.2 (Apple Git-33)
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list