Patchwork [bionic] Add -foptimize-sincos

login
register
mail settings
Submitter Andrew Hsieh
Date May 24, 2013, 10:53 a.m.
Message ID <CABySjRu5EmZFEUtOfYkFbnYGKxEs-YB_cXYpi_Lo9Z9U3gEQNA@mail.gmail.com>
Download mbox | patch
Permalink /patch/246128/
State New
Headers show

Comments

Andrew Hsieh - May 24, 2013, 10:53 a.m.
Bionic prior to Gingerbread doesn't support sincos*, but upstream GCC
enables sincos optimization for OPTION_BIONIC unconditionally since
4.6.  I'd like to propose a new flag -foptimize-sincos for NDK to
maintain backward compatibility.

1. For BIONIC: sincos optimization is disabled by default.  Apps built
for Gingerbread+ or AOSP platform build which uses the same compiler
as NDK, can add -foptimize-sincos to enhance performance.  (although
it's likely that only benchmarks may benefit)

2. Other C libs aren't affected.  sincos optimization is enabled for
GLIBC and disabled for othres, regardless of this flag.

 #undef TARGET_HAS_BIONIC
Richard Guenther - May 24, 2013, 12:10 p.m.
On Fri, May 24, 2013 at 12:53 PM, Andrew Hsieh <andrewhsieh@google.com> wrote:
> Bionic prior to Gingerbread doesn't support sincos*, but upstream GCC
> enables sincos optimization for OPTION_BIONIC unconditionally since
> 4.6.  I'd like to propose a new flag -foptimize-sincos for NDK to
> maintain backward compatibility.
>
> 1. For BIONIC: sincos optimization is disabled by default.  Apps built
> for Gingerbread+ or AOSP platform build which uses the same compiler
> as NDK, can add -foptimize-sincos to enhance performance.  (although
> it's likely that only benchmarks may benefit)
>
> 2. Other C libs aren't affected.  sincos optimization is enabled for
> GLIBC and disabled for othres, regardless of this flag.

That's a pretty awful option name for one that makes us assume the target
C library has a sincos function.

I'd rather think about a way to specify, for all known builtins, whether GCC
should generate calls to such function where they are not in the source
program.  That is, similar to how we have -f[no-]builtin-FOO introduce
-f[no-]libc-FOO (with a better name for 'libc'?).  That way there would be
a way to specify that -floop-distribute-patterns should not produce calls
to memset () for example.

Richard.

> ====
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt (revision 199277)
> +++ gcc/common.opt (working copy)
> @@ -1591,6 +1591,10 @@
>  Common Report Var(flag_optimize_sibling_calls) Optimization
>  Optimize sibling and tail recursive calls
>
> +foptimize-sincos
> +Common Report Var(flag_optimize_sincos) Optimization
> +Optimize calls to sin() and cos() with the same argument to sincos()
> +
>  fpartial-inlining
>  Common Report Var(flag_partial_inlining)
>  Perform partial inlining
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi (revision 199277)
> +++ gcc/doc/invoke.texi (working copy)
> @@ -388,7 +388,7 @@
>  -fno-sched-interblock -fno-sched-spec -fno-signed-zeros @gol
>  -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol
>  -fomit-frame-pointer -foptimize-register-move -foptimize-sibling-calls @gol
> --fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
> +-foptimize-sincos -fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
>  -fprefetch-loop-arrays -fprofile-report @gol
>  -fprofile-correction -fprofile-dir=@var{path} -fprofile-generate @gol
>  -fprofile-generate=@var{path} @gol
> @@ -6586,6 +6586,7 @@
>  -fipa-profile @gol
>  -fipa-reference @gol
>  -fmerge-constants
> +-foptimize-sincos @gol
>  -fsplit-wide-types @gol
>  -ftree-bit-ccp @gol
>  -ftree-builtin-call-dce @gol
> @@ -6772,6 +6773,12 @@
>
>  Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
>
> +@item -foptimize-sincos
> +@opindex foptimize-sincos
> +Optimize calls to sin() and cos() with the same argument to sincos()
> +
> +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
> +
>  @item -fno-inline
>  @opindex fno-inline
>  Do not expand any functions inline apart from those marked with
> Index: gcc/config/linux.h
> ===================================================================
> --- gcc/config/linux.h (revision 199277)
> +++ gcc/config/linux.h (working copy)
> @@ -102,7 +102,7 @@
>
>  /* Whether we have sincos that follows the GNU extension.  */
>  #undef TARGET_HAS_SINCOS
> -#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
> +#define TARGET_HAS_SINCOS (OPTION_GLIBC || (OPTION_BIONIC &&
> flag_optimize_sincos))
>
>  /* Whether we have Bionic libc runtime */
>  #undef TARGET_HAS_BIONIC
Jakub Jelinek - May 24, 2013, 12:18 p.m.
On Fri, May 24, 2013 at 02:10:18PM +0200, Richard Biener wrote:
> That's a pretty awful option name for one that makes us assume the target
> C library has a sincos function.
> 
> I'd rather think about a way to specify, for all known builtins, whether GCC
> should generate calls to such function where they are not in the source
> program.  That is, similar to how we have -f[no-]builtin-FOO introduce
> -f[no-]libc-FOO (with a better name for 'libc'?).  That way there would be
> a way to specify that -floop-distribute-patterns should not produce calls
> to memset () for example.

Yeah.  Or we could be more aggressive at producing stpcpy, mempcpy etc.
calls where it could be beneficial and have a way to disable that.
What we currently do for stpcpy is c/c-decl.c (merge_decl) and
cp/decl.c (duplicate_decls) has code that if not -fno-builtin-stpcpy and
a compatible prototype is seen for stpcpy, then we allow it to be generated
implicitly (set_builtin_decl_implicit_p (fncode, true);).
Yeah, we could do the same for sincos, I bet most of the people don't
prototype sin or cos themselves but include <math.h>, but in all cases
it means the compiler will do it only if stpcpy resp. sincos is actually
prototyped in the headers (right feature test macros for that).

	Jakub
Alexander Ivchenko - May 24, 2013, 12:18 p.m.
Richard, the target hook (libc_has_function) for what you described is
waiting for a review:
http://gcc.gnu.org/ml/gcc-patches/2013-03/msg01201.html

However, it doesn't have command line options support.

Alexander


2013/5/24 Richard Biener <richard.guenther@gmail.com>:
> On Fri, May 24, 2013 at 12:53 PM, Andrew Hsieh <andrewhsieh@google.com> wrote:
>> Bionic prior to Gingerbread doesn't support sincos*, but upstream GCC
>> enables sincos optimization for OPTION_BIONIC unconditionally since
>> 4.6.  I'd like to propose a new flag -foptimize-sincos for NDK to
>> maintain backward compatibility.
>>
>> 1. For BIONIC: sincos optimization is disabled by default.  Apps built
>> for Gingerbread+ or AOSP platform build which uses the same compiler
>> as NDK, can add -foptimize-sincos to enhance performance.  (although
>> it's likely that only benchmarks may benefit)
>>
>> 2. Other C libs aren't affected.  sincos optimization is enabled for
>> GLIBC and disabled for othres, regardless of this flag.
>
> That's a pretty awful option name for one that makes us assume the target
> C library has a sincos function.
>
> I'd rather think about a way to specify, for all known builtins, whether GCC
> should generate calls to such function where they are not in the source
> program.  That is, similar to how we have -f[no-]builtin-FOO introduce
> -f[no-]libc-FOO (with a better name for 'libc'?).  That way there would be
> a way to specify that -floop-distribute-patterns should not produce calls
> to memset () for example.
>
> Richard.
>
>> ====
>> Index: gcc/common.opt
>> ===================================================================
>> --- gcc/common.opt (revision 199277)
>> +++ gcc/common.opt (working copy)
>> @@ -1591,6 +1591,10 @@
>>  Common Report Var(flag_optimize_sibling_calls) Optimization
>>  Optimize sibling and tail recursive calls
>>
>> +foptimize-sincos
>> +Common Report Var(flag_optimize_sincos) Optimization
>> +Optimize calls to sin() and cos() with the same argument to sincos()
>> +
>>  fpartial-inlining
>>  Common Report Var(flag_partial_inlining)
>>  Perform partial inlining
>> Index: gcc/doc/invoke.texi
>> ===================================================================
>> --- gcc/doc/invoke.texi (revision 199277)
>> +++ gcc/doc/invoke.texi (working copy)
>> @@ -388,7 +388,7 @@
>>  -fno-sched-interblock -fno-sched-spec -fno-signed-zeros @gol
>>  -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol
>>  -fomit-frame-pointer -foptimize-register-move -foptimize-sibling-calls @gol
>> --fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
>> +-foptimize-sincos -fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
>>  -fprefetch-loop-arrays -fprofile-report @gol
>>  -fprofile-correction -fprofile-dir=@var{path} -fprofile-generate @gol
>>  -fprofile-generate=@var{path} @gol
>> @@ -6586,6 +6586,7 @@
>>  -fipa-profile @gol
>>  -fipa-reference @gol
>>  -fmerge-constants
>> +-foptimize-sincos @gol
>>  -fsplit-wide-types @gol
>>  -ftree-bit-ccp @gol
>>  -ftree-builtin-call-dce @gol
>> @@ -6772,6 +6773,12 @@
>>
>>  Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
>>
>> +@item -foptimize-sincos
>> +@opindex foptimize-sincos
>> +Optimize calls to sin() and cos() with the same argument to sincos()
>> +
>> +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
>> +
>>  @item -fno-inline
>>  @opindex fno-inline
>>  Do not expand any functions inline apart from those marked with
>> Index: gcc/config/linux.h
>> ===================================================================
>> --- gcc/config/linux.h (revision 199277)
>> +++ gcc/config/linux.h (working copy)
>> @@ -102,7 +102,7 @@
>>
>>  /* Whether we have sincos that follows the GNU extension.  */
>>  #undef TARGET_HAS_SINCOS
>> -#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
>> +#define TARGET_HAS_SINCOS (OPTION_GLIBC || (OPTION_BIONIC &&
>> flag_optimize_sincos))
>>
>>  /* Whether we have Bionic libc runtime */
>>  #undef TARGET_HAS_BIONIC
Richard Guenther - May 24, 2013, 12:23 p.m.
On Fri, May 24, 2013 at 2:18 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, May 24, 2013 at 02:10:18PM +0200, Richard Biener wrote:
>> That's a pretty awful option name for one that makes us assume the target
>> C library has a sincos function.
>>
>> I'd rather think about a way to specify, for all known builtins, whether GCC
>> should generate calls to such function where they are not in the source
>> program.  That is, similar to how we have -f[no-]builtin-FOO introduce
>> -f[no-]libc-FOO (with a better name for 'libc'?).  That way there would be
>> a way to specify that -floop-distribute-patterns should not produce calls
>> to memset () for example.
>
> Yeah.  Or we could be more aggressive at producing stpcpy, mempcpy etc.
> calls where it could be beneficial and have a way to disable that.
> What we currently do for stpcpy is c/c-decl.c (merge_decl) and
> cp/decl.c (duplicate_decls) has code that if not -fno-builtin-stpcpy and
> a compatible prototype is seen for stpcpy, then we allow it to be generated
> implicitly (set_builtin_decl_implicit_p (fncode, true);).

But for example memset/memcpy always have that set, even if no prototype
is in the source.  So, is that decl_implicit_p really supposed to tell us
whether we've seen a compatible prototype?

> Yeah, we could do the same for sincos, I bet most of the people don't
> prototype sin or cos themselves but include <math.h>, but in all cases
> it means the compiler will do it only if stpcpy resp. sincos is actually
> prototyped in the headers (right feature test macros for that).

Right, that would be good enough for C and C++ - but what to do for Fortran?

Richard.

>         Jakub
Jakub Jelinek - May 24, 2013, 12:28 p.m.
On Fri, May 24, 2013 at 02:23:45PM +0200, Richard Biener wrote:
> But for example memset/memcpy always have that set, even if no prototype
> is in the source.  So, is that decl_implicit_p really supposed to tell us
> whether we've seen a compatible prototype?

decl_implicit_p isn't whether we've seen a compatible prototype, but whether
it is ok for the compiler to make calls to that function, even when there
were none in the source.  Usually this comes from how we define the builtin
in builtins.def, whether it is a standard required function or some
extension beyond the standard.  And for stpcpy right now we are using this
way (kind of hack).

> Right, that would be good enough for C and C++ - but what to do for Fortran?

Sure.  So what about have a -f{,no-}builtin-implicit-{builtin_name}
with the default as is right now, that would just tweak decl_implicit_p if
decl_explicit_p is true.

	Jakub
Richard Guenther - May 24, 2013, 12:31 p.m.
On Fri, May 24, 2013 at 2:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, May 24, 2013 at 02:23:45PM +0200, Richard Biener wrote:
>> But for example memset/memcpy always have that set, even if no prototype
>> is in the source.  So, is that decl_implicit_p really supposed to tell us
>> whether we've seen a compatible prototype?
>
> decl_implicit_p isn't whether we've seen a compatible prototype, but whether
> it is ok for the compiler to make calls to that function, even when there
> were none in the source.  Usually this comes from how we define the builtin
> in builtins.def, whether it is a standard required function or some
> extension beyond the standard.  And for stpcpy right now we are using this
> way (kind of hack).
>
>> Right, that would be good enough for C and C++ - but what to do for Fortran?
>
> Sure.  So what about have a -f{,no-}builtin-implicit-{builtin_name}
> with the default as is right now, that would just tweak decl_implicit_p if
> decl_explicit_p is true.

That works for me.  We could still have a way for targets to override the
default here.

Richard.

>         Jakub

Patch

====
Index: gcc/common.opt
===================================================================
--- gcc/common.opt (revision 199277)
+++ gcc/common.opt (working copy)
@@ -1591,6 +1591,10 @@ 
 Common Report Var(flag_optimize_sibling_calls) Optimization
 Optimize sibling and tail recursive calls

+foptimize-sincos
+Common Report Var(flag_optimize_sincos) Optimization
+Optimize calls to sin() and cos() with the same argument to sincos()
+
 fpartial-inlining
 Common Report Var(flag_partial_inlining)
 Perform partial inlining
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 199277)
+++ gcc/doc/invoke.texi (working copy)
@@ -388,7 +388,7 @@ 
 -fno-sched-interblock -fno-sched-spec -fno-signed-zeros @gol
 -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol
 -fomit-frame-pointer -foptimize-register-move -foptimize-sibling-calls @gol
--fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
+-foptimize-sincos -fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
 -fprefetch-loop-arrays -fprofile-report @gol
 -fprofile-correction -fprofile-dir=@var{path} -fprofile-generate @gol
 -fprofile-generate=@var{path} @gol
@@ -6586,6 +6586,7 @@ 
 -fipa-profile @gol
 -fipa-reference @gol
 -fmerge-constants
+-foptimize-sincos @gol
 -fsplit-wide-types @gol
 -ftree-bit-ccp @gol
 -ftree-builtin-call-dce @gol
@@ -6772,6 +6773,12 @@ 

 Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.

+@item -foptimize-sincos
+@opindex foptimize-sincos
+Optimize calls to sin() and cos() with the same argument to sincos()
+
+Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
+
 @item -fno-inline
 @opindex fno-inline
 Do not expand any functions inline apart from those marked with
Index: gcc/config/linux.h
===================================================================
--- gcc/config/linux.h (revision 199277)
+++ gcc/config/linux.h (working copy)
@@ -102,7 +102,7 @@ 

 /* Whether we have sincos that follows the GNU extension.  */
 #undef TARGET_HAS_SINCOS
-#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
+#define TARGET_HAS_SINCOS (OPTION_GLIBC || (OPTION_BIONIC &&
flag_optimize_sincos))

 /* Whether we have Bionic libc runtime */