On Fri, Aug 23, 2024 at 5:38 AM Richard Biener <rguent...@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

Reply via email to