For more context please see
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116352#c11.

I've sent this as an RFC because it's hard to be sure that this was
just uncovered by r15-2820-gab18785840d7b8 rather than being
introduced by it.
Still, to the best of my knowledge after reading through the code,
this looked like a general issue to me and hence I'm proposing this
fix.

Thanks,
Manolis

On Fri, Aug 30, 2024 at 1:46 PM Manolis Tsamis <manolis.tsa...@vrull.eu> wrote:
>
> Currently we do SLP CSE after permute optimization using a single map across
> all SLP instances. These SLP instances can affect many different basic blocks
> and the cache may replace a statement in one block with one from another 
> block.
> Because there are no further limitations and the blocks may be visited in an
> arbitrary order, this may lead to a statement being used in paths that may not
> be defined. This patch creates one map per SLP instance to address that.
>
>         PR tree-optimization/116352
>
> gcc/ChangeLog:
>
>         * tree-vect-slp.cc (vect_optimize_slp): Use one scalar stmts to tree
>         map per SLP instance.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr116352.c: New test.
>
> Signed-off-by: Manolis Tsamis <manolis.tsa...@vrull.eu>
> ---
>
>  gcc/testsuite/gcc.dg/pr116352.c | 18 ++++++++++++++++++
>  gcc/tree-vect-slp.cc            | 12 +++++++-----
>  2 files changed, 25 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr116352.c
>
> diff --git a/gcc/testsuite/gcc.dg/pr116352.c b/gcc/testsuite/gcc.dg/pr116352.c
> new file mode 100644
> index 00000000000..c427eff3c08
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr116352.c
> @@ -0,0 +1,18 @@
> +/* PR tree-optimization/116352 */
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -fchecking" } */
> +
> +int a;
> +float b, c;
> +void l(int h, int f, int g, float *e)
> +{
> +  for (int m = 0; m < h; m++)
> +  {
> +    float i = 2 * b, j = 2 * c;
> +    if (a) {
> +      e[m*4 + 0] = e[m*4 + 1] = (j - g * 0.5f);
> +      e[m*4 + 2] = e[m*4 + 3] = (i + f * 0.5f);
> +    } else
> +      e[m*4 + 0] = f * 0.5f + g * 0.5f;
> +  }
> +}
> diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
> index cfdf59ad386..a8836c2fb04 100644
> --- a/gcc/tree-vect-slp.cc
> +++ b/gcc/tree-vect-slp.cc
> @@ -6356,13 +6356,15 @@ vect_optimize_slp (vec_info *vinfo)
>    vect_optimize_slp_pass (vinfo).run ();
>
>    /* Apply CSE again to nodes after permute optimization.  */
> -  scalar_stmts_to_slp_tree_map_t *bst_map
> -    = new scalar_stmts_to_slp_tree_map_t ();
> -
>    for (auto inst : vinfo->slp_instances)
> -    vect_cse_slp_nodes (bst_map, SLP_INSTANCE_TREE (inst));
> +    {
> +      scalar_stmts_to_slp_tree_map_t *bst_map
> +       = new scalar_stmts_to_slp_tree_map_t ();
>
> -  release_scalar_stmts_to_slp_tree_map (bst_map);
> +      vect_cse_slp_nodes (bst_map, SLP_INSTANCE_TREE (inst));
> +
> +      release_scalar_stmts_to_slp_tree_map (bst_map);
> +    }
>  }
>
>  /* Gather loads reachable from the individual SLP graph entries.  */
> --
> 2.34.1
>

Reply via email to