BugFix: set_irn_n() should now work for the block input (-1)
[libfirm] / ir / ir / irnode.c
index 8e184cd..5e3ba55 100644 (file)
@@ -30,6 +30,7 @@
 #include "iredges_t.h"
 
 #include "irhooks.h"
+#include "irtools.h"
 
 /* some constants fixing the positions of nodes predecessors
    in the in array */
@@ -158,16 +159,16 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
 
 #if FIRM_EDGES_INPLACE
   {
-    int i, n;
-    int not_a_block = is_no_Block(res);
+    int i;
+    int is_bl = is_Block(res);
 
     INIT_LIST_HEAD(&res->edge_info.outs_head);
-    if(!not_a_block)
+    if(is_bl)
       INIT_LIST_HEAD(&res->attr.block.succ_head);
 
 
-    for (i = 0, n = arity + not_a_block; i < n; ++i)
-      edges_notify_edge(res, i - not_a_block, res->in[i], NULL, irg);
+    for (i = is_bl; i <= arity; ++i)
+      edges_notify_edge(res, i - 1, res->in[i], NULL, irg);
   }
 #endif
 
@@ -225,6 +226,7 @@ void
 set_irn_in (ir_node *node, int arity, ir_node **in) {
   int i;
   ir_node *** arr;
+  ir_graph *irg = current_ir_graph;
   assert(node);
   if (get_interprocedural_view()) { /* handle Filter and Block specially */
     if (get_irn_opcode(node) == iro_Filter) {
@@ -241,20 +243,20 @@ set_irn_in (ir_node *node, int arity, ir_node **in) {
 
        for (i = 0; i < arity; i++) {
                if (i < ARR_LEN(*arr)-1)
-       edges_notify_edge(node, i, in[i], (*arr)[i+1], current_ir_graph);
+       edges_notify_edge(node, i, in[i], (*arr)[i+1], irg);
                else
-           edges_notify_edge(node, i, in[i], NULL,        current_ir_graph);
+           edges_notify_edge(node, i, in[i], NULL,        irg);
   }
        for(;i < ARR_LEN(*arr)-1; i++) {
-               edges_notify_edge(node, i, NULL, (*arr)[i+1], current_ir_graph);
+               edges_notify_edge(node, i, NULL, (*arr)[i+1], irg);
        }
 
        if (arity != ARR_LEN(*arr) - 1) {
     ir_node * block = (*arr)[0];
-    *arr = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
+    *arr = NEW_ARR_D(ir_node *, irg->obst, arity + 1);
     (*arr)[0] = block;
   }
-  fix_backedges(current_ir_graph->obst, node);
+  fix_backedges(irg->obst, node);
 
   memcpy((*arr) + 1, in, sizeof(ir_node *) * arity);
 }
@@ -465,13 +467,12 @@ void firm_set_irn_section(ir_node *n, struct section *s) {}
 
 
 /* Outputs a unique number for this node */
-long
-get_irn_node_nr(const ir_node *node) {
+long get_irn_node_nr(const ir_node *node) {
   assert(node);
 #ifdef DEBUG_libfirm
   return node->node_nr;
 #else
-  return (long)node;
+  return (long)PTR_TO_INT(node);
 #endif
 }
 
@@ -630,12 +631,12 @@ get_Block_cfgpred_arr (ir_node *node)
 
 int
 (get_Block_n_cfgpreds)(ir_node *node) {
-  return get_Block_n_cfgpreds(node);
+  return _get_Block_n_cfgpreds(node);
 }
 
 ir_node *
 (get_Block_cfgpred)(ir_node *node, int pos) {
-  return get_Block_cfgpred(node, pos);
+  return _get_Block_cfgpred(node, pos);
 }
 
 void
@@ -748,22 +749,19 @@ int (is_Block_dead)(const ir_node *block) {
 }
 
 ir_extblk *get_Block_extbb(const ir_node *block) {
+       ir_extblk *res;
   assert(is_Block(block));
-  return block->attr.block.extblk;
+       res = block->attr.block.extblk;
+       assert(res == NULL || is_ir_extbb(res));
+  return res;
 }
 
 void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
   assert(is_Block(block));
+       assert(extblk == NULL || is_ir_extbb(extblk));
   block->attr.block.extblk = extblk;
 }
 
-void
-set_Start_irg(ir_node *node, ir_graph *irg) {
-  assert(node->op == op_Start);
-  assert(is_ir_graph(irg));
-  assert(0 && " Why set irg? -- use set_irn_irg");
-}
-
 int
 get_End_n_keepalives(ir_node *end) {
   assert (end->op == op_End);
@@ -1788,7 +1786,7 @@ ir_type *get_Proj_type(ir_node *n)
   case iro_Call: break;
   case iro_Load: {
     ir_node *a = get_Load_ptr(pred);
-    if (get_irn_op(a) == op_Sel)
+    if (is_Sel(a))
       tp = get_entity_type(get_Sel_entity(a));
   } break;
   default:
@@ -2313,12 +2311,30 @@ int
   return _is_Block(node);
 }
 
-/* returns true if node is a Unknown node. */
+/* returns true if node is an Unknown node. */
 int
 (is_Unknown)(const ir_node *node) {
   return _is_Unknown(node);
 }
 
+/* returns true if node is a Return node. */
+int
+(is_Return)(const ir_node *node) {
+  return _is_Return(node);
+}
+
+/* returns true if node is a Call node. */
+int
+(is_Call)(const ir_node *node) {
+  return _is_Call(node);
+}
+
+/* returns true if node is a Sel node. */
+int
+(is_Sel)(const ir_node *node) {
+  return _is_Sel(node);
+}
+
 int
 is_Proj (const ir_node *node) {
   assert(node);