diff mbox series

RISC-V: Avoid division by zero via constant_multiple_p

Message ID 20240830103358.B063013A3D@imap1.dmz-prg2.suse.org
State New
Headers show
Series RISC-V: Avoid division by zero via constant_multiple_p | expand

Commit Message

Richard Biener Aug. 30, 2024, 10:33 a.m. UTC
With recent SLP vectorization patches I see RISC-V divison by zero
for gfortran.dg/matmul_10.f90 and others in get_group_load_store_type
which does

              && can_div_trunc_p (group_size
                                  * LOOP_VINFO_VECT_FACTOR (loop_vinfo) - gap,
                                  nunits, &tem, &remain)
              && (known_eq (remain, 0u)
                  || (constant_multiple_p (nunits, remain, &num)
                      && (vector_vector_composition_type (vectype, num,
                                                          &half_vtype)
                          != NULL_TREE))))
            overrun_p = false;

where for [2, 2] / [0, 2] the condition doesn't reflect what we
are trying to test - that, when remain is zero or, when non-zero,
nunits is a multiple of remain, we can avoid touching a gap via
loading smaller pieces and vector composition.

It isn't safe to change the known_eq to maybe_eq so instead
require known_ne (remain, 0u) before doing constant_multiple_p.
There's the corresponding code in vectorizable_load that's known
to have a latent similar issue, so sync that up as well.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

	* tree-vect-stmts.cc (get_group_load_store_type): Check
	known_ne (remain, 0u) before doing constant_multiple_p.
	(vectorizable_load): Likewise.
---
 gcc/tree-vect-stmts.cc | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index f8bb637342e..d2282c0dc4f 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -2135,7 +2135,8 @@  get_group_load_store_type (vec_info *vinfo, stmt_vec_info stmt_info,
 				  * LOOP_VINFO_VECT_FACTOR (loop_vinfo) - gap,
 				  nunits, &tem, &remain)
 	      && (known_eq (remain, 0u)
-		  || (constant_multiple_p (nunits, remain, &num)
+		  || (known_ne (remain, 0u)
+		      && constant_multiple_p (nunits, remain, &num)
 		      && (vector_vector_composition_type (vectype, num,
 							  &half_vtype)
 			  != NULL_TREE))))
@@ -11586,7 +11587,8 @@  vectorizable_load (vec_info *vinfo,
 			  {
 			    /* remain should now be > 0 and < nunits.  */
 			    unsigned num;
-			    if (constant_multiple_p (nunits, remain, &num))
+			    if (known_ne (remain, 0u)
+				&& constant_multiple_p (nunits, remain, &num))
 			      {
 				tree ptype;
 				new_vtype