removed unimplemented extension
[libfirm] / ir / ir / irgraph.c
index 34f1da7..faa4967 100644 (file)
@@ -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 */
@@ -161,10 +164,6 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc)
        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;
@@ -249,7 +248,6 @@ ir_graph *new_const_code_irg(void)
 
        res->last_node_idx = 0;
 
-       res->phase_state      = phase_building;
        res->irg_pinned_state = op_pin_state_pinned;
        res->fp_model         = fp_model_precise;
 
@@ -258,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);
 
@@ -352,7 +352,6 @@ ir_graph *create_irg_copy(ir_graph *irg)
 
        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;
 
@@ -362,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 */
@@ -579,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);
@@ -609,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);
@@ -768,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);
 }