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
This commit is contained in:
Zdenek Dvorak 2007-06-07 17:34:40 +02:00 committed by Zdenek Dvorak
parent 554a540059
commit 1b0cfaa6a8
4 changed files with 38 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2007-06-07 Zdenek Dvorak <dvorakz@suse.cz>
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 <andrew_pinski@playstation.sony.com>
PR tree-opt/32231

View file

@ -1,3 +1,8 @@
2007-06-07 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/32220
* gfortran.dg/predcom-2.f: New testcase.
2007-06-06 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR tree-opt/32231

View file

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

View file

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