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" } } */
