https://gcc.gnu.org/g:445d8bb6a89eb2275c4930ec87a98d5123e5abdd

commit r15-5187-g445d8bb6a89eb2275c4930ec87a98d5123e5abdd
Author: xuli <xu...@eswincomputing.com>
Date:   Tue Nov 12 02:31:28 2024 +0000

    RISC-V: Bugfix for 
max_sew_overlap_and_next_ratio_valid_for_prev_sew_p[pr117483]
    
    This patch fixs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117483
    
    If prev and next satisfy the following rules, we should forbid the case
    (next.get_sew() < prev.get_sew() && (!next.get_ta() || !next.get_ma()))
    in the compatible function 
max_sew_overlap_and_next_ratio_valid_for_prev_sew_p.
    Otherwise, the tail elements of next will be polluted.
    
    DEF_SEW_LMUL_RULE (ge_sew, ratio_and_ge_sew, ratio_and_ge_sew,
     max_sew_overlap_and_next_ratio_valid_for_prev_sew_p,
     always_false, use_max_sew_and_lmul_with_next_ratio)
    
    Passed the rv64gcv full regression test.
    
    Signed-off-by: Li Xu <xu...@eswincomputing.com>
    
            PR target/117483
    
    gcc/ChangeLog:
    
            * config/riscv/riscv-vsetvl.cc: Fix bug.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/pr117483.c: New test.

Diff:
---
 gcc/config/riscv/riscv-vsetvl.cc          | 11 +++++++++--
 gcc/testsuite/gcc.target/riscv/pr117483.c | 20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 0b53b20f9f6c..35c69a903579 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -1480,8 +1480,15 @@ private:
   max_sew_overlap_and_next_ratio_valid_for_prev_sew_p (const vsetvl_info &prev,
                                                       const vsetvl_info &next)
   {
-    return next_ratio_valid_for_prev_sew_p (prev, next)
-          && max_sew_overlap_p (prev, next);
+    if (next_ratio_valid_for_prev_sew_p (prev, next)
+       && max_sew_overlap_p (prev, next))
+      {
+       if (next.get_sew () < prev.get_sew ()
+           && (!next.get_ta () || !next.get_ma ()))
+         return false;
+       return true;
+      }
+    return false;
   }
   inline bool
   sew_le_and_next_sew_le_prev_max_sew_and_ratio_eq_p (const vsetvl_info &prev,
diff --git a/gcc/testsuite/gcc.target/riscv/pr117483.c 
b/gcc/testsuite/gcc.target/riscv/pr117483.c
new file mode 100644
index 000000000000..3e00986d7e1e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/pr117483.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fsigned-char -fno-strict-aliasing -fwrapv 
-march=rv64gcv_zvl256b -mabi=lp64d -O3" } */
+
+char a, b, f;
+short c, h;
+int d[5];
+int e;
+long *g;
+short (*i)[4];
+int main() {
+  e = 906784;
+  char *j = &f;
+  short *k = &h;
+  for (short l = 0; l < 23; l += 740314495218734 - 29738)
+    for (unsigned char m = ~!g[l] - 255; m < 24; m += 3) {
+      a = k[m];
+      b += j[1] ?: d[6];
+      c ^= i[010][l];
+    }
+}

Reply via email to