3 * File name: ir/ir/irgraph.c
4 * Purpose: Flags to control optimizations, inline implementation.
8 * Copyright: (c) 1998-2004 Universität Karlsruhe
9 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
15 * Inline implementation of Optimization flags.
17 * @author Michael Beck
25 * current libFIRM optimizations
28 /** Common subexpression eliminations: Hash the nodes. */
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,
37 /** Evaluate operations. */
38 OPT_CONSTANT_FOLDING = 0x00000004,
40 /** Bad node propagation. */
41 OPT_UNREACHABLE_CODE = 0x00000008,
44 OPT_CONTROL_FLOW_STRAIGHTENING = 0x00000010,
47 OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION = 0x00000020,
50 OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION = 0x00000040,
53 OPT_CRITICAL_EDGES = 0x00000080,
55 /** Reclaim memory. */
56 OPT_DEAD_NODE_ELIMINATION = 0x00000100,
58 /** Reassociate nodes. */
59 OPT_REASSOCIATION = 0x00000200,
61 /** Do inlining transformation. */
62 OPT_INLINE = 0x00000400,
64 /** Remove dynamic method dispatch. */
65 OPT_DYN_METH_DISPATCH = 0x00000800,
67 /** Transformations that normalize the firm representation
68 * as removing Ids and Tuples, useless Phis, SymConst(id) -> Const(entity) ...
70 OPT_NORMALIZE = 0x00001000,
72 /** Turn off all optimizations. */
73 OPT_OPTIMIZED = 0x40000000
76 extern optimization_state_t libFIRM_opt;
78 /* take care of the INLINE/USE_GCC_INLINE mess */
81 # ifdef USE_GCC_INLINE
82 # define INLINE __extension__ ((__inline__))
83 # else /* defined USE_GCC_INLINE */
85 # endif /* define USE_GCC_INLINE */
86 # endif /* defined INLINE */
89 /** Returns constant folding optimization setting. */
90 INLINE int get_opt_cse(void)
91 # ifdef USE_GCC_INLINE
93 return libFIRM_opt & OPT_CSE;
95 # else /* defined USE_GCC_INLINE */
97 # endif /* not defined USE_GCC_INLINE */
99 /** Returns constant subexpression elimination setting. */
100 INLINE int get_opt_global_cse(void)
101 # ifdef USE_GCC_INLINE
103 return libFIRM_opt & OPT_GLOBAL_CSE;
105 # else /* defined USE_GCC_INLINE */
107 # endif /* not defined USE_GCC_INLINE */
109 /** Returns global constant subexpression elimination setting. */
110 INLINE int get_opt_constant_folding(void)
111 # ifdef USE_GCC_INLINE
113 return libFIRM_opt & OPT_CONSTANT_FOLDING;
115 # else /* defined USE_GCC_INLINE */
117 # endif /* not defined USE_GCC_INLINE */
119 /** Returns unreachable code elimination setting. */
120 INLINE int get_opt_unreachable_code(void)
121 # ifdef USE_GCC_INLINE
123 return libFIRM_opt & OPT_UNREACHABLE_CODE;
125 # else /* defined USE_GCC_INLINE */
127 # endif /* not defined USE_GCC_INLINE */
129 /** Returns Straightening setting. */
130 INLINE int get_opt_control_flow_straightening(void)
131 # ifdef USE_GCC_INLINE
133 return libFIRM_opt & OPT_CONTROL_FLOW_STRAIGHTENING;
135 # else /* defined USE_GCC_INLINE */
137 # endif /* not defined USE_GCC_INLINE */
139 /** Returns if simplifications in local optimizations setting. */
140 INLINE int get_opt_control_flow_weak_simplification(void)
141 # ifdef USE_GCC_INLINE
143 return libFIRM_opt & OPT_CONTROL_FLOW_WEAK_SIMPLIFICATION;
145 # else /* defined USE_GCC_INLINE */
147 # endif /* not defined USE_GCC_INLINE */
149 /** Returns strong if and loop simplification setting */
150 INLINE int get_opt_control_flow_strong_simplification(void)
151 # ifdef USE_GCC_INLINE
153 return libFIRM_opt & OPT_CONTROL_FLOW_STRONG_SIMPLIFICATION;
155 # else /* defined USE_GCC_INLINE */
157 # endif /* not defined USE_GCC_INLINE */
159 /** Returns whether critical edges are removed */
160 INLINE int get_opt_critical_edges(void)
161 # ifdef USE_GCC_INLINE
163 return libFIRM_opt & OPT_CRITICAL_EDGES;
165 # else /* defined USE_GCC_INLINE */
167 # endif /* not defined USE_GCC_INLINE */
169 /** Returns reassociation setting. */
170 INLINE int get_opt_reassociation(void)
171 # ifdef USE_GCC_INLINE
173 return libFIRM_opt & OPT_REASSOCIATION;
175 # else /* defined USE_GCC_INLINE */
177 # endif /* not defined USE_GCC_INLINE */
179 /** Returns dead node elimination setting. */
180 INLINE int get_opt_dead_node_elimination(void)
181 # ifdef USE_GCC_INLINE
183 return libFIRM_opt & OPT_DEAD_NODE_ELIMINATION;
185 # else /* defined USE_GCC_INLINE */
187 # endif /* not defined USE_GCC_INLINE */
189 /** Returns global optimization setting */
190 INLINE int get_opt_optimize(void)
191 # ifdef USE_GCC_INLINE
193 return libFIRM_opt & OPT_OPTIMIZED;
195 # else /* defined USE_GCC_INLINE */
197 # endif /* not defined USE_GCC_INLINE */
199 /** Returns inlining setting. */
200 INLINE int get_opt_inline(void)
201 # ifdef USE_GCC_INLINE
203 return libFIRM_opt & OPT_INLINE;
205 # else /* defined USE_GCC_INLINE */
207 # endif /* not defined USE_GCC_INLINE */
209 INLINE int get_opt_dyn_meth_dispatch(void)
210 # ifdef USE_GCC_INLINE
212 return libFIRM_opt & OPT_DYN_METH_DISPATCH;
214 # else /* defined USE_GCC_INLINE */
216 # endif /* not defined USE_GCC_INLINE */
218 INLINE int get_opt_normalize(void)
219 # ifdef USE_GCC_INLINE
221 return libFIRM_opt & OPT_NORMALIZE;
223 # else /* defined USE_GCC_INLINE */
225 # endif /* not defined USE_GCC_INLINE */
227 #endif /* _IRFLAG_T_H_ */