https://gcc.gnu.org/g:f35ddc7e38e375bcdf9b753b0021fad99ae6e991

commit r16-4655-gf35ddc7e38e375bcdf9b753b0021fad99ae6e991
Author: Richard Biener <[email protected]>
Date:   Mon Oct 20 10:20:18 2025 +0200

    Cleanup flag_complex_method further
    
    PR122325 reports that -ffast-math no longer enables -fcx-limited-range.
    This is due to the weird handling of flag_default_complex_method which
    the following simply removes.  Frontends that wish to impose a default
    evaluation method that is not -fcx-fortran-rules (the current default
    of flag_default_complex_method) need to imposed that in ther
    init_options_struct langhook which those requesting C std rules already
    do and I'm adding that for the fortran frontend, explicitly requesting
    fortran rules.
    
            PR middle-end/122325
    gcc/
            * common.opt (flag_default_complex_method): Remove.
            * opts.cc (init_options_struct): Default to fortran rules
            for complex evaluations.
            (finish_options): Remove (re-)instantiating of the frontend
            default of the complex evaluation method.
    
    gcc/c-family/
            * c-opts.cc (c_common_init_options_struct): Remove set of
            flag_default_complex_method.
    
    gcc/go/
            * go-lang.cc (go_langhook_init_options_struct): Remove set of
            flag_default_complex_method.
    
    gcc/lto/
            * lto-lang.cc (lto_init_options_struct): Remove set of
            flag_default_complex_method.
    
    gcc/fortran/
            * options.cc (gfc_init_options_struct): Set flag_complex_method
            to fortran rules.
    
    gcc/testsuite/
            * gcc.dg/complex-8.c: New testcase.
            * gcc.dg/complex-9.c: Likewise.

Diff:
---
 gcc/c-family/c-opts.cc           |  1 -
 gcc/common.opt                   |  3 ---
 gcc/fortran/options.cc           |  1 +
 gcc/go/go-lang.cc                |  1 -
 gcc/lto/lto-lang.cc              |  1 -
 gcc/opts.cc                      |  7 +++----
 gcc/testsuite/gcc.dg/complex-8.c | 13 +++++++++++++
 gcc/testsuite/gcc.dg/complex-9.c | 13 +++++++++++++
 8 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index 7bec3f105997..b7dc8ceae820 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -230,7 +230,6 @@ c_common_init_options_struct (struct gcc_options *opts)
 
   /* By default, C99-like requirements for complex multiply and divide.  */
   opts->x_flag_complex_method = 2;
-  opts->x_flag_default_complex_method = opts->x_flag_complex_method;
 }
 
 /* Common initialization before calling option handlers.  */
diff --git a/gcc/common.opt b/gcc/common.opt
index 9b8fbf6a6845..92b0d4d931bd 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -53,9 +53,6 @@ bool in_lto_p = false
 Variable
 enum incremental_link flag_incremental_link = INCREMENTAL_LINK_NONE
 
-Variable
-int flag_default_complex_method = 1
-
 ; Language specific warning pass for unused results.
 Variable
 bool flag_warn_unused_result = false
diff --git a/gcc/fortran/options.cc b/gcc/fortran/options.cc
index 21839ef4a4f9..59c64624b51d 100644
--- a/gcc/fortran/options.cc
+++ b/gcc/fortran/options.cc
@@ -133,6 +133,7 @@ gfc_init_options_struct (struct gcc_options *opts)
   opts->frontend_set_flag_errno_math = true;
   opts->x_flag_associative_math = -1;
   opts->frontend_set_flag_associative_math = true;
+  opts->x_flag_complex_method = 1;
 }
 
 /* Get ready for options handling. Keep in sync with
diff --git a/gcc/go/go-lang.cc b/gcc/go/go-lang.cc
index 0c9c9ce35844..0222b8abf81a 100644
--- a/gcc/go/go-lang.cc
+++ b/gcc/go/go-lang.cc
@@ -173,7 +173,6 @@ go_langhook_init_options_struct (struct gcc_options *opts)
   /* Default to avoiding range issues for complex multiply and
      divide.  */
   opts->x_flag_complex_method = 2;
-  opts->x_flag_default_complex_method = opts->x_flag_complex_method;
 
   /* The builtin math functions should not set errno.  */
   opts->x_flag_errno_math = 0;
diff --git a/gcc/lto/lto-lang.cc b/gcc/lto/lto-lang.cc
index e41b548b3983..3e71a8fce74d 100644
--- a/gcc/lto/lto-lang.cc
+++ b/gcc/lto/lto-lang.cc
@@ -841,7 +841,6 @@ lto_init_options_struct (struct gcc_options *opts)
      safe choice.  This will pessimize Fortran code with LTO unless
      people specify a complex method manually or use -ffast-math.  */
   opts->x_flag_complex_method = 2;
-  opts->x_flag_default_complex_method = opts->x_flag_complex_method;
 }
 
 /* Handle command-line option SCODE.  If the option takes an argument, it is
diff --git a/gcc/opts.cc b/gcc/opts.cc
index 21ac6b566e0b..ceb1e0f445b1 100644
--- a/gcc/opts.cc
+++ b/gcc/opts.cc
@@ -454,6 +454,9 @@ init_options_struct (struct gcc_options *opts, struct 
gcc_options *opts_set)
   /* Some targets have ABI-specified unwind tables.  */
   opts->x_flag_unwind_tables = targetm_common.unwind_tables_default;
 
+  /* Languages not explicitly specifying a default get fortran rules.  */
+  opts->x_flag_complex_method = 1;
+
   /* Some targets have other target-specific initialization.  */
   targetm_common.option_init_struct (opts);
 }
@@ -1393,10 +1396,6 @@ finish_options (struct gcc_options *opts, struct 
gcc_options *opts_set,
          || opts->x_flag_peel_loops
          || opts->x_optimize >= 3);
 
-  /* Use a frontend provided default for the complex eval method.  */
-  if (!opts_set->x_flag_complex_method)
-    opts->x_flag_complex_method = opts->x_flag_default_complex_method;
-
   /* Use -fvect-cost-model=cheap instead of -fvect-cost-mode=very-cheap
      by default with explicit -ftree-{loop,slp}-vectorize.  */
   if (opts->x_optimize == 2
diff --git a/gcc/testsuite/gcc.dg/complex-8.c b/gcc/testsuite/gcc.dg/complex-8.c
new file mode 100644
index 000000000000..ea20adf24858
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/complex-8.c
@@ -0,0 +1,13 @@
+/* PR tree-optimization/122325.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-cplxlower" } */
+/* { dg-require-effective-target double64 } */
+
+__complex double
+foo (__complex double a, __complex double b)
+{
+  return a / b;
+}
+
+/* { dg-final { scan-tree-dump-times "__(?:gnu_)?divdc3" 1 "cplxlower1" } } */
diff --git a/gcc/testsuite/gcc.dg/complex-9.c b/gcc/testsuite/gcc.dg/complex-9.c
new file mode 100644
index 000000000000..413c507fd258
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/complex-9.c
@@ -0,0 +1,13 @@
+/* PR tree-optimization/122325.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math -fdump-tree-cplxlower" } */
+/* { dg-require-effective-target double64 } */
+
+__complex double
+foo (__complex double a, __complex double b)
+{
+  return a / b;
+}
+
+/* { dg-final { scan-tree-dump-not "__(?:gnu_)?divdc3" "cplxlower1" } } */

Reply via email to