X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgraph.c;h=faa49675b29644d5a7be4aace3dd8523059ba0c6;hb=fa6fdc19998fbdcac9388070fd7c680df98c33fa;hp=bae26bec62dce758d46719ef9cb4f9092fbb9bc7;hpb=02f098c997643c82451cd29b6c44d8a75cb4d8d8;p=libfirm diff --git a/ir/ir/irgraph.c b/ir/ir/irgraph.c index bae26bec6..faa49675b 100644 --- a/ir/ir/irgraph.c +++ b/ir/ir/irgraph.c @@ -46,6 +46,8 @@ #include "iredges_t.h" #include "type_t.h" #include "irmemory.h" +#include "iroptimize.h" +#include "irgopt.h" #define INITIAL_IDX_IRN_MAP_SIZE 1024 @@ -120,7 +122,7 @@ static void free_graph(ir_graph *irg) void irg_set_nloc(ir_graph *res, int n_loc) { - assert(res->phase_state == phase_building); + assert(irg_is_constrained(res, IR_GRAPH_CONSTRAINT_CONSTRUCTION)); res->n_loc = n_loc + 1; /* number of local variables that are never dereferenced in this graph plus one for @@ -149,7 +151,8 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) res->obst = XMALLOC(struct obstack); obstack_init(res->obst); - res->phase_state = phase_building; + /* graphs are in construction mode by default */ + add_irg_constraints(res, IR_GRAPH_CONSTRAINT_CONSTRUCTION); irg_set_nloc(res, n_loc); /* descriptions will be allocated on demand */ @@ -158,15 +161,9 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) res->visited = 0; /* visited flag, for the ir walker */ res->block_visited = 0; /* visited flag, for the 'block'-walker */ - res->extbb_obst = NULL; - res->last_node_idx = 0; new_identities(res); - res->outs = NULL; - - res->inline_property = irg_inline_any; - res->additional_properties = mtp_property_inherited; /* inherited from type */ res->irg_pinned_state = op_pin_state_pinned; res->typeinfo_state = ir_typeinfo_none; @@ -187,7 +184,7 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) res->anchor = new_r_Anchor(res); /*-- Nodes needed in every graph --*/ - set_irg_end_block (res, new_r_immBlock(res)); + set_irg_end_block(res, new_r_immBlock(res)); set_irg_end(res, new_r_End(res, 0, NULL)); start_block = new_r_Block_noopt(res, 0, NULL); @@ -213,9 +210,8 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) set_r_store(res, initial_mem); /*-- Make a block to start with --*/ - first_block = new_r_immBlock(res); + first_block = new_r_Block(res, 1, &projX); set_r_cur_block(res, first_block); - add_immBlock_pred(first_block, projX); res->method_execution_frequency = -1.0; res->estimated_node_count = 0; @@ -249,11 +245,9 @@ ir_graph *new_const_code_irg(void) res->block_visited = 0; /* visited flag, for the 'block'-walker */ res->obst = XMALLOC(struct obstack); obstack_init(res->obst); - res->extbb_obst = NULL; res->last_node_idx = 0; - res->phase_state = phase_building; res->irg_pinned_state = op_pin_state_pinned; res->fp_model = fp_model_precise; @@ -262,6 +256,8 @@ ir_graph *new_const_code_irg(void) res->ent = NULL; res->frame_type = NULL; + add_irg_constraints(res, IR_GRAPH_CONSTRAINT_CONSTRUCTION); + /* the Anchor node must be created first */ res->anchor = new_r_Anchor(res); @@ -353,11 +349,9 @@ ir_graph *create_irg_copy(ir_graph *irg) res->block_visited = 0; /* visited flag, for the 'block'-walker */ res->obst = XMALLOC(struct obstack); obstack_init(res->obst); - res->extbb_obst = NULL; res->last_node_idx = 0; - res->phase_state = irg->phase_state; res->irg_pinned_state = irg->irg_pinned_state; res->fp_model = irg->fp_model; @@ -367,8 +361,6 @@ ir_graph *create_irg_copy(ir_graph *irg) irp_reserve_resources(irp, IRP_RESOURCE_ENTITY_LINK); res->frame_type = clone_frame_type(irg->frame_type); - res->phase_state = irg->phase_state; - ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); /* copy all nodes from the graph irg to the new graph res */ @@ -584,16 +576,6 @@ int node_is_in_irgs_storage(const ir_graph *irg, const ir_node *n) return 0; } -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) -{ - set_irg_phase_state_(irg, state); -} - op_pin_state (get_irg_pinned)(const ir_graph *irg) { return get_irg_pinned_(irg); @@ -614,31 +596,6 @@ 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) -{ - return get_irg_inline_property_(irg); -} - -void (set_irg_inline_property)(ir_graph *irg, irg_inline_property s) -{ - set_irg_inline_property_(irg, s); -} - -mtp_additional_properties (get_irg_additional_properties)(const ir_graph *irg) -{ - return get_irg_additional_properties_(irg); -} - -void (set_irg_additional_properties)(ir_graph *irg, mtp_additional_properties property_mask) -{ - set_irg_additional_properties_(irg, property_mask); -} - -void (add_irg_additional_properties)(ir_graph *irg, mtp_additional_properties flag) -{ - add_irg_additional_properties_(irg, flag); -} - void (set_irg_link)(ir_graph *irg, void *thing) { set_irg_link_(irg, thing); @@ -773,17 +730,75 @@ size_t register_additional_graph_data(size_t size) return additional_graph_data_size += size; } -void (set_irg_state)(ir_graph *irg, ir_graph_state_t state) +void add_irg_constraints(ir_graph *irg, ir_graph_constraints_t constraints) +{ + irg->constraints |= constraints; +} + +void clear_irg_constraints(ir_graph *irg, ir_graph_constraints_t constraints) { - set_irg_state_(irg, state); + irg->constraints &= ~constraints; } -void (clear_irg_state)(ir_graph *irg, ir_graph_state_t state) +int (irg_is_constrained)(const ir_graph *irg, ir_graph_constraints_t constraints) { - clear_irg_state_(irg, state); + return irg_is_constrained_(irg, constraints); +} + +void (add_irg_properties)(ir_graph *irg, ir_graph_properties_t props) +{ + add_irg_properties_(irg, props); +} + +void (clear_irg_properties)(ir_graph *irg, ir_graph_properties_t props) +{ + clear_irg_properties_(irg, props); +} + +int (irg_has_properties)(const ir_graph *irg, ir_graph_properties_t props) +{ + return irg_has_properties_(irg, props); +} + +typedef void (*assure_property_func)(ir_graph *irg); + +void assure_irg_properties(ir_graph *irg, ir_graph_properties_t props) +{ + static struct { + ir_graph_properties_t property; + assure_property_func func; + } property_functions[] = { + { IR_GRAPH_PROPERTY_ONE_RETURN, normalize_one_return }, + { IR_GRAPH_PROPERTY_MANY_RETURNS, normalize_n_returns }, + { IR_GRAPH_PROPERTY_NO_CRITICAL_EDGES, remove_critical_cf_edges }, + { IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE, remove_unreachable_code }, + { IR_GRAPH_PROPERTY_NO_BADS, remove_bads }, + { IR_GRAPH_PROPERTY_NO_TUPLES, remove_tuples }, + { IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE, assure_doms }, + { IR_GRAPH_PROPERTY_CONSISTENT_POSTDOMINANCE, assure_postdoms }, + { IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES, assure_edges }, + { IR_GRAPH_PROPERTY_CONSISTENT_OUTS, assure_irg_outs }, + { IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO, assure_loopinfo }, + { IR_GRAPH_PROPERTY_CONSISTENT_ENTITY_USAGE, assure_irg_entity_usage_computed }, + { IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE_FRONTIERS, ir_compute_dominance_frontiers }, + }; + size_t i; + for (i = 0; i < ARRAY_SIZE(property_functions); ++i) { + ir_graph_properties_t missing = props & ~irg->properties; + if (missing & property_functions[i].property) + property_functions[i].func(irg); + } + assert((props & ~irg->properties) == IR_GRAPH_PROPERTIES_NONE); } -int (is_irg_state)(const ir_graph *irg, ir_graph_state_t state) +void confirm_irg_properties(ir_graph *irg, ir_graph_properties_t props) { - return is_irg_state_(irg, state); + clear_irg_properties(irg, ~props); + if (! (props & IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES)) + edges_deactivate(irg); + if (! (props & IR_GRAPH_PROPERTY_CONSISTENT_OUTS) + && (irg->properties & IR_GRAPH_PROPERTY_CONSISTENT_OUTS)) + free_irg_outs(irg); + if (! (props & IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE_FRONTIERS)) + ir_free_dominance_frontiers(irg); }