- Changed keep logic: all nodes can be keeped yet, thi is necessary to fix fehler152
[libfirm] / ir / ir / irnode.c
index 85dd309..b0d062f 100644 (file)
@@ -138,7 +138,9 @@ new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mod
        char *p;
        int i;
 
-       assert(irg && op && mode);
+       assert(irg);
+       assert(op);
+       assert(mode);
        p = obstack_alloc(irg->obst, node_size);
        memset(p, 0, node_size);
        res = (ir_node *)(p + firm_add_node_size);
@@ -900,8 +902,12 @@ ir_node *get_End_keepalive(const ir_node *end, int pos) {
 }
 
 void add_End_keepalive(ir_node *end, ir_node *ka) {
+       ir_graph *irg = get_irn_irg(end);
        assert(is_End(end));
-       assert((is_Phi(ka) || is_Proj(ka) || is_Block(ka) || is_irn_keep(ka)) && "Only Phi, Block or Keep nodes can be kept alive!");
+
+       if (get_irg_phase_state(irg) == phase_building) {
+               assert((is_Phi(ka) || is_Block(ka) || is_irn_keep(ka)) && "Only Phi, Block or Keep nodes can be kept alive!");
+       }
        add_irn_n(end, ka);
 }
 
@@ -1335,7 +1341,7 @@ set_Call_ptr(ir_node *node, ir_node *ptr) {
 ir_node **
 get_Call_param_arr(ir_node *node) {
        assert(is_Call(node));
-       return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET + 1];
+       return &get_irn_in(node)[CALL_PARAM_OFFSET + 1];
 }
 
 int
@@ -2530,6 +2536,13 @@ const ir_node *skip_Cast_const(const ir_node *node) {
        return node;
 }
 
+/* returns operand of node if node is a Pin */
+ir_node *skip_Pin(ir_node *node) {
+       if (is_Pin(node))
+               return get_Pin_op(node);
+       return node;
+}
+
 /* returns operand of node if node is a Confirm */
 ir_node *skip_Confirm(ir_node *node) {
        if (get_irn_op(node) == op_Confirm)