[PATCH] Do not set flag_complex_method to 2 for C++ by default.

Andrew Pinski pinskia@gmail.com
Wed Jan 8 01:46:00 GMT 2014


On Thu, Nov 14, 2013 at 11:12 AM, Xinliang David Li <davidxl@google.com> wrote:
> On Thu, Nov 14, 2013 at 10:17 AM, Andrew Pinski <pinskia@gmail.com> wrote:
>> On Thu, Nov 14, 2013 at 8:25 AM, Xinliang David Li <davidxl@google.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
>>> case?
>>
>> It is not a niche case.  It is confusing for people who write C++ code
>> to rewrite their code to C99
>
> Compared with people who just work on C++ or C but do not worry about
> rewrite nor cross language comparison?
>
>>and find that C is much slower because of
>> correctness?  I think they have this backwards here.  C++ should be
>> consistent with C here.
>
> Correctness by what definition?

See also http://gcc.gnu.org/ml/gcc-patches/2005-02/msg00568.html which
is one of the libstdc++ maintainers opinion on this subject.


>
>>
>>> 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
>>> poorly.
>>
>>
>> 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
>> disable it.
>
> You can say the same thing that people who find C is slower can use
> the flag to disable it.
>
> thanks,
>
> David
>
>>
>> Thanks,
>> Andrew Pinski
>>
>>>
>>> thanks,
>>>
>>> David
>>>
>>>
>>> On Wed, Nov 13, 2013 at 9:07 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>>> On Wed, Nov 13, 2013 at 5:26 PM, Cong Hou <congh@google.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.
>>>>
>>>> Thanks,
>>>> Andrew Pinski
>>>>
>>>>>
>>>>>
>>>>> thanks,
>>>>> Cong
>>>>>
>>>>>
>>>>> 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  <congh@google.com>
>>>>> +
>>>>> + * 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  <joseph@codesourcery.com>
>>>>>
>>>>>   * c-common.c (c_common_reswords): Add _Thread_local.



More information about the Gcc-patches mailing list