backend: created a (not so nice) macro to iterate over all values defined by an instr...
[libfirm] / ir / be / benode.c
index 73263a3..4657324 100644 (file)
@@ -37,7 +37,6 @@
 #include "util.h"
 #include "debug.h"
 #include "fourcc.h"
-#include "offset.h"
 #include "bitfiddle.h"
 #include "raw_bitset.h"
 #include "error.h"
@@ -130,7 +129,6 @@ static const ir_op_ops be_node_op_ops;
 #define L   irop_flag_labeled
 #define C   irop_flag_commutative
 #define X   irop_flag_cfopcode
-#define I   irop_flag_ip_cfopcode
 #define F   irop_flag_fragile
 #define Y   irop_flag_forking
 #define H   irop_flag_highlevel
@@ -205,7 +203,8 @@ static int Return_cmp_attr(ir_node *a, ir_node *b)
  *
  * @return zero if both nodes have identically attributes
  */
-static int IncSP_cmp_attr(ir_node *a, ir_node *b) {
+static int IncSP_cmp_attr(ir_node *a, ir_node *b)
+{
        const be_incsp_attr_t *a_attr = get_irn_attr_const(a);
        const be_incsp_attr_t *b_attr = get_irn_attr_const(b);
 
@@ -235,7 +234,7 @@ static int Call_cmp_attr(ir_node *a, ir_node *b)
 static arch_register_req_t *allocate_reg_req(const ir_node *node)
 {
        ir_graph       *irg  = get_irn_irg(node);
-       struct obstack *obst = be_get_birg_obst(irg);
+       struct obstack *obst = be_get_be_obst(irg);
 
        arch_register_req_t *req = obstack_alloc(obst, sizeof(*req));
        memset(req, 0, sizeof(*req));
@@ -262,7 +261,7 @@ void be_set_constr_out(ir_node *node, int pos, const arch_register_req_t *req)
 static void *init_node_attr(ir_node *node, int n_inputs, int n_outputs)
 {
        ir_graph       *irg  = get_irn_irg(node);
-       struct obstack *obst = be_get_birg_obst(irg);
+       struct obstack *obst = be_get_be_obst(irg);
        be_node_attr_t *a    = get_irn_attr(node);
        backend_info_t *info = be_get_info(node);
 
@@ -441,9 +440,10 @@ void be_Perm_reduce(ir_node *perm, int new_size, int *map)
        set_irn_in(perm, new_size, new_in);
 }
 
-ir_node *be_new_MemPerm(const arch_env_t *arch_env, ir_node *bl, int n, ir_node *in[])
+ir_node *be_new_MemPerm(ir_node *block, int n, ir_node *in[])
 {
-       ir_graph                     *irg       = get_Block_irg(bl);
+       ir_graph                     *irg       = get_Block_irg(block);
+       const arch_env_t             *arch_env  = be_get_irg_arch_env(irg);
        ir_node                      *frame     = get_irg_frame(irg);
        const arch_register_t        *sp        = arch_env->sp;
        ir_node                      *irn;
@@ -454,7 +454,7 @@ ir_node *be_new_MemPerm(const arch_env_t *arch_env, ir_node *bl, int n, ir_node
        real_in[0] = frame;
        memcpy(&real_in[1], in, n * sizeof(real_in[0]));
 
-       irn = new_ir_node(NULL, irg, bl, op_be_MemPerm, mode_T, n+1, real_in);
+       irn = new_ir_node(NULL, irg, block, op_be_MemPerm, mode_T, n+1, real_in);
 
        init_node_attr(irn, n + 1, n);
        be_node_set_reg_class_in(irn, 0, sp->reg_class);
@@ -488,11 +488,13 @@ ir_node *be_new_Copy(const arch_register_class_t *cls, ir_node *bl, ir_node *op)
        return res;
 }
 
-ir_node *be_get_Copy_op(const ir_node *cpy) {
+ir_node *be_get_Copy_op(const ir_node *cpy)
+{
        return get_irn_n(cpy, be_pos_Copy_op);
 }
 
-void be_set_Copy_op(ir_node *cpy, ir_node *op) {
+void be_set_Copy_op(ir_node *cpy, ir_node *op)
+{
        set_irn_n(cpy, be_pos_Copy_op, op);
 }
 
@@ -549,39 +551,45 @@ ir_node *be_new_Call(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem,
 }
 
 /* Gets the call entity or NULL if this is no static call. */
-ir_entity *be_Call_get_entity(const ir_node *call) {
+ir_entity *be_Call_get_entity(const ir_node *call)
+{
        const be_call_attr_t *a = get_irn_attr_const(call);
        assert(be_is_Call(call));
        return a->ent;
 }
 
 /* Sets the call entity. */
-void be_Call_set_entity(ir_node *call, ir_entity *ent) {
+void be_Call_set_entity(ir_node *call, ir_entity *ent)
+{
        be_call_attr_t *a = get_irn_attr(call);
        assert(be_is_Call(call));
        a->ent = ent;
 }
 
 /* Gets the call type. */
-ir_type *be_Call_get_type(ir_node *call) {
+ir_type *be_Call_get_type(ir_node *call)
+{
        const be_call_attr_t *a = get_irn_attr_const(call);
        assert(be_is_Call(call));
        return a->call_tp;
 }
 
 /* Sets the call type. */
-void be_Call_set_type(ir_node *call, ir_type *call_tp) {
+void be_Call_set_type(ir_node *call, ir_type *call_tp)
+{
        be_call_attr_t *a = get_irn_attr(call);
        assert(be_is_Call(call));
        a->call_tp = call_tp;
 }
 
-void be_Call_set_pop(ir_node *call, unsigned pop) {
+void be_Call_set_pop(ir_node *call, unsigned pop)
+{
        be_call_attr_t *a = get_irn_attr(call);
        a->pop = pop;
 }
 
-unsigned be_Call_get_pop(const ir_node *call) {
+unsigned be_Call_get_pop(const ir_node *call)
+{
        const be_call_attr_t *a = get_irn_attr_const(call);
        return a->pop;
 }
@@ -611,30 +619,35 @@ ir_node *be_new_Return(dbg_info *dbg, ir_graph *irg, ir_node *block, int n_res,
 }
 
 /* Returns the number of real returns values */
-int be_Return_get_n_rets(const ir_node *ret) {
+int be_Return_get_n_rets(const ir_node *ret)
+{
        const be_return_attr_t *a = get_irn_generic_attr_const(ret);
        return a->num_ret_vals;
 }
 
 /* return the number of bytes that should be popped from stack when executing the Return. */
-unsigned be_Return_get_pop(const ir_node *ret) {
+unsigned be_Return_get_pop(const ir_node *ret)
+{
        const be_return_attr_t *a = get_irn_generic_attr_const(ret);
        return a->pop;
 }
 
 /* return non-zero, if number of popped bytes must be always emitted */
-int be_Return_get_emit_pop(const ir_node *ret) {
+int be_Return_get_emit_pop(const ir_node *ret)
+{
        const be_return_attr_t *a = get_irn_generic_attr_const(ret);
        return a->emit_pop;
 }
 
 /* return non-zero, if number of popped bytes must be always emitted */
-void be_Return_set_emit_pop(ir_node *ret, int emit_pop) {
+void be_Return_set_emit_pop(ir_node *ret, int emit_pop)
+{
        be_return_attr_t *a = get_irn_generic_attr(ret);
        a->emit_pop = emit_pop;
 }
 
-int be_Return_append_node(ir_node *ret, ir_node *node) {
+int be_Return_append_node(ir_node *ret, ir_node *node)
+{
        int pos;
 
        pos = add_irn_n(ret, node);
@@ -713,13 +726,13 @@ ir_node *be_new_SubSP(const arch_register_t *sp, ir_node *bl, ir_node *old_sp, i
        return irn;
 }
 
-ir_node *be_new_Start(ir_node *bl, int n_outs)
+ir_node *be_new_Start(dbg_info *dbgi, ir_node *bl, int n_outs)
 {
        ir_node *res;
        int i;
        ir_graph *irg = get_Block_irg(bl);
 
-       res = new_ir_node(NULL, irg, bl, op_be_Start, mode_T, 0, NULL);
+       res = new_ir_node(dbgi, irg, bl, op_be_Start, mode_T, 0, NULL);
        init_node_attr(res, 0, -1);
        for (i = 0; i < n_outs; ++i) {
                add_register_req_out(res);
@@ -746,7 +759,8 @@ ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_node *bl, i
        return optimize_node(irn);
 }
 
-ir_node *be_get_FrameAddr_frame(const ir_node *node) {
+ir_node *be_get_FrameAddr_frame(const ir_node *node)
+{
        assert(be_is_FrameAddr(node));
        return get_irn_n(node, be_pos_FrameAddr_ptr);
 }
@@ -778,11 +792,13 @@ ir_node *be_new_CopyKeep_single(const arch_register_class_t *cls, ir_node *bl, i
        return be_new_CopyKeep(cls, bl, src, 1, &keep, mode);
 }
 
-ir_node *be_get_CopyKeep_op(const ir_node *cpy) {
+ir_node *be_get_CopyKeep_op(const ir_node *cpy)
+{
        return get_irn_n(cpy, be_pos_CopyKeep_op);
 }
 
-void be_set_CopyKeep_op(ir_node *cpy, ir_node *op) {
+void be_set_CopyKeep_op(ir_node *cpy, ir_node *op)
+{
        set_irn_n(cpy, be_pos_CopyKeep_op, op);
 }
 
@@ -805,26 +821,25 @@ ir_node *be_new_Barrier(ir_node *bl, int n, ir_node *in[])
 
 ir_node *be_Barrier_append_node(ir_node *barrier, ir_node *node)
 {
-       ir_node *block = get_nodes_block(barrier);
        ir_mode *mode = get_irn_mode(node);
        int n = add_irn_n(barrier, node);
 
-       ir_node *proj = new_r_Proj(block, barrier, mode, n);
+       ir_node *proj = new_r_Proj(barrier, mode, n);
        add_register_req_in(barrier);
        add_register_req_out(barrier);
 
        return proj;
 }
 
-int be_has_frame_entity(const ir_node *irn)
+static bool be_has_frame_entity(const ir_node *irn)
 {
        switch (get_irn_opcode(irn)) {
        case beo_Spill:
        case beo_Reload:
        case beo_FrameAddr:
-               return 1;
+               return true;
        default:
-               return 0;
+               return false;
        }
 }
 
@@ -892,7 +907,7 @@ int be_get_MemPerm_entity_arity(const ir_node *irn)
        return get_irn_arity(irn) - 1;
 }
 
-static const arch_register_req_t *get_single_req(struct obstack *obst,
+const arch_register_req_t *be_create_reg_req(struct obstack *obst,
                const arch_register_t *reg, arch_register_req_type_t additional_types)
 {
        arch_register_req_t         *req = obstack_alloc(obst, sizeof(*req));
@@ -917,8 +932,8 @@ void be_set_constr_single_reg_in(ir_node *node, int pos,
                req = reg->single_req;
        } else {
                ir_graph       *irg  = get_irn_irg(node);
-               struct obstack *obst = be_get_birg_obst(irg);
-               req = get_single_req(obst, reg, additional_types);
+               struct obstack *obst = be_get_be_obst(irg);
+               req = be_create_reg_req(obst, reg, additional_types);
        }
        be_set_constr_in(node, pos, req);
 }
@@ -937,8 +952,8 @@ void be_set_constr_single_reg_out(ir_node *node, int pos,
                req = reg->single_req;
        } else {
                ir_graph       *irg  = get_irn_irg(node);
-               struct obstack *obst = be_get_birg_obst(irg);
-               req = get_single_req(obst, reg, additional_types);
+               struct obstack *obst = be_get_be_obst(irg);
+               req = be_create_reg_req(obst, reg, additional_types);
        }
 
        arch_irn_set_register(node, pos, reg);
@@ -957,12 +972,14 @@ void be_node_set_reg_class_out(ir_node *irn, int pos,
        be_set_constr_out(irn, pos, cls->class_req);
 }
 
-ir_node *be_get_IncSP_pred(ir_node *irn) {
+ir_node *be_get_IncSP_pred(ir_node *irn)
+{
        assert(be_is_IncSP(irn));
        return get_irn_n(irn, 0);
 }
 
-void be_set_IncSP_pred(ir_node *incsp, ir_node *pred) {
+void be_set_IncSP_pred(ir_node *incsp, ir_node *pred)
+{
        assert(be_is_IncSP(incsp));
        set_irn_n(incsp, 0, pred);
 }
@@ -1061,7 +1078,7 @@ static ir_entity *be_node_get_frame_entity(const ir_node *irn)
        return be_get_frame_entity(irn);
 }
 
-static void be_node_set_frame_entity(ir_node *irn, ir_entity *ent)
+void be_node_set_frame_entity(ir_node *irn, ir_entity *ent)
 {
        be_frame_attr_t *a;
 
@@ -1106,7 +1123,6 @@ static const arch_irn_ops_t be_node_irn_ops = {
        be_node_get_in_reg_req,
        be_node_classify,
        be_node_get_frame_entity,
-       be_node_set_frame_entity,
        be_node_set_frame_offset,
        be_node_get_sp_bias,
        NULL,    /* get_inverse             */
@@ -1135,13 +1151,6 @@ static ir_entity* dummy_get_frame_entity(const ir_node *node)
        return NULL;
 }
 
-static void dummy_set_frame_entity(ir_node *node, ir_entity *entity)
-{
-       (void) node;
-       (void) entity;
-       panic("dummy_set_frame_entity() should not be called");
-}
-
 static void dummy_set_frame_offset(ir_node *node, int bias)
 {
        (void) node;
@@ -1160,7 +1169,6 @@ static const arch_irn_ops_t dummy_be_irn_ops = {
        dummy_reg_req,
        dummy_classify,
        dummy_get_frame_entity,
-       dummy_set_frame_entity,
        dummy_set_frame_offset,
        dummy_get_sp_bias,
        NULL,      /* get_inverse           */
@@ -1181,7 +1189,7 @@ static const arch_irn_ops_t dummy_be_irn_ops = {
 ir_node *be_new_Phi(ir_node *block, int n_ins, ir_node **ins, ir_mode *mode,
                     const arch_register_class_t *cls)
 {
-       struct obstack *obst = be_get_birg_obst(get_irn_irg(block));
+       struct obstack *obst = be_get_be_obst(get_irn_irg(block));
        backend_info_t *info;
 
        ir_node *phi = new_r_Phi(block, n_ins, ins, mode);
@@ -1272,9 +1280,9 @@ void be_set_phi_reg_req(ir_node *node, const arch_register_req_t *req)
        assert(mode_is_datab(get_irn_mode(node)));
 }
 
-int be_dump_phi_reg_reqs(ir_node *node, FILE *F, dump_reason_t reason)
+void be_dump_phi_reg_reqs(FILE *F, ir_node *node, dump_reason_t reason)
 {
-       switch(reason) {
+       switch (reason) {
        case dump_node_opcode_txt:
                fputs(get_op_name(get_irn_op(node)), F);
                break;
@@ -1295,15 +1303,12 @@ int be_dump_phi_reg_reqs(ir_node *node, FILE *F, dump_reason_t reason)
        default:
                break;
        }
-
-       return 0;
 }
 
 static const arch_irn_ops_t phi_irn_ops = {
        phi_get_irn_reg_req,
        dummy_classify,
        dummy_get_frame_entity,
-       dummy_set_frame_entity,
        dummy_set_frame_offset,
        dummy_get_sp_bias,
        NULL,    /* get_inverse             */
@@ -1324,24 +1329,22 @@ static const arch_irn_ops_t phi_irn_ops = {
 /**
  * ir_op-Operation: dump a be node to file
  */
-static int dump_node(ir_node *irn, FILE *f, dump_reason_t reason)
+static void dump_node(FILE *f, ir_node *irn, dump_reason_t reason)
 {
-       be_node_attr_t *at = get_irn_attr(irn);
-
        assert(is_be_node(irn));
 
-       switch(reason) {
+       switch (reason) {
                case dump_node_opcode_txt:
                        fputs(get_op_name(get_irn_op(irn)), f);
                        break;
                case dump_node_mode_txt:
-                       if (be_is_Perm(irn) || be_is_Copy(irn) || be_is_CopyKeep(irn)) {
-                               fprintf(f, " %s", get_mode_name(get_irn_mode(irn)));
+                       if (be_is_Copy(irn) || be_is_CopyKeep(irn)) {
+                               fprintf(f, "%s", get_mode_name(get_irn_mode(irn)));
                        }
                        break;
                case dump_node_nodeattr_txt:
                        if (be_is_Call(irn)) {
-                               be_call_attr_t *a = (be_call_attr_t *) at;
+                               const be_call_attr_t *a = get_irn_generic_attr_const(irn);
                                if (a->ent)
                                        fprintf(f, " [%s] ", get_entity_name(a->ent));
                        }
@@ -1360,7 +1363,7 @@ static int dump_node(ir_node *irn, FILE *f, dump_reason_t reason)
                        arch_dump_reqs_and_registers(f, irn);
 
                        if (be_has_frame_entity(irn)) {
-                               be_frame_attr_t *a = (be_frame_attr_t *) at;
+                               const be_frame_attr_t *a = get_irn_generic_attr_const(irn);
                                if (a->ent) {
                                        unsigned size = get_type_size_bytes(get_entity_type(a->ent));
                                        ir_fprintf(f, "frame entity: %+F, offset 0x%x (%d), size 0x%x (%d) bytes\n",
@@ -1370,60 +1373,55 @@ static int dump_node(ir_node *irn, FILE *f, dump_reason_t reason)
                        }
 
                        switch (get_irn_opcode(irn)) {
-                       case beo_IncSP:
-                               {
-                                       be_incsp_attr_t *a = (be_incsp_attr_t *) at;
-                                       if (a->offset == BE_STACK_FRAME_SIZE_EXPAND)
-                                               fprintf(f, "offset: FRAME_SIZE\n");
-                                       else if (a->offset == BE_STACK_FRAME_SIZE_SHRINK)
-                                               fprintf(f, "offset: -FRAME SIZE\n");
-                                       else
-                                               fprintf(f, "offset: %u\n", a->offset);
-                               }
+                       case beo_IncSP: {
+                               const be_incsp_attr_t *a = get_irn_generic_attr_const(irn);
+                               fprintf(f, "align: %d\n", a->align);
+                               if (a->offset == BE_STACK_FRAME_SIZE_EXPAND)
+                                       fprintf(f, "offset: FRAME_SIZE\n");
+                               else if (a->offset == BE_STACK_FRAME_SIZE_SHRINK)
+                                       fprintf(f, "offset: -FRAME SIZE\n");
+                               else
+                                       fprintf(f, "offset: %d\n", a->offset);
                                break;
-                       case beo_Call:
-                               {
-                                       be_call_attr_t *a = (be_call_attr_t *) at;
+                       }
+                       case beo_Call: {
+                               const be_call_attr_t *a = get_irn_generic_attr_const(irn);
 
-                                       if (a->ent)
-                                               fprintf(f, "\ncalling: %s\n", get_entity_name(a->ent));
-                               }
+                               if (a->ent)
+                                       fprintf(f, "\ncalling: %s\n", get_entity_name(a->ent));
                                break;
-                       case beo_MemPerm:
-                               {
-                                       int i;
-                                       for (i = 0; i < be_get_MemPerm_entity_arity(irn); ++i) {
-                                               ir_entity *in, *out;
-                                               in = be_get_MemPerm_in_entity(irn, i);
-                                               out = be_get_MemPerm_out_entity(irn, i);
-                                               if (in) {
-                                                       fprintf(f, "\nin[%d]: %s\n", i, get_entity_name(in));
-                                               }
-                                               if (out) {
-                                                       fprintf(f, "\nout[%d]: %s\n", i, get_entity_name(out));
-                                               }
+                       }
+                       case beo_MemPerm: {
+                               int i;
+                               for (i = 0; i < be_get_MemPerm_entity_arity(irn); ++i) {
+                                       ir_entity *in, *out;
+                                       in = be_get_MemPerm_in_entity(irn, i);
+                                       out = be_get_MemPerm_out_entity(irn, i);
+                                       if (in) {
+                                               fprintf(f, "\nin[%d]: %s\n", i, get_entity_name(in));
+                                       }
+                                       if (out) {
+                                               fprintf(f, "\nout[%d]: %s\n", i, get_entity_name(out));
                                        }
                                }
                                break;
+                       }
 
                        default:
                                break;
                        }
        }
-
-       return 0;
 }
 
 /**
  * ir_op-Operation:
  * Copies the backend specific attributes from old node to new node.
  */
-static void copy_attr(const ir_node *old_node, ir_node *new_node)
+static void copy_attr(ir_graph *irg, const ir_node *old_node, ir_node *new_node)
 {
        const be_node_attr_t *old_attr = get_irn_attr_const(old_node);
        be_node_attr_t *new_attr = get_irn_attr(new_node);
-       ir_graph       *irg      = get_irn_irg(new_node);
-       struct obstack *obst     = be_get_birg_obst(irg);
+       struct obstack *obst     = be_get_be_obst(irg);
        backend_info_t *old_info = be_get_info(old_node);
        backend_info_t *new_info = be_get_info(new_node);