added remove_Confirm option. If set, local_optimize() will remove
[libfirm] / ir / ir / irflag_t.h
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irgraph.c
4  * Purpose:     Flags to control optimizations, inline implementation.
5  * Author:      Michael Beck
6  * Created:
7  * CVS-ID:      $Id$
8  * Copyright:   (c) 1998-2004 Universität Karlsruhe
9  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
10  */
11
12 /**
13  * @file irflag_t.h
14  *
15  * Inline implementation of Optimization flags.
16  *
17  * @author Michael Beck
18  */
19 #ifndef _IRFLAG_T_H_
20 #define _IRFLAG_T_H_
21
22 #include "irflag.h"
23
24 /**
25  * current libFIRM optimizations
26  */
27 typedef enum {
28   /** Common subexpression eliminations: Hash the nodes. */
29   OPT_CSE                                = 0x00000001,
30
31   /** Don't use block predecessor for comparison.
32    *  Default must be zero as code placement must
33    *  be run right after a local optimize walk with
34    *  opt_global_cse on. */
35   OPT_GLOBAL_CSE                         = 0x00000002,
36
37   /** Evaluate operations. */
38   OPT_CONSTANT_FOLDING                   = 0x00000004,
39
40   /** Bad node propagation. */
41   OPT_UNREACHABLE_CODE                   = 0x00000008,
42
43   /** */
44   OPT_CONTROL_FLOW_STRAIGHTENING         = 0x00000010,
45
46   /** */
47   OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION   = 0x00000020,
48
49   /** */
50   OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION = 0x00000040,
51
52   /** */
53   OPT_CRITICAL_EDGES                     = 0x00000080,
54
55   /** Reclaim memory. */
56   OPT_DEAD_NODE_ELIMINATION              = 0x00000100,
57
58   /** Reassociate nodes. */
59   OPT_REASSOCIATION                      = 0x00000200,
60
61   /** Do inlining transformation. */
62   OPT_INLINE                             = 0x00000400,
63
64   /** Remove dynamic method dispatch. */
65   OPT_DYN_METH_DISPATCH                  = 0x00000800,
66
67   /** Transformations that normalize the firm representation
68    *  as removing Ids and Tuples, useless Phis, SymConst(id) -> Const(entity) ...
69    */
70   OPT_NORMALIZE                          = 0x00001000,
71
72   /** Remove tail-recursion. */
73   OPT_TAIL_RECURSION                     = 0x00002000,
74
75   /** Free never called methods */
76   OPT_DEAD_METHOD_ELIMINATION            = 0x00004000,
77
78   /** precise exception context */
79   OPT_PRECISE_EXC_CONTEXT                = 0x00008000,
80
81  /** EMPTY SLOT !!! TO BE ASSIGNED */
82
83   /** Do loop unrolling */
84   OPT_LOOP_UNROLLING                     = 0x00010000,
85
86   /** Do Strength reduction */
87   OPT_STRENGTH_RED                       = 0x00020000,
88
89   /** Optimize Loads and Stores */
90   OPT_REDUNDANT_LOADSTORE                = 0x00040000,
91
92   /** Optimize Fragile OPs */
93   OPT_FRAGILE_OPS                        = 0x00080000,
94
95   /** If conversion. */
96   OPT_IF_CONVERSION                      = 0x00100000,
97
98   /** Optimize real function calls. */
99   OPT_REAL_FUNC_CALL                     = 0x00200000,
100
101   /** Optimize cast nodes. */
102   OPT_CLASS_CASTS                        = 0x00400000,
103   OPT_SUPPRESS_DOWNCAST_OPT              = 0x00800000,
104
105   /** Not really an optimization, removes Confirm nodes */
106   OPT_REMOVE_CONFIRM                     = 0x01000000,
107
108   /** Turn off all optimizations. */
109   OPT_OPTIMIZED                          = 0x40000000,
110
111 } libfirm_opts_t;
112
113 extern optimization_state_t libFIRM_opt;
114 extern optimization_state_t libFIRM_verb;
115
116 extern int firm_verbosity_level;
117
118
119 /** Returns constant folding optimization setting. */
120 static INLINE int _get_opt_cse(void)
121 {
122   return libFIRM_opt & OPT_CSE;
123 }
124
125 /** Returns constant subexpression elimination setting. */
126 static INLINE int get_opt_global_cse(void)
127 {
128   return libFIRM_opt & OPT_GLOBAL_CSE;
129 }
130
131 static INLINE int get_opt_loop_unrolling(void)
132 {
133   return libFIRM_opt & OPT_LOOP_UNROLLING;
134 }
135
136 /** Returns verbosity for loop unrolling.   */
137 static INLINE int get_opt_loop_unrolling_verbose(void)
138 {
139   return libFIRM_verb & OPT_LOOP_UNROLLING;
140 }
141
142 static INLINE int get_opt_strength_red(void)
143 {
144   return libFIRM_opt & OPT_STRENGTH_RED;
145 }
146
147 /** Returns verbosity for strength reduction.   */
148 static INLINE int get_opt_strength_red_verbose(void)
149 {
150   return libFIRM_verb & OPT_STRENGTH_RED;
151 }
152
153 /** Returns global constant subexpression elimination setting. */
154 static INLINE int get_opt_constant_folding(void)
155 {
156   return libFIRM_opt & OPT_CONSTANT_FOLDING;
157 }
158
159 /** Returns global constant subexpression elimination setting. */
160 static INLINE int get_opt_redundant_LoadStore(void)
161 {
162   return libFIRM_opt & OPT_REDUNDANT_LOADSTORE;
163 }
164
165 /** Returns unreachable code elimination setting. */
166 static INLINE int get_opt_unreachable_code(void)
167 {
168   return libFIRM_opt & OPT_UNREACHABLE_CODE;
169 }
170
171 /** Returns Straightening setting. */
172 static INLINE int get_opt_control_flow_straightening(void)
173 {
174   return libFIRM_opt & OPT_CONTROL_FLOW_STRAIGHTENING;
175 }
176
177 /** Returns if simplifications in local optimizations setting. */
178 static INLINE int get_opt_control_flow_weak_simplification(void)
179 {
180   return libFIRM_opt & OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION;
181 }
182
183 /** Returns strong if and loop simplification setting */
184 static INLINE int get_opt_control_flow_strong_simplification(void)
185 {
186   return libFIRM_opt & OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION;
187 }
188
189 /** Returns whether critical edges are removed */
190 static INLINE int get_opt_critical_edges(void)
191 {
192   return libFIRM_opt & OPT_CRITICAL_EDGES;
193 }
194
195 /** Returns reassociation setting. */
196 static INLINE int get_opt_reassociation(void)
197 {
198   return libFIRM_opt & OPT_REASSOCIATION;
199 }
200
201 /** Returns dead node elimination setting. */
202 static INLINE int get_opt_dead_node_elimination(void)
203 {
204   return libFIRM_opt & OPT_DEAD_NODE_ELIMINATION;
205 }
206
207 /** Returns dead method elimination setting. */
208 static INLINE int get_opt_dead_method_elimination(void)
209 {
210   return libFIRM_opt & OPT_DEAD_METHOD_ELIMINATION;
211 }
212
213 /** Returns dead method elimination setting. */
214 static INLINE int get_opt_dead_method_elimination_verbose(void)
215 {
216   return libFIRM_verb & OPT_DEAD_METHOD_ELIMINATION;
217 }
218
219 /** Returns global optimization setting */
220 static INLINE int get_opt_optimize(void)
221 {
222   return libFIRM_opt & OPT_OPTIMIZED;
223 }
224
225 static INLINE int _get_firm_verbosity (void) {
226   return firm_verbosity_level;
227 }
228
229 /** Returns inlining setting. */
230 static INLINE int get_opt_inline(void)
231 {
232   return libFIRM_opt & OPT_INLINE;
233 }
234
235 static INLINE int _get_opt_dyn_meth_dispatch(void)
236 {
237   return libFIRM_opt & OPT_DYN_METH_DISPATCH;
238 }
239
240 static INLINE int _get_opt_optimize_class_casts (void) {
241   return libFIRM_opt & OPT_CLASS_CASTS;
242 }
243
244 static INLINE int _get_opt_optimize_class_casts_verbose (void) {
245   return libFIRM_verb & OPT_CLASS_CASTS;
246 }
247
248 static INLINE int _get_opt_suppress_downcast_optimization (void) {
249   return libFIRM_opt & OPT_SUPPRESS_DOWNCAST_OPT;
250 }
251
252 static INLINE int get_opt_normalize(void)
253 {
254   return libFIRM_opt & OPT_NORMALIZE;
255 }
256
257 /** Returns tail-recursion setting. */
258 static INLINE int get_opt_tail_recursion(void)
259 {
260   return libFIRM_opt & OPT_TAIL_RECURSION;
261 }
262
263 /** Returns tail-recursion setting. */
264 static INLINE int get_opt_tail_recursion_verbose(void)
265 {
266   return libFIRM_verb & OPT_TAIL_RECURSION;
267 }
268
269 /** Returns precise exception context setting. */
270 static INLINE int get_opt_precise_exc_context(void)
271 {
272   return libFIRM_opt & OPT_PRECISE_EXC_CONTEXT;
273 }
274
275 /** Returns fragile ops setting. */
276 static INLINE int get_opt_fragile_ops(void)
277 {
278   return libFIRM_opt & OPT_FRAGILE_OPS;
279 }
280
281 /** Returns if conversion setting. */
282 static INLINE int get_opt_if_conversion(void)
283 {
284   return libFIRM_opt & OPT_IF_CONVERSION;
285 }
286
287 /** Returns real function call optimization setting. */
288 static INLINE int get_opt_real_func_call(void)
289 {
290   return libFIRM_opt & OPT_REAL_FUNC_CALL;
291 }
292
293 /** Returns Confirm removal setting. */
294 static INLINE int get_opt_remove_Confirm(void)
295 {
296   return libFIRM_opt & OPT_REMOVE_CONFIRM;
297 }
298
299 #define get_opt_cse()                            _get_opt_cse()
300 #define get_firm_verbosity()                     _get_firm_verbosity()
301 #define get_opt_dyn_meth_dispatch()              _get_opt_dyn_meth_dispatch()
302 #define get_opt_optimize_class_casts()           _get_opt_optimize_class_casts()
303 #define get_opt_optimize_class_casts_verbose()   _get_opt_optimize_class_casts_verbose()
304 #define get_opt_suppress_downcast_optimization() _get_opt_suppress_downcast_optimization()
305
306 #endif /* _IRFLAG_T_H_ */