some fixes for xml dumper / still buggy.
[libfirm] / ir / ir / irnode.c
index 6711704..da0cee2 100644 (file)
@@ -137,6 +137,15 @@ copy_attrs (ir_node *old, ir_node *new) {
 
 /** getting some parameters from ir_nodes **/
 
+int
+is_ir_node (void *thing) {
+  assert(thing);
+  if (get_kind(thing) == k_ir_node)
+    return 1;
+  else
+    return 0;
+}
+
 /* returns the number of predecessors without the block predecessor. */
 INLINE int
 get_irn_arity (const ir_node *node) {
@@ -2116,6 +2125,7 @@ get_irn_irg(ir_node *node) {
     return node->attr.end.irg;
   } else {
     assert(0 && "no irg attr");
+    return NULL;
   }
 }
 
@@ -2151,6 +2161,9 @@ skip_Tuple (ir_node *node) {
   return node;
 }
 
+/* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
+   than any other approach, as Id chains are resolved and all point to the real node, or
+   all id's are self loops. */
 INLINE ir_node *
 skip_nop (ir_node *node) {
   /* don't assert node !!! */
@@ -2160,8 +2173,17 @@ skip_nop (ir_node *node) {
   /* Don't use get_Id_pred:  We get into an endless loop for
      self-referencing Ids. */
   if (node && (node->op == op_Id) && (node != node->in[0+1])) {
+    ir_node *rem_pred = node->in[0+1];
+    ir_node *res;
+
     assert (get_irn_arity (node) > 0);
-    return node->in[0+1];
+
+    node->in[0+1] = node;
+    res = skip_nop(rem_pred);
+    if (res->op == op_Id) /* self-loop */ return node;
+
+    node->in[0+1] = res;
+    return res;
   } else {
     return node;
   }