From 0532869d0595b5ae8a45a6ca9eceab25fa8b2958 Mon Sep 17 00:00:00 2001 From: Ira Rosen Date: Thu, 4 Nov 2010 11:51:09 +0000 Subject: [PATCH] re PR tree-optimization/46213 (gfortran.dg/aliasing_array_result_1.f90 ICE: in vectorizable_reduction, at tree-vect-loop.c:4046 with custom compiler flags) PR tree-optimization/46213 * tree-vect-loop.c (vect_is_simple_reduction_1): Handle MINUS_EXPR only if the first operand is reduction operand. From-SVN: r166306 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/vect/pr46213.f90 | 25 ++++++++++++++++++++++ gcc/tree-vect-loop.c | 6 +++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/vect/pr46213.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a3cdb0535cd..2cfb60a0cf0d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-04 Ira Rosen + + PR tree-optimization/46213 + * tree-vect-loop.c (vect_is_simple_reduction_1): Handle + MINUS_EXPR only if the first operand is reduction operand. + 2010-11-04 Richard Guenther Richard Henderson diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ebbd125ecbb2..66fb730c8912 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-04 Ira Rosen + + PR tree-optimization/46213 + * gfortran.dg/vect/pr46213.f90: New. + 2010-11-04 Richard Guenther PR testsuite/45702 diff --git a/gcc/testsuite/gfortran.dg/vect/pr46213.f90 b/gcc/testsuite/gfortran.dg/vect/pr46213.f90 new file mode 100644 index 000000000000..504d1a3cf841 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/pr46213.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-O -fno-tree-loop-ivcanon -ftree-vectorize -fno-tree-ccp -fno-tree-ch -finline-small-functions" } + +module foo + INTEGER, PARAMETER :: ONE = 1 +end module foo +program test + use foo + integer :: a(ONE), b(ONE), c(ONE), d(ONE) + interface + function h_ext() + end function h_ext + end interface + c = j() + if (any (c .ne. check)) call myabort (7) +contains + function j() + integer :: j(ONE), cc(ONE) + j = cc - j + end function j + function get_d() + end function get_d +end program test + +! { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 57ca5a8c4c46..bc87965fa91e 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -1800,7 +1800,11 @@ vect_is_simple_reduction_1 (loop_vec_info loop_info, gimple phi, simply rewriting this into "res += -x[i]". Avoid changing gimple instruction for the first simple tests and only do this if we're allowed to change code at all. */ - if (code == MINUS_EXPR && modify) + if (code == MINUS_EXPR + && modify + && (op1 = gimple_assign_rhs1 (def_stmt)) + && TREE_CODE (op1) == SSA_NAME + && SSA_NAME_DEF_STMT (op1) == phi) code = PLUS_EXPR; if (check_reduction