On Mon, 20 Oct 2025, Richard Biener wrote:
> 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.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for trunk?
Ping.
> Thanks,
> Richard.
>
> 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.
> ---
> 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(-)
> create mode 100644 gcc/testsuite/gcc.dg/complex-8.c
> create mode 100644 gcc/testsuite/gcc.dg/complex-9.c
>
> diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
> index 7bec3f10599..b7dc8ceae82 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 9b8fbf6a684..92b0d4d931b 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 21839ef4a4f..59c64624b51 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 0c9c9ce3584..0222b8abf81 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 e41b548b398..3e71a8fce74 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 21ac6b566e0..ceb1e0f445b 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 00000000000..ea20adf2485
> --- /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 00000000000..413c507fd25
> --- /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" } } */
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)