split graph state into properties and constraints
[libfirm] / ir / opt / opt_manage.c
1 #include "config.h"
2
3 #include <assert.h>
4 #include <stdbool.h>
5
6 #include "irgraph_t.h"
7 #include "irprog_t.h"
8 #include "irnode.h"
9 #include "iroptimize.h"
10 #include "irgopt.h"
11 #include "irdom.h"
12 #include "iredges.h"
13 #include "irouts.h"
14 #include "irverify.h"
15 #include "irdump.h"
16 #include "opt_manage.h"
17
18 static void nop(ir_graph *irg) {
19         (void)irg;
20 }
21
22 void perform_irg_optimization(ir_graph *irg, optdesc_t *opt)
23 {
24         ir_graph_properties_t new_irg_state;
25         ir_graph_properties_t required = opt->requirements;
26         const bool dump = get_irp_optimization_dumps();
27
28         /* It does not make sense to require both: */
29         assert (!((required & IR_GRAPH_PROPERTY_ONE_RETURN) && (required & IR_GRAPH_PROPERTY_MANY_RETURNS)));
30
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)
44
45         /* now all the requirements for the optimization are fulfilled */
46         if (dump)
47                 dump_ir_graph(irg, opt->name);
48
49         new_irg_state = opt->optimization(irg);
50
51         if (dump)
52                 dump_ir_graph(irg, opt->name);
53
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.
57          */
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)
70
71         remove_End_Bads_and_doublets(get_irg_end(irg));
72
73         irg_verify(irg, VERIFY_ENFORCE_SSA);
74 }