[backport from gcc-4.8/trunk r186321 ] gcc/ 2012-04-11 Richard Guenther PR middle-end/52621 * tree-chrec.c (evolution_function_is_invariant_rec_p): Properly consider loop nesting. (evolution_function_is_univariate_p): Properly check the remainder for chrecs. gcc/testsuite/ 2012-04-11 Richard Guenther PR middle-end/52621 * gfortran.dg/pr52621.f90: New testcase. --- gcc-4.6.3/gcc/testsuite/gfortran.dg/pr52621.f90.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.6.3/gcc/testsuite/gfortran.dg/pr52621.f90 2012-06-10 11:53:57.000000000 +0200 @@ -0,0 +1,20 @@ +! { dg-do compile } +! { dg-options "-O2 -fprefetch-loop-arrays" } + + SUBROUTINE GHDSYM(IZ,IS,LMMAX,S,LMS,Y,L2M,DRL,NLAY2,K0,DCUT)!, +! + COMPLEX Y(L2M,L2M),H(33),S(LMS) + COMPLEX RU,CI,CZ,K0,FF,Z,Z1,Z2,Z3,ST +! + DO 140 KK=1,4 + DO 130 L=1,L2M + L1=L*L-L + DO 120 M=1,L + IPM=L1+M + IMM=L1-M+2 + S(IPM)=S(IPM)+Z3*Y(L,M) + IF (M.NE.1) S(IMM)=S(IMM)+Z3*Y(M-1,L)*CSGN +120 CONTINUE +130 CONTINUE +140 CONTINUE + END --- gcc-4.6.3/gcc/tree-chrec.c.~1~ 2011-02-12 01:12:52.000000000 +0100 +++ gcc-4.6.3/gcc/tree-chrec.c 2012-06-10 11:53:57.000000000 +0200 @@ -1008,6 +1008,8 @@ evolution_function_is_invariant_rec_p (t if (TREE_CODE (chrec) == POLYNOMIAL_CHREC) { if (CHREC_VARIABLE (chrec) == (unsigned) loopnum + || flow_loop_nested_p (get_loop (loopnum), + get_loop (CHREC_VARIABLE (chrec))) || !evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum) || !evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec), @@ -1111,6 +1113,8 @@ evolution_function_is_univariate_p (cons break; default: + if (tree_contains_chrecs (CHREC_LEFT (chrec), NULL)) + return false; break; } @@ -1124,6 +1128,8 @@ evolution_function_is_univariate_p (cons break; default: + if (tree_contains_chrecs (CHREC_RIGHT (chrec), NULL)) + return false; break; }