On Tue, 21 Apr 2020, Martin Jambor wrote:

> On Wed, Apr 08 2020, Martin Jambor wrote:
> >
> [...]
> >
> > 2020-04-08  Martin Jambor  <mjam...@suse.cz>
> >         Richard Biener  <rguent...@suse.de>
> >
> >     PR tree-optimization/94482
> >     * tree-sra.c (create_access_replacement): Dump new replacement with
> >     TDF_UID.
> >     (sra_modify_expr): Fix handling of cases when the original EXPR writes
> >     to only part of the replacement.
> >     * tree-ssa-forwprop.c (pass_forwprop::execute): Properly verify
> >     the first operand of combinations into REAL/IMAGPART_EXPR and
> >     BIT_FIELD_REF.
> >
> >     testsuite/
> >     * gcc.dg/torture/pr94482.c: New test.
> >     * gcc.dg/tree-ssa/pr94482-2.c: Likewise.
> 
> I'd like to backport the patch to the gcc-9 and gcc-8 branches.  The
> backport patch is the same for both release branches, the differences
> compared to the mainline one are:
> 
> 1. the code handling BIT_FIELD_REF if fwprop is not present on the
>    release branches so the "fixing" hunk was dropped, and
> 
> 2. the testcase options were changed to what Jakub put there on
>    the mainline to suppress all vector ABI warnings.
> 
> Bootstrapped and tested on x86_64-linux.  OK for both?

OK.

Thanks,
Richard.

> Thanks,
> 
> Martin
> 
> 
> 2020-04-21  Martin Jambor  <mjam...@suse.cz>
> 
>         Backport from master
>       2020-04-09  Martin Jambor  <mjam...@suse.cz>
>                     Richard Biener  <rguent...@suse.de>
> 
>       PR tree-optimization/94482
>       * tree-sra.c (create_access_replacement): Dump new replacement with
>       TDF_UID.
>       (sra_modify_expr): Fix handling of cases when the original EXPR writes
>       to only part of the replacement.
>       * tree-ssa-forwprop.c (pass_forwprop::execute): Properly verify
>       the first operand of combinations into REAL/IMAGPART_EXPR and
>       BIT_FIELD_REF.
> 
>       testsuite/
>       * gcc.dg/torture/pr94482.c: New test.
>       * gcc.dg/tree-ssa/pr94482-2.c: Likewise.
> ---
>  gcc/ChangeLog                             | 15 +++++++
>  gcc/testsuite/ChangeLog                   |  9 ++++
>  gcc/testsuite/gcc.dg/torture/pr94482.c    | 36 ++++++++++++++++
>  gcc/testsuite/gcc.dg/tree-ssa/pr94482-2.c | 50 +++++++++++++++++++++++
>  gcc/tree-sra.c                            | 31 ++++++++++++--
>  gcc/tree-ssa-forwprop.c                   |  3 +-
>  6 files changed, 139 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr94482.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr94482-2.c
> 
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index 7df3a0d0990..be843b53e6c 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,18 @@
> +2020-04-21  Martin Jambor  <mjam...@suse.cz>
> +
> +     Backport from master
> +     2020-04-09  Martin Jambor  <mjam...@suse.cz>
> +                 Richard Biener  <rguent...@suse.de>
> +
> +     PR tree-optimization/94482
> +     * tree-sra.c (create_access_replacement): Dump new replacement with
> +     TDF_UID.
> +     (sra_modify_expr): Fix handling of cases when the original EXPR writes
> +     to only part of the replacement.
> +     * tree-ssa-forwprop.c (pass_forwprop::execute): Properly verify
> +     the first operand of combinations into REAL/IMAGPART_EXPR and
> +     BIT_FIELD_REF.
> +
>  2020-04-17  H.J. Lu  <hongjiu...@intel.com>
>  
>       Backport from master
> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
> index 3df9dd78d0c..248244343c4 100644
> --- a/gcc/testsuite/ChangeLog
> +++ b/gcc/testsuite/ChangeLog
> @@ -1,3 +1,12 @@
> +2020-04-21  Martin Jambor  <mjam...@suse.cz>
> +
> +     Backport from master
> +     2020-04-09  Martin Jambor  <mjam...@suse.cz>
> +
> +     PR tree-optimization/94482
> +     * gcc.dg/torture/pr94482.c: New test.
> +     * gcc.dg/tree-ssa/pr94482-2.c: Likewise.
> +
>  2020-04-17  H.J. Lu  <hongjiu...@intel.com>
>  
>       Backport from master
> diff --git a/gcc/testsuite/gcc.dg/torture/pr94482.c 
> b/gcc/testsuite/gcc.dg/torture/pr94482.c
> new file mode 100644
> index 00000000000..9264842e349
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr94482.c
> @@ -0,0 +1,36 @@
> +/* { dg-do run } */
> +/* { dg-additional-options "-Wno-psabi -w" } */
> +/* { dg-additional-options "-msse2" { target sse2_runtime } } */
> +
> +typedef unsigned V __attribute__ ((__vector_size__ (16)));
> +union U
> +{
> +  V j;
> +  unsigned long long i __attribute__ ((__vector_size__ (16)));
> +};
> +
> +static inline __attribute__((always_inline)) V
> +foo (unsigned long long a)
> +{
> +  union U z = { .j = (V) {} };
> +  for (unsigned long i = 0; i < 1; i++)
> +    z.i[i] = a;
> +  return z.j;
> +}
> +
> +static inline __attribute__((always_inline)) V
> +bar (V a, unsigned long long i, int q)
> +{
> +  union U z = { .j = a };
> +  z.i[q] = i;
> +  return z.j;
> +}
> +
> +int
> +main ()
> +{
> +  union U z = { .j = bar (foo (1729), 2, 1) };
> +  if (z.i[0] != 1729)
> +    __builtin_abort ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94482-2.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr94482-2.c
> new file mode 100644
> index 00000000000..fcac9d5e439
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr94482-2.c
> @@ -0,0 +1,50 @@
> +/* { dg-do run } */
> +/* { dg-options "-O1" } */
> +
> +typedef unsigned long V __attribute__ ((__vector_size__ (8)));
> +typedef _Complex int Ci;
> +typedef _Complex float Cf;
> +
> +union U
> +{
> +  Ci ci;
> +  Cf cf;
> +};
> +
> +volatile Ci vgi;
> +
> +Cf foo (Cf c)
> +{
> +  __real c = 0x1ffp10;
> +  return c;
> +}
> +
> +Ci ioo (Ci c)
> +{
> +  __real c = 50;
> +  return c;
> +}
> +
> +
> +int main (int argc, char *argv[])
> +{
> +  union U u;
> +
> +  __real u.ci = 500;
> +  __imag u.ci = 1000;
> +  vgi = u.ci;
> +
> +  u.ci = ioo (u.ci);
> +  __imag u.ci = 100;
> +
> +  if (__real u.ci != 50 || __imag u.ci != 100)
> +    __builtin_abort();
> +
> +  u.cf = foo (u.cf);
> +  __imag u.cf = 0x1p3;
> +
> +  if (__real u.cf != 0x1ffp10 || __imag u.cf != 0x1p3)
> +    __builtin_abort();
> +
> +  return 0;
> +}
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index 0a5c24a183a..805839cac50 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -2329,7 +2329,7 @@ create_access_replacement (struct access *access, tree 
> reg_type = NULL_TREE)
>         print_generic_expr (dump_file, access->base);
>         fprintf (dump_file, " offset: %u, size: %u: ",
>                  (unsigned) access->offset, (unsigned) access->size);
> -       print_generic_expr (dump_file, repl);
> +       print_generic_expr (dump_file, repl, TDF_UID);
>         fprintf (dump_file, "\n");
>       }
>      }
> @@ -3187,6 +3187,7 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator *gsi, 
> bool write)
>    location_t loc;
>    struct access *access;
>    tree type, bfr, orig_expr;
> +  bool partial_cplx_access = false;
>  
>    if (TREE_CODE (*expr) == BIT_FIELD_REF)
>      {
> @@ -3197,7 +3198,10 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator 
> *gsi, bool write)
>      bfr = NULL_TREE;
>  
>    if (TREE_CODE (*expr) == REALPART_EXPR || TREE_CODE (*expr) == 
> IMAGPART_EXPR)
> -    expr = &TREE_OPERAND (*expr, 0);
> +    {
> +      expr = &TREE_OPERAND (*expr, 0);
> +      partial_cplx_access = true;
> +    }
>    access = get_access_for_expr (*expr);
>    if (!access)
>      return false;
> @@ -3225,13 +3229,32 @@ sra_modify_expr (tree *expr, gimple_stmt_iterator 
> *gsi, bool write)
>           be accessed as a different type too, potentially creating a need for
>           type conversion (see PR42196) and when scalarized unions are 
> involved
>           in assembler statements (see PR42398).  */
> -      if (!useless_type_conversion_p (type, access->type))
> +      if (!bfr && !useless_type_conversion_p (type, access->type))
>       {
>         tree ref;
>  
>         ref = build_ref_for_model (loc, orig_expr, 0, access, gsi, false);
>  
> -       if (write)
> +       if (partial_cplx_access)
> +         {
> +         /* VIEW_CONVERT_EXPRs in partial complex access are always fine in
> +            the case of a write because in such case the replacement cannot
> +            be a gimple register.  In the case of a load, we have to
> +            differentiate in between a register an non-register
> +            replacement.  */
> +           tree t = build1 (VIEW_CONVERT_EXPR, type, repl);
> +           gcc_checking_assert (!write || access->grp_partial_lhs);
> +           if (!access->grp_partial_lhs)
> +             {
> +               tree tmp = make_ssa_name (type);
> +               gassign *stmt = gimple_build_assign (tmp, t);
> +               /* This is always a read. */
> +               gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
> +               t = tmp;
> +             }
> +           *expr = t;
> +         }
> +       else if (write)
>           {
>             gassign *stmt;
>  
> diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
> index bbfa1bc6fae..ca5443b79b3 100644
> --- a/gcc/tree-ssa-forwprop.c
> +++ b/gcc/tree-ssa-forwprop.c
> @@ -2357,7 +2357,8 @@ pass_forwprop::execute (function *fun)
>                   continue;
>                 if (!is_gimple_assign (use_stmt)
>                     || (gimple_assign_rhs_code (use_stmt) != REALPART_EXPR
> -                       && gimple_assign_rhs_code (use_stmt) != 
> IMAGPART_EXPR))
> +                       && gimple_assign_rhs_code (use_stmt) != IMAGPART_EXPR)
> +                   || TREE_OPERAND (gimple_assign_rhs1 (use_stmt), 0) != lhs)
>                   {
>                     rewrite = false;
>                     break;
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to