BugFix: edges_activate() must handle the whole root set of nodes
[libfirm] / ir / ir / iredges_t.h
index 9aca773..82dc175 100644 (file)
 
 #include "iredges.h"
 
-#if FIRM_EDGES_INPLACE
-
-#define DBG_EDGES  "edges"
+#define DBG_EDGES  "firm.ir.edges"
 
 /**
  * An edge.
  */
 struct _ir_edge_t {
-#ifdef DEBUG_libfirm
-  long src_nr;            /**< The node number of the source node. */
-#endif
   ir_node *src;           /**< The source node of the edge. */
   int pos;                /**< The position of the edge at @p src. */
   unsigned invalid : 1;   /**< edges that are removed are marked invalid. */
   unsigned present : 1;   /**< Used by the verifier. Don't rely on its content. */
   struct list_head list;  /**< The list head to queue all out edges at a node. */
+#ifdef DEBUG_libfirm
+  long src_nr;            /**< The node number of the source node. */
+#endif
 };
 
 /**
@@ -61,10 +59,10 @@ struct _ir_block_edge_t {
 };
 
 /** Accessor for private irn info. */
-#define _get_irn_edge_info(irn) ((irn_edge_info_t *) &(irn)->edge_info)
+#define _get_irn_edge_info(irn) (&(irn)->edge_info)
 
 /** Accessor for private irg info. */
-#define _get_irg_edge_info(irg) ((irg_edge_info_t *) &(irg)->edge_info)
+#define _get_irg_edge_info(irg) (&(irg)->edge_info)
 
 /**
  * Convenience macro to get the outs_head from a irn_edge_info_t
@@ -87,7 +85,7 @@ struct _ir_block_edge_t {
  */
 static INLINE const ir_edge_t *_get_irn_out_edge_first(const ir_node *irn)
 {
-  struct list_head *head = _get_irn_outs_head(irn);
+  const struct list_head *head = _get_irn_outs_head(irn);
   return list_empty(head) ? NULL : list_entry(head->next, ir_edge_t, list);
 }
 
@@ -167,7 +165,15 @@ static INLINE int _get_edge_src_pos(const ir_edge_t *edge)
  */
 static INLINE int _get_irn_n_edges(const ir_node *irn)
 {
-  return _get_irn_edge_info(irn)->out_count;
+/* Perhaps out_count was buggy. This code does it more safely.
+
+       int res = 0;
+       struct list_head *pos, *head = _get_irn_outs_head(irn);
+       list_for_each(pos, head)
+               res++;
+       return res;
+*/
+       return _get_irn_edge_info(irn)->out_count;
 }
 
 static INLINE int _edges_activated(const ir_graph *irg)
@@ -189,8 +195,15 @@ void edges_reroute(ir_node *old, ir_node *nw, ir_graph *irg);
 
 void edges_init_graph(ir_graph *irg);
 
+/**
+ * Notify of a edge change.
+ * The edge from (src, pos) -> old_tgt is redirected to tgt
+ */
 void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt, ir_graph *irg);
 
+/**
+ * A node is deleted.
+ */
 void edges_node_deleted(ir_node *old, ir_graph *irg);
 
 void edges_invalidate(ir_node *irn, ir_graph *irg);
@@ -237,23 +250,4 @@ extern void init_edges(void);
 #define edges_activated(irg)             _edges_activated(irg)
 #define edges_assure(irg)                _edges_assure(irg)
 
-#else
-/* new edges are disabled */
-
-#define init_edges()
-#define edges_reroute(old, nw, irg)
-#define edges_init_graph(irg);
-#define edges_notify_edge(src, pos, tgt, old_tgt, irg)
-#define edges_node_deleted(old, irg)
-#define edges_invalidate(irn, irg)
-#define get_irn_out_edge_first(irn)       NULL
-#define get_irn_out_edge_next(irn,last)   NULL
-#define get_edge_src_irn(edge)            NULL
-#define get_edge_src_pos(edge)            -1
-#define get_edge_private_data(edge,ofs)   NULL
-#define edges_activated(irg)              0
-#define edges_assure(irg)
-
-#endif /* FIRM_EDGES_INPLACE */
-
 #endif /* _FIRM_EDGES_T_H */