On Thu, Sep 1, 2011 at 10:12 AM, Ira Rosen <ira.ro...@linaro.org> wrote: > Hi, > > When vectorizing a function call we replace the original call with a > dummy statement to ensure that DCE later removes it. We also remove > its stmt_vec_info, which causes the segfault when we try to access it > through related pattern stmt. The following patch updates related > pattern stmt to be the dummy stmt. > > Bootstrapped and tested on powerpc64-suse-linux. > OK for 4.6?
Ok. Thanks, Richard. > Thanks, > Ira > > ChangeLog: > > PR tree-optimization/50178 > * tree-vect-stmts.c (vectorizable_call): Update the related > pattern statement > before deleting the original call. > (vect_transform_stmt): Don't expect the related pattern statement match > the > original statement after transformation. > > testsuite/ChangeLog: > > PR tree-optimization/50178 > * gfortran.dg/vect/pr50178.f90: New test. > > Index: testsuite/gfortran.dg/vect/pr50178.f90 > =================================================================== > --- testsuite/gfortran.dg/vect/pr50178.f90 (revision 0) > +++ testsuite/gfortran.dg/vect/pr50178.f90 (revision 0) > @@ -0,0 +1,29 @@ > +! { dg-do compile } > + > +module yemdyn > + implicit none > + integer, parameter :: jpim = selected_int_kind(9) > + integer, parameter :: jprb = selected_real_kind(13,300) > + real(kind=jprb) :: elx > + real(kind=jprb), allocatable :: xkcoef(:) > + integer(kind=jpim),allocatable :: ncpln(:), npne(:) > +end module yemdyn > + > +subroutine suedyn > + > + use yemdyn > + > + implicit none > + > + integer(kind=jpim) :: jm, jn > + real(kind=jprb) :: zjm, zjn, zxxx > + > + jn=0 > + do jm=0,ncpln(jn) > + zjm=real(jm,jprb) / elx > + xkcoef(npne(jn)+jm) = - zxxx*(zjm**2)**0.5_jprb > + end do > + > +end subroutine suedyn > + > +! { dg-final { cleanup-tree-dump "vect" } } > Index: tree-vect-stmts.c > =================================================================== > --- tree-vect-stmts.c (revision 178373) > +++ tree-vect-stmts.c (working copy) > @@ -1583,6 +1583,14 @@ vectorizable_call (gimple stmt, gimple_stmt_iterat > new_stmt = gimple_build_assign (gimple_call_lhs (stmt), > build_zero_cst (type)); > set_vinfo_for_stmt (new_stmt, stmt_info); > + /* For pattern statements make the related statement to point to > + NEW_STMT in order to be able to retrieve the original statement > + information later. */ > + if (is_pattern_stmt_p (stmt_info)) > + { > + gimple related = STMT_VINFO_RELATED_STMT (stmt_info); > + STMT_VINFO_RELATED_STMT (vinfo_for_stmt (related)) = new_stmt; > + } > set_vinfo_for_stmt (stmt, NULL); > STMT_VINFO_STMT (stmt_info) = new_stmt; > gsi_replace (gsi, new_stmt, false); > @@ -4957,11 +4965,7 @@ vect_transform_stmt (gimple stmt, gimple_stmt_iter > the stmt_info of ORIG_STMT_IN_PATTERN. See more details in the > documentation of vect_pattern_recog. */ > if (STMT_VINFO_IN_PATTERN_P (stmt_vinfo)) > - { > - gcc_assert (STMT_VINFO_RELATED_STMT (stmt_vinfo) > - == orig_scalar_stmt); > - STMT_VINFO_VEC_STMT (stmt_vinfo) = vec_stmt; > - } > + STMT_VINFO_VEC_STMT (stmt_vinfo) = vec_stmt; > } > } >