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
This commit is contained in:
Ira Rosen 2010-11-04 11:51:09 +00:00 committed by Ira Rosen
parent e4d8d4ea19
commit 0532869d05
4 changed files with 41 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2010-11-04 Ira Rosen <irar@il.ibm.com>
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 <rguenther@suse.de>
Richard Henderson <rth@redhat.com>

View File

@ -1,3 +1,8 @@
2010-11-04 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/46213
* gfortran.dg/vect/pr46213.f90: New.
2010-11-04 Richard Guenther <rguenther@suse.de>
PR testsuite/45702

View File

@ -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" } }

View File

@ -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