OSDN Git Service

* jump.c (mark_all_labels): Work in cfglayout mode.
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Nov 2006 10:53:06 +0000 (10:53 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Nov 2006 10:53:06 +0000 (10:53 +0000)
* cfgcleanup.c (cleanup_cfg): Do not call delete_dead_jumptables
when in cfglayout mode, because there are no dead jumptables
visible.
* cfgrtl.c (commit_one_edge_insertion): Don't set bb->aux when
in cfglayout mode.
(commit_edge_insertions): Do not allow insertion of instructions
with control flow insns when in cfglayout mode.

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

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/cfgrtl.c
gcc/jump.c

index c43316e..7e2e0db 100644 (file)
@@ -1,3 +1,14 @@
+2006-11-25  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * jump.c (mark_all_labels): Work in cfglayout mode.
+       * cfgcleanup.c (cleanup_cfg): Do not call delete_dead_jumptables
+       when in cfglayout mode, because there are no dead jumptables
+       visible.
+       * cfgrtl.c (commit_one_edge_insertion): Don't set bb->aux when
+       in cfglayout mode.
+       (commit_edge_insertions): Do not allow insertion of instructions
+       with control flow insns when in cfglayout mode.
+
 2006-11-25  Zdenek Dvorak <dvorakz@suse.cz>
 
        * tree-vrp.c (execute_vrp): Do not pass loops structure through
 
 2006-11-11  Jan Hubicka  <jh@suse.cz>
 
-       * extended.texi (__builtin_expect): We no longer require second argument
+       * extend.texi (__builtin_expect): We no longer require second argument
        to be constant.
        * gengtype.c (adjust_field_rtx_def): Drop NOTE_INSN_EXPECTED_VALUE.
        * builtins.c (expand_builtin_expect): Simplify.
index 046ee77..ad9ae4f 100644 (file)
@@ -763,8 +763,6 @@ merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
   if (BB_PARTITION (b) != BB_PARTITION (c))
     return NULL;
 
-
-
   /* If B has a fallthru edge to C, no need to move anything.  */
   if (e->flags & EDGE_FALLTHRU)
     {
@@ -2260,7 +2258,15 @@ cleanup_cfg (int mode)
        }
       else
        break;
-      delete_dead_jumptables ();
+
+      /* Don't call delete_dead_jumptables in cfglayout mode, because
+        that function assumes that jump tables are in the insns stream.
+        But we also don't _have_ to delete dead jumptables in cfglayout
+        mode because we shouldn't even be looking at things that are
+        not in a basic block.  Dead jumptables are cleaned up when
+        going out of cfglayout mode.  */
+      if (!(mode & CLEANUP_CFGLAYOUT))
+       delete_dead_jumptables ();
     }
 
   timevar_pop (TV_CLEANUP_CFG);
index 3934d92..6f474c0 100644 (file)
@@ -1477,7 +1477,8 @@ commit_one_edge_insertion (edge e, int watch_calls)
     gcc_assert (!JUMP_P (last));
 
   /* Mark the basic block for find_many_sub_basic_blocks.  */
-  bb->aux = &bb->aux;
+  if (current_ir_type () != IR_RTL_CFGLAYOUT)
+    bb->aux = &bb->aux;
 }
 
 /* Update the CFG for all queued instructions.  */
@@ -1509,6 +1510,13 @@ commit_edge_insertions (void)
   if (!changed)
     return;
 
+  /* In the old rtl CFG API, it was OK to insert control flow on an
+     edge, apparently?  In cfglayout mode, this will *not* work, and
+     the caller is responsible for making sure that control flow is
+     valid at all times.  */
+  if (current_ir_type () == IR_RTL_CFGLAYOUT)
+    return;
+
   blocks = sbitmap_alloc (last_basic_block);
   sbitmap_zero (blocks);
   FOR_EACH_BB (bb)
index f42ee5a..127e8a8 100644 (file)
@@ -202,6 +202,31 @@ mark_all_labels (rtx f)
              }
          }
       }
+  
+  /* If we are in cfglayout mode, there may be non-insns between the
+     basic blocks.  If those non-insns represent tablejump data, they
+     contain label references that we must record.  */
+  if (current_ir_type () == IR_RTL_CFGLAYOUT)
+    {
+      basic_block bb;
+      rtx insn;
+      FOR_EACH_BB (bb)
+       {
+         for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
+           if (INSN_P (insn))
+             {
+               gcc_assert (JUMP_TABLE_DATA_P (insn));
+               mark_jump_label (PATTERN (insn), insn, 0);
+             }
+
+         for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
+           if (INSN_P (insn))
+             {
+               gcc_assert (JUMP_TABLE_DATA_P (insn));
+               mark_jump_label (PATTERN (insn), insn, 0);
+             }
+       }
+    }
 }
 \f
 /* Move all block-beg, block-end and loop-beg notes between START and END out