From: Michael Beck Date: Wed, 13 Jun 2007 12:51:28 +0000 (+0000) Subject: added strictly_dominate functions X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=d38903b3463d9a6dbd4ba3b9f682f80723b4dda0;p=libfirm added strictly_dominate functions [r14459] --- diff --git a/include/libfirm/irdom.h b/include/libfirm/irdom.h index 2c6e10390..295b025af 100644 --- a/include/libfirm/irdom.h +++ b/include/libfirm/irdom.h @@ -132,12 +132,24 @@ ir_node *get_Block_dominated_next(const ir_node *dom); /** * Check, if a block dominates another block. - * @param a The first block. - * @param b The second block. + * + * @param a The potential dominator block. + * @param b The potentially dominated block. + * * @return 1, if @p a dominates @p b, else 0. */ int block_dominates(const ir_node *a, const ir_node *b); +/** + * Check, if a block strictly dominates another block, i.e. a != b. + * + * @param a The potential dominator block. + * @param b The potentially dominated block. + * + * @return 1, if @p a strictly dominates @p b, else 0. + */ +int block_strictly_dominates(const ir_node *a, const ir_node *b); + /** * Returns the smallest common dominator block of two nodes. * @param a A node. @@ -162,12 +174,24 @@ ir_node *node_users_smallest_common_dominator(ir_node *irn, int handle_phi); /** * Check, if a block post dominates another block. - * @param a The first block. - * @param b The second block. + * + * @param a The potential post dominator block. + * @param b The potentially post dominated block. + * * @return 1, if @p a post dominates @p b, else 0. */ int block_postdominates(const ir_node *a, const ir_node *b); +/** + * Check, if a block strictly post dominates another block, i.e. a != b. + * + * @param a The potential post dominator block. + * @param b The potentially post dominated block. + * + * @return 1, if @p a strictly post dominates @p b, else 0. + */ +int block_strictly_postdominates(const ir_node *a, const ir_node *b); + /** * Visit all nodes in the dominator subtree of a given node. * Call a pre-visitor before descending to the children and call a diff --git a/ir/ana/irdom.c b/ir/ana/irdom.c index 0063f4f03..97a10795d 100644 --- a/ir/ana/irdom.c +++ b/ir/ana/irdom.c @@ -150,33 +150,28 @@ void set_Block_postdom_depth(ir_node *bl, int depth) { get_pdom_info(bl)->dom_depth = depth; } -unsigned get_Block_dom_tree_pre_num(const ir_node *bl) -{ +unsigned get_Block_dom_tree_pre_num(const ir_node *bl) { assert(is_Block(bl)); return get_dom_info(bl)->tree_pre_num; } -unsigned get_Block_dom_max_subtree_pre_num(const ir_node *bl) -{ +unsigned get_Block_dom_max_subtree_pre_num(const ir_node *bl) { assert(is_Block(bl)); return get_dom_info(bl)->max_subtree_pre_num; } -unsigned get_Block_pdom_tree_pre_num(const ir_node *bl) -{ +unsigned get_Block_pdom_tree_pre_num(const ir_node *bl) { assert(is_Block(bl)); return get_pdom_info(bl)->tree_pre_num; } -unsigned get_Block_pdom_max_subtree_pre_num(const ir_node *bl) -{ +unsigned get_Block_pdom_max_subtree_pre_num(const ir_node *bl) { assert(is_Block(bl)); return get_pdom_info(bl)->max_subtree_pre_num; } /* Check, if a block dominates another block. */ -int block_dominates(const ir_node *a, const ir_node *b) -{ +int block_dominates(const ir_node *a, const ir_node *b) { const ir_dom_info *ai, *bi; if (is_Block(a) && is_Block(b)) { @@ -189,9 +184,13 @@ int block_dominates(const ir_node *a, const ir_node *b) return 0; } +/* Check, if a block strictly dominates another block. */ +int block_strictly_dominates(const ir_node *a, const ir_node *b) { + return (a != b) && block_dominates(a, 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; @@ -218,8 +217,7 @@ 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; @@ -276,23 +274,20 @@ ir_node *node_users_smallest_common_dominator(ir_node *irn, int handle_phi) /* Get the first node in the list of nodes dominated by a given block. */ -ir_node *get_Block_dominated_first(const ir_node *bl) -{ +ir_node *get_Block_dominated_first(const ir_node *bl) { assert(is_Block(bl)); return get_dom_info(bl)->first; } /* Get the next node in a list of nodes which are dominated by some * other node. */ -ir_node *get_Block_dominated_next(const ir_node *bl) -{ +ir_node *get_Block_dominated_next(const ir_node *bl) { assert(is_Block(bl)); return get_dom_info(bl)->next; } /* Check, if a block post dominates another block. */ -int block_postdominates(const ir_node *a, const ir_node *b) -{ +int block_postdominates(const ir_node *a, const ir_node *b) { const ir_dom_info *ai, *bi; if (is_Block(a) && is_Block(b)) { @@ -305,17 +300,21 @@ int block_postdominates(const ir_node *a, const ir_node *b) return 0; } +/* Check, if a block strictly dominates another block. */ +int block_strictly_postdominates(const ir_node *a, const ir_node *b) { + return (a != b) && block_postdominates(a, b); +} + + /* Get the first node in the list of nodes post dominated by a given block. */ -ir_node *get_Block_postdominated_first(const ir_node *bl) -{ +ir_node *get_Block_postdominated_first(const ir_node *bl) { assert(is_Block(bl)); return get_pdom_info(bl)->first; } /* Get the next node in a list of nodes which are post dominated by some * other node. */ -ir_node *get_Block_postdominated_next(const ir_node *bl) -{ +ir_node *get_Block_postdominated_next(const ir_node *bl) { assert(is_Block(bl)); return get_pdom_info(bl)->next; }