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?
2) It is very confusing for users who see huge performance difference
between compiler generated code for Complex multiplication vs manually
expanded code
3) The default setting can also block potential vectorization
opportunities for complex operations
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.

thanks,

David


On Wed, Nov 13, 2013 at 9:07 PM, Andrew Pinski <pins...@gmail.com> wrote:
> On Wed, Nov 13, 2013 at 5:26 PM, Cong Hou <co...@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  <co...@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  <jos...@codesourcery.com>
>>
>>   * c-common.c (c_common_reswords): Add _Thread_local.

Reply via email to