gcse.c (bypass_block, [...]): Do not create irreducible loops.
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Sat, 8 Mar 2003 09:47:28 +0000 (10:47 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sat, 8 Mar 2003 09:47:28 +0000 (09:47 +0000)
* gcse.c (bypass_block, bypass_conditional_jumps): Do not create
irreducible loops.

* loop-unroll.c (unroll_loop_runtime_iterations): Update irreducible
loops info correctly.

From-SVN: r63980

gcc/ChangeLog
gcc/gcse.c
gcc/loop-unroll.c

index 663b3eb543043f43d9f74d439781c9e7a7ed75b7..e3919a9ef8485ff8e77c1cc9a0895c2383fdd495 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-08  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       * gcse.c (bypass_block, bypass_conditional_jumps): Do not create
+       irreducible loops.
+
+       * loop-unroll.c (unroll_loop_runtime_iterations): Update irreducible
+       loops info correctly.
+
 2003-03-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR middle-end/7796
index f5bb66d0053d0ef486d6a812ec7614ecb04fdb9a..f0e588ecd4955ad72d2e2b672d57b6d3d80f6f0f 100644 (file)
@@ -4759,6 +4759,7 @@ bypass_block (bb, setcc, jump)
   rtx insn, note;
   edge e, enext;
   int i, change;
+  int may_be_loop_header;
 
   insn = (setcc != NULL) ? setcc : jump;
 
@@ -4769,6 +4770,14 @@ bypass_block (bb, setcc, jump)
   if (note)
     find_used_regs (&XEXP (note, 0), NULL);
 
+  may_be_loop_header = false;
+  for (e = bb->pred; e; e = e->pred_next)
+    if (e->flags & EDGE_DFS_BACK)
+      {
+       may_be_loop_header = true;
+       break;
+      }
+
   change = 0;
   for (e = bb->pred; e; e = enext)
     {
@@ -4780,6 +4789,13 @@ bypass_block (bb, setcc, jump)
       if (e->src->index >= bypass_last_basic_block)
        continue;
 
+      /* The irreducible loops created by redirecting of edges entering the
+        loop from outside would decrease effectivity of some of the following
+        optimalizations, so prevent this.  */
+      if (may_be_loop_header
+         && !(e->flags & EDGE_DFS_BACK))
+       continue;
+
       for (i = 0; i < reg_use_count; i++)
        {
          struct reg_use *reg_used = &reg_use_table[i];
@@ -4866,6 +4882,7 @@ bypass_conditional_jumps ()
     return 0;
 
   bypass_last_basic_block = last_basic_block;
+  mark_dfs_back_edges ();
 
   changed = 0;
   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb,
index 55899a97c49d324d7a3172f7822270f2e8440347..e39bdbcbffb8fc694dfc28f6309df86f1a33cade 100644 (file)
@@ -895,7 +895,8 @@ unroll_loop_runtime_iterations (loops, loop)
          swtch = loop_split_edge_with (swtch->pred, branch_code, loops);
          set_immediate_dominator (loops->cfg.dom, preheader, swtch);
          swtch->succ->probability = REG_BR_PROB_BASE - p;
-         e = make_edge (swtch, preheader, 0);
+         e = make_edge (swtch, preheader,
+                        swtch->succ->flags & EDGE_IRREDUCIBLE_LOOP);
          e->probability = p;
        }
     }
@@ -925,7 +926,8 @@ unroll_loop_runtime_iterations (loops, loop)
       swtch = loop_split_edge_with (swtch->succ, branch_code, loops);
       set_immediate_dominator (loops->cfg.dom, preheader, swtch);
       swtch->succ->probability = REG_BR_PROB_BASE - p;
-      e = make_edge (swtch, preheader, 0);
+      e = make_edge (swtch, preheader,
+                    swtch->succ->flags & EDGE_IRREDUCIBLE_LOOP);
       e->probability = p;
     }