replaced all recursive computed_value calls ba value_of()
[libfirm] / ir / ir / irflag.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irflag.c
4  * Purpose:     Flags to control optimizations.
5  * Author:      Christian Schaefer, Goetz Lindenmaier
6  * Modified by:
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1999-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
16
17 #include "firm_common.h"
18 #include "irflag_t.h"
19
20 /* DISABLE - don't do this optimization
21    ENABLE  - lets see, if there is a better graph */
22 #define ENABLE(a)   a
23 #define DISABLE(a)  0
24
25 optimization_state_t libFIRM_opt =
26   ENABLE(OPT_OPTIMIZED)                          |
27   ENABLE(OPT_CSE)                                |
28   DISABLE(OPT_GLOBAL_CSE)                        |
29   ENABLE(OPT_STRENGTH_RED)                       |
30   ENABLE(OPT_CONSTANT_FOLDING)                   |
31   ENABLE(OPT_REDUNDANT_LOADSTORE)                |
32   ENABLE(OPT_UNREACHABLE_CODE)                   |
33   ENABLE(OPT_CONTROL_FLOW_STRAIGHTENING)         |
34   ENABLE(OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION)   |
35   ENABLE(OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION) |
36   ENABLE(OPT_CRITICAL_EDGES)                     |
37   ENABLE(OPT_DEAD_NODE_ELIMINATION)              |
38   ENABLE(OPT_DEAD_METHOD_ELIMINATION)            |
39   ENABLE(OPT_REASSOCIATION)                      |
40   ENABLE(OPT_INLINE)                             |
41   ENABLE(OPT_DYN_METH_DISPATCH)                  |
42   ENABLE(OPT_NORMALIZE)                          |
43   ENABLE(OPT_TAIL_RECURSION)                     |
44   ENABLE(OPT_PRECISE_EXC_CONTEXT)                |
45   DISABLE(OPT_FRAGILE_OPS)                       |
46   0;
47
48 optimization_state_t libFIRM_verb =
49   DISABLE(OPT_OPTIMIZED)                          |
50   DISABLE(OPT_CSE)                                |
51   DISABLE(OPT_GLOBAL_CSE)                         |
52   DISABLE(OPT_STRENGTH_RED)                       |
53   DISABLE(OPT_CONSTANT_FOLDING)                   |
54   DISABLE(OPT_REDUNDANT_LOADSTORE)                |
55   DISABLE(OPT_UNREACHABLE_CODE)                   |
56   DISABLE(OPT_CONTROL_FLOW_STRAIGHTENING)         |
57   DISABLE(OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION)   |
58   DISABLE(OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION) |
59   DISABLE(OPT_CRITICAL_EDGES)                     |
60   DISABLE(OPT_DEAD_NODE_ELIMINATION)              |
61   DISABLE(OPT_DEAD_METHOD_ELIMINATION)            |
62   DISABLE(OPT_REASSOCIATION)                      |
63   DISABLE(OPT_INLINE)                             |
64   DISABLE(OPT_DYN_METH_DISPATCH)                  |
65   DISABLE(OPT_NORMALIZE)                          |
66   DISABLE(OPT_TAIL_RECURSION)                     |
67   DISABLE(OPT_PRECISE_EXC_CONTEXT)                |
68   DISABLE(OPT_FRAGILE_OPS)                       |
69   0;
70
71 /** The Firm verbosity level */
72 int firm_verbosity_level;
73
74 /* set the flags with set_flagname, get the flag with get_flagname */
75 void set_opt_cse (int value)
76 {
77   if (value)
78     libFIRM_opt |= OPT_CSE;
79   else
80     libFIRM_opt &= ~OPT_CSE;
81 }
82
83 int (get_opt_cse)(void) {
84   return _get_opt_cse();
85 }
86
87 void set_opt_global_cse(int value)
88 {
89   if (value)
90     libFIRM_opt |= OPT_GLOBAL_CSE;
91   else
92     libFIRM_opt &= ~OPT_GLOBAL_CSE;
93 }
94
95 void set_opt_strength_red (int value)
96 {
97   if (value)
98     libFIRM_opt |= OPT_STRENGTH_RED;
99   else
100     libFIRM_opt &= ~OPT_STRENGTH_RED;
101 }
102
103 void set_opt_strength_red_verbose (int value)
104 {
105   if (value)
106     libFIRM_verb |= OPT_STRENGTH_RED;
107   else
108     libFIRM_verb &= ~OPT_STRENGTH_RED;
109 }
110
111 void
112 set_opt_constant_folding(int value)
113 {
114   if (value)
115     libFIRM_opt |= OPT_CONSTANT_FOLDING;
116   else
117     libFIRM_opt &= ~OPT_CONSTANT_FOLDING;
118 }
119
120 void
121 set_opt_redundant_LoadStore(int value) {
122   if (value)
123     libFIRM_opt |= OPT_REDUNDANT_LOADSTORE;
124   else
125     libFIRM_opt &= ~OPT_REDUNDANT_LOADSTORE;
126 }
127
128 void
129 set_opt_unreachable_code(int value)
130 {
131   if (value)
132     libFIRM_opt |= OPT_UNREACHABLE_CODE;
133   else
134     libFIRM_opt &= ~OPT_UNREACHABLE_CODE;
135 }
136
137 void set_opt_control_flow(int value)
138 {
139   set_opt_control_flow_straightening(value);
140   set_opt_control_flow_weak_simplification(value);
141   set_opt_control_flow_strong_simplification(value);
142   set_opt_critical_edges(value);
143 }
144
145 /* Performs Straightening */
146 void set_opt_control_flow_straightening(int value)
147 {
148   if (value)
149     libFIRM_opt |= OPT_CONTROL_FLOW_STRAIGHTENING;
150   else
151     libFIRM_opt &= ~OPT_CONTROL_FLOW_STRAIGHTENING;
152 }
153
154 /* Performs if simplifications in local optimizations. */
155 void set_opt_control_flow_weak_simplification(int value)
156 {
157   if (value)
158     libFIRM_opt |= OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION;
159   else
160     libFIRM_opt &= ~OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION;
161 }
162
163 /* Performs strong if and loop simplification (in optimize_cf). */
164 void set_opt_control_flow_strong_simplification(int value)
165 {
166   if (value)
167     libFIRM_opt |= OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION;
168   else
169     libFIRM_opt &= ~OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION;
170 }
171
172 void set_opt_critical_edges(int value)
173 {
174   if (value)
175     libFIRM_opt |= OPT_CRITICAL_EDGES;
176   else
177     libFIRM_opt &= ~OPT_CRITICAL_EDGES;
178 }
179
180 void set_opt_reassociation(int value)
181 {
182   if (value)
183     libFIRM_opt |= OPT_REASSOCIATION;
184   else
185     libFIRM_opt &= ~OPT_REASSOCIATION;
186 }
187
188 void set_opt_dead_node_elimination(int value)
189 {
190   if (value)
191     libFIRM_opt |= OPT_DEAD_NODE_ELIMINATION;
192   else
193     libFIRM_opt &= ~OPT_DEAD_NODE_ELIMINATION;
194 }
195
196 void set_opt_dead_method_elimination (int value) {
197   if (value)
198     libFIRM_opt |= OPT_DEAD_METHOD_ELIMINATION;
199   else
200     libFIRM_opt &= ~OPT_DEAD_METHOD_ELIMINATION;
201 }
202
203 void set_opt_dead_method_elimination_verbose (int value) {
204   if (value)
205     libFIRM_verb |= OPT_DEAD_METHOD_ELIMINATION;
206   else
207     libFIRM_verb &= ~OPT_DEAD_METHOD_ELIMINATION;
208 }
209
210 void set_optimize(int value)
211 {
212   if (value)
213     libFIRM_opt |= OPT_OPTIMIZED;
214   else
215     libFIRM_opt &= ~OPT_OPTIMIZED;
216 }
217
218 int get_optimize(void)
219 {
220   return get_opt_optimize();
221 }
222
223
224 void set_firm_verbosity (int value) {
225   firm_verbosity_level = value;
226 }
227
228 int  (get_firm_verbosity) (void) {
229   return _get_firm_verbosity();
230 }
231
232
233
234 /* Enable/Disables inlining. */
235 void set_opt_inline(int value)
236 {
237   if (value)
238     libFIRM_opt |= OPT_INLINE;
239   else
240     libFIRM_opt &= ~OPT_INLINE;
241 }
242
243 /* Enable/Disable optimization of dynamic method dispatch */
244 void set_opt_dyn_meth_dispatch (int value)
245 {
246   if (value)
247     libFIRM_opt |= OPT_DYN_METH_DISPATCH;
248   else
249     libFIRM_opt &= ~OPT_DYN_METH_DISPATCH;
250 }
251
252 /* Enable/Disable normalizations of the firm representation. */
253 void set_opt_normalize(int value)
254 {
255   if (value)
256     libFIRM_opt |= OPT_NORMALIZE;
257   else
258     libFIRM_opt &= ~OPT_NORMALIZE;
259 }
260
261 /* Enable/Disable optimization of tail-recursion calls. */
262 void set_opt_tail_recursion(int value)
263 {
264   if (value)
265     libFIRM_opt |= OPT_TAIL_RECURSION;
266   else
267     libFIRM_opt &= ~OPT_TAIL_RECURSION;
268 }
269
270 /* Enable/Disable optimization of tail-recursion calls. */
271 void set_opt_tail_recursion_verbose(int value)
272 {
273   if (value)
274     libFIRM_verb |= OPT_TAIL_RECURSION;
275   else
276     libFIRM_verb &= ~OPT_TAIL_RECURSION;
277 }
278
279 /* Enable/Disable precise exception context. */
280 void set_opt_precise_exc_context(int value)
281 {
282 #if PRECISE_EXC_CONTEXT
283   if (value)
284     libFIRM_opt |= OPT_PRECISE_EXC_CONTEXT;
285   else
286     libFIRM_opt &= ~OPT_PRECISE_EXC_CONTEXT;
287 #endif
288 }
289
290 void set_opt_fragile_ops(int value)
291 {
292   if (value)
293     libFIRM_opt |= OPT_FRAGILE_OPS;
294   else
295     libFIRM_opt &= ~OPT_FRAGILE_OPS;
296 }
297
298 /* Save the current optimization state. */
299 void save_optimization_state(optimization_state_t *state)
300 {
301   *state = libFIRM_opt;
302 }
303
304 /* Restore the current optimization state. */
305 void restore_optimization_state(const optimization_state_t *state)
306 {
307   libFIRM_opt = *state;
308 }