OSDN Git Service

PR rtl-optimization/31391
[pf3gnuchains/gcc-fork.git] / gcc / cfgcleanup.c
index d7c29b7..c2595ea 100644 (file)
@@ -1,6 +1,7 @@
 /* Control flow optimization code for GNU compiler.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -1991,7 +1992,7 @@ try_optimize_cfg (int mode)
              bool changed_here = false;
 
              /* Delete trivially dead basic blocks.  */
-             while (EDGE_COUNT (b->preds) == 0)
+             if (EDGE_COUNT (b->preds) == 0)
                {
                  c = b->prev_bb;
                  if (dump_file)
@@ -2001,7 +2002,9 @@ try_optimize_cfg (int mode)
                  delete_basic_block (b);
                  if (!(mode & CLEANUP_CFGLAYOUT))
                    changed = true;
-                 b = c;
+                 /* Avoid trying to remove ENTRY_BLOCK_PTR.  */
+                 b = (c == ENTRY_BLOCK_PTR ? c->next_bb : c);
+                 continue;
                }
 
              /* Remove code labels no longer used.  */
@@ -2031,6 +2034,8 @@ try_optimize_cfg (int mode)
 
                      reorder_insns_nobb (label, label, bb_note);
                      BB_HEAD (b) = bb_note;
+                     if (BB_END (b) == bb_note)
+                       BB_END (b) = label;
                    }
                  if (dump_file)
                    fprintf (dump_file, "Deleted label in block %i.\n",
@@ -2234,7 +2239,7 @@ cleanup_cfg (int mode)
         now to introduce more opportunities for try_optimize_cfg.  */
       if (!(mode & (CLEANUP_NO_INSN_DEL | CLEANUP_UPDATE_LIFE))
          && !reload_completed)
-       delete_trivially_dead_insns (get_insns(), max_reg_num ());
+       delete_trivially_dead_insns (get_insns (), max_reg_num ());
     }
 
   compact_blocks ();
@@ -2259,7 +2264,7 @@ cleanup_cfg (int mode)
               && (mode & CLEANUP_EXPENSIVE)
               && !reload_completed)
        {
-         if (!delete_trivially_dead_insns (get_insns(), max_reg_num ()))
+         if (!delete_trivially_dead_insns (get_insns (), max_reg_num ()))
            break;
        }
       else