* tree.h (BLOCK_DEAD): New macro.
(struct tree_block): New flag, dead_flag.
* print-tree.c (print_node, case 'b'): Print missing fields.
* emit-rtl.c (remove_unnecessary_notes): Set BLOCK_DEAD.
* function.c (identify_blocks): Enable test for misplaced notes.
(all_blocks): Skip BLOCK_DEAD blocks.
* integrate.c (integrate_decl_tree): Likewise.
From-SVN: r40039
Sat Feb 24 06:45:21 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+ * tree.h (BLOCK_DEAD): New macro.
+ (struct tree_block): New flag, dead_flag.
+ * print-tree.c (print_node, case 'b'): Print missing fields.
+ * emit-rtl.c (remove_unnecessary_notes): Set BLOCK_DEAD.
+ * function.c (identify_blocks): Enable test for misplaced notes.
+ (all_blocks): Skip BLOCK_DEAD blocks.
+ * integrate.c (integrate_decl_tree): Likewise.
+
* errors.c (internal_error, trim_filename): New functions.
(fancy_abort): Call internal_error.
* errors.h (internal_error, trim_filename): New declarations.
if (debug_ignore_block (NOTE_BLOCK (insn)))
{
+ BLOCK_DEAD (NOTE_BLOCK (insn)) = 1;
remove_insn (prev);
remove_insn (insn);
}
block_stack);
/* If we didn't use all of the subblocks, we've misplaced block notes. */
- /* ??? This appears to happen all the time. Latent bugs elsewhere? */
- if (0 && last_block_vector != block_vector + n_blocks)
+ if (last_block_vector != block_vector + n_blocks)
abort ();
free (block_vector);
blocks. */
static int
-all_blocks (block, vector)
- tree block;
+all_blocks (blocks, vector)
+ tree blocks;
tree *vector;
{
int n_blocks = 0;
+ tree block;
- while (block)
- {
- TREE_ASM_WRITTEN (block) = 0;
+ for (block = blocks; block != 0; block = TREE_CHAIN (block))
+ if (!BLOCK_DEAD (block))
+ {
+ TREE_ASM_WRITTEN (block) = 0;
- /* Record this block. */
- if (vector)
- vector[n_blocks] = block;
+ /* Record this block. */
+ if (vector)
+ vector[n_blocks] = block;
- ++n_blocks;
+ ++n_blocks;
- /* Record the subblocks, and their subblocks... */
- n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
- vector ? vector + n_blocks : 0);
- block = BLOCK_CHAIN (block);
- }
+ /* Record the subblocks, and their subblocks... */
+ n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
+ vector ? vector + n_blocks : 0);
+ }
return n_blocks;
}
next = &BLOCK_SUBBLOCKS (new_block);
for (t = BLOCK_SUBBLOCKS (let); t; t = BLOCK_CHAIN (t))
- {
- *next = integrate_decl_tree (t, map);
- BLOCK_SUPERCONTEXT (*next) = new_block;
- next = &BLOCK_CHAIN (*next);
- }
+ if (!BLOCK_DEAD (t))
+ {
+ *next = integrate_decl_tree (t, map);
+ BLOCK_SUPERCONTEXT (*next) = new_block;
+ next = &BLOCK_CHAIN (*next);
+ }
TREE_USED (new_block) = TREE_USED (let);
BLOCK_ABSTRACT_ORIGIN (new_block) = let;
break;
case 'b':
+ if (BLOCK_ABSTRACT (node))
+ fprintf (file, " abstract");
+ if (BLOCK_HANDLER_BLOCK (node))
+ fprintf (file, " handler-block");
+ if (BLOCK_DEAD (node))
+ fprintf (file, " dead");
+ fprintf (file, " block-number %d", BLOCK_NUMBER (node));
+
print_node (file, "vars", BLOCK_VARS (node), indent + 4);
print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
listed in the BLOCK_VARS slot. */
#define BLOCK_HANDLER_BLOCK(NODE) (BLOCK_CHECK (NODE)->block.handler_block_flag)
+/* Nonzero means the block was deleted as dead and should not be copied
+ when a function is inlined. */
+#define BLOCK_DEAD(NODE) (BLOCK_CHECK (NODE)->block.dead_flag)
+
/* An index number for this block. These values are not guaranteed to
be unique across functions -- whether or not they are depends on
the debugging output format in use. */
unsigned handler_block_flag : 1;
unsigned abstract_flag : 1;
- unsigned block_num : 30;
+ unsigned dead_flag : 1;
+ unsigned block_num : 29;
union tree_node *vars;
union tree_node *subblocks;