#include <stdlib.h>
#include <string.h>
#include <libfirm/firm.h>
-
-#ifdef FIRM_BACKEND
#include <libfirm/be.h>
-#endif /* FIRM_BACKEND */
#include "firm_opt.h"
static void *create_intrinsic_ctx = NULL;
static const ir_settings_if_conv_t *if_conv_info = NULL;
+ir_mode *firm_imm_fp_mode = NULL;
+
/* entities of runtime functions */
ir_entity_ptr rts_entities[rts_max];
DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "reassoc");
CHECK_ONE(firm_opt.check_all, irg);
+ compute_doms(irg);
+ CHECK_ONE(firm_opt.check_all, irg);
+
+ if (firm_opt.code_place) {
+ timer_push(TV_CODE_PLACE);
+ set_opt_global_cse(1);
+ optimize_graph_df(irg);
+ place_code(irg);
+ set_opt_global_cse(0);
+ timer_pop();
+ DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "place");
+ CHECK_ONE(firm_opt.check_all, irg);
+ }
+
if (firm_opt.confirm) {
/* Confirm construction currently can only handle blocks with only one control
flow predecessor. Calling optimize_cf here removes Bad predecessors and help
the optimization of switch constructs. */
timer_push(TV_CF_OPT);
- optimize_cf(irg);
+ optimize_cf(irg);
timer_pop();
DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
CHECK_ONE(firm_opt.check_all, irg);
timer_pop();
DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "confirms");
CHECK_ONE(firm_opt.check_all, irg);
- }
- timer_push(TV_LOCAL_OPT);
- optimize_graph_df(irg);
- timer_pop();
- DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "lopt");
- CHECK_ONE(firm_opt.check_all, irg);
-
- compute_doms(irg);
- CHECK_ONE(firm_opt.check_all, irg);
-
- if (firm_opt.code_place) {
- timer_push(TV_CODE_PLACE);
- set_opt_global_cse(1);
+ timer_push(TV_LOCAL_OPT);
optimize_graph_df(irg);
- place_code(irg);
- set_opt_global_cse(0);
timer_pop();
- DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "place");
+ DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "lopt");
CHECK_ONE(firm_opt.check_all, irg);
}
DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
CHECK_ONE(firm_opt.check_all, irg);
- /* should we really remove the Confirm here? */
- if (firm_opt.confirm) {
- timer_push(TV_CONFIRM_CREATE);
- remove_confirms(irg);
- timer_pop();
- }
-
irg_verify(irg, VRFY_ENFORCE_SSA);
if (firm_opt.gvn_pre) {
do_gvn_pre(irg);
timer_pop();
DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "ldst");
CHECK_ONE(firm_opt.check_all, irg);
- }
+ }
lower_highlevel_graph(irg, firm_opt.lower_bitfields);
CHECK_ONE(firm_opt.check_all, irg);
}
+ /* should we really remove the Confirm here? */
+ if (firm_opt.confirm) {
+ timer_push(TV_CONFIRM_CREATE);
+ remove_confirms(irg);
+ timer_pop();
+ }
+
compute_doms(irg);
compute_postdoms(irg);
DUMP_ONE_CFG_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "dom");
CHECK_ALL(firm_opt.check_all);
}
+ if (firm_opt.cond_eval) {
+ for (i = 0; i < get_irp_n_irgs(); i++) {
+ irg = get_irp_irg(i);
+ timer_push(TV_COND_EVAL);
+ opt_cond_eval(irg);
+ timer_pop();
+ DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cond_eval");
+ CHECK_ONE(firm_opt.check_all, irg);
+
+ timer_push(TV_CF_OPT);
+ optimize_cf(irg);
+ timer_pop();
+ DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
+ CHECK_ONE(firm_opt.check_all, irg);
+ }
+ }
+
if (firm_dump.ir_graph) {
/* recompute backedges for nicer dumps */
for (i = 0; i < get_irp_n_irgs(); i++)
CHECK_ONE(firm_opt.check_all, current_ir_graph);
}
+ /* enable architecture dependent optimizations */
+ arch_dep_set_opts((arch_dep_opts_t)
+ ((firm_opt.muls ? arch_dep_mul_to_shift : arch_dep_none) |
+ (firm_opt.divs ? arch_dep_div_by_const : arch_dep_none) |
+ (firm_opt.mods ? arch_dep_mod_by_const : arch_dep_none) ));
+
for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
current_ir_graph = get_irp_irg(i);
params.cc_mask = 0; /* no regparam, cdecl */
params.builtin_dbg = NULL;
-#ifdef FIRM_BACKEND
+ #ifdef FIRM_EXT_GRS
+ /* Activate Graph rewriting if SIMD optimization is turned on */
+ /* This has to be done before init_firm() is called! */
+ if (firm_ext_grs.simd_opt)
+ ext_grs_activate();
+#endif
+
+ init_firm(¶ms);
+
if (firm_be_opt.selection == BE_FIRM_BE) {
- const backend_params *be_params = be_init();
+ const backend_params *be_params = be_get_backend_param();
firm_opt.lower_ll = (a_byte) be_params->do_dw_lowering;
params.arch_op_settings = be_params->arch_op_settings;
ad_param = be_params->dep_param;
if_conv_info = be_params->if_conv_info;
- }
-#endif /* FIRM_BACKEND */
-#ifdef FIRM_EXT_GRS
- /* Activate Graph rewriting if SIMD optimization is turned on */
- /* This has to be done before init_firm() is called! */
- if (firm_ext_grs.simd_opt)
- ext_grs_activate();
-#endif
+ if (be_params->has_imm_fp_mode)
+ firm_imm_fp_mode = be_params->imm_fp_mode;
+ }
- init_firm(¶ms);
dbg_init(NULL, NULL, dbg_snprint);
edges_init_dbg(firm_opt.vrfy_edges);
//cbackend_set_debug_retrieve(dbg_retrieve);
ext_grs_simd_opt();
#endif
- /* enable architecture dependent optimizations */
- arch_dep_set_opts((arch_dep_opts_t)
- ((firm_opt.muls ? arch_dep_mul_to_shift : arch_dep_none) |
- (firm_opt.divs ? arch_dep_div_by_const : arch_dep_none) |
- (firm_opt.mods ? arch_dep_mod_by_const : arch_dep_none) ));
-
-
if (firm_dump.statistic & STAT_FINAL_IR)
stat_dump_snapshot(input_filename, "final-ir");
* Do very early initializations
*/
void firm_early_init(void) {
-#ifdef FIRM_BACKEND
/* arg: need this here for command line options */
be_opt_register();
-#endif
firm_init_options(NULL, 0, NULL);
} /* firm_early_init */