X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgraph.c;h=0680c7cb08e7bdf303703a05faf3d55f5fb7d3af;hb=70a04b0cc2c9efc3323b9ef1a6158c0ae1c88235;hp=f9c2a15a156b0b0e09e760ed50078fb5bb7d2a73;hpb=32ea6ea0320f551448bb66e534e3351977464d42;p=libfirm diff --git a/ir/ir/irgraph.c b/ir/ir/irgraph.c index f9c2a15a1..0680c7cb0 100644 --- a/ir/ir/irgraph.c +++ b/ir/ir/irgraph.c @@ -26,9 +26,7 @@ #include "config.h" #include -#ifdef HAVE_STDDEF_H -# include -#endif +#include #include "xmalloc.h" #include "ircons_t.h" @@ -48,6 +46,7 @@ #include "iredges_t.h" #include "type_t.h" #include "irmemory.h" +#include "irphase.h" #define INITIAL_IDX_IRN_MAP_SIZE 1024 @@ -74,30 +73,6 @@ void set_current_ir_graph(ir_graph *graph) current_ir_graph = graph; } -#ifdef INTERPROCEDURAL_VIEW -int firm_interprocedural_view = 0; - -int (get_interprocedural_view)(void) -{ - return _get_interprocedural_view(); -} - -void (set_interprocedural_view)(int state) -{ - firm_interprocedural_view = state; - - /* set function vectors for faster access */ - if (state) { - _get_irn_arity = _get_irn_inter_arity; - _get_irn_n = _get_irn_inter_n; - } - else { - _get_irn_arity = _get_irn_intra_arity; - _get_irn_n = _get_irn_intra_n; - } -} -#endif - /** contains the suffix for frame type names */ static ident *frame_type_suffix = NULL; @@ -119,8 +94,7 @@ static ir_graph *alloc_graph(void) { ir_graph *res; size_t size = sizeof(ir_graph) + additional_graph_data_size; - char *ptr = xmalloc(size); - memset(ptr, 0, size); + char *ptr = XMALLOCNZ(char, size); res = (ir_graph *)(ptr + additional_graph_data_size); res->kind = k_ir_graph; @@ -251,8 +225,6 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) set_cur_block(get_irg_end_block(res)); end = new_End(); set_irg_end (res, end); - set_irg_end_reg (res, end); - set_irg_end_except(res, end); start_block = new_immBlock(); set_cur_block(start_block); @@ -346,8 +318,6 @@ ir_graph *new_const_code_irg(void) set_cur_block(end_block); end = new_End(); set_irg_end (res, end); - set_irg_end_reg (res, end); - set_irg_end_except(res, end); mature_immBlock(end_block); /* -- The start block -- */ @@ -392,37 +362,17 @@ ir_graph *new_const_code_irg(void) * @param n A node from the original method graph. * @param env The copied graph. */ -static void copy_all_nodes(ir_node *n, void *env) +static void copy_all_nodes(ir_node *node, void *env) { - ir_graph *irg = env; - ir_op *op = get_irn_op(n); - ir_node *nn; - - nn = new_ir_node(get_irn_dbg_info(n), - irg, - NULL, /* no block yet, will be set later */ - op, - get_irn_mode(n), - get_irn_arity(n), - get_irn_in(n) + 1); + ir_graph *irg = env; + ir_node *new_node = irn_copy_into_irg(node, irg); - - /* Copy the attributes. These might point to additional data. If this - was allocated on the old obstack the pointers now are dangling. This - frees e.g. the memory of the graph_arr allocated in new_immBlock. */ - copy_node_attr(n, nn); - new_backedge_info(nn); - set_irn_link(n, nn); - - /* fix the irg for Blocks: as Bad nodes are NOT copied, no - need t fix them */ - if (is_Block(nn)) - nn->attr.block.irg.irg = irg; + set_irn_link(node, new_node); /* fix access to entities on the stack frame */ - if (is_Sel(nn)) { - ir_entity *ent = get_Sel_entity(nn); - ir_type *tp = get_entity_owner(ent); + if (is_Sel(new_node)) { + ir_entity *ent = get_Sel_entity(new_node); + ir_type *tp = get_entity_owner(ent); if (is_frame_type(tp)) { /* replace by the copied entity */ @@ -430,7 +380,7 @@ static void copy_all_nodes(ir_node *n, void *env) assert(is_entity(ent)); assert(get_entity_owner(ent) == get_irg_frame_type(irg)); - set_Sel_entity(nn, ent); + set_Sel_entity(new_node, ent); } } } @@ -440,32 +390,16 @@ static void copy_all_nodes(ir_node *n, void *env) * The copied nodes are set as link of their original nodes. The links of * "irn" predecessors are the predecessors of copied node. */ -static void set_all_preds(ir_node *irn, void *env) +static void rewire(ir_node *irn, void *env) { - int i; - ir_node *nn, *pred; (void) env; - - nn = get_irn_link(irn); - - if (is_Block(irn)) { - ir_node *mbh = get_Block_MacroBlock(irn); - set_Block_MacroBlock(nn, get_irn_link(mbh)); - for (i = get_Block_n_cfgpreds(irn) - 1; i >= 0; i--) { - pred = get_Block_cfgpred(irn, i); - set_Block_cfgpred(nn, i, get_irn_link(pred)); - } - } else { - /* First we set the block our copy if it is not a block.*/ - set_nodes_block(nn, get_irn_link(get_nodes_block(irn))); - for (i = get_irn_arity(irn) - 1; i >= 0; i--) { - pred = get_irn_n(irn, i); - set_irn_n(nn, i, get_irn_link(pred)); - } - } + irn_rewire_inputs(irn); } -#define NN(irn) get_irn_link(irn) +static ir_node *get_new_node(const ir_node *old_node) +{ + return (ir_node*) get_irn_link(old_node); +} /* * Create a new graph that is a copy of a given one. @@ -501,25 +435,23 @@ ir_graph *create_irg_copy(ir_graph *irg) ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); /* copy all nodes from the graph irg to the new graph res */ - irg_walk_anchors(irg, copy_all_nodes, set_all_preds, res); + irg_walk_anchors(irg, copy_all_nodes, rewire, res); /* copy the Anchor node */ - res->anchor = NN(irg->anchor); + res->anchor = get_new_node(irg->anchor); /* -- The end block -- */ - set_irg_end_block (res, NN(get_irg_end_block(irg))); - set_irg_end (res, NN(get_irg_end(irg))); - set_irg_end_reg (res, NN(get_irg_end_reg(irg))); - set_irg_end_except(res, NN(get_irg_end_except(irg))); + set_irg_end_block (res, get_new_node(get_irg_end_block(irg))); + set_irg_end (res, get_new_node(get_irg_end(irg))); /* -- The start block -- */ - set_irg_start_block(res, NN(get_irg_start_block(irg))); - set_irg_bad (res, NN(get_irg_bad(irg))); - set_irg_no_mem (res, NN(get_irg_no_mem(irg))); - set_irg_start (res, NN(get_irg_start(irg))); + set_irg_start_block(res, get_new_node(get_irg_start_block(irg))); + set_irg_bad (res, get_new_node(get_irg_bad(irg))); + set_irg_no_mem (res, get_new_node(get_irg_no_mem(irg))); + set_irg_start (res, get_new_node(get_irg_start(irg))); /* Proj results of start node */ - set_irg_initial_mem(res, NN(get_irg_initial_mem(irg))); + set_irg_initial_mem(res, get_new_node(get_irg_initial_mem(irg))); /* Copy the node count estimation. Would be strange if this is different from the original one. */ @@ -530,8 +462,6 @@ ir_graph *create_irg_copy(ir_graph *irg) return res; } -#undef NN - /* Frees the passed irgraph. Deallocates all nodes in this graph and the ir_graph structure. @@ -571,8 +501,8 @@ void free_ir_graph(ir_graph *irg) {attr type} get_irg_{attribute name} (ir_graph *irg); void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */ -int -(is_ir_graph)(const void *thing) { +int (is_ir_graph)(const void *thing) +{ return _is_ir_graph(thing); } @@ -599,164 +529,143 @@ ir_node *(get_idx_irn)(ir_graph *irg, unsigned idx) return _get_idx_irn(irg, idx); } -ir_node * -(get_irg_start_block)(const ir_graph *irg) { +ir_node *(get_irg_start_block)(const ir_graph *irg) +{ return _get_irg_start_block(irg); } -void -(set_irg_start_block)(ir_graph *irg, ir_node *node) { +void (set_irg_start_block)(ir_graph *irg, ir_node *node) +{ _set_irg_start_block(irg, node); } -ir_node * -(get_irg_start)(const ir_graph *irg) { +ir_node *(get_irg_start)(const ir_graph *irg) +{ return _get_irg_start(irg); } -void -(set_irg_start)(ir_graph *irg, ir_node *node) { +void (set_irg_start)(ir_graph *irg, ir_node *node) +{ _set_irg_start(irg, node); } -ir_node * -(get_irg_end_block)(const ir_graph *irg) { +ir_node *(get_irg_end_block)(const ir_graph *irg) +{ return _get_irg_end_block(irg); } -void -(set_irg_end_block)(ir_graph *irg, ir_node *node) { +void (set_irg_end_block)(ir_graph *irg, ir_node *node) +{ _set_irg_end_block(irg, node); } -ir_node * -(get_irg_end)(const ir_graph *irg) { +ir_node *(get_irg_end)(const ir_graph *irg) +{ return _get_irg_end(irg); } -void -(set_irg_end)(ir_graph *irg, ir_node *node) { +void (set_irg_end)(ir_graph *irg, ir_node *node) +{ _set_irg_end(irg, node); } -ir_node * -(get_irg_end_reg)(const ir_graph *irg) { - return _get_irg_end_reg(irg); -} - -void -(set_irg_end_reg)(ir_graph *irg, ir_node *node) { - _set_irg_end_reg(irg, node); -} - -ir_node * -(get_irg_end_except)(const ir_graph *irg) { - return _get_irg_end_except(irg); -} - -void -(set_irg_end_except)(ir_graph *irg, ir_node *node) { - assert(get_irn_op(node) == op_EndExcept || is_End(node)); - _set_irg_end_except(irg, node); -} - -ir_node * -(get_irg_initial_exec)(const ir_graph *irg) { +ir_node *(get_irg_initial_exec)(const ir_graph *irg) +{ return _get_irg_initial_exec(irg); } -void -(set_irg_initial_exec)(ir_graph *irg, ir_node *node) { +void (set_irg_initial_exec)(ir_graph *irg, ir_node *node) +{ _set_irg_initial_exec(irg, node); } -ir_node * -(get_irg_frame)(const ir_graph *irg) { +ir_node *(get_irg_frame)(const ir_graph *irg) +{ return _get_irg_frame(irg); } -void -(set_irg_frame)(ir_graph *irg, ir_node *node) { +void (set_irg_frame)(ir_graph *irg, ir_node *node) +{ _set_irg_frame(irg, node); } -ir_node * -(get_irg_tls)(const ir_graph *irg) { +ir_node *(get_irg_tls)(const ir_graph *irg) +{ return _get_irg_tls(irg); } -void -(set_irg_tls)(ir_graph *irg, ir_node *node) { +void (set_irg_tls)(ir_graph *irg, ir_node *node) +{ _set_irg_tls(irg, node); } -ir_node * -(get_irg_initial_mem)(const ir_graph *irg) { +ir_node *(get_irg_initial_mem)(const ir_graph *irg) +{ return _get_irg_initial_mem(irg); } -void -(set_irg_initial_mem)(ir_graph *irg, ir_node *node) { +void (set_irg_initial_mem)(ir_graph *irg, ir_node *node) +{ _set_irg_initial_mem(irg, node); } -ir_node * -(get_irg_args)(const ir_graph *irg) { +ir_node *(get_irg_args)(const ir_graph *irg) +{ return _get_irg_args(irg); } -void -(set_irg_args)(ir_graph *irg, ir_node *node) { +void (set_irg_args)(ir_graph *irg, ir_node *node) +{ _set_irg_args(irg, node); } -ir_node * -(get_irg_bad)(const ir_graph *irg) { +ir_node *(get_irg_bad)(const ir_graph *irg) +{ return _get_irg_bad(irg); } -void -(set_irg_bad)(ir_graph *irg, ir_node *node) { +void (set_irg_bad)(ir_graph *irg, ir_node *node) +{ _set_irg_bad(irg, node); } -ir_node * -(get_irg_no_mem)(const ir_graph *irg) { +ir_node *(get_irg_no_mem)(const ir_graph *irg) +{ return _get_irg_no_mem(irg); } -void -(set_irg_no_mem)(ir_graph *irg, ir_node *node) { +void (set_irg_no_mem)(ir_graph *irg, ir_node *node) +{ _set_irg_no_mem(irg, node); } -ir_node * -(get_irg_current_block)(const ir_graph *irg) { +ir_node *(get_irg_current_block)(const ir_graph *irg) +{ return _get_irg_current_block(irg); } -void -(set_irg_current_block)(ir_graph *irg, ir_node *node) { +void (set_irg_current_block)(ir_graph *irg, ir_node *node) +{ _set_irg_current_block(irg, node); } -ir_entity * -(get_irg_entity)(const ir_graph *irg) { +ir_entity *(get_irg_entity)(const ir_graph *irg) +{ return _get_irg_entity(irg); } -void -(set_irg_entity)(ir_graph *irg, ir_entity *ent) { +void (set_irg_entity)(ir_graph *irg, ir_entity *ent) +{ _set_irg_entity(irg, ent); } -ir_type * -(get_irg_frame_type)(ir_graph *irg) { +ir_type *(get_irg_frame_type)(ir_graph *irg) +{ return _get_irg_frame_type(irg); } -void -(set_irg_frame_type)(ir_graph *irg, ir_type *ftp) { +void (set_irg_frame_type)(ir_graph *irg, ir_type *ftp) +{ _set_irg_frame_type(irg, ftp); } @@ -768,8 +677,7 @@ ir_type *get_irg_value_param_type(ir_graph *irg) return get_method_value_param_type(mtp); } -int -get_irg_n_locs(ir_graph *irg) +int get_irg_n_locs(ir_graph *irg) { if (get_opt_precise_exc_context()) return irg->n_loc - 1 - 1; @@ -777,17 +685,6 @@ get_irg_n_locs(ir_graph *irg) return irg->n_loc - 1; } -void -set_irg_n_loc(ir_graph *irg, int n_loc) -{ - if (get_opt_precise_exc_context()) - irg->n_loc = n_loc + 1 + 1; - else - irg->n_loc = n_loc + 1; -} - - - /* Returns the obstack associated with the graph. */ struct obstack * (get_irg_obstack)(const ir_graph *irg) { @@ -815,68 +712,68 @@ int node_is_in_irgs_storage(ir_graph *irg, ir_node *n) return 0; } -irg_phase_state -(get_irg_phase_state)(const ir_graph *irg) { +irg_phase_state (get_irg_phase_state)(const ir_graph *irg) +{ return _get_irg_phase_state(irg); } -void -(set_irg_phase_state)(ir_graph *irg, irg_phase_state state) { +void (set_irg_phase_state)(ir_graph *irg, irg_phase_state state) +{ _set_irg_phase_state(irg, state); } -op_pin_state -(get_irg_pinned)(const ir_graph *irg) { +op_pin_state (get_irg_pinned)(const ir_graph *irg) +{ return _get_irg_pinned(irg); } -irg_outs_state -(get_irg_outs_state)(const ir_graph *irg) { +irg_outs_state (get_irg_outs_state)(const ir_graph *irg) +{ return _get_irg_outs_state(irg); } -void -(set_irg_outs_inconsistent)(ir_graph *irg) { +void (set_irg_outs_inconsistent)(ir_graph *irg) +{ _set_irg_outs_inconsistent(irg); } -irg_extblk_state -(get_irg_extblk_state)(const ir_graph *irg) { +irg_extblk_state (get_irg_extblk_state)(const ir_graph *irg) +{ return _get_irg_extblk_state(irg); } -void -(set_irg_extblk_inconsistent)(ir_graph *irg) { +void (set_irg_extblk_inconsistent)(ir_graph *irg) +{ _set_irg_extblk_inconsistent(irg); } -irg_dom_state -(get_irg_dom_state)(const ir_graph *irg) { +irg_dom_state (get_irg_dom_state)(const ir_graph *irg) +{ return _get_irg_dom_state(irg); } -irg_dom_state -(get_irg_postdom_state)(const ir_graph *irg) { +irg_dom_state (get_irg_postdom_state)(const ir_graph *irg) +{ return _get_irg_postdom_state(irg); } -void -(set_irg_doms_inconsistent)(ir_graph *irg) { +void (set_irg_doms_inconsistent)(ir_graph *irg) +{ _set_irg_doms_inconsistent(irg); } -irg_loopinfo_state -(get_irg_loopinfo_state)(const ir_graph *irg) { +irg_loopinfo_state (get_irg_loopinfo_state)(const ir_graph *irg) +{ return _get_irg_loopinfo_state(irg); } -void -(set_irg_loopinfo_state)(ir_graph *irg, irg_loopinfo_state s) { +void (set_irg_loopinfo_state)(ir_graph *irg, irg_loopinfo_state s) +{ _set_irg_loopinfo_state(irg, s); } -void -(set_irg_loopinfo_inconsistent)(ir_graph *irg) { +void (set_irg_loopinfo_inconsistent)(ir_graph *irg) +{ _set_irg_loopinfo_inconsistent(irg); } @@ -890,58 +787,58 @@ void set_irp_loopinfo_inconsistent(void) -void -(set_irg_pinned)(ir_graph *irg, op_pin_state p) { +void (set_irg_pinned)(ir_graph *irg, op_pin_state p) +{ _set_irg_pinned(irg, p); } -irg_callee_info_state -(get_irg_callee_info_state)(const ir_graph *irg) { +irg_callee_info_state (get_irg_callee_info_state)(const ir_graph *irg) +{ return _get_irg_callee_info_state(irg); } -void -(set_irg_callee_info_state)(ir_graph *irg, irg_callee_info_state s) { +void (set_irg_callee_info_state)(ir_graph *irg, irg_callee_info_state s) +{ _set_irg_callee_info_state(irg, s); } -irg_inline_property -(get_irg_inline_property)(const ir_graph *irg) { +irg_inline_property (get_irg_inline_property)(const ir_graph *irg) +{ return _get_irg_inline_property(irg); } -void -(set_irg_inline_property)(ir_graph *irg, irg_inline_property s) { +void (set_irg_inline_property)(ir_graph *irg, irg_inline_property s) +{ _set_irg_inline_property(irg, s); } -unsigned -(get_irg_additional_properties)(const ir_graph *irg) { +unsigned (get_irg_additional_properties)(const ir_graph *irg) +{ return _get_irg_additional_properties(irg); } -void -(set_irg_additional_properties)(ir_graph *irg, unsigned property_mask) { +void (set_irg_additional_properties)(ir_graph *irg, unsigned property_mask) +{ _set_irg_additional_properties(irg, property_mask); } -void -(set_irg_additional_property)(ir_graph *irg, mtp_additional_property flag) { +void (set_irg_additional_property)(ir_graph *irg, mtp_additional_property flag) +{ _set_irg_additional_property(irg, flag); } -void -(set_irg_link)(ir_graph *irg, void *thing) { +void (set_irg_link)(ir_graph *irg, void *thing) +{ _set_irg_link(irg, thing); } -void * -(get_irg_link)(const ir_graph *irg) { +void *(get_irg_link)(const ir_graph *irg) +{ return _get_irg_link(irg); } -ir_visited_t -(get_irg_visited)(const ir_graph *irg) { +ir_visited_t (get_irg_visited)(const ir_graph *irg) +{ return _get_irg_visited(irg); } @@ -978,24 +875,24 @@ ir_visited_t inc_max_irg_visited(void) { #ifndef NDEBUG int i; - for(i = 0; i < get_irp_n_irgs(); i++) + for (i = 0; i < get_irp_n_irgs(); i++) assert(max_irg_visited >= get_irg_visited(get_irp_irg(i))); #endif return ++max_irg_visited; } -ir_visited_t -(get_irg_block_visited)(const ir_graph *irg) { +ir_visited_t (get_irg_block_visited)(const ir_graph *irg) +{ return _get_irg_block_visited(irg); } -void -(set_irg_block_visited)(ir_graph *irg, ir_visited_t visited) { +void (set_irg_block_visited)(ir_graph *irg, ir_visited_t visited) +{ _set_irg_block_visited(irg, visited); } -void -(inc_irg_block_visited)(ir_graph *irg) { +void (inc_irg_block_visited)(ir_graph *irg) +{ _inc_irg_block_visited(irg); } @@ -1054,6 +951,26 @@ void *get_irg_loc_description(ir_graph *irg, int n) return irg->loc_descriptions ? irg->loc_descriptions[n] : NULL; } +void irg_register_phase(ir_graph *irg, ir_phase_id id, ir_phase *phase) +{ + assert(id <= PHASE_LAST); + assert(irg->phases[id] == NULL); + irg->phases[id] = phase; +} + +void irg_invalidate_phases(ir_graph *irg) +{ + int p; + for (p = 0; p <= PHASE_LAST; ++p) { + ir_phase *phase = irg->phases[p]; + if (phase == NULL) + continue; + + phase_free(phase); + irg->phases[p] = NULL; + } +} + #ifndef NDEBUG void ir_reserve_resources(ir_graph *irg, ir_resources_t resources) {