This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Do not set flag_complex_method to 2 for C++ by default.
- From: Robert Dewar <dewar at adacore dot com>
- To: Andrew Pinski <pinskia at gmail dot com>, 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: Tue, 07 Jan 2014 21:12:12 -0500
- 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> <CA+=Sn1=iPzZgU37XnLFEeqspAUAK2vnbMnzrZRi3Mxty0Q3ojQ at mail dot gmail dot com> <CAAkRFZ+DQkiWUdLQHnz1K64B5phD+ARy2+zB8=VrRPQJWK7OKw at mail dot gmail dot com> <CA+=Sn1n70N0eE8Gu1adDPvBkXjdBfFFgzVfLmGxCnddz9pexxg at mail dot gmail dot com>
On 1/7/2014 8:46 PM, Andrew Pinski wrote:
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.
Obviously in a case like this, it is the programmer who should
be able to decide between fast-and-acceptable and slow-and-accurate.
This is an old debate (e.g. consider Cray, who always went for the
fast-and-acceptable path, and was able to build machines that were
interestingly fast partly as a result of this philosophy).
So having a switch is not controversial
But then the question is, what should the default be. The trouble with
the slow-but-accurate is that many users will never know about the
switch, and will judge the compiler ONLY on the basis that it is slow,
without even knowing, noticing, or caring that it is "more correct"
than the competition.
We have seen gcc lose out in a number of head to head comparisons,
because GCC defaulted to -O0 (optimization really really off, and
don't care how horrible the code is) and the competition defaulted
to optimization turned on.
We even worked with one customer, and explained the issue, and they
said "sorry, company procedures require us to run both compilers with
their default settings, since that is perceived as being fairer!"
Their conclusion was that gcc was unacceptably inefficient and they
went with the competition.
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.