X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firop.c;h=450dd475d33d98d5e637c5c2f087c5a752063f57;hb=67553de44f77855233fb2dfb0251eb9098f2b467;hp=82950692fe841026e1022a3d9c8e5011837c0dfa;hpb=60a271b605cd365033e0a4df54f3cc53ac831957;p=libfirm diff --git a/ir/ir/irop.c b/ir/ir/irop.c index 82950692f..450dd475d 100644 --- a/ir/ir/irop.c +++ b/ir/ir/irop.c @@ -33,7 +33,7 @@ #include "irbackedge_t.h" #include "iropt_t.h" -#include "irvrfy_t.h" +#include "irverify_t.h" #include "reassoc_t.h" #include "xmalloc.h" @@ -47,8 +47,11 @@ static unsigned next_iro = iro_MaxOpcode; * Copies all attributes stored in the old node to the new node. * Assumes both have the same opcode and sufficient size. */ -void default_copy_attr(const ir_node *old_node, ir_node *new_node) { +void default_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ unsigned size = firm_add_node_size; + (void) irg; assert(get_irn_op(old_node) == get_irn_op(new_node)); memcpy(&new_node->attr, &old_node->attr, get_op_attr_size(get_irn_op(old_node))); @@ -57,65 +60,60 @@ void default_copy_attr(const ir_node *old_node, ir_node *new_node) { /* copy additional node data */ memcpy(get_irn_data(new_node, void, size), get_irn_data(old_node, void, size), size); } -} /* default_copy_attr */ +} /** * Copies all Call attributes stored in the old node to the new node. */ -static void -call_copy_attr(const ir_node *old_node, ir_node *new_node) { - default_copy_attr(old_node, new_node); +static void call_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ + default_copy_attr(irg, old_node, new_node); remove_Call_callee_arr(new_node); -} /* call_copy_attr */ +} /** * Copies all Block attributes stored in the old node to the new node. */ -static void -block_copy_attr(const ir_node *old_node, ir_node *new_node) { - ir_graph *irg = current_ir_graph; - - default_copy_attr(old_node, new_node); - new_node->attr.block.phis = NULL; - new_node->attr.block.cg_backedge = NULL; - new_node->attr.block.backedge = new_backedge_arr(irg->obst, get_irn_arity(new_node)); +static void block_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ + default_copy_attr(irg, old_node, new_node); + new_node->attr.block.irg.irg = irg; + new_node->attr.block.phis = NULL; + new_node->attr.block.cg_backedge = NULL; + new_node->attr.block.backedge = new_backedge_arr(irg->obst, get_irn_arity(new_node)); + new_node->attr.block.block_visited = 0; + memset(&new_node->attr.block.dom, 0, sizeof(new_node->attr.block.dom)); + memset(&new_node->attr.block.pdom, 0, sizeof(new_node->attr.block.pdom)); + /* TODO: we should probably create a new entity. But we somehow have to + * patch the stuff at the same time */ + new_node->attr.block.entity = NULL; + new_node->attr.block.phis = NULL; INIT_LIST_HEAD(&new_node->attr.block.succ_head); -} /* block_copy_attr */ +} /** * Copies all phi attributes stored in old node to the new node */ -static void -phi_copy_attr(const ir_node *old_node, ir_node *new_node) { - ir_graph *irg = current_ir_graph; - - default_copy_attr(old_node, new_node); +static void phi_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ + default_copy_attr(irg, old_node, new_node); new_node->attr.phi.next = NULL; new_node->attr.phi.u.backedge = new_backedge_arr(irg->obst, get_irn_arity(new_node)); } -/** - * Copies all filter attributes stored in old node to the new node - */ -static void -filter_copy_attr(const ir_node *old_node, ir_node *new_node) { - ir_graph *irg = current_ir_graph; - - default_copy_attr(old_node, new_node); - new_node->attr.filter.backedge = new_backedge_arr(irg->obst, get_irn_arity(new_node)); -} - /** * Copies all ASM attributes stored in old node to the new node */ -static void -ASM_copy_attr(const ir_node *old_node, ir_node *new_node) { - ir_graph *irg = current_ir_graph; - - default_copy_attr(old_node, new_node); - new_node->attr.assem.inputs = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.inputs); - new_node->attr.assem.outputs = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.outputs); - new_node->attr.assem.clobber = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.clobber); +static void ASM_copy_attr(ir_graph *irg, const ir_node *old_node, + ir_node *new_node) +{ + default_copy_attr(irg, old_node, new_node); + new_node->attr.assem.input_constraints = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.input_constraints); + new_node->attr.assem.output_constraints = DUP_ARR_D(ir_asm_constraint, irg->obst, old_node->attr.assem.output_constraints); + new_node->attr.assem.clobbers = DUP_ARR_D(ident*, irg->obst, old_node->attr.assem.clobbers); } /** @@ -127,8 +125,9 @@ ASM_copy_attr(const ir_node *old_node, ir_node *new_node) { * @return * The operations. */ -static ir_op_ops *firm_set_default_copy_attr(ir_opcode code, ir_op_ops *ops) { - switch(code) { +static ir_op_ops *firm_set_default_copy_attr(unsigned code, ir_op_ops *ops) +{ + switch (code) { case iro_Call: ops->copy_attr = call_copy_attr; break; @@ -138,9 +137,6 @@ static ir_op_ops *firm_set_default_copy_attr(ir_opcode code, ir_op_ops *ops) { case iro_Phi: ops->copy_attr = phi_copy_attr; break; - case iro_Filter: - ops->copy_attr = filter_copy_attr; - break; case iro_ASM: ops->copy_attr = ASM_copy_attr; break; @@ -153,10 +149,9 @@ static ir_op_ops *firm_set_default_copy_attr(ir_opcode code, ir_op_ops *ops) { } /* firm_set_default_copy_attr */ /* Creates a new ir operation. */ -ir_op * -new_ir_op(unsigned code, const char *name, op_pin_state p, - unsigned flags, op_arity opar, int op_index, size_t attr_size, - const ir_op_ops *ops) +ir_op *new_ir_op(unsigned code, const char *name, op_pin_state p, + unsigned flags, op_arity opar, int op_index, size_t attr_size, + const ir_op_ops *ops) { ir_op *res = XMALLOCZ(ir_op); @@ -185,7 +180,8 @@ new_ir_op(unsigned code, const char *name, op_pin_state p, return res; } /* new_ir_op */ -void free_ir_op(ir_op *code) { +void free_ir_op(ir_op *code) +{ hook_free_ir_op(code); remove_irp_opcode(code); @@ -193,20 +189,24 @@ void free_ir_op(ir_op *code) { } /* free_ir_op */ /* Returns the string for the opcode. */ -const char *get_op_name (const ir_op *op) { +const char *get_op_name (const ir_op *op) +{ return get_id_str(op->name); } /* get_op_name */ -unsigned (get_op_code)(const ir_op *op){ +unsigned (get_op_code)(const ir_op *op) +{ return _get_op_code(op); } /* get_op_code */ -ident *(get_op_ident)(const ir_op *op){ +ident *(get_op_ident)(const ir_op *op) +{ return _get_op_ident(op); } /* get_op_ident */ -const char *get_op_pin_state_name(op_pin_state s) { - switch(s) { +const char *get_op_pin_state_name(op_pin_state s) +{ + switch (s) { #define XXX(s) case s: return #s XXX(op_pin_state_floats); XXX(op_pin_state_pinned); @@ -217,46 +217,54 @@ const char *get_op_pin_state_name(op_pin_state s) { return ""; } /* get_op_pin_state_name */ -op_pin_state (get_op_pinned)(const ir_op *op) { +op_pin_state (get_op_pinned)(const ir_op *op) +{ return _get_op_pinned(op); } /* get_op_pinned */ /* Sets op_pin_state_pinned in the opcode. Setting it to floating has no effect for Phi, Block and control flow nodes. */ -void set_op_pinned(ir_op *op, op_pin_state pinned) { +void set_op_pinned(ir_op *op, op_pin_state pinned) +{ if (op == op_Block || op == op_Phi || is_op_cfopcode(op)) return; op->pin_state = pinned; } /* set_op_pinned */ /* retrieve the next free opcode */ -unsigned get_next_ir_opcode(void) { +unsigned get_next_ir_opcode(void) +{ return next_iro++; } /* get_next_ir_opcode */ /* Returns the next free n IR opcode number, allows to register a bunch of user ops */ -unsigned get_next_ir_opcodes(unsigned num) { +unsigned get_next_ir_opcodes(unsigned num) +{ unsigned base = next_iro; next_iro += num; return base; } /* get_next_ir_opcodes */ /* Returns the generic function pointer from an ir operation. */ -op_func (get_generic_function_ptr)(const ir_op *op) { +op_func (get_generic_function_ptr)(const ir_op *op) +{ return _get_generic_function_ptr(op); } /* get_generic_function_ptr */ /* Store a generic function pointer into an ir operation. */ -void (set_generic_function_ptr)(ir_op *op, op_func func) { +void (set_generic_function_ptr)(ir_op *op, op_func func) +{ _set_generic_function_ptr(op, func); } /* set_generic_function_ptr */ /* Returns the ir_op_ops of an ir_op. */ -const ir_op_ops *(get_op_ops)(const ir_op *op) { +const ir_op_ops *(get_op_ops)(const ir_op *op) +{ return _get_op_ops(op); } /* get_op_ops */ -irop_flags get_op_flags(const ir_op *op) { - return op->flags; +irop_flags get_op_flags(const ir_op *op) +{ + return (irop_flags)op->flags; } #include "gen_irop.c.inl"