On Wed, Dec 20, 2023 at 3:54 AM Alexandre Oliva <ol...@adacore.com> wrote:
>
>
> Builtin expanders for memset and memcpy may involve conditionals and
> loops, but their sequences may be end up emitted in edges.  Alas,
> commit_one_edge_insertion rejects sequences that end with a jump, a
> requirement that makes sense for insertions after expand, but not so
> much during expand.
>
> During expand, jumps may appear in the middle of the insert sequence
> as much as in the end, and it's only after committing edge insertions
> out of PHI nodes that we go through the entire function splitting
> blocks where needed, so relax the assert in commit_one_edge_insertion
> so that jumps are accepted during expand even at the end of the
> sequence.
>
> Regstrapping on x86_64-linux-gnu, after testing the testcase with a
> cross compiler to ppc64le-linux-gnu.  Ok to install?

OK.

>
> Builtin expanders for memset and memcpy may involve conditionals and
> loops, but their sequences may be end up emitted in edges.  Alas,
> commit_one_edge_insertion rejects sequences that end with a jump, a
> requirement that makes sense for insertions after expand, but not so
> much during expand.
>
> During expand, jumps may appear in the middle of the insert sequence
> as much as in the end, and it's only after committing edge insertions
> out of PHI nodes that we go through the entire function splitting
> blocks where needed, so relax the assert in commit_one_edge_insertion
> so that jumps are accepted during expand even at the end of the
> sequence.
>
>
> for  gcc/ChangeLog
>
>         PR rtl-optimization/113002
>         * cfgrtl.cc (commit_one_edge_insertion): Tolerate jumps in the
>         inserted sequence during expand.
>
> for  gcc/testsuite/ChangeLog
>
>         PR rtl-optimization/113002
>         * gcc.dg/vect/pr113002.c: New.
> ---
>  gcc/cfgrtl.cc                        |    8 +++++++-
>  gcc/testsuite/gcc.dg/vect/pr113002.c |   13 +++++++++++++
>  2 files changed, 20 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.dg/vect/pr113002.c
>
> diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
> index 2a3f853eed59b..437eb3a86d5c2 100644
> --- a/gcc/cfgrtl.cc
> +++ b/gcc/cfgrtl.cc
> @@ -2092,7 +2092,13 @@ commit_one_edge_insertion (edge e)
>         delete_insn (before);
>      }
>    else
> -    gcc_assert (!JUMP_P (last));
> +    /* Some builtin expanders, such as those for memset and memcpy,
> +       may generate loops and conditionals, and those may get emitted
> +       into edges.  That's ok while expanding to rtl, basic block
> +       boundaries will be identified and split afterwards.  ???  Need
> +       we check whether the destination labels of any inserted jumps
> +       are also part of the inserted sequence?  */
> +    gcc_assert (!JUMP_P (last) || currently_expanding_to_rtl);
>  }
>
>  /* Update the CFG for all queued instructions.  */
> diff --git a/gcc/testsuite/gcc.dg/vect/pr113002.c 
> b/gcc/testsuite/gcc.dg/vect/pr113002.c
> new file mode 100644
> index 0000000000000..186710f64b422
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr113002.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target int128 } */
> +/* { dg-options "-finline-stringops -Os" } */
> +
> +typedef __int128 v64u128 __attribute__((vector_size(64)));
> +int c;
> +v64u128 u;
> +void foo() {
> +  if (c)
> +    u = (v64u128){0};
> +  else
> +    u = (v64u128){1};
> +}
>
> --
> Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
>    Free Software Activist                   GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive

Reply via email to