LGTM
juzhe.zh...@rivai.ai From: Li Xu Date: 2024-11-13 10:36 To: gcc-patches CC: kito.cheng; palmer; juzhe.zhong; pan2.li; xuli Subject: [PATCH v2] RISC-V: Bugfix for max_sew_overlap_and_next_ratio_valid_for_prev_sew_p[pr117483] From: xuli <xu...@eswincomputing.com> 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. --- gcc/config/riscv/riscv-vsetvl.cc | 11 +++++++++-- gcc/testsuite/gcc.target/riscv/pr117483.c | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/pr117483.c diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 0b53b20f9f6..35c69a90357 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 00000000000..3e00986d7e1 --- /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]; + } +} -- 2.17.1