On Mon, Feb 28, 2022 at 10:03 AM Martin Liška <mli...@suse.cz> wrote: > > Note -fvar-tracking is enabled automatically with OPT_LEVELS_1_PLUS and > so we need to drop it if we are called from optimize attribute and the > option is unset. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > PR middle-end/104381 > > gcc/ChangeLog: > > * opts.cc (finish_options): If debug info is disabled > (debug_info_level) and -fvar-tracking is unset, disable it. > > gcc/testsuite/ChangeLog: > > * gcc.dg/pr104381.c: New test. > --- > gcc/opts.cc | 49 +++++++++++++++++++-------------- > gcc/testsuite/gcc.dg/pr104381.c | 20 ++++++++++++++ > 2 files changed, 48 insertions(+), 21 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/pr104381.c > > diff --git a/gcc/opts.cc b/gcc/opts.cc > index 19c68aed065..2370bb0aafe 100644 > --- a/gcc/opts.cc > +++ b/gcc/opts.cc > @@ -1302,6 +1302,34 @@ finish_options (struct gcc_options *opts, struct > gcc_options *opts_set, > SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model, > VECT_COST_MODEL_CHEAP); > > + if (flag_gtoggle) > + { > + /* Make sure to process -gtoggle only once. */ > + flag_gtoggle = false; > + if (debug_info_level == DINFO_LEVEL_NONE) > + { > + debug_info_level = DINFO_LEVEL_NORMAL; > + > + if (write_symbols == NO_DEBUG) > + write_symbols = PREFERRED_DEBUGGING_TYPE; > + } > + else > + debug_info_level = DINFO_LEVEL_NONE; > + } > + > + if (!OPTION_SET_P (debug_nonbind_markers_p)) > + debug_nonbind_markers_p > + = (optimize > + && debug_info_level >= DINFO_LEVEL_NORMAL > + && dwarf_debuginfo_p () > + && !(flag_selective_scheduling || flag_selective_scheduling2)); > + > + /* Note -fvar-tracking is enabled automatically with OPT_LEVELS_1_PLUS and > + so we need to drop it if we are called from optimize attribute. */ > + if (debug_info_level < DINFO_LEVEL_NORMAL > + && !OPTION_SET_P (flag_var_tracking)) > + flag_var_tracking = false; > +
I think moving flag_gtoggle handling before the flag_syntax_only handling is a good thing. But I don't quite understand the flag_var_tracking disabling or how it worked before. At least I think you want to check for debug_info_level == NONE, no? Why should DINFO_LEVEL_TERSE be special? > /* One could use EnabledBy, but it would lead to a circular dependency. > */ > if (!OPTION_SET_P (flag_var_tracking_uninit)) > flag_var_tracking_uninit = flag_var_tracking; > @@ -1328,27 +1356,6 @@ finish_options (struct gcc_options *opts, struct > gcc_options *opts_set, > profile_flag = 0; > } > > - if (flag_gtoggle) > - { > - /* Make sure to process -gtoggle only once. */ > - flag_gtoggle = false; > - if (debug_info_level == DINFO_LEVEL_NONE) > - { > - debug_info_level = DINFO_LEVEL_NORMAL; > - > - if (write_symbols == NO_DEBUG) > - write_symbols = PREFERRED_DEBUGGING_TYPE; > - } > - else > - debug_info_level = DINFO_LEVEL_NONE; > - } > - > - if (!OPTION_SET_P (debug_nonbind_markers_p)) > - debug_nonbind_markers_p > - = (optimize > - && debug_info_level >= DINFO_LEVEL_NORMAL > - && dwarf_debuginfo_p () > - && !(flag_selective_scheduling || flag_selective_scheduling2)); > > diagnose_options (opts, opts_set, loc); > } > diff --git a/gcc/testsuite/gcc.dg/pr104381.c b/gcc/testsuite/gcc.dg/pr104381.c > new file mode 100644 > index 00000000000..a3aec919bee > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr104381.c > @@ -0,0 +1,20 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -g -gtoggle -fdump-tree-optimized" } */ > + > +int foo (int x) > +{ > + int tem = x + 1; > + int tem2 = tem - 1; > + return tem2; > +} > + > +int > +__attribute__((optimize("no-tree-pre"))) > +bar (int x) > +{ > + int tem = x + 1; > + int tem2 = tem - 1; > + return tem2; > +} > + > +// { dg-final { scan-tree-dump-not "DEBUG " "optimized" } } > -- > 2.35.1 >