From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1851) id E53383839420; Mon, 6 Sep 2021 14:53:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E53383839420 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Martin Liska To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/marxin/heads/complex-method-optimize-opt-v2)] flag_complex_method: support optimize attribute X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/users/marxin/heads/complex-method-optimize-opt-v2 X-Git-Oldrev: 66bba4dc263d42b6a2254b68fe8706302071f880 X-Git-Newrev: e88ae14be7c5609a969897b5d09f40709fea8a34 Message-Id: <20210906145303.E53383839420@sourceware.org> Date: Mon, 6 Sep 2021 14:53:03 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Sep 2021 14:53:04 -0000 https://gcc.gnu.org/g:e88ae14be7c5609a969897b5d09f40709fea8a34 commit e88ae14be7c5609a969897b5d09f40709fea8a34 Author: Martin Liska Date: Fri Sep 3 10:53:00 2021 +0200 flag_complex_method: support optimize attribute gcc/c-family/ChangeLog: * c-opts.c (c_common_init_options_struct): Set also x_flag_default_complex_method. gcc/ChangeLog: * common.opt: Add new variable flag_default_complex_method. * opts.c (finish_options): Handle flags related to x_flag_complex_method. * toplev.c (process_options): Remove option handling related to flag_complex_method. gcc/go/ChangeLog: * go-lang.c (go_langhook_init_options_struct): Set also x_flag_default_complex_method. gcc/lto/ChangeLog: * lto-lang.c (lto_init_options_struct): Set also x_flag_default_complex_method. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/attr-complex-method-2.c: New test. * gcc.c-torture/compile/attr-complex-method.c: New test. Diff: --- gcc/c-family/c-opts.c | 1 + gcc/common.opt | 3 +++ gcc/go/go-lang.c | 1 + gcc/lto/lto-lang.c | 1 + gcc/opts.c | 12 ++++++++++++ gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c | 10 ++++++++++ gcc/testsuite/gcc.c-torture/compile/attr-complex-method.c | 10 ++++++++++ gcc/toplev.c | 8 -------- 8 files changed, 38 insertions(+), 8 deletions(-) diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index fdde082158b..3eaab5e1530 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -222,6 +222,7 @@ 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 7d69ab5ef7c..6bfe0b74023 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -59,6 +59,9 @@ enum incremental_link flag_incremental_link = INCREMENTAL_LINK_NONE Variable int flag_complex_method = 1 +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/go/go-lang.c b/gcc/go/go-lang.c index a01db8dbdcd..c3ae6f012bb 100644 --- a/gcc/go/go-lang.c +++ b/gcc/go/go-lang.c @@ -174,6 +174,7 @@ 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.c b/gcc/lto/lto-lang.c index 92f499643b5..a014e5884e0 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -813,6 +813,7 @@ 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.c b/gcc/opts.c index e0501551ef5..8cf868ac88d 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1323,6 +1323,18 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, = (opts->x_flag_unroll_loops || opts->x_flag_peel_loops || opts->x_optimize >= 3); + + /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ + if (opts->x_flag_cx_limited_range) + opts->x_flag_complex_method = 0; + else if (opts_set->x_flag_cx_limited_range) + opts->x_flag_complex_method = opts->x_flag_default_complex_method; + + /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ + if (opts->x_flag_cx_fortran_rules) + opts->x_flag_complex_method = 1; + else if (opts_set->x_flag_cx_fortran_rules) + opts->x_flag_complex_method = opts->x_flag_default_complex_method; } #define LEFT_COLUMN 27 diff --git a/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c new file mode 100644 index 00000000000..a3dc9c1ba91 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c @@ -0,0 +1,10 @@ +/* { dg-additional-options "-fcx-limited-range -fdump-tree-optimized" } */ + +#pragma GCC optimize "-fno-cx-limited-range" + +void do_div (_Complex double *a, _Complex double *b) +{ + *a = *b / (4.0 - 5.0fi); +} + +/* { dg-final { scan-tree-dump "__divdc3" "optimized" } } */ diff --git a/gcc/testsuite/gcc.c-torture/compile/attr-complex-method.c b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method.c new file mode 100644 index 00000000000..f08b72e273f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method.c @@ -0,0 +1,10 @@ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#pragma GCC optimize "-fcx-limited-range" + +void do_div (_Complex double *a, _Complex double *b) +{ + *a = *b / (4.0 - 5.0fi); +} + +/* { dg-final { scan-tree-dump-not "__divdc3" "optimized" } } */ diff --git a/gcc/toplev.c b/gcc/toplev.c index 14d1335e79e..e1688aae724 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1695,14 +1695,6 @@ process_options (void) flag_stack_check = NO_STACK_CHECK; } - /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ - if (flag_cx_limited_range) - flag_complex_method = 0; - - /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ - if (flag_cx_fortran_rules) - flag_complex_method = 1; - /* Targets must be able to place spill slots at lower addresses. If the target already uses a soft frame pointer, the transition is trivial. */ if (!FRAME_GROWS_DOWNWARD && flag_stack_protect)