From 1b0cfaa6a890d6cea3ce6a98a707219cac2aedd6 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Thu, 7 Jun 2007 17:34:40 +0200 Subject: [PATCH] re PR tree-optimization/32220 (internal compiler error: in eliminate_temp_copies, at tree-predcom.c:1937) PR tree-optimization/32220 * tree-predcom.c (eliminate_temp_copies): Handle the case that loop phi node is reached before defining statement. * gfortran.dg/predcom-2.f: New testcase. From-SVN: r125531 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/predcom-2.f | 20 ++++++++++++++++++++ gcc/tree-predcom.c | 8 +++++++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/predcom-2.f diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f95d01a072e..621396fd1b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-07 Zdenek Dvorak + + PR tree-optimization/32220 + * tree-predcom.c (eliminate_temp_copies): Handle the case that loop + phi node is reached before defining statement. + 2007-06-06 Andrew Pinski PR tree-opt/32231 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1852f0cb08..746e3db77bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-06-07 Zdenek Dvorak + + PR tree-optimization/32220 + * gfortran.dg/predcom-2.f: New testcase. + 2007-06-06 Andrew Pinski PR tree-opt/32231 diff --git a/gcc/testsuite/gfortran.dg/predcom-2.f b/gcc/testsuite/gfortran.dg/predcom-2.f new file mode 100644 index 00000000000..7e43cb07ae5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/predcom-2.f @@ -0,0 +1,20 @@ +! PR 32220, ICE when the loop is not unrolled enough to eliminate all +! register copies +! { dg-do compile } +! { dg-options "-O3" } + + subroutine derv (b,cosxy,thick) +c + common /shell4/xji(3,3) +c + dimension cosxy(6,*), + 1 thick(*),b(*) +c + + do 125 i=1,3 + b(k2+i)=xji(i,1) + xji(i,2) + xji(i,3) + 125 b(k3+i)=cosxy(i+3,kk) + cosxy(i,kk) +c +c + return + end diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c index 5c90fb14419..4e5471397db 100644 --- a/gcc/tree-predcom.c +++ b/gcc/tree-predcom.c @@ -1932,7 +1932,13 @@ eliminate_temp_copies (struct loop *loop, bitmap tmp_vars) /* Base all the ssa names in the ud and du chain of NAME on VAR. */ stmt = SSA_NAME_DEF_STMT (use); - while (TREE_CODE (stmt) == PHI_NODE) + while (TREE_CODE (stmt) == PHI_NODE + /* In case we could not unroll the loop enough to eliminate + all copies, we may reach the loop header before the defining + statement (in that case, some register copies will be present + in loop latch in the final code, corresponding to the newly + created looparound phi nodes). */ + && bb_for_stmt (stmt) != loop->header) { gcc_assert (single_pred_p (bb_for_stmt (stmt))); use = PHI_ARG_DEF (stmt, 0);