remove sel_based_null_check flag
[libfirm] / ir / ir / irflag.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Flags to control optimizations.
23  * @author  Michael Beck, Sebastian Hack
24  */
25 #include "config.h"
26
27 #include <stdio.h>
28
29 #include "lc_opts.h"
30
31 #include "firm_common.h"
32 #include "irtools.h"
33 #include "irflag_t.h"
34
35 /* DISABLE - don't do this optimization
36    ENABLE  - lets see, if there is a better graph */
37 #define ON   -1
38 #define OFF   0
39
40 #define FLAG(name, value, def)     (irf_##name & def) |
41 #define E_FLAG(name, value, def)    FLAG(name, value, def)
42 #define I_FLAG(name, value, def)    FLAG(name, value, def)
43 #define R_FLAG(name, value)
44
45 optimization_state_t libFIRM_opt =
46 #include "irflag_t.def"
47   0;
48
49 #undef FLAG
50 #undef E_FLAG
51 #undef I_FLAG
52 #undef R_FLAG
53
54 /** The bitset of currently running phases. */
55 optimization_state_t libFIRM_running = 0;
56
57 /* verbose is always off on default */
58 optimization_state_t libFIRM_verb = 0;
59
60 /* silence warnings */
61 void set_opt_optimize(int value);
62
63 /* an external flag can be set and get from outside */
64 #define E_FLAG(name, value, def)           \
65 void set_opt_##name(int flag) {            \
66   if (flag) libFIRM_opt |= irf_##name;     \
67   else      libFIRM_opt &= ~irf_##name;    \
68 }                                          \
69 int (get_opt_##name)(void) {               \
70   return get_opt_##name##_();              \
71 }
72
73 /* an internal flag can only be set from outside */
74 #define I_FLAG(name, value, def)          \
75 void set_opt_##name(int flag) {           \
76   if (flag) libFIRM_opt |= irf_##name;    \
77   else      libFIRM_opt &= ~irf_##name;   \
78 }                                         \
79
80 #define R_FLAG(name, value)
81
82 /* generate them */
83 #include "irflag_t.def"
84
85 #undef I_FLAG
86 #undef E_FLAG
87 #undef R_FLAG
88
89 /* for compatibility reasons */
90 void set_optimize(int value)
91 {
92         set_opt_optimize(value);
93 }
94
95 int (get_optimize)(void)
96 {
97         return get_opt_optimize();
98 }
99
100 /* Save the current optimization state. */
101 void save_optimization_state(optimization_state_t *state)
102 {
103         *state = libFIRM_opt;
104 }
105
106 /* Restore the current optimization state. */
107 void restore_optimization_state(const optimization_state_t *state)
108 {
109         libFIRM_opt = *state;
110 }
111
112 /* Switches ALL optimizations off */
113 void all_optimizations_off(void)
114 {
115         libFIRM_opt = 0;
116 }
117
118 #ifdef _DEBUG
119 /* only for debugging */
120 void firm_show_flags(FILE *f)
121 {
122         if (! f)
123                 f = stdout;
124         printf("Firm optimization state:\n");
125 #define E_FLAG(name, value, def) printf(" %-20s = %s\n", #name, get_opt_##name() ? "ON" : "OFF");
126 #define I_FLAG(name, value, def) printf(" %-20s = %s\n", #name, get_opt_##name() ? "ON" : "OFF");
127 #define R_FLAG(name, value)      printf(" %-20s = %s\n", #name, is_##name##_running() ? "is running" : "not running");
128 #include "irflag_t.def"
129 #undef I_FLAG
130 #undef E_FLAG
131 #undef R_FLAG
132         printf("\n");
133 }
134 #endif
135
136 static const lc_opt_table_entry_t firm_flags[] = {
137 #define I_FLAG(name, val, def) LC_OPT_ENT_BIT(#name, #name, &libFIRM_opt, (1 << val)),
138 #define E_FLAG(name, val, def) LC_OPT_ENT_BIT(#name, #name, &libFIRM_opt, (1 << val)),
139 #define R_FLAG(name, val)
140 #include "irflag_t.def"
141 #undef I_FLAG
142 #undef E_FLAG
143 #undef R_FLAG
144         LC_OPT_LAST
145 };
146
147 void firm_init_flags(void)
148 {
149         lc_opt_entry_t *grp = lc_opt_get_grp(firm_opt_get_root(), "opt");
150         lc_opt_add_table(grp, firm_flags);
151 }
152
153 firm_verification_t opt_do_node_verification = FIRM_VERIFICATION_ON;
154
155 void do_node_verification(firm_verification_t mode)
156 {
157         opt_do_node_verification = mode;
158 }