added new licence header
[libfirm] / ir / ir / irnode.c
index 695a346..10813ee 100644 (file)
@@ -1,3 +1,22 @@
+/*
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
 /*
  * Project:     libFIRM
  * File name:   ir/ir/irnode.c
@@ -7,7 +26,6 @@
  * Created:
  * CVS-ID:      $Id$
  * Copyright:   (c) 1998-2006 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -123,7 +141,7 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
        ir_node *res;
        size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size;
        char *p;
-       int i, is_bl;
+       int i;
 
        assert(irg && op && mode);
        p = obstack_alloc (irg->obst, node_size);
@@ -156,8 +174,9 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
        for(i = 0; i < EDGE_KIND_LAST; ++i)
                INIT_LIST_HEAD(&res->edge_info[i].outs_head);
 
-       is_bl = is_Block(res);
-       for (i = is_bl; i <= arity; ++i)
+       // don't put this into the for loop, arity is -1 for some nodes!
+       edges_notify_edge(res, -1, res->in[0], NULL, irg);
+       for (i = 1; i <= arity; ++i)
                edges_notify_edge(res, i - 1, res->in[i], NULL, irg);
 
        hook_new_node(irg, res);
@@ -301,6 +320,22 @@ set_irn_n (ir_node *node, int n, ir_node *in) {
        node->in[n + 1] = in;
 }
 
+int add_irn_n(ir_node *node, ir_node *in)
+{
+       int pos;
+       ir_graph *irg = get_irn_irg(node);
+
+       assert(node->op->opar == oparity_dynamic);
+       pos = ARR_LEN(node->in) - 1;
+       ARR_APP1(ir_node *, node->in, in);
+       edges_notify_edge(node, pos, node->in[pos + 1], NULL, irg);
+
+       /* Call the hook */
+       hook_set_irn_n(node, pos, node->in[pos + 1], NULL);
+
+       return pos;
+}
+
 int
 (get_irn_deps)(const ir_node *node)
 {
@@ -712,7 +747,7 @@ set_Block_matured(ir_node *node, int matured) {
 }
 
 unsigned long
-(get_Block_block_visited)(ir_node *node) {
+(get_Block_block_visited)(const ir_node *node) {
        return _get_Block_block_visited(node);
 }
 
@@ -728,10 +763,15 @@ void
 }
 
 int
-(Block_not_block_visited)(ir_node *node) {
+(Block_not_block_visited)(const ir_node *node) {
        return _Block_not_block_visited(node);
 }
 
+int
+(Block_block_visited)(const ir_node *node) {
+       return _Block_block_visited(node);
+}
+
 ir_node *
 get_Block_graph_arr (ir_node *node, int pos) {
        assert(node->op == op_Block);
@@ -825,13 +865,8 @@ get_End_keepalive(ir_node *end, int pos) {
 
 void
 add_End_keepalive (ir_node *end, ir_node *ka) {
-       int l;
-       ir_graph *irg = get_irn_irg(end);
-
        assert(end->op == op_End);
-       l = ARR_LEN(end->in);
-       ARR_APP1(ir_node *, end->in, ka);
-       edges_notify_edge(end, l - 1, end->in[l], NULL, irg);
+       add_irn_n(end, ka);
 }
 
 void
@@ -846,14 +881,14 @@ void set_End_keepalives(ir_node *end, int n, ir_node *in[]) {
        ir_graph *irg = get_irn_irg(end);
 
        /* notify that edges are deleted */
-       for (i = 1 + END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in); ++i) {
-               edges_notify_edge(end, i, end->in[i], NULL, irg);
+       for (i = END_KEEPALIVE_OFFSET; i < ARR_LEN(end->in) - 1; ++i) {
+               edges_notify_edge(end, i, NULL, end->in[i + 1], irg);
        }
        ARR_RESIZE(ir_node *, end->in, n + 1 + END_KEEPALIVE_OFFSET);
 
        for (i = 0; i < n; ++i) {
                end->in[1 + END_KEEPALIVE_OFFSET + i] = in[i];
-               edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, NULL, end->in[1 + END_KEEPALIVE_OFFSET + i], irg);
+               edges_notify_edge(end, END_KEEPALIVE_OFFSET + i, end->in[1 + END_KEEPALIVE_OFFSET + i], NULL, irg);
        }
 }
 
@@ -1817,13 +1852,8 @@ void set_Sync_pred(ir_node *node, int pos, ir_node *pred) {
 
 /* Add a new Sync predecessor */
 void add_Sync_pred(ir_node *node, ir_node *pred) {
-       int l;
-       ir_graph *irg = get_irn_irg(node);
-
        assert(node->op == op_Sync);
-       l = ARR_LEN(node->in);
-       ARR_APP1(ir_node *, node->in, pred);
-       edges_notify_edge(node, l, node->in[l], NULL, irg);
+       add_irn_n(node, pred);
 }
 
 /* Returns the source language type of a Proj node. */
@@ -1870,6 +1900,16 @@ set_Proj_pred(ir_node *node, ir_node *pred) {
        set_irn_n(node, 0, pred);
 }
 
+long get_VProj_proj(const ir_node *node)
+{
+       return node->attr.proj;
+}
+
+void set_VProj_proj(ir_node *node, long value)
+{
+       node->attr.proj = value;
+}
+
 long
 get_Proj_proj(const ir_node *node) {
        assert(is_Proj(node));
@@ -2458,6 +2498,11 @@ int
        return _is_DivMod(node);
 }
 
+int
+(is_Quot)(const ir_node *node) {
+       return _is_Quot(node);
+}
+
 int
 (is_Start)(const ir_node *node) {
   return _is_Start(node);