On 07/24/2018 01:46 PM, Jakub Jelinek wrote: > On Tue, Jul 24, 2018 at 01:37:32PM +0200, Tom de Vries wrote: >> Another drawback is that the fake uses confuse the unitialized warning >> analysis, so that is switched off for -fkeep-vars-live. > > Is that really needed? I.e. can't you for the purpose of uninitialized > warning analysis ignore the clobber = var uses? >
This seems to work on the test-case that failed during testing (g++.dg/uninit-pred-4.C): ... diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c index 77f090bfa80..953db9ed02d 100644 --- a/gcc/tree-ssa-uninit.c +++ b/gcc/tree-ssa-uninit.c @@ -132,6 +132,9 @@ warn_uninit (enum opt_code wc, tree t, tree expr, tree var, if (is_gimple_assign (context) && gimple_assign_rhs_code (context) == COMPLEX_EXPR) return; + if (gimple_assign_single_p (context) + && TREE_CLOBBER_P (gimple_assign_lhs (context))) + return; if (!has_undefined_value_p (t)) return; ... But I don't know the pass well enough to know whether this is a sufficient fix. > Is the -fkeep-vars-live option -fcompare-debug friendly? > I think so, there's no reference to debug flags or instructions. >> --- a/gcc/cfgexpand.c >> +++ b/gcc/cfgexpand.c >> @@ -3533,6 +3533,13 @@ expand_clobber (tree lhs) >> } >> } >> >> +static void >> +expand_use (tree rhs) >> +{ >> + rtx target = expand_expr (rhs, NULL_RTX, VOIDmode, EXPAND_NORMAL); >> + emit_use (target); >> +} > > Missing function comment. > >> +fkeep-vars-live >> +Common Report Var(flag_keep_vars_live) Optimization >> +Add artificial uses of local vars at end of scope. > > at the end of scope? Is this better? +Add artificial use for each local variable at the end of the declaration scope Thanks, - Tom