On Sat, Oct 25, 2025 at 6:52 AM Andrew Pinski
<[email protected]> wrote:
>
> After r16-4081-g966cdec2b2 which added folding of __builtin_assume_aligned,
> forwprop would propagate pointers that lower alignment replacing ones with
> greater alignment. This causes us to lose alignment information that
> __builtin_assume_aligned provided to expand.  Normally this just loses some
> optimizations except in the s390 case where the alignment is specifically
> checked and was for inlining of the atomics; without this patch an infininite
> loop would happen.
>
> Note this was previously broken for -Og before r16-4081-g966cdec2b2. This
> fixes -Og case as forwprop is used instead of copyprop.
>
> This moves the testcase for pr107389.c to torture to get a generic testcase.
> pr107389.c was originally for -O0 case but we should test for other
> optimization levels so this is not lost again.
>
> align-5.c is xfailed because __builtin_assume_aligned is not instrumented for 
> ubsan
> alignment and ubsan check to see pointer is aligned before emitting a check 
> for the
> load (based on the known alignment in compiling). See PR 122038 too. I had 
> mentioned
> this issue previously in r16-4081-g966cdec2b2 too.

So what made you not chose to make use of maybe_duplicate_ssa_info_at_copy
in forwprop like copyprop does?

>         PR middle-end/107389
>         PR tree-optimization/122086
> gcc/ChangeLog:
>
>         * tree-ssa-forwprop.cc (forwprop_may_propagate_copy): New function.
>         (pass_forwprop::execute):  Use forwprop_may_propagate_copy
>         instead of may_propagate_copy.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr107389.c: Move to...
>         * gcc.dg/torture/pr107389.c: ...here. Skip for lto.
>         Use dg-additional-options rather than dg-options.
>         * c-c++-common/ubsan/align-5.c: xfail.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  gcc/testsuite/c-c++-common/ubsan/align-5.c    |  4 ++-
>  gcc/testsuite/gcc.dg/{ => torture}/pr107389.c |  3 +-
>  gcc/tree-ssa-forwprop.cc                      | 32 ++++++++++++++++---
>  3 files changed, 33 insertions(+), 6 deletions(-)
>  rename gcc/testsuite/gcc.dg/{ => torture}/pr107389.c (73%)
>
> diff --git a/gcc/testsuite/c-c++-common/ubsan/align-5.c 
> b/gcc/testsuite/c-c++-common/ubsan/align-5.c
> index 484790134a6..6d2ac26612b 100644
> --- a/gcc/testsuite/c-c++-common/ubsan/align-5.c
> +++ b/gcc/testsuite/c-c++-common/ubsan/align-5.c
> @@ -11,4 +11,6 @@ foo (char *p)
>    return *q;
>  }
>
> -/* { dg-final { scan-assembler "__ubsan_handle" } } */
> +/* xfail, see PR 122038 as __builtin_assume_aligned should be instrumented 
> instead
> +   of only the load. */
> +/* { dg-final { scan-assembler "__ubsan_handle" { xfail *-*-* } } } */
> diff --git a/gcc/testsuite/gcc.dg/pr107389.c 
> b/gcc/testsuite/gcc.dg/torture/pr107389.c
> similarity index 73%
> rename from gcc/testsuite/gcc.dg/pr107389.c
> rename to gcc/testsuite/gcc.dg/torture/pr107389.c
> index deb63380704..23c2776ab73 100644
> --- a/gcc/testsuite/gcc.dg/pr107389.c
> +++ b/gcc/testsuite/gcc.dg/torture/pr107389.c
> @@ -1,5 +1,6 @@
>  /* { dg-do compile } */
> -/* { dg-options "-fdump-tree-optimized-alias" } */
> +/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
> +/* { dg-additional-options "-fdump-tree-optimized-alias" } */
>
>  unsigned foo (void *p)
>  {
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index 68e80baa46c..98c98dd8be4 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -216,6 +216,30 @@ static bitmap to_purge;
>  /* Const-and-copy lattice.  */
>  static vec<tree> lattice;
>
> +/* forwprop_may_propagate_copy is like may_propagate_copy except
> +   after the final folding, don't allow propagating of pointer ORIG
> +   that have a lower alignment than the DEST name.
> +   This is to prevent losing alignment information from __ 
> builtin_assume_aligned for expand (See also PR 122086).  */
> +static bool
> +forwprop_may_propagate_copy (tree dest, tree orig,
> +                            bool dest_not_abnormal_phi_edge_p = false)
> +{
> +  if (!may_propagate_copy (dest, orig, dest_not_abnormal_phi_edge_p))
> +    return false;
> +
> +  /* Only check alignment for the final folding.  */
> +  if (!(cfun->curr_properties & PROP_last_full_fold))
> +    return true;
> +
> +  /* Alignment only matters for pointer types.  */
> +  if (!POINTER_TYPE_P (TREE_TYPE (dest)) || !POINTER_TYPE_P (TREE_TYPE 
> (orig)))
> +    return true;
> +
> +  unsigned aligndest = get_pointer_alignment (dest);
> +  unsigned alignorig = get_pointer_alignment (orig);
> +  return aligndest <= alignorig;
> +}
> +
>  /* Set the lattice entry for NAME to VAL.  */
>  static void
>  fwprop_set_lattice_val (tree name, tree val)
> @@ -5177,7 +5201,7 @@ pass_forwprop::execute (function *fun)
>             }
>           if (all_same)
>             {
> -             if (may_propagate_copy (res, first))
> +             if (forwprop_may_propagate_copy (res, first))
>                 to_remove_defs.safe_push (SSA_NAME_VERSION (res));
>               fwprop_set_lattice_val (res, first);
>             }
> @@ -5532,7 +5556,7 @@ pass_forwprop::execute (function *fun)
>                 {
>                   if (!is_gimple_debug (stmt))
>                     bitmap_set_bit (simple_dce_worklist, SSA_NAME_VERSION 
> (use));
> -                 if (may_propagate_copy (use, val))
> +                 if (forwprop_may_propagate_copy (use, val))
>                     {
>                       propagate_value (usep, val);
>                       substituted_p = true;
> @@ -5695,7 +5719,7 @@ pass_forwprop::execute (function *fun)
>                   /* If we can propagate the lattice-value mark the
>                      stmt for removal.  */
>                   if (val != lhs
> -                     && may_propagate_copy (lhs, val))
> +                     && forwprop_may_propagate_copy (lhs, val))
>                     to_remove_defs.safe_push (SSA_NAME_VERSION (lhs));
>                   fwprop_set_lattice_val (lhs, val);
>                 }
> @@ -5717,7 +5741,7 @@ pass_forwprop::execute (function *fun)
>               continue;
>             tree val = fwprop_ssa_val (arg);
>             if (val != arg
> -               && may_propagate_copy (arg, val, !(e->flags & EDGE_ABNORMAL)))
> +               && forwprop_may_propagate_copy (arg, val, !(e->flags & 
> EDGE_ABNORMAL)))
>               propagate_value (use_p, val);
>           }
>
> --
> 2.43.0
>

Reply via email to