diff mbox series

tree-optimization/116463 - complex lowering leaves around dead stmts

Message ID 20240823123713.40B9A1333E@imap1.dmz-prg2.suse.org
State New
Headers show
Series tree-optimization/116463 - complex lowering leaves around dead stmts | expand

Commit Message

Richard Biener Aug. 23, 2024, 12:37 p.m. UTC
Complex lowering generally replaces existing complex defs with
COMPLEX_EXPRs but those might be dead when it can always refer to
components from the lattice.  This in turn can pessimize followup
transforms like forwprop and reassoc, the following makes sure to
get rid of dead COMPLEX_EXPRs generated by using
simple_dce_from_worklist.

Bootstrapped and tested on x86_64-unknown-linux-gnu, this will cause
the following fallout which is similar to the aarch64 fallout in
PR116463, complex SLP recognition being somewhat fragile.  I'll track
this there.  Pushed.

FAIL: gcc.target/i386/avx512fp16-vector-complex-float.c scan-assembler-not 
vfma
dd[123]*ph[ \\\\t]
FAIL: gcc.target/i386/avx512fp16-vector-complex-float.c 
scan-assembler-times vf
maddcph[ \\\\t] 1
FAIL: gcc.target/i386/part-vect-complexhf.c scan-assembler-times 
vfmaddcph[ \\\\t] 1


	PR tree-optimization/116463
	* tree-complex.cc: Include tree-ssa-dce.h.
	(dce_worklist): New global.
	(update_complex_assignment): Add SSA def to the DCE worklist.
	(tree_lower_complex): Perform DCE.
---
 gcc/tree-complex.cc | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Andrew Pinski Aug. 23, 2024, 8:46 p.m. UTC | #1
On Fri, Aug 23, 2024 at 5:38 AM Richard Biener <rguenther@suse.de> wrote:
>
> Complex lowering generally replaces existing complex defs with
> COMPLEX_EXPRs but those might be dead when it can always refer to
> components from the lattice.  This in turn can pessimize followup
> transforms like forwprop and reassoc, the following makes sure to
> get rid of dead COMPLEX_EXPRs generated by using
> simple_dce_from_worklist.

Just an FYI, I had noticed this also when looking into PR 115544, 2
months ago and I was thinking about implementing then.
It also fixes that issue without the change to the _BitInt lower.

Thanks,
Andrew Pinski

>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, this will cause
> the following fallout which is similar to the aarch64 fallout in
> PR116463, complex SLP recognition being somewhat fragile.  I'll track
> this there.  Pushed.
>
> FAIL: gcc.target/i386/avx512fp16-vector-complex-float.c scan-assembler-not
> vfma
> dd[123]*ph[ \\\\t]
> FAIL: gcc.target/i386/avx512fp16-vector-complex-float.c
> scan-assembler-times vf
> maddcph[ \\\\t] 1
> FAIL: gcc.target/i386/part-vect-complexhf.c scan-assembler-times
> vfmaddcph[ \\\\t] 1
>
>
>         PR tree-optimization/116463
>         * tree-complex.cc: Include tree-ssa-dce.h.
>         (dce_worklist): New global.
>         (update_complex_assignment): Add SSA def to the DCE worklist.
>         (tree_lower_complex): Perform DCE.
> ---
>  gcc/tree-complex.cc | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
> index dfb45b9d91c..7480c07640e 100644
> --- a/gcc/tree-complex.cc
> +++ b/gcc/tree-complex.cc
> @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.  If not see
>  #include "case-cfn-macros.h"
>  #include "builtins.h"
>  #include "optabs-tree.h"
> +#include "tree-ssa-dce.h"
>
>  /* For each complex ssa name, a lattice value.  We're interested in finding
>     out whether a complex number is degenerate in some way, having only real
> @@ -88,6 +89,9 @@ static vec<gphi *> phis_to_revisit;
>  /* BBs that need EH cleanup.  */
>  static bitmap need_eh_cleanup;
>
> +/* SSA defs we should try to DCE.  */
> +static bitmap dce_worklist;
> +
>  /* Lookup UID in the complex_variable_components hashtable and return the
>     associated tree.  */
>  static tree
> @@ -731,6 +735,7 @@ update_complex_assignment (gimple_stmt_iterator *gsi, tree r, tree i)
>    update_stmt (stmt);
>    if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
>      bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
> +  bitmap_set_bit (dce_worklist, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
>
>    update_complex_components (gsi, gsi_stmt (*gsi), r, i);
>  }
> @@ -1962,6 +1967,7 @@ tree_lower_complex (void)
>    complex_propagate.ssa_propagate ();
>
>    need_eh_cleanup = BITMAP_ALLOC (NULL);
> +  dce_worklist = BITMAP_ALLOC (NULL);
>
>    complex_variable_components = new int_tree_htab_type (10);
>
> @@ -2008,6 +2014,9 @@ tree_lower_complex (void)
>
>    gsi_commit_edge_inserts ();
>
> +  simple_dce_from_worklist (dce_worklist, need_eh_cleanup);
> +  BITMAP_FREE (dce_worklist);
> +
>    unsigned todo
>      = gimple_purge_all_dead_eh_edges (need_eh_cleanup) ? TODO_cleanup_cfg : 0;
>    BITMAP_FREE (need_eh_cleanup);
> --
> 2.43.0
diff mbox series

Patch

diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
index dfb45b9d91c..7480c07640e 100644
--- a/gcc/tree-complex.cc
+++ b/gcc/tree-complex.cc
@@ -46,6 +46,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "case-cfn-macros.h"
 #include "builtins.h"
 #include "optabs-tree.h"
+#include "tree-ssa-dce.h"
 
 /* For each complex ssa name, a lattice value.  We're interested in finding
    out whether a complex number is degenerate in some way, having only real
@@ -88,6 +89,9 @@  static vec<gphi *> phis_to_revisit;
 /* BBs that need EH cleanup.  */
 static bitmap need_eh_cleanup;
 
+/* SSA defs we should try to DCE.  */
+static bitmap dce_worklist;
+
 /* Lookup UID in the complex_variable_components hashtable and return the
    associated tree.  */
 static tree
@@ -731,6 +735,7 @@  update_complex_assignment (gimple_stmt_iterator *gsi, tree r, tree i)
   update_stmt (stmt);
   if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
     bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
+  bitmap_set_bit (dce_worklist, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
 
   update_complex_components (gsi, gsi_stmt (*gsi), r, i);
 }
@@ -1962,6 +1967,7 @@  tree_lower_complex (void)
   complex_propagate.ssa_propagate ();
 
   need_eh_cleanup = BITMAP_ALLOC (NULL);
+  dce_worklist = BITMAP_ALLOC (NULL);
 
   complex_variable_components = new int_tree_htab_type (10);
 
@@ -2008,6 +2014,9 @@  tree_lower_complex (void)
 
   gsi_commit_edge_inserts ();
 
+  simple_dce_from_worklist (dce_worklist, need_eh_cleanup);
+  BITMAP_FREE (dce_worklist);
+
   unsigned todo
     = gimple_purge_all_dead_eh_edges (need_eh_cleanup) ? TODO_cleanup_cfg : 0;
   BITMAP_FREE (need_eh_cleanup);