On Fri, 1 Mar 2019 at 10:20, Richard Biener <rguent...@suse.de> wrote: > > On Wed, 27 Feb 2019, Richard Biener wrote: > > > > > CFG cleanup is now set up to perform trivial unreachable code > > elimination before doing anything that would require up-to-date > > SSA form. Unfortunately a pending SSA update still will cause > > breakage to stmt folding triggered for example by basic-block > > merging. > > > > Fortunately it's now easy to properly "interleave" CFG cleanup > > and SSA update. > > > > Done as follows, bootstrap & regtest running on x86_64-unknown-linux-gnu. > > Testing went OK, two testcases need adjustments though. > > FAIL: gcc.dg/tree-ssa/reassoc-43.c scan-tree-dump-not reassoc2 "0 != 0" > > here we now end up with if (_20 != 0) matching. > > FAIL: g++.dg/tree-prof/devirt.C scan-tree-dump-times dom3 "folding virtual > function call to virtual unsigned int mozPersonalDictionary::AddRef" 1 > FAIL: g++.dg/tree-prof/devirt.C scan-tree-dump-times dom3 "folding virtual > function call to virtual unsigned int mozPersonalDictionary::_ZThn16" 1 > > here both foldings now alrady happen one pass earlier (during tracer > triggered CFG cleanup). Previously the folding didn't happen because > the SSA names were marked for SSA update. > > Committed as follows. >
Hi Richard, I've noticed a regression after you committed this patch: FAIL: gcc.dg/uninit-pred-8_b.c bogus warning (test for bogus messages, line 20) FAIL: gcc.dg/uninit-pred-8_b.c bogus warning (test for bogus messages, line 39) FAIL: gcc.dg/uninit-pred-8_b.c warning (test for warnings, line 42) It's unusual because I see that on arm-none-linux-gnueabihf --with-cpu cortex-a5 --with-fpu vfpv3-d16-fp16 but the same test still passes on the same target --with-cpu cortex-a9 --with-fpu neon-fp16 Any idea? Thanks, Christophe > Richard. > > 2019-03-01 Richard Biener <rguent...@suse.de> > > PR middle-end/89497 > * tree-cfgcleanup.h (cleanup_tree_cfg): Add SSA update flags > argument, defaulted to zero. > * passes.c (execute_function_todo): Pass down SSA update flags > to cleanup_tree_cfg. > * tree-cfgcleanup.c: Include tree-into-ssa.h and tree-cfgcleanup.h. > (cleanup_tree_cfg_noloop): After cleanup_control_flow_pre update SSA > form if requested. > (cleanup_tree_cfg): Get and pass down SSA update flags. > > * gcc.dg/tree-ssa/reassoc-43.c: Avoid false match in regex. > * g++.dg/tree-prof/devirt.C: Scan tracer dump for foldings > that happen now earlier. > > Index: gcc/tree-cfgcleanup.h > =================================================================== > --- gcc/tree-cfgcleanup.h (revision 269251) > +++ gcc/tree-cfgcleanup.h (working copy) > @@ -22,7 +22,7 @@ along with GCC; see the file COPYING3. > > /* In tree-cfgcleanup.c */ > extern bitmap cfgcleanup_altered_bbs; > -extern bool cleanup_tree_cfg (void); > +extern bool cleanup_tree_cfg (unsigned = 0); > extern bool fixup_noreturn_call (gimple *stmt); > extern bool delete_unreachable_blocks_update_callgraph (cgraph_node > *dst_node, > bool update_clones); > Index: gcc/passes.c > =================================================================== > --- gcc/passes.c (revision 269251) > +++ gcc/passes.c (working copy) > @@ -1927,7 +1927,7 @@ execute_function_todo (function *fn, voi > /* Always cleanup the CFG before trying to update SSA. */ > if (flags & TODO_cleanup_cfg) > { > - cleanup_tree_cfg (); > + cleanup_tree_cfg (flags & TODO_update_ssa_any); > > /* When cleanup_tree_cfg merges consecutive blocks, it may > perform some simplistic propagation when removing single > Index: gcc/tree-cfgcleanup.c > =================================================================== > --- gcc/tree-cfgcleanup.c (revision 269251) > +++ gcc/tree-cfgcleanup.c (working copy) > @@ -44,6 +44,9 @@ along with GCC; see the file COPYING3. > #include "gimple-fold.h" > #include "tree-ssa-loop-niter.h" > #include "cgraph.h" > +#include "tree-into-ssa.h" > +#include "tree-cfgcleanup.h" > + > > /* The set of blocks in that at least one of the following changes happened: > -- the statement at the end of the block was changed > @@ -943,7 +946,7 @@ mfb_keep_latches (edge e) > Return true if the flowgraph was modified, false otherwise. */ > > static bool > -cleanup_tree_cfg_noloop (void) > +cleanup_tree_cfg_noloop (unsigned ssa_update_flags) > { > timevar_push (TV_TREE_CLEANUP_CFG); > > @@ -1023,6 +1026,8 @@ cleanup_tree_cfg_noloop (void) > > /* After doing the above SSA form should be valid (or an update SSA > should be required). */ > + if (ssa_update_flags) > + update_ssa (ssa_update_flags); > > /* Compute dominator info which we need for the iterative process below. > */ > if (!dom_info_available_p (CDI_DOMINATORS)) > @@ -1125,9 +1130,9 @@ repair_loop_structures (void) > /* Cleanup cfg and repair loop structures. */ > > bool > -cleanup_tree_cfg (void) > +cleanup_tree_cfg (unsigned ssa_update_flags) > { > - bool changed = cleanup_tree_cfg_noloop (); > + bool changed = cleanup_tree_cfg_noloop (ssa_update_flags); > > if (current_loops != NULL > && loops_state_satisfies_p (LOOPS_NEED_FIXUP)) > Index: gcc/testsuite/g++.dg/tree-prof/devirt.C > =================================================================== > --- gcc/testsuite/g++.dg/tree-prof/devirt.C (revision 269301) > +++ gcc/testsuite/g++.dg/tree-prof/devirt.C (working copy) > @@ -1,5 +1,5 @@ > /* PR ipa/88561 */ > -/* { dg-options "-O3 -fdump-tree-dom3-details" } */ > +/* { dg-options "-O3 -fdump-tree-tracer-details -fdump-tree-dom3-details" } > */ > > struct nsISupports > { > @@ -121,6 +121,6 @@ main () > __builtin_abort (); > } > > -/* { dg-final-use-not-autofdo { scan-tree-dump-times "folding virtual > function call to virtual unsigned int mozPersonalDictionary::_ZThn16" 1 > "dom3" { target { lp64 || llp64 } } } } */ > +/* { dg-final-use-not-autofdo { scan-tree-dump-times "folding virtual > function call to virtual unsigned int mozPersonalDictionary::_ZThn16" 1 > "tracer" { target { lp64 || llp64 } } } } */ > /* { dg-final-use-not-autofdo { scan-tree-dump-times "folding virtual > function call to virtual unsigned int mozPersonalDictionary::_ZThn8" 1 "dom3" > { target ilp32 } } } */ > -/* { dg-final-use-not-autofdo { scan-tree-dump-times "folding virtual > function call to virtual unsigned int mozPersonalDictionary::AddRef" 1 "dom3" > } } */ > +/* { dg-final-use-not-autofdo { scan-tree-dump-times "folding virtual > function call to virtual unsigned int mozPersonalDictionary::AddRef" 1 > "tracer" } } */ > Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-43.c > =================================================================== > --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-43.c (revision 269301) > +++ gcc/testsuite/gcc.dg/tree-ssa/reassoc-43.c (working copy) > @@ -50,4 +50,4 @@ c_parser_translation_unit (c_parser * pa > } > } > } > -/* { dg-final { scan-tree-dump-not "0 != 0" "reassoc2"} } */ > +/* { dg-final { scan-tree-dump-not "\[ (\]0 != 0" "reassoc2"} } */