9 #include "iroptimize.h"
16 #include "opt_manage.h"
18 static void nop(ir_graph *irg) {
22 void perform_irg_optimization(ir_graph *irg, optdesc_t *opt)
24 ir_graph_properties_t new_irg_state;
25 ir_graph_properties_t required = opt->requirements;
26 const bool dump = get_irp_optimization_dumps();
28 /* It does not make sense to require both: */
29 assert (!((required & IR_GRAPH_PROPERTY_ONE_RETURN) && (required & IR_GRAPH_PROPERTY_MANY_RETURNS)));
31 /* assure that all requirements for the optimization are fulfilled */
32 #define PREPARE(property,func) if (property & (required ^ irg->properties)) {func(irg); add_irg_properties(irg,property);}
33 PREPARE(IR_GRAPH_PROPERTY_ONE_RETURN, normalize_one_return)
34 PREPARE(IR_GRAPH_PROPERTY_MANY_RETURNS, normalize_n_returns)
35 PREPARE(IR_GRAPH_PROPERTY_NO_CRITICAL_EDGES, remove_critical_cf_edges)
36 PREPARE(IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE, remove_unreachable_code)
37 PREPARE(IR_GRAPH_PROPERTY_NO_BADS, remove_bads)
38 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE, assure_doms)
39 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_POSTDOMINANCE, assure_postdoms)
40 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES, edges_assure)
41 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_OUTS, assure_irg_outs)
42 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO, assure_loopinfo)
43 PREPARE(IR_GRAPH_PROPERTY_CONSISTENT_ENTITY_USAGE, assure_irg_entity_usage_computed)
45 /* now all the requirements for the optimization are fulfilled */
47 dump_ir_graph(irg, opt->name);
49 new_irg_state = opt->optimization(irg);
52 dump_ir_graph(irg, opt->name);
54 /* unless the optimization returned that some state is retained,
55 * we disable the corresponding irg state.
56 * Since we currently duplicate information, sometimes another func must be called too.
58 #define INVALIDATE(property,func) if (!(property & new_irg_state)) {clear_irg_properties(irg,property); func(irg);}
59 INVALIDATE(IR_GRAPH_PROPERTY_NO_CRITICAL_EDGES, nop)
60 INVALIDATE(IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE, nop)
61 INVALIDATE(IR_GRAPH_PROPERTY_NO_BADS, nop)
62 INVALIDATE(IR_GRAPH_PROPERTY_ONE_RETURN, nop)
63 INVALIDATE(IR_GRAPH_PROPERTY_MANY_RETURNS, nop)
64 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE, nop)
65 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_POSTDOMINANCE, nop)
66 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_OUTS, nop)
67 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES, edges_deactivate)
68 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO, nop)
69 INVALIDATE(IR_GRAPH_PROPERTY_CONSISTENT_ENTITY_USAGE, nop)
71 remove_End_Bads_and_doublets(get_irg_end(irg));
73 irg_verify(irg, VERIFY_ENFORCE_SSA);