2012-12-21 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Dec 2012 14:33:59 +0000 (14:33 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Dec 2012 14:33:59 +0000 (14:33 +0000)
PR rtl-optimization/52996
* cprop.c (bypass_block): When loops are to be preserved
do not bypass loop headers.  Revert earlier kludge to remove
loops when doing that.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194666 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cprop.c

index 53bbd71..f0563db 100644 (file)
@@ -1,5 +1,12 @@
 2012-12-21  Richard Biener  <rguenther@suse.de>
 
+       PR rtl-optimization/52996
+       * cprop.c (bypass_block): When loops are to be preserved
+       do not bypass loop headers.  Revert earlier kludge to remove
+       loops when doing that.
+
+2012-12-21  Richard Biener  <rguenther@suse.de>
+
        PR bootstrap/54659
        * system.h: Include gmp.h.
        * tree-ssa-loop-niter.c: Do not include gmp.h here.
index ec896a4..463f81f 100644 (file)
@@ -1496,7 +1496,7 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
   rtx insn, note;
   edge e, edest;
   int change;
-  int may_be_loop_header;
+  int may_be_loop_header = false;
   unsigned removed_p;
   unsigned i;
   edge_iterator ei;
@@ -1510,27 +1510,22 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
   if (note)
     find_used_regs (&XEXP (note, 0), NULL);
 
-  /* Determine whether there are more latch edges.  Threading through
-     a loop header with more than one latch is delicate, see e.g.
-     tree-ssa-threadupdate.c:thread_through_loop_header.  */
   if (current_loops)
     {
-      may_be_loop_header = bb == bb->loop_father->header;
-      if (may_be_loop_header
-         && bb->loop_father->latch == NULL)
+      /* If we are to preserve loop structure then do not bypass
+         a loop header.  This will either rotate the loop, create
+        multiple entry loops or even irreducible regions.  */
+      if (bb == bb->loop_father->header)
        return 0;
     }
   else
     {
-      unsigned n_back_edges = 0;
       FOR_EACH_EDGE (e, ei, bb->preds)
        if (e->flags & EDGE_DFS_BACK)
-         n_back_edges++;
-
-      may_be_loop_header = n_back_edges > 0;
-
-      if (n_back_edges > 1)
-        return 0;
+         {
+           may_be_loop_header = true;
+           break;
+         }
     }
 
   change = 0;
@@ -1619,17 +1614,6 @@ bypass_block (basic_block bb, rtx setcc, rtx jump)
              && dest != old_dest
              && dest != EXIT_BLOCK_PTR)
             {
-             if (current_loops != NULL
-                 && e->src->loop_father->latch == e->src)
-               {
-                 /* ???  Now we are creating (or may create) a loop
-                    with multiple entries.  Simply mark it for
-                    removal.  Alternatively we could not do this
-                    threading.  */
-                 e->src->loop_father->header = NULL;
-                 e->src->loop_father->latch = NULL;
-               }
-
              redirect_edge_and_branch_force (e, dest);
 
              /* Copy the register setter to the redirected edge.