This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]