From fc8907376ecd32d779af9224ce11361913c09af2 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Thu, 21 Jun 2007 14:54:41 +0000 Subject: [PATCH] _value_strictly_dominates() implemented [r14687] --- ir/be/beintlive_t.h | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/ir/be/beintlive_t.h b/ir/be/beintlive_t.h index f096db378..49827ee35 100644 --- a/ir/be/beintlive_t.h +++ b/ir/be/beintlive_t.h @@ -33,6 +33,20 @@ static INLINE int _value_dominates_intrablock(const ir_node *a, const ir_node *b return as <= bs; } +/** + * Check strict dominance of two nodes in the same block. + * @param a The first node. + * @param b The second node. + * @return 1 if a comes before b in the same block, 0 else. + */ +static INLINE int _value_strictly_dominates_intrablock(const ir_node *a, const ir_node *b) +{ + /* TODO: ? : can be removed?! */ + sched_timestep_t as = is_Phi(a) ? 0 : sched_get_time_step(a); + sched_timestep_t bs = is_Phi(b) ? 0 : sched_get_time_step(b); + return as < bs; +} + /** * Check, if one value dominates the other. * The dominance is not strict here. @@ -59,6 +73,32 @@ static INLINE int _value_dominates(const ir_node *a, const ir_node *b) return _value_dominates_intrablock(a, b); } +/** + * Check, if one value dominates the other. + * The dominance is strict here. + * @param a The first node. + * @param b The second node. + * @return 1 if a dominates b, 0 else. + */ +static INLINE int _value_strictly_dominates(const ir_node *a, const ir_node *b) +{ + const ir_node *block_a = get_block(a); + const ir_node *block_b = get_block(b); + + /* + * a and b are not in the same block, + * so dominance is determined by the dominance of the blocks. + */ + if(block_a != block_b) { + return block_dominates(block_a, block_b); + } + + /* + * Dominance is determined by the time steps of the schedule. + */ + return _value_strictly_dominates_intrablock(a, b); +} + /** * Check, if two values interfere. * @param lv Liveness information (in the future we should use a be_irg_t here). @@ -108,7 +148,7 @@ static INLINE int _lv_values_interfere(const be_lv_t *lv, const ir_node *a, cons */ foreach_out_edge(a, edge) { const ir_node *user = get_edge_src_irn(edge); - if(get_nodes_block(user) == bb && !is_Phi(user) && b != user && _value_dominates(b, user)) + if(get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates(b, user)) return 1; } } -- 2.20.1