On Tue, 1 Oct 2024, Qing Zhao wrote:

> From: Richard Biener <rguent...@suse.de>
> 
> Hi, this is the backport of the fix for PR116585 to GCC13.
> bootstrapped and regress tested on both X86 and aarch64.
> 
> Okay for committing?

OK.

> thanks.
> 
> Qing.
> 
> =======
> split_constant_offset when looking through SSA defs can end up
> picking SSA leafs that are subject to abnormal coalescing.  This
> can lead to downstream consumers to insert code based on the
> result (like from dataref analysis) in places that violate constraints
> for abnormal coalescing.  It's best to not expand defs whose operands
> are subject to abnormal coalescing - and not either do something when
> a subexpression has operands like that already.
> 
>       PR tree-optimization/116585
>       * tree-data-ref.cc (split_constant_offset_1): When either
>       operand is subject to abnormal coalescing do no further
>       processing.
> 
>       * gcc.dg/torture/pr116585.c: New testcase.
> 
> (cherry picked from commit 1d0cb3b5fca69b81e69cfdb4aea0eebc1ac04750)
> ---
>  gcc/testsuite/gcc.dg/torture/pr116585.c | 32 +++++++++++++++++++++++++
>  gcc/tree-data-ref.cc                    | 11 ++++++---
>  2 files changed, 40 insertions(+), 3 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr116585.c
> 
> diff --git a/gcc/testsuite/gcc.dg/torture/pr116585.c 
> b/gcc/testsuite/gcc.dg/torture/pr116585.c
> new file mode 100644
> index 00000000000..108c481e104
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr116585.c
> @@ -0,0 +1,32 @@
> +/* { dg-do compile } */
> +
> +char *s1, *s2;
> +extern int* my_alloc (int);
> +extern int _setjmp ();
> +extern void bar();
> +void foo(int s1len, int s2len)
> +{
> +  int e;
> +  e = _setjmp ();
> +    {
> +      int l, i;
> +      int *md = my_alloc(((sizeof(int)) * (s1len + 1) * (s2len)));
> +      s1len++;
> +      for (; s1len; l)
> +     for (; s2len; l)
> +       for (; s1len; i)
> +         {
> +           int j = 1;
> +           for (; j < s2len; j++)
> +             {
> +               int cost;
> +               if (s1[1] == s2[1])
> +                 cost = 0;
> +               else
> +                 cost = 1;
> +               md[j * s1len ] = ((cost));
> +             }
> +         }
> +      bar();
> +    }
> +}
> diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc
> index 96934addff1..7657eeaf9e6 100644
> --- a/gcc/tree-data-ref.cc
> +++ b/gcc/tree-data-ref.cc
> @@ -763,6 +763,14 @@ split_constant_offset_1 (tree type, tree op0, enum 
> tree_code code, tree op1,
>    if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_TRAPS (type))
>      return false;
>  
> +  if (TREE_CODE (op0) == SSA_NAME
> +      && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
> +    return false;
> +  if (op1
> +      && TREE_CODE (op1) == SSA_NAME
> +      && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op1))
> +    return false;
> +
>    switch (code)
>      {
>      case INTEGER_CST:
> @@ -855,9 +863,6 @@ split_constant_offset_1 (tree type, tree op0, enum 
> tree_code code, tree op1,
>  
>      case SSA_NAME:
>        {
> -     if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
> -       return false;
> -
>       gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
>       enum tree_code subcode;
>  
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to