This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH] Do not set flag_complex_method to 2 for C++ by default.
- From: Andrew Pinski <pinskia at gmail dot com>
- To: Xinliang David Li <davidxl at google dot com>
- Cc: Cong Hou <congh at google dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Guenther <richard dot guenther at gmail dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Thu, 14 Nov 2013 10:17:41 -0800
- Subject: Re: [PATCH] Do not set flag_complex_method to 2 for C++ by default.
- Authentication-results: sourceware.org; auth=none
- References: <CAK=A3=1YD0dWia2Qj=uYO2cpp6=TL0bR59n8HAKMGWAJFTtGAw at mail dot gmail dot com> <CA+=Sn1nSfkCvKAotv6Vp6s09xpb1Frd5dCJsfkM8xGRqDaM=MA at mail dot gmail dot com> <CAAkRFZJVmesF+jbdDL_0hJGmXQnFP8-7qvCXH_2wNK7ziJF+qQ at mail dot gmail dot com>
On Thu, Nov 14, 2013 at 8:25 AM, Xinliang David Li <email@example.com> wrote:
> Can we revisit the decision for this? Here are the reasons:
> 1) It seems that the motivation to make C++ consistent with c99 is to
> avoid confusing users who build the C source with both C and C++
> compilers. Why should C++'s default behavior be tuned for this niche
It is not a niche case. It is confusing for people who write C++ code
to rewrite their code to C99 and find that C is much slower because of
correctness? I think they have this backwards here. C++ should be
consistent with C here.
> 2) It is very confusing for users who see huge performance difference
> between compiler generated code for Complex multiplication vs manually
> expanded code
I don't see why this is an issue if they understand how complex
multiplication works for correctness. I am sorry but correctness over
speed is a good argument of why this should stay this way.
> 3) The default setting can also block potential vectorization
> opportunities for complex operations
Yes so again this is about a correctness issue over a speed issue.
> 4) GCC is about the only compiler which has this default -- very few
> user knows about GCC's strict default, and will think GCC performs
Correctness over speed is better. I am sorry GCC is the only one
which gets it correct here. If people don't like there is a flag to
> On Wed, Nov 13, 2013 at 9:07 PM, Andrew Pinski <firstname.lastname@example.org> wrote:
>> On Wed, Nov 13, 2013 at 5:26 PM, Cong Hou <email@example.com> wrote:
>>> This patch is for PR58963.
>>> In the patch http://gcc.gnu.org/ml/gcc-patches/2005-02/msg00560.html,
>>> the builtin function is used to perform complex multiplication and
>>> division. This is to comply with C99 standard, but I am wondering if
>>> C++ also needs this.
>>> There is no complex keyword in C++, and no content in C++ standard
>>> about the behavior of operations on complex types. The <complex>
>>> header file is all written in source code, including complex
>>> multiplication and division. GCC should not do too much for them by
>>> using builtin calls by default (although we can set -fcx-limited-range
>>> to prevent GCC doing this), which has a big impact on performance
>>> (there may exist vectorization opportunities).
>>> In this patch flag_complex_method will not be set to 2 for C++.
>>> Bootstraped and tested on an x86-64 machine.
>> I think you need to look into this issue deeper as the original patch
>> only enabled it for C99:
>> http://gcc.gnu.org/ml/gcc-patches/2005-02/msg01483.html .
>> Just a little deeper will find
>> http://gcc.gnu.org/ml/gcc/2007-07/msg00124.html which says yes C++
>> needs this.
>> Andrew Pinski
>>> Index: gcc/c-family/c-opts.c
>>> --- gcc/c-family/c-opts.c (revision 204712)
>>> +++ gcc/c-family/c-opts.c (working copy)
>>> @@ -198,8 +198,10 @@ c_common_init_options_struct (struct gcc
>>> opts->x_warn_write_strings = c_dialect_cxx ();
>>> opts->x_flag_warn_unused_result = true;
>>> - /* By default, C99-like requirements for complex multiply and divide. */
>>> - opts->x_flag_complex_method = 2;
>>> + /* By default, C99-like requirements for complex multiply and divide.
>>> + But for C++ this should not be required. */
>>> + if (c_language != clk_cxx && c_language != clk_objcxx)
>>> + opts->x_flag_complex_method = 2;
>>> /* Common initialization before calling option handlers. */
>>> Index: gcc/c-family/ChangeLog
>>> --- gcc/c-family/ChangeLog (revision 204712)
>>> +++ gcc/c-family/ChangeLog (working copy)
>>> @@ -1,3 +1,8 @@
>>> +2013-11-13 Cong Hou <firstname.lastname@example.org>
>>> + * c-opts.c (c_common_init_options_struct): Don't let C++ comply with
>>> + C99-like requirements for complex multiply and divide.
>>> 2013-11-12 Joseph Myers <email@example.com>
>>> * c-common.c (c_common_reswords): Add _Thread_local.