On Thu, Jul 11, 2024 at 2:13 PM YunQiang Su <[email protected]> wrote:
>
> From: YunQiang Su <[email protected]>
>
> PR target/115840.
>
> In riscv_preferred_else_value, we create an uninitialized tmp var
> for else value, instead of the 0 (as default_preferred_else_value)
> or the pre-exists VAR (as aarch64 does), so that we can use agnostic
> policy.
>
> The problem is that `warn_uninit` will emit a warning:
> ({anonymous})’ may be used uninitialized
>
> Let's mark this tmp var as "allow_uninitialized".
>
> This problem is found when I try to build glibc with V extension.
>
> gcc
> PR target/115840.
> * config/riscv/riscv.cc(riscv_preferred_else_value): Mark
> tmp_var as allow_unitialized.
>
> gcc/testsuite
> * gcc.dg/vect/pr115840.c: New testcase.
> ---
> gcc/config/riscv/riscv.cc | 6 +++++-
> gcc/testsuite/gcc.dg/vect/pr115840.c | 11 +++++++++++
> 2 files changed, 16 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.dg/vect/pr115840.c
>
> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index 61fa74e9322..08159d7cbbc 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -11431,7 +11431,11 @@ riscv_preferred_else_value (unsigned ifn, tree
> vectype, unsigned int nops,
> tree *ops)
> {
> if (riscv_v_ext_mode_p (TYPE_MODE (vectype)))
> - return get_or_create_ssa_default_def (cfun, create_tmp_var (vectype));
> + {
> + tree tmp_var = create_tmp_var (vectype);
> + TREE_ALLOW_UNINITIALIZED (tmp_var) = 1;
Does it work when you do
TREE_NO_WARNING (tmp_var) = 1;
?
> + return get_or_create_ssa_default_def (cfun, tmp_var);
> + }
>
> return default_preferred_else_value (ifn, vectype, nops, ops);
> }
> diff --git a/gcc/testsuite/gcc.dg/vect/pr115840.c
> b/gcc/testsuite/gcc.dg/vect/pr115840.c
> new file mode 100644
> index 00000000000..09dc9e4eb7c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr115840.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-Wall -Werror" } */
> +
> +double loads[16];
> +
> +void
> +foo (double loadavg[], int count)
> +{
> + for (int i = 0; i < count; i++)
> + loadavg[i] = loads[i] / 1.5;
> +}
> --
> 2.45.1
>