From 0072cbfd46edfd3ec6946f8cacc634677867ca69 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 8 Sep 2004 16:04:54 +0000 Subject: [PATCH] blocks without dominators (i.e. dead blocks) return now Bad() as its dominator [r3837] --- ir/ana/irdom.c | 34 +++++++++++++--------------------- ir/ana/irdom.h | 4 +++- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/ir/ana/irdom.c b/ir/ana/irdom.c index 1bc8e47a5..9ff0b12e8 100644 --- a/ir/ana/irdom.c +++ b/ir/ana/irdom.c @@ -20,13 +20,18 @@ #include "irdom_t.h" #include "irgraph_t.h" /* To access state field. */ #include "irnode_t.h" +#include "ircons_t.h" -/**********************************************************************/ +/*--------------------------------------------------------------------*/ /** Accessing the dominator data structures **/ -/**********************************************************************/ +/*--------------------------------------------------------------------*/ ir_node *get_Block_idom(ir_node *bl) { assert(get_irn_op(bl) == op_Block); + if (get_Block_dom_depth(bl) == -1) { + /* This block is not reachable from Start */ + return new_Bad(); + } return bl->attr.block.dom.idom; } @@ -57,23 +62,9 @@ void set_Block_dom_depth(ir_node *bl, int depth) { -/**********************************************************************/ -/** Building and Removing the dominator datasturcture **/ -/** **/ -/** **/ -/** **/ -/** **/ -/** **/ -/** **/ -/** **/ -/** .**/ -/** **/ -/** **/ -/** **/ -/** **/ -/** **/ -/** **/ -/**********************************************************************/ +/*--------------------------------------------------------------------*/ +/* Building and Removing the dominator datastructure */ +/*--------------------------------------------------------------------*/ static void count_and_init_blocks(ir_node *bl, void *env) { int *n_blocks = (int *) env; @@ -215,10 +206,11 @@ void compute_doms(ir_graph *irg) { /* Step 2 */ irn_arity = get_irn_arity(w->block); for (j = 0; j < irn_arity; j++) { - ir_node *pred = get_nodes_block(get_Block_cfgpred(w->block, j)); + ir_node *cf_op = get_Block_cfgpred(w->block, j); + ir_node *pred = get_nodes_block(cf_op); tmp_dom_info *u; - if ((is_Bad(get_Block_cfgpred(w->block, j))) || + if ((is_Bad(cf_op)) || (is_Bad(pred)) || (get_Block_pre_num (pred) == -1)) continue; /* control-dead */ diff --git a/ir/ana/irdom.h b/ir/ana/irdom.h index dddfddda1..12af2371b 100644 --- a/ir/ana/irdom.h +++ b/ir/ana/irdom.h @@ -33,10 +33,12 @@ # include "irnode.h" -/* Accessing the dominator datastructure. +/** Accessing the dominator datastructure. * * These routines only work properly if the ir_graph is in state * dom_consistent or dom_inconsistent. + * + * If the block is not reachable from Start, returns a Bad node. */ ir_node *get_Block_idom(ir_node *bl); void set_Block_idom(ir_node *bl, ir_node *n); -- 2.20.1