On Tue, Jul 24, 2018 at 01:30:30PM +0200, Tom de Vries wrote: > On 07/16/2018 05:10 PM, Tom de Vries wrote: > > On 07/16/2018 03:50 PM, Richard Biener wrote: > >> On Mon, 16 Jul 2018, Tom de Vries wrote: > >>> Any comments? > >> > >> Interesting idea. I wonder if that should be generalized > >> to other places > > > > I kept the option name general, to allow for that. > > > > And indeed, this is a point-fix patch. I've been playing around with a > > more generic patch that adds nops such that each is_stmt .loc is > > associated with a unique insn, but that was embedded in an > > fkeep-vars-live branch, so this patch is minimally addressing the first > > problem I managed to reproduce on trunk. > > > >> and how we can avoid compare-debug failures > >> (var-tracking usually doesn't change code-generation). > >> > > > > I'll post this patch series (the current state of my fkeep-vars-live > branch) in reply to this email: > > 1 [debug] Add fdebug-nops > 2 [debug] Add fkeep-vars-live > 3 [debug] Add fdebug-nops and fkeep-vars-live to Og only > > Bootstrapped and reg-tested on x86_64. ChangeLog entries and function > header comments missing. > > Comments welcome. >
This switches on fdebug-nops and fkeep-vars-live by default for Og only, in order to excercise the new switches in combination with the optimization option they're intended to be used with. Resulting fixes: ... FAIL: gcc.dg/guality/pr54200.c -Og -DPREVENT_OPTIMIZATION line . z == 3 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+4 a[0] == 1 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+3 a[1] == 2 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+2 a[2] == 3 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 *p == 3 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 2 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+4 a[0] == 1 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+3 a[1] == 2 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+2 a[2] == 13 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 *p == 13 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 2 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+4 a[0] == 1 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+3 a[1] == 12 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+2 a[2] == 13 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 *p == 13 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 12 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+3 a[1] == 5 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+2 a[2] == 6 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 *p == 6 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 5 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+3 a[1] == 5 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+2 a[2] == 26 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 *p == 26 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 5 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+7 a[1] == 25 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+6 a[2] == 26 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+5 *p == 26 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+4 p[-1] == 25 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line .+1 q[1] == 26 FAIL: gcc.dg/guality/pr54970.c -Og -DPREVENT_OPTIMIZATION line . *q == 25 ... The intended nature of Og is: offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience. Todo: assess compile time and runtime cost of adding adding fdebug-nops and fkeep-vars-live to Og, to see if nature of Og has been changed. PR debug/78685 [debug] Add fdebug-nops and fkeep-vars-live to Og only --- gcc/common/common-target.h | 1 + gcc/opts.c | 6 ++++++ gcc/testsuite/gcc.dg/pr84614.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gcc/common/common-target.h b/gcc/common/common-target.h index 9b796c8f085..17e8950a027 100644 --- a/gcc/common/common-target.h +++ b/gcc/common/common-target.h @@ -34,6 +34,7 @@ enum opt_levels OPT_LEVELS_1_PLUS, /* -O1 and above, including -Os and -Og. */ OPT_LEVELS_1_PLUS_SPEED_ONLY, /* -O1 and above, but not -Os or -Og. */ OPT_LEVELS_1_PLUS_NOT_DEBUG, /* -O1 and above, but not -Og. */ + OPT_LEVELS_1_DEBUG, /* -Og. */ OPT_LEVELS_2_PLUS, /* -O2 and above, including -Os. */ OPT_LEVELS_2_PLUS_SPEED_ONLY, /* -O2 and above, but not -Os or -Og. */ OPT_LEVELS_3_PLUS, /* -O3 and above. */ diff --git a/gcc/opts.c b/gcc/opts.c index 17d91988ada..e8142eb6920 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -370,6 +370,10 @@ maybe_default_option (struct gcc_options *opts, enabled = (level >= 1 && !debug); break; + case OPT_LEVELS_1_DEBUG: + enabled = (level == 1 && debug); + break; + case OPT_LEVELS_2_PLUS: enabled = (level >= 2); break; @@ -477,6 +481,8 @@ static const struct default_options default_options_table[] = { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 }, + { OPT_LEVELS_1_DEBUG, OPT_fdebug_nops, NULL, 1 }, + { OPT_LEVELS_1_DEBUG, OPT_fkeep_vars_live, NULL, 1 }, /* -O2 optimizations. */ { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 }, diff --git a/gcc/testsuite/gcc.dg/pr84614.c b/gcc/testsuite/gcc.dg/pr84614.c index 98af26ba4e5..b7a5b9c1c84 100644 --- a/gcc/testsuite/gcc.dg/pr84614.c +++ b/gcc/testsuite/gcc.dg/pr84614.c @@ -1,6 +1,6 @@ /* PR target/84614 */ /* { dg-do run { target int128 } } */ -/* { dg-options "-Og -fno-split-wide-types -fno-tree-coalesce-vars -g --param=max-combine-insns=3 -fcompare-debug" } */ +/* { dg-options "-Og -fno-split-wide-types -fno-tree-coalesce-vars -g --param=max-combine-insns=3 -fcompare-debug -fno-debug-nops" } */ unsigned __int128 a;