middle-end: copy STMT_VINFO_STRIDED_P when DR is replaced [PR116956]

When move_dr copies a DR from one statement to another, it seems we've
forgotten to copy the STMT_VINFO_STRIDED_P flag.  This leaves the new DR in a
broken state where it has a non constant stride but isn't marked as strided.

This causes the ICE in the PR because dataref analysis fails during epilogue
vectorization because there is an assumption in place that while costing may
fail for epiloque vectorization, that DR analysis cannot if it succeeded for
the main loop.

gcc/ChangeLog:

	PR tree-optimization/116956
	* tree-vectorizer.cc (vec_info::move_dr): Copy STMT_VINFO_STRIDED_P.

gcc/testsuite/ChangeLog:

	PR tree-optimization/116956
	* gfortran.dg/vect/pr116956.f90: New test.
This commit is contained in:
Tamar Christina 2024-10-14 14:01:24 +01:00
parent be966baa35
commit ec3d3ea60a
2 changed files with 13 additions and 0 deletions

View file

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-require-effective-target vect_int }
! { dg-additional-options "-mcpu=neoverse-v2 -Ofast" { target aarch64*-*-* } }
SUBROUTINE nesting_offl_init(u, v, mask)
IMPLICIT NONE
real :: u(:)
real :: v(:)
integer :: mask(:)
u = MERGE( u, v, BTEST (mask, 1) )
END SUBROUTINE nesting_offl_init

View file

@ -610,6 +610,8 @@ vec_info::move_dr (stmt_vec_info new_stmt_info, stmt_vec_info old_stmt_info)
= STMT_VINFO_DR_WRT_VEC_LOOP (old_stmt_info);
STMT_VINFO_GATHER_SCATTER_P (new_stmt_info)
= STMT_VINFO_GATHER_SCATTER_P (old_stmt_info);
STMT_VINFO_STRIDED_P (new_stmt_info)
= STMT_VINFO_STRIDED_P (old_stmt_info);
}
/* Permanently remove the statement described by STMT_INFO from the