the delayed nodes are also counted in register pressure, subtract them form there
[libfirm] / ir / be / benode.c
index 4e5a45a..1e2e107 100644 (file)
@@ -206,7 +206,7 @@ void be_node_init(void) {
        op_be_AddSP      = new_ir_op(beo_base + beo_AddSP,      "be_AddSP",      op_pin_state_pinned,     N, oparity_unary,    0, sizeof(be_node_attr_t),    &be_node_op_ops);
        op_be_SubSP      = new_ir_op(beo_base + beo_SubSP,      "be_SubSP",      op_pin_state_pinned,     N, oparity_unary,    0, sizeof(be_node_attr_t),    &be_node_op_ops);
        op_be_SetSP      = new_ir_op(beo_base + beo_SetSP,      "be_SetSP",      op_pin_state_pinned,     N, oparity_binary,   0, sizeof(be_stack_attr_t),   &be_node_op_ops);
-       op_be_IncSP      = new_ir_op(beo_base + beo_IncSP,      "be_IncSP",      op_pin_state_pinned,     N, oparity_binary,   0, sizeof(be_stack_attr_t),   &be_node_op_ops);
+       op_be_IncSP      = new_ir_op(beo_base + beo_IncSP,      "be_IncSP",      op_pin_state_pinned,     N, oparity_unary,    0, sizeof(be_stack_attr_t),   &be_node_op_ops);
        op_be_RegParams  = new_ir_op(beo_base + beo_RegParams,  "be_RegParams",  op_pin_state_pinned,     N, oparity_zero,     0, sizeof(be_node_attr_t),    &be_node_op_ops);
        op_be_StackParam = new_ir_op(beo_base + beo_StackParam, "be_StackParam", op_pin_state_pinned,     N, oparity_unary,    0, sizeof(be_frame_attr_t),   &be_node_op_ops);
        op_be_FrameAddr  = new_ir_op(beo_base + beo_FrameAddr,  "be_FrameAddr",  op_pin_state_pinned,     N, oparity_unary,    0, sizeof(be_frame_attr_t),   &be_node_op_ops);
@@ -273,7 +273,16 @@ be_opcode_t be_get_irn_opcode(const ir_node *irn)
        return is_be_node(irn) ? get_irn_opcode(irn) - beo_base : beo_NoBeOp;
 }
 
-static int redir_proj(const ir_node **node, int pos)
+/**
+ * Skip Proj nodes and return their Proj numbers.
+ *
+ * If *node is a Proj or Proj(Proj) node, skip it.
+ *
+ * @param node  points to the node to be skipped
+ *
+ * @return 0 if *node was no Proj node, its Proj number else.
+ */
+static int redir_proj(const ir_node **node)
 {
        const ir_node *n = *node;
 
@@ -768,6 +777,7 @@ int be_is_Return        (const ir_node *irn) { return be_get_irn_opcode(irn) ==
 int be_is_IncSP         (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_IncSP          ; }
 int be_is_SetSP         (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_SetSP          ; }
 int be_is_AddSP         (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_AddSP          ; }
+int be_is_SubSP         (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_SubSP          ; }
 int be_is_RegParams     (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_RegParams      ; }
 int be_is_StackParam    (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_StackParam     ; }
 int be_is_FrameAddr     (const ir_node *irn) { return be_get_irn_opcode(irn) == beo_FrameAddr      ; }
@@ -1057,7 +1067,7 @@ be_node_get_irn_reg_req(const void *self, arch_register_req_t *req, const ir_nod
                if (get_irn_mode(irn) == mode_T)
                        return NULL;
 
-               out_pos = redir_proj((const ir_node **)&irn, pos);
+               out_pos = redir_proj((const ir_node **)&irn);
                assert(is_be_node(irn));
                return put_out_reg_req(req, irn, out_pos);
        }
@@ -1090,7 +1100,7 @@ be_node_get_irn_reg(const void *_self, const ir_node *irn)
 
 static arch_irn_class_t be_node_classify(const void *_self, const ir_node *irn)
 {
-       redir_proj((const ir_node **) &irn, -1);
+       redir_proj((const ir_node **) &irn);
 
        switch(be_get_irn_opcode(irn)) {
 #define XXX(a,b) case beo_ ## a: return arch_irn_class_ ## b
@@ -1173,7 +1183,7 @@ static const arch_irn_ops_t be_node_irn_ops = {
 
 const void *be_node_get_irn_ops(const arch_irn_handler_t *self, const ir_node *irn)
 {
-       redir_proj((const ir_node **) &irn, -1);
+       redir_proj((const ir_node **) &irn);
        return is_be_node(irn) ? &be_node_irn_ops : NULL;
 }