X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firdom.c;h=cf47222367d49e0aa6222ec67df1148744b7a250;hb=d0d85962ef52c14950db90e5981a7bea36023ab3;hp=ef82991ed96633971b958ba26ca1f9e7c55b8d1a;hpb=7e151013a3aada6ad9f5861153423b2207377fd1;p=libfirm diff --git a/ir/ana/irdom.c b/ir/ana/irdom.c index ef82991ed..cf4722236 100644 --- a/ir/ana/irdom.c +++ b/ir/ana/irdom.c @@ -182,7 +182,8 @@ int block_dominates(const ir_node *a, const ir_node *b) } /* Returns the smallest common dominator block of two nodes. */ -ir_node *node_smallest_common_dominator(ir_node *a, ir_node *b) { +ir_node *node_smallest_common_dominator(ir_node *a, ir_node *b) +{ ir_node *bl_a = is_Block(a) ? a : get_nodes_block(a); ir_node *bl_b = is_Block(b) ? b : get_nodes_block(b); ir_node *dom_bl = NULL; @@ -209,7 +210,8 @@ ir_node *node_smallest_common_dominator(ir_node *a, ir_node *b) { } /* Returns the smallest common dominator block of all users of a node. */ -ir_node *node_users_smallest_common_dominator(ir_node *irn, int handle_phi) { +ir_node *node_users_smallest_common_dominator(ir_node *irn, int handle_phi) +{ int n, j, i = 0, success; ir_node **user_blocks, *dom_bl; const ir_edge_t *edge; @@ -234,6 +236,8 @@ ir_node *node_users_smallest_common_dominator(ir_node *irn, int handle_phi) { user_blocks[i++] = is_Block(src) ? src : get_nodes_block(src); } + assert(i == n && "get_irn_n_edges probably broken"); + /* in case of only one user: return the block of the user */ if (n == 1) return user_blocks[0]; @@ -470,7 +474,7 @@ typedef struct { * Start block misses control dead blocks. */ static void init_tmp_dom_info(ir_node *bl, tmp_dom_info *parent, - tmp_dom_info *tdi_list, int *used) { + tmp_dom_info *tdi_list, int *used, int n_blocks) { tmp_dom_info *tdi; int i; @@ -480,21 +484,22 @@ static void init_tmp_dom_info(ir_node *bl, tmp_dom_info *parent, mark_Block_block_visited(bl); set_Block_dom_pre_num(bl, *used); + assert(*used < n_blocks); tdi = &tdi_list[*used]; ++(*used); - tdi->semi = tdi; - tdi->label = tdi; + tdi->semi = tdi; + tdi->label = tdi; tdi->ancestor = NULL; - tdi->bucket = NULL; - tdi->parent = parent; - tdi->block = bl; + tdi->bucket = NULL; + tdi->parent = parent; + tdi->block = bl; /* Iterate */ for (i = get_Block_n_cfg_outs_ka(bl) - 1; i >= 0; --i) { ir_node *pred = get_Block_cfg_out_ka(bl, i); assert(is_Block(pred)); - init_tmp_dom_info(pred, tdi, tdi_list, used); + init_tmp_dom_info(pred, tdi, tdi_list, used, n_blocks); } } @@ -503,7 +508,7 @@ static void init_tmp_dom_info(ir_node *bl, tmp_dom_info *parent, * End block misses blocks in endless loops. */ static void init_tmp_pdom_info(ir_node *bl, tmp_dom_info *parent, - tmp_dom_info *tdi_list, int* used) { + tmp_dom_info *tdi_list, int* used, int n_blocks) { tmp_dom_info *tdi; int i; @@ -513,6 +518,7 @@ static void init_tmp_pdom_info(ir_node *bl, tmp_dom_info *parent, mark_Block_block_visited(bl); set_Block_postdom_pre_num(bl, *used); + assert(*used < n_blocks); tdi = &tdi_list[*used]; ++(*used); @@ -529,7 +535,7 @@ static void init_tmp_pdom_info(ir_node *bl, tmp_dom_info *parent, if (is_Bad(pred)) continue; assert(is_Block(pred)); - init_tmp_pdom_info(pred, tdi, tdi_list, used); + init_tmp_pdom_info(pred, tdi, tdi_list, used, n_blocks); } /* Handle keep-alives. Note that the preprocessing @@ -544,7 +550,7 @@ static void init_tmp_pdom_info(ir_node *bl, tmp_dom_info *parent, ir_node *pred = get_irn_n(end, i); if (is_Block(pred)) - init_tmp_pdom_info(pred, tdi, tdi_list, used); + init_tmp_pdom_info(pred, tdi, tdi_list, used, n_blocks); } } } @@ -674,7 +680,7 @@ void compute_doms(ir_graph *irg) { simple. */ used = 0; inc_irg_block_visited(irg); - init_tmp_dom_info(get_irg_start_block(irg), NULL, tdi_list, &used); + init_tmp_dom_info(get_irg_start_block(irg), NULL, tdi_list, &used, n_blocks); /* If not all blocks are reachable from Start by out edges this assertion fails. assert(used == n_blocks && "Precondition for dom construction violated"); */ @@ -762,7 +768,6 @@ void compute_doms(ir_graph *irg) { /* clean up */ free(tdi_list); - current_ir_graph = rem; /* Do a walk over the tree and assign the tree pre orders. */ { @@ -770,6 +775,7 @@ void compute_doms(ir_graph *irg) { dom_tree_walk_irg(irg, assign_tree_dom_pre_order, assign_tree_dom_pre_order_max, &tree_pre_order); } + current_ir_graph = rem; } void assure_doms(ir_graph *irg) { @@ -813,7 +819,7 @@ void compute_postdoms(ir_graph *irg) { simple. */ used = 0; inc_irg_block_visited(irg); - init_tmp_pdom_info(get_irg_end_block(irg), NULL, tdi_list, &used); + init_tmp_pdom_info(get_irg_end_block(irg), NULL, tdi_list, &used, n_blocks); /* If not all blocks are reachable from End by cfg edges this assertion fails. assert(used == n_blocks && "Precondition for dom construction violated"); */ @@ -873,7 +879,6 @@ void compute_postdoms(ir_graph *irg) { /* clean up */ free(tdi_list); - irg = rem; /* Do a walk over the tree and assign the tree pre orders. */ { @@ -881,6 +886,7 @@ void compute_postdoms(ir_graph *irg) { postdom_tree_walk_irg(irg, assign_tree_postdom_pre_order, assign_tree_postdom_pre_order_max, &tree_pre_order); } + current_ir_graph = rem; } void assure_postdoms(ir_graph *irg) {