### belive: Clean up be_values_interfere() and its cousin my_values_interfere2().

parent 20a0283f
 ... ... @@ -17,8 +17,6 @@ #include "beutil.h" #include "iredges_t.h" #define value_dominates(a, b) _value_dominates(a, b) /** * Check dominance of two nodes in the same block. * @param a The first node. ... ... @@ -52,7 +50,7 @@ static inline int _value_strictly_dominates_intrablock(const ir_node *a, const i * @param b The second node. * @return 1 if a dominates b or if a == b, 0 else. */ static inline int _value_dominates(const ir_node *a, const ir_node *b) static inline int value_dominates(const ir_node *a, const ir_node *b) { const ir_node *block_a = get_block_const(a); const ir_node *block_b = get_block_const(b); ... ... @@ -76,60 +74,44 @@ static inline int _value_dominates(const ir_node *a, const ir_node *b) * @param lv Liveness information * @param a The first value. * @param b The second value. * @return 1, if a and b interfere, 0 if not. * @return true, if a and b interfere, false if not. */ static inline int be_values_interfere(const be_lv_t *lv, const ir_node *a, const ir_node *b) static inline bool be_values_interfere(be_lv_t const *lv, ir_node const *a, ir_node const *b) { int a2b = _value_dominates(a, b); int b2a = _value_dominates(b, a); int res = 0; /* * Adjust a and b so, that a dominates b if * a dominates b or vice versa. */ if(b2a) { const ir_node *t = a; if (value_dominates(b, a)) { /* Adjust a and b so, that a dominates b if * a dominates b or vice versa. */ ir_node const *const t = a; a = b; b = t; a2b = 1; } else if (!value_dominates(a, b)) { /* If there is no dominance relation, they do not interfere. */ return false; } /* If there is no dominance relation, they do not interfere. */ if(a2b) { ir_node *bb = get_nodes_block(b); ir_node *const bb = get_nodes_block(b); /* * If a is live end in b's block it is * live at b's definition (a dominates b) */ if(be_is_live_end(lv, bb, a)) { res = 1; goto end; } /* If a is live end in b's block it is * live at b's definition (a dominates b) */ if (be_is_live_end(lv, bb, a)) return true; /* * Look at all usages of a. * If there's one usage of a in the block of b, then * we check, if this use is dominated by b, if that's true * a and b interfere. Note that b must strictly dominate the user, * since if b is the last user of in the block, b and a do not * interfere. * Uses of a not in b's block can be disobeyed, because the * check for a being live at the end of b's block is already * performed. */ foreach_out_edge(a, edge) { const ir_node *user = get_edge_src_irn(edge); if (get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates_intrablock(b, user)) { res = 1; goto end; } } /* Look at all usages of a. * If there's one usage of a in the block of b, then * we check, if this use is dominated by b, if that's true * a and b interfere. Note that b must strictly dominate the user, * since if b is the last user of in the block, b and a do not * interfere. * Uses of a not in b's block can be disobeyed, because the * check for a being live at the end of b's block is already * performed. */ foreach_out_edge(a, edge) { ir_node const *const user = get_edge_src_irn(edge); if (get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates_intrablock(b, user)) return true; } end: return res; return false; } #endif
 ... ... @@ -213,67 +213,54 @@ static int merge_interferences(be_fec_env_t *env, bitset_t** interferences, return res; } static int my_values_interfere2(ir_graph *irg, const ir_node *a, const ir_node *b) static bool my_values_interfere2(ir_graph *const irg, ir_node const *a, ir_node const *b) { be_lv_t *lv = be_get_irg_liveness(irg); int a2b = _value_dominates(a, b); int b2a = _value_dominates(b, a); /* If there is no dominance relation, they do not interfere. */ if ((a2b | b2a) > 0) { ir_node *bb; /* * Adjust a and b so, that a dominates b if * a dominates b or vice versa. */ if (b2a) { const ir_node *t = a; a = b; b = t; } bb = get_nodes_block(b); /* * If a is live end in b's block it is * live at b's definition (a dominates b) */ if (be_is_live_end(lv, bb, a)) return 1; if (value_dominates(b, a)) { /* Adjust a and b so, that a dominates b if * a dominates b or vice versa. */ ir_node const *const t = a; a = b; b = t; } else if (!value_dominates(a, b)) { /* If there is no dominance relation, they do not interfere. */ return 0; } /* * Look at all usages of a. * If there's one usage of a in the block of b, then * we check, if this use is dominated by b, if that's true * a and b interfere. Note that b must strictly dominate the user, * since if b is the last user of in the block, b and a do not * interfere. * Uses of a not in b's block can be disobeyed, because the * check for a being live at the end of b's block is already * performed. */ foreach_out_edge(a, edge) { const ir_node *user = get_edge_src_irn(edge); if (is_Sync(user)) { foreach_out_edge(user, edge2) { const ir_node *user2 = get_edge_src_irn(edge2); assert(!is_Sync(user2)); if (get_nodes_block(user2) == bb && !is_Phi(user2) && _value_strictly_dominates_intrablock(b, user2)) return 1; } } else { if (get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates_intrablock(b, user)) return 1; ir_node *const bb = get_nodes_block(b); /* If a is live end in b's block it is * live at b's definition (a dominates b) */ be_lv_t *const lv = be_get_irg_liveness(irg); if (be_is_live_end(lv, bb, a)) return true; /* Look at all usages of a. * If there's one usage of a in the block of b, then * we check, if this use is dominated by b, if that's true * a and b interfere. Note that b must strictly dominate the user, * since if b is the last user of in the block, b and a do not * interfere. * Uses of a not in b's block can be disobeyed, because the * check for a being live at the end of b's block is already * performed. */ foreach_out_edge(a, edge) { ir_node const *const user = get_edge_src_irn(edge); if (is_Sync(user)) { foreach_out_edge(user, edge2) { ir_node const *const user2 = get_edge_src_irn(edge2); assert(!is_Sync(user2)); if (get_nodes_block(user2) == bb && !is_Phi(user2) && _value_strictly_dominates_intrablock(b, user2)) return true; } } else { if (get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates_intrablock(b, user)) return true; } } return 0; return false; } /** ... ...
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment