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"} } */

Reply via email to