* 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
+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.
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)
{
}
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);
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. */
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)
}
}
}
+
+ /* 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