/* optimization settings */
struct a_firm_opt firm_opt = {
- /* enabled = */ TRUE,
- /* debug_mode = */ DBG_MODE_NONE,
/* const_folding = */ TRUE,
/* cse = */ TRUE,
/* confirm = */ TRUE,
/* alias_analysis = */ TRUE,
/* strict_alias = */ FALSE,
/* no_alias = */ FALSE,
- /* cc_opt = */ TRUE,
/* fp_model = */ fp_model_precise,
/* verify = */ FIRM_VERIFICATION_ON,
/* check_all = */ FALSE,
- /* lower = */ TRUE,
- /* honor_restrict = */ TRUE,
- /* lower_bitfields = */ TRUE,
- /* pic = */ FALSE,
/* clone_threshold = */ DEFAULT_CLONE_THRESHOLD,
/* inline_maxsize = */ 750,
/* inline_threshold= */ 0,
/* verify_edges = */ FALSE,
- /* grs_simd_opt = */ 0,
- /* grs_create_pattern = */ 0,
- /* enable_statev = */ FALSE,
- /* statev_filter = */ "",
};
/* dumping options */
{ X("help"), NULL, 0, "print FCC related help options" },
/* firm optimization options */
- { X("pic"), &firm_opt.pic, 1, "firm: generate position independent code" },
- { X("g0"), &firm_opt.debug_mode, DBG_MODE_BACKSTORE, "firm: Debug Mode: use back stores" },
- { X("g1"), &firm_opt.debug_mode, DBG_MODE_FULL, "firm: Debug Mode: no register variables" },
{ X("no-opt"), NULL, 0, "firm: disable all FIRM optimizations" },
{ X("cse"), &firm_opt.cse, 1, "firm: enable common subexpression elimination" },
{ X("no-cse"), &firm_opt.cse, 0, "firm: disable common subexpression elimination" },
{ X("fp-precise"), &firm_opt.fp_model, fp_model_precise, "firm: precise fp model" },
{ X("fp-fast"), &firm_opt.fp_model, fp_model_fast, "firm: fast fp model" },
{ X("fp-strict"), &firm_opt.fp_model, fp_model_strict, "firm: strict fp model" },
- { X("opt-cc"), &firm_opt.cc_opt, 1, "firm: enable calling conventions optimization" },
- { X("no-opt-cc"), &firm_opt.cc_opt, 0, "firm: disable calling conventions optimization" },
/* other firm regarding options */
- { X("restrict"), &firm_opt.honor_restrict, 1, "firm: honor restrict keyword" },
- { X("no-restrict"), &firm_opt.honor_restrict, 1, "firm: restrict keyword is meaningless" },
- { X("no-lower"), &firm_opt.lower, 0, "firm: disable lowering" },
{ X("verify-off"), &firm_opt.verify, FIRM_VERIFICATION_OFF, "firm: disable node verification" },
{ X("verify-on"), &firm_opt.verify, FIRM_VERIFICATION_ON, "firm: enable node verification" },
{ X("verify-report"), &firm_opt.verify, FIRM_VERIFICATION_REPORT, "firm: node verification, report only" },
firm_opt.alias_analysis = FALSE;
firm_opt.strict_alias = FALSE;
firm_opt.no_alias = FALSE;
- firm_opt.cc_opt = FALSE;
disable_all_opts();
} /* disable_opts */
{
int i, len = strlen(opt);
const char *p = opt;
- int res;
if (strncmp("dump-filter=", opt, 12) == 0) {
opt = &opt[12];
else
*firm_options[i].flag = firm_options[i].set;
- if (firm_options[i].flag == &firm_opt.debug_mode && firm_opt.debug_mode > DBG_MODE_NONE) {
- if (firm_opt.debug_mode == DBG_MODE_FULL)
- disable_opts();
- res = 1;
- res &= be_parse_arg("omitfp=0");
- res &= be_parse_arg("stabs");
- return res;
- }
break;
}
}
#include "fe_common.h"
-enum a_debug_mode {
- DBG_MODE_NONE = 0, /**< no special debug support */
- DBG_MODE_BACKSTORE = 1, /**< backstores are created */
- DBG_MODE_FULL = 2, /**< no register valiables */
-};
-
/* optimization settings */
struct a_firm_opt {
- a_byte enabled; /**< enable all optimizations */
- a_byte debug_mode; /**< debug mode: store all local variables */
a_byte const_folding; /**< enable constant folding */
a_byte cse; /**< enable common-subexpression elimination */
a_byte confirm; /**< enable Confirm optimization */
a_byte alias_analysis; /**< enable Alias Analysis */
a_byte strict_alias; /**< enable strict Alias Analysis (using type based AA) */
a_byte no_alias; /**< no aliasing possible. */
- a_byte cc_opt; /**< optimize calling conventions */
a_byte fp_model; /**< fp model */
a_byte verify; /**< Firm verifier setting */
a_byte check_all; /**< enable checking all Firm phases */
- a_byte lower; /**< enable Firm lowering */
- a_byte honor_restrict; /**< enable restrict keyword */
- a_byte lower_bitfields; /**< lower bitfield access */
- a_byte pic; /**< generate position independent code */
int clone_threshold; /**< The threshold value for procedure cloning. */
unsigned inline_maxsize; /**< Maximum function size for inlining. */
unsigned inline_threshold;/**< Inlining benefice threshold. */
a_byte verify_edges; /**< verify edges */
- a_byte grs_simd_opt;
- a_byte grs_create_pattern;
- a_byte enable_statev; /**< enable statev output */
- const char *statev_filter; /**< statev filter */
};
/** statistic options */
static void do_lower_highlevel(ir_graph *irg)
{
- lower_highlevel_graph(irg, firm_opt.lower_bitfields);
+ lower_highlevel_graph(irg, false);
}
static void do_stred(ir_graph *irg)
IRP("opt-proc-clone", do_cloning, "procedure cloning", OPT_FLAG_NONE),
IRP("remove-unused", garbage_collect_entities, "removal of unused functions/variables", OPT_FLAG_NO_DUMP | OPT_FLAG_NO_VERIFY),
IRP("rts", rts_map, "optimization of known library functions", OPT_FLAG_HIDE_OPTIONS),
+ IRP("opt-cc", mark_private_methods, "calling conventions optimization", OPT_FLAG_NONE),
#undef IRP
#undef IRG
};
set_opt_enabled("target-lowering", true);
set_opt_enabled("rts", true);
set_opt_enabled("parallelize-mem", true);
+ set_opt_enabled("opt-cc", true);
}
/**
if (firm_dump.statistic & STAT_AFTER_LOWER)
stat_dump_snapshot(input_filename, "low");
- if (firm_opt.enabled) {
- timer_start(t_all_opt);
+ timer_start(t_all_opt);
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "place");
+ do_irg_opt(irg, "control-flow");
+ do_irg_opt(irg, "opt-load-store");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "control-flow");
+ if (do_irg_opt(irg, "vrp")) {
do_irg_opt(irg, "local");
- do_irg_opt(irg, "place");
do_irg_opt(irg, "control-flow");
- do_irg_opt(irg, "opt-load-store");
+ do_irg_opt(irg, "vrp");
do_irg_opt(irg, "local");
do_irg_opt(irg, "control-flow");
-
- if (do_irg_opt(irg, "vrp")) {
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- do_irg_opt(irg, "vrp");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- }
-
- if (do_irg_opt(irg, "if-conversion")) {
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- }
-
- do_irg_opt(irg, "parallelize-mem");
}
- timer_stop(t_all_opt);
- do_irp_opt("remove-unused");
+ if (do_irg_opt(irg, "if-conversion")) {
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "control-flow");
+ }
- dump_all("low-opt");
+ do_irg_opt(irg, "parallelize-mem");
}
-
- if (firm_opt.cc_opt)
- mark_private_methods();
+ do_irp_opt("remove-unused");
+ do_irp_opt("opt-cc");
+ timer_stop(t_all_opt);
+ dump_all("low-opt");
if (firm_dump.statistic & STAT_FINAL) {
stat_dump_snapshot(input_filename, "final");
if (firm_dump.no_blocks)
ir_remove_dump_flags(ir_dump_flag_blocks_as_subgraphs);
- if (firm_opt.enabled) {
- set_optimize(1);
- set_opt_constant_folding(firm_opt.const_folding);
- set_opt_algebraic_simplification(firm_opt.const_folding);
- set_opt_cse(firm_opt.cse);
- set_opt_global_cse(0);
- set_opt_unreachable_code(1);
- } else {
- set_optimize(0);
- }
+ set_optimize(1);
+ set_opt_constant_folding(firm_opt.const_folding);
+ set_opt_algebraic_simplification(firm_opt.const_folding);
+ set_opt_cse(firm_opt.cse);
+ set_opt_global_cse(0);
+ set_opt_unreachable_code(1);
}
/**
{
int i;
-#if 0
- if (firm_opt.enable_statev) {
- char buf[1024];
- snprintf(buf, sizeof(buf), "%s.ev", input_filename);
- ir_stat_ev_begin(input_filename, firm_opt.statev_filter);
- ir_stat_ev_compilation_unit(input_filename);
- }
-#endif
-
firm_const_exists = new_firm_const_exists;
/* the general for dumping option must be set, or the others will not work*/
stat_dump_snapshot(input_filename, "noopt");
}
- if (firm_opt.enabled)
- do_firm_optimizations(input_filename);
-
- if (firm_opt.lower)
- do_firm_lowering(input_filename);
+ do_firm_optimizations(input_filename);
+ do_firm_lowering(input_filename);
/* set the phase to low */
for (i = get_irp_n_irgs() - 1; i >= 0; --i)
return EXIT_FAILURE;
}
- /* we do the lowering in ast2firm */
- firm_opt.lower_bitfields = FALSE;
-
/* set the c_mode here, types depends on it */
c_mode |= features_on;
c_mode &= ~features_off;