On 5/29/24 00:20, Richard Biener wrote:
On Wed, May 29, 2024 at 1:39 AM Patrick O'Neill<patr...@rivosinc.com>  wrote:
From: Greg McGary<g...@rivosinc.com>

gcc/ChangeLog:
         * gcc/tree-vect-stmts.cc (gcc/tree-vect-stmts.cc): Prevent 
divide-by-zero.
         * testsuite/gcc.target/riscv/rvv/autovec/no-segment.c: Remove xfail.
---
  gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c | 1 -
  gcc/tree-vect-stmts.cc                                  | 3 ++-
  2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c
index fd996a27501..79d03612a22 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c
@@ -1,6 +1,5 @@
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d -mrvv-vector-bits=scalable -O3 
-mno-autovec-segment" } */
-/* { xfail *-*-* } */

  enum e { c, d };
  enum g { f };
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 4219ad832db..34f5736ba00 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -11558,7 +11558,8 @@ vectorizable_load (vec_info *vinfo,
                                  - (vec_num * j + i) * nunits);
                             /* remain should now be > 0 and < nunits.  */
^^^

                             unsigned num;
-                           if (constant_multiple_p (nunits, remain, &num))
+                           if (known_gt (remain, 0)
So this shouldn't happen.  Do you have a testcase where this triggers?
If < nunits doesn't hold things will also go wrong.

This ICE appears after patch 1 of the series is applied with the testcase:
testsuite/gcc.target/riscv/rvv/autovec/no-segment.c

Executing on host: 
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/build/build-gcc-linux-stage2/gcc/xgcc
 
-B/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/build/build-gcc-linux-stage2/gcc/
  
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/gcc/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c
  -march=rv64gc_zba_zbb_zbc_zbs -mabi=lp64d -mcmodel=medlow   
-fdiagnostics-plain-output  -O3 -ftree-vectorize -march=rv64gcv -mabi=lp64d 
-mrvv-vector-bits=scalable -O3 -mno-autovec-segment -S   -o no-segment.s    
(timeout = 600)
spawn -ignore SIGHUP 
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/build/build-gcc-linux-stage2/gcc/xgcc
 
-B/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/build/build-gcc-linux-stage2/gcc/
 
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/gcc/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c
 -march=rv64gc_zba_zbb_zbc_zbs -mabi=lp64d -mcmodel=medlow 
-fdiagnostics-plain-output -O3 -ftree-vectorize -march=rv64gcv -mabi=lp64d 
-mrvv-vector-bits=scalable -O3 -mno-autovec-segment -S -o no-segment.s
during GIMPLE pass: vect
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/gcc/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c:
 In function 'ClutImageChannel':
/home/runner/work/gcc-precommit-ci/gcc-precommit-ci/riscv-gnu-toolchain/gcc/gcc/testsuite/gcc.target/riscv/rvv/autovec/no-segment.c:45:1:
 internal compiler error: Floating point exception
0x13e06b3 crash_signal
    ../../../gcc/gcc/toplev.cc:319
0x2840977 poly_int<2u, poly_result<unsigned long, unsigned long, poly_coeff_pair_traits<unsigned long, unsigned 
long>::result_kind>::type> operator-<2u, unsigned long, unsigned long>(poly_int<2u, unsigned long> 
const&, poly_int<2u, unsigned long> const&)
    ../../../gcc/gcc/poly-int.h:871
0x2840977 vectorizable_load
    ../../../gcc/gcc/tree-vect-stmts.cc:11558
0x284da2d vect_transform_stmt(vec_info*, _stmt_vec_info*, 
gimple_stmt_iterator*, _slp_tree*, _slp_instance*)
    ../../../gcc/gcc/tree-vect-stmts.cc:13416
0x16a00ce vect_transform_loop_stmt
    ../../../gcc/gcc/tree-vect-loop.cc:11618
0x16ca4f2 vect_transform_loop(_loop_vec_info*, gimple*)
    ../../../gcc/gcc/tree-vect-loop.cc:12144
0x1712a8d vect_transform_loops
    ../../../gcc/gcc/tree-vectorizer.cc:1006
0x17131c3 try_vectorize_loop_1
    ../../../gcc/gcc/tree-vectorizer.cc:1152
0x17131c3 try_vectorize_loop
    ../../../gcc/gcc/tree-vectorizer.cc:1182
0x17137fc execute
    ../../../gcc/gcc/tree-vectorizer.cc:1298
Please submit a full bug report, with preprocessed source (by using 
-freport-bug).
Please include the complete backtrace with any bug report.
See<https://gcc.gnu.org/bugs/>  for instructions.
compiler exited with status 1

Greg created this patch as a fix for that ICE so I'm guessing it was root-caused to be a nunits == 0 divide-by-zero.

@Greg McGary is the author of this patch and would know best.

Patrick


Richard.


+                               && constant_multiple_p (nunits, remain, &num))
                               {
                                 tree ptype;
                                 new_vtype
--
2.43.2

Reply via email to