https://gcc.gnu.org/g:c6f38e5e6d900b8ed6a4f5c126d3197946cad4dd

commit r15-1995-gc6f38e5e6d900b8ed6a4f5c126d3197946cad4dd
Author: YunQiang Su <yunqi...@isrc.iscas.ac.cn>
Date:   Thu Jul 11 20:43:54 2024 +0800

    RISC-V: NO_WARNING preferred else value for RVV
    
    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 NO_WARNING.
    
    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 NO_WARNING.
    
    gcc/testsuite
            * gcc.dg/vect/pr115840.c: New testcase.

Diff:
---
 gcc/config/riscv/riscv.cc            |  6 +++++-
 gcc/testsuite/gcc.dg/vect/pr115840.c | 11 +++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 16b210f323e2..d50ac611e1af 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -11432,7 +11432,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_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 000000000000..09dc9e4eb7c2
--- /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;
+}

Reply via email to