]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/32220 (internal compiler error: in eliminate_temp_copies...
authorZdenek Dvorak <dvorakz@suse.cz>
Thu, 7 Jun 2007 15:34:40 +0000 (17:34 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Thu, 7 Jun 2007 15:34:40 +0000 (15:34 +0000)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/predcom-2.f [new file with mode: 0644]
gcc/tree-predcom.c

index f95d01a072e36932b40088b2b7972b9d60a3c86a..621396fd1b1ccb31050356b93ba564fdbecc1b3a 100644 (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
index a1852f0cb08bd803bcaf683e06c8bcd095329715..746e3db77bd77c2b1cae6f7a354c0eeb35cc5ba2 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/predcom-2.f b/gcc/testsuite/gfortran.dg/predcom-2.f
new file mode 100644 (file)
index 0000000..7e43cb0
--- /dev/null
@@ -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
index 5c90fb14419cec1be527e5c64c8a8f3b807c7f80..4e5471397dbdbc3f300469ab458035997e73c3c8 100644 (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);