Message ID | patch-18847-tamar@arm.com |
---|---|
State | New |
Headers | show |
Series | middle-end: copy STMT_VINFO_STRIDED_P when DR is replaced [PR116956] | expand |
On Mon, 14 Oct 2024, Tamar Christina wrote: > Hi All, > > 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. > > Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu -m32, > -m64 and no issues. > > Ok for master? OK. Thanks, Richard. > Thanks, > Tamar > > > > 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. > > --- > diff --git a/gcc/testsuite/gfortran.dg/vect/pr116956.f90 b/gcc/testsuite/gfortran.dg/vect/pr116956.f90 > new file mode 100644 > index 0000000000000000000000000000000000000000..3ce4d1ab7927900ccb261ed468263797ea97c354 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/vect/pr116956.f90 > @@ -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 > diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc > index fed12c41f9cb1aa0a3322bda53338f46c548588a..0c471c5580d35e92441251f9b494223aa71944d8 100644 > --- a/gcc/tree-vectorizer.cc > +++ b/gcc/tree-vectorizer.cc > @@ -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 > > > > >
diff --git a/gcc/testsuite/gfortran.dg/vect/pr116956.f90 b/gcc/testsuite/gfortran.dg/vect/pr116956.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3ce4d1ab7927900ccb261ed468263797ea97c354 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/pr116956.f90 @@ -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 diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc index fed12c41f9cb1aa0a3322bda53338f46c548588a..0c471c5580d35e92441251f9b494223aa71944d8 100644 --- a/gcc/tree-vectorizer.cc +++ b/gcc/tree-vectorizer.cc @@ -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