From: Richard Biener Date: Mon, 20 Oct 2025 08:20:18 +0000 (+0200) Subject: Cleanup flag_complex_method further X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f35ddc7e38e375bcdf9b753b0021fad99ae6e991;p=thirdparty%2Fgcc.git 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 --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" } } */