- removed useless be_req_t which was a wrapper around an arch_register_req_t
[libfirm] / ir / be / beintlive_t.h
index 659f5de..fc075a6 100644 (file)
 #include "irphase_t.h"
 #include "iredges_t.h"
 
-#include "irlivechk.h"
+#include "statev.h"
 
 #include "beirg_t.h"
 #include "besched_t.h"
+#include "belive_t.h"
 
 /**
  * Check dominance of two nodes in the same block.
  * @param b The second node.
  * @return 1 if a comes before b in the same block or if a == b, 0 else.
  */
-static INLINE int _value_dominates_intrablock(const ir_node *a, const ir_node *b)
+static inline int _value_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);
+       sched_timestep_t as = sched_is_scheduled(a) ? sched_get_time_step(a) : 0;
+       sched_timestep_t bs = sched_is_scheduled(b) ? sched_get_time_step(b) : 0;
        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 = sched_is_scheduled(a) ? sched_get_time_step(a) : 0;
+       sched_timestep_t bs = sched_is_scheduled(b) ? sched_get_time_step(b) : 0;
+       return as < bs;
+}
+
 /**
  * Check, if one value dominates the other.
  * The dominance is not strict here.
@@ -42,10 +57,10 @@ static INLINE int _value_dominates_intrablock(const ir_node *a, const ir_node *b
  * @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(a);
-       const ir_node *block_b = get_block(b);
+       const ir_node *block_a = get_block_const(a);
+       const ir_node *block_b = get_block_const(b);
 
        /*
         * a and b are not in the same block,
@@ -61,6 +76,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_const(a);
+       const ir_node *block_b = get_block_const(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).
@@ -68,34 +109,38 @@ static INLINE int _value_dominates(const ir_node *a, const ir_node *b)
  * @param b The second value.
  * @return 1, if a and b interfere, 0 if not.
  */
-static INLINE int _lv_values_interfere(const be_lv_t *lv, const ir_node *a, const ir_node *b)
+static inline int _lv_values_interfere(const be_lv_t *lv, const ir_node *a, const ir_node *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;
+               a = b;
+               b = t;
+               a2b = 1;
+       }
 
        /* If there is no dominance relation, they do not interfere. */
-       if((a2b | b2a) > 0) {
+       if(a2b) {
                const ir_edge_t *edge;
-               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;
-               }
+               ir_node *bb = get_nodes_block(b);
 
-               bb = get_nodes_block(b);
+               //stat_ev_dbl("beintlive_ignore", arch_irn_is(lv->birg->main_env->arch_env, a, ignore));
 
                /*
                 * 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(be_is_live_end(lv, bb, a)) {
+                       res = 1;
+                       goto end;
+               }
 
                /*
                 * Look at all usages of a.
@@ -110,12 +155,15 @@ 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))
-                               return 1;
+                       if(get_nodes_block(user) == bb && !is_Phi(user) && _value_strictly_dominates(b, user)) {
+                               res = 1;
+                               goto end;
+                       }
                }
        }
 
-       return 0;
+end:
+       return res;
 }
 
 
@@ -127,7 +175,7 @@ static INLINE int _lv_values_interfere(const be_lv_t *lv, const ir_node *a, cons
  * @param edge The use.
  * @return     1, if @p irn dominates the use @p edge.
  */
-static INLINE int _dominates_use(const ir_node *irn, const ir_edge_t *edge)
+static inline int _dominates_use(const ir_node *irn, const ir_edge_t *edge)
 {
        ir_node *use = get_edge_src_irn(edge);
 
@@ -149,7 +197,7 @@ static INLINE int _dominates_use(const ir_node *irn, const ir_edge_t *edge)
  * @param edge The use.
  * @return     1, if @p irn strictly dominates the use @p edge.
  */
-static INLINE int _strictly_dominates_use(const ir_node *irn, const ir_edge_t *edge)
+static inline int _strictly_dominates_use(const ir_node *irn, const ir_edge_t *edge)
 {
        return get_edge_src_irn(edge) != irn && _dominates_use(irn, edge);
 }
@@ -161,9 +209,9 @@ static INLINE int _strictly_dominates_use(const ir_node *irn, const ir_edge_t *e
  * @param where The location to check for.
  * @return      1, if @p irn is live in front of @p where.
  */
-static INLINE int _be_lv_chk_before_irn(const be_irg_t *birg, const ir_node *irn, const ir_node *where)
+static inline int _be_lv_chk_before_irn(const be_irg_t *birg, const ir_node *irn, const ir_node *where)
 {
-       const lv_chk_t *lv = be_get_birg_liveness_chk(birg);
+       const be_lv_t *lv = be_get_birg_liveness(birg);
        const ir_edge_t *edge;
 
        /* the node must strictly dominate the location, else it cannot be live there. */
@@ -174,7 +222,7 @@ static INLINE int _be_lv_chk_before_irn(const be_irg_t *birg, const ir_node *irn
         * now that it is clear that it strictly dominates the location it is surely live
         * if it is also live end at the block.
         */
-       if (lv_chk_bl_end(lv, get_nodes_block(where), irn))
+       if (be_is_live_end(lv, get_nodes_block(where), irn))
                return 1;
 
        /*
@@ -196,15 +244,15 @@ static INLINE int _be_lv_chk_before_irn(const be_irg_t *birg, const ir_node *irn
  * @param where The location to check for.
  * @return      1, if @p irn is live after @p where.
  */
-static INLINE int _be_lv_chk_after_irn(const be_irg_t *birg, const ir_node *irn, const ir_node *where)
+static inline int _be_lv_chk_after_irn(const be_irg_t *birg, const ir_node *irn, const ir_node *where)
 {
-       const lv_chk_t *lv = be_get_birg_liveness_chk(birg);
+       const be_lv_t *lv = be_get_birg_liveness(birg);
        const ir_edge_t *edge;
 
        if (!_value_dominates(irn, where))
                return 0;
 
-       if (lv_chk_bl_end(lv, get_nodes_block(where), irn))
+       if (be_is_live_end(lv, get_nodes_block(where), irn))
                return 1;
 
        foreach_out_edge (irn, edge) {
@@ -215,37 +263,12 @@ static INLINE int _be_lv_chk_after_irn(const be_irg_t *birg, const ir_node *irn,
        return 0;
 }
 
-/**
- * Check, if two nodes interfere.
- * This will become the favored rotine to call but it is not used yet.
- * @param birg   The backend irg.
- * @param a      The first node.
- * @param b      The second node.
- * @return       1, if a and b interfere, 0 if not.
- */
-static INLINE int _be_lv_chk_values_interfere(const be_irg_t *birg, const ir_node *a, const ir_node *b)
-{
-       int adb = _value_dominates(a, b);
-       int bda = _value_dominates(b, a);
-
-       if (bda) {
-               const ir_node *t = a;
-               a = b;
-               b = t;
-               adb = 1;
-       }
-
-       return adb && _be_lv_chk_after_irn(birg, a, b);
-}
-
 #define value_dominates_intrablock(a, b)         _value_dominates_intrablock(a, b)
 #define value_dominates(a, b)                    _value_dominates(a, b)
-#define lv_values_interfere(lv, a, b)            _lv_values_interfere(lv, a, b)
 #define values_interfere(birg, a, b)             _lv_values_interfere(be_get_birg_liveness(birg), a, b)
 #define dominates_use(a, e)                      _dominates_use(a, e)
 #define strictly_dominates_use(a, e)             _strictly_dominates_use(a, e)
 #define be_lv_chk_before_irn(birg, a, b)         _be_lv_chk_before_irn(birg, a, b)
 #define be_lv_chk_after_irn(birg, a, b)          _be_lv_chk_after_irn(birg, a, b)
-#define be_lv_chk_values_interfere(birg, a, b)   _be_lv_chk_values_interfere(birg, a, b)
 
 #endif /* _BELIVECHK_T_H */