aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-04-11 14:04:00 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-04-11 14:04:00 +0000
commit754870ed779d39b573295a04dc559542e7bcabf3 (patch)
tree2ef6199ab21d5100ae3c9462c2fefb73040fea00 /gcc
parent405af656bcbddb0f655aa7744220478b80df09d7 (diff)
downloadgcc-754870ed779d39b573295a04dc559542e7bcabf3.zip
gcc-754870ed779d39b573295a04dc559542e7bcabf3.tar.gz
gcc-754870ed779d39b573295a04dc559542e7bcabf3.tar.bz2
re PR middle-end/52621 (ICE with -O3 -march=opteron in initialize_matrix_A, at tree-data-ref.c:1964)
2012-04-11 Richard Guenther <rguenther@suse.de> 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. * gfortran.dg/pr52621.f90: New testcase. From-SVN: r186321
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr52621.f9020
-rw-r--r--gcc/tree-chrec.c6
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 945e904..ed6beb1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2012-04-11 Richard Guenther <rguenther@suse.de>
+ 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.
+
+2012-04-11 Richard Guenther <rguenther@suse.de>
+
PR middle-end/52918
* except.c (sjlj_emit_dispatch_table): Properly update loop
structure.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7e2a1c3..ab04f98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2012-04-11 Richard Guenther <rguenther@suse.de>
+ PR middle-end/52621
+ * gfortran.dg/pr52621.f90: New testcase.
+
+2012-04-11 Richard Guenther <rguenther@suse.de>
+
PR middle-end/52918
* g++.dg/torture/pr52918-1.C: New testcase.
* g++.dg/torture/pr52918-2.C: Likewise.
diff --git a/gcc/testsuite/gfortran.dg/pr52621.f90 b/gcc/testsuite/gfortran.dg/pr52621.f90
new file mode 100644
index 0000000..d305e4d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr52621.f90
@@ -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
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index fbd61c0..38dca4a 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -1011,6 +1011,8 @@ evolution_function_is_invariant_rec_p (tree chrec, int loopnum)
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),
@@ -1114,6 +1116,8 @@ evolution_function_is_univariate_p (const_tree chrec)
break;
default:
+ if (tree_contains_chrecs (CHREC_LEFT (chrec), NULL))
+ return false;
break;
}
@@ -1127,6 +1131,8 @@ evolution_function_is_univariate_p (const_tree chrec)
break;
default:
+ if (tree_contains_chrecs (CHREC_RIGHT (chrec), NULL))
+ return false;
break;
}