43399c50dcd9d4de49acf93923d29fae7d17148a
[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
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_state_t new_irg_state;
25         ir_graph_state_t required = opt->requirements;
26         const bool dump = get_irp_optimization_dumps();
27
28         /* no bad block requires no unreachable code */
29         if (required & IR_GRAPH_STATE_NO_BAD_BLOCKS)
30                 required |= IR_GRAPH_STATE_NO_UNREACHABLE_BLOCKS;
31
32         /** Some workarounds because information is currently duplicated */
33         // FIXME should not be necessary!
34         if (loopinfo_inconsistent == get_irg_loopinfo_state(irg))
35                 clear_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_LOOPINFO);
36
37         /* assure that all requirements for the optimization are fulfilled */
38 #define PREPARE(st,func) if (st & (required ^ irg->state)) {func(irg); set_irg_state(irg,st);}
39         PREPARE(IR_GRAPH_STATE_ONE_RETURN,               normalize_one_return)
40         PREPARE(IR_GRAPH_STATE_NO_CRITICAL_EDGES,        remove_critical_cf_edges)
41         PREPARE(IR_GRAPH_STATE_NO_UNREACHABLE_BLOCKS,    remove_unreachable_blocks)
42         PREPARE(IR_GRAPH_STATE_NO_BAD_BLOCKS,            remove_bads)
43         PREPARE(IR_GRAPH_STATE_CONSISTENT_DOMINANCE,     assure_doms)
44         PREPARE(IR_GRAPH_STATE_CONSISTENT_POSTDOMINANCE, assure_postdoms)
45         PREPARE(IR_GRAPH_STATE_CONSISTENT_OUT_EDGES,     edges_assure)
46         PREPARE(IR_GRAPH_STATE_CONSISTENT_OUTS,          assure_irg_outs)
47         PREPARE(IR_GRAPH_STATE_CONSISTENT_LOOPINFO,      assure_cf_loop)
48         PREPARE(IR_GRAPH_STATE_CONSISTENT_ENTITY_USAGE,  assure_irg_entity_usage_computed)
49         PREPARE(IR_GRAPH_STATE_VALID_EXTENDED_BLOCKS,    compute_extbb)
50
51         /* now all the requirements for the optimization are fulfilled */
52         if (dump)
53                 dump_ir_graph(irg, opt->name);
54
55         new_irg_state = opt->optimization(irg);
56
57         if (dump)
58                 dump_ir_graph(irg, opt->name);
59
60         /* unless the optimization returned that some state is retained,
61          * we disable the corresponding irg state.
62          * Since we currently duplicate information, sometimes another func must be called too.
63          */
64 #define INVALIDATE(state,func) if (!(state & new_irg_state)) {clear_irg_state(irg,state); func(irg);}
65         INVALIDATE(IR_GRAPH_STATE_NO_CRITICAL_EDGES,        nop)
66         INVALIDATE(IR_GRAPH_STATE_NO_UNREACHABLE_BLOCKS,    nop)
67         INVALIDATE(IR_GRAPH_STATE_NO_BAD_BLOCKS,            nop)
68         INVALIDATE(IR_GRAPH_STATE_ONE_RETURN,               nop)
69         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_DOMINANCE,     nop)
70         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_POSTDOMINANCE, nop)
71         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_OUTS,          nop)
72         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_OUT_EDGES,     edges_deactivate)
73         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_LOOPINFO,      set_irg_loopinfo_inconsistent)
74         INVALIDATE(IR_GRAPH_STATE_CONSISTENT_ENTITY_USAGE,  nop)
75         INVALIDATE(IR_GRAPH_STATE_VALID_EXTENDED_BLOCKS,    set_irg_extblk_inconsistent)
76
77         if (!(new_irg_state & IR_GRAPH_STATE_BROKEN_FOR_VERIFIER)) {
78                 irg_verify(irg, VERIFY_ENFORCE_SSA);
79         }
80
81 }