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;
>        }
>     }
>

Reply via email to