_value_strictly_dominates() implemented
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 21 Jun 2007 14:54:41 +0000 (14:54 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 21 Jun 2007 14:54:41 +0000 (14:54 +0000)
[r14687]

ir/be/beintlive_t.h

index f096db3..49827ee 100644 (file)
@@ -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;
                }
        }