static bool do_irg_opt(ir_graph *irg, const char *name);
/** dump all the graphs depending on cond */
-#define DUMP_ALL(cond, suffix) \
- do { \
- if (cond) { \
- timer_push(t_vcg_dump); \
- if (firm_dump.no_blocks) \
- dump_all_ir_graphs(dump_ir_graph, suffix); \
- else if (firm_dump.extbb) \
- dump_all_ir_graphs(dump_ir_extblock_graph, suffix);\
- else \
- dump_all_ir_graphs(dump_ir_block_graph, suffix); \
- timer_pop(t_vcg_dump); \
- } \
- } while (0)
-
-/** dump all control flow graphs depending on cond */
-#define DUMP_ALL_CFG(cond, suffix) \
- do { \
- if (cond) { \
- timer_push(t_vcg_dump); \
- dump_all_ir_graphs(dump_cfg, suffix); \
- timer_pop(t_vcg_dump); \
- } \
- } while (0)
-
-/** dump graphs irg depending on cond */
-#define DUMP_ONE(cond, irg, suffix) \
- do { \
- if (cond) { \
- timer_push(t_vcg_dump); \
- if (firm_dump.no_blocks) \
- dump_ir_graph(irg, suffix); \
- else if (firm_dump.extbb) \
- dump_ir_extblock_graph(irg, suffix); \
- else \
- dump_ir_block_graph(irg, suffix); \
- timer_pop(t_vcg_dump); \
- } \
- } while (0)
-
-/** dump control flow graph irg depending on cond */
-#define DUMP_ONE_CFG(cond, irg, suffix) \
- do { \
- if (cond) { \
- timer_push(t_vcg_dump); \
- dump_cfg(irg, suffix); \
- timer_pop(t_vcg_dump); \
- } \
- } while (0)
+
+static void dump_all(const char *suffix) {
+ if (firm_dump.ir_graph) {
+ timer_push(t_vcg_dump);
+ if (firm_dump.no_blocks)
+ dump_all_ir_graphs(dump_ir_graph, suffix);
+ else if (firm_dump.extbb)
+ dump_all_ir_graphs(dump_ir_extblock_graph, suffix);
+ else
+ dump_all_ir_graphs(dump_ir_block_graph, suffix);
+ timer_pop(t_vcg_dump);
+ }
+}
/* set by the backend parameters */
static const ir_settings_arch_dep_t *ad_param = NULL;
* Map runtime functions.
*/
static void rts_map(void) {
- static const struct {
- ir_entity_ptr *ent; /**< address of the rts entity */
- i_mapper_func func; /**< mapper function. */
- } mapper[] = {
- /* integer */
- { &rts_entities[rts_abs], i_mapper_abs },
- { &rts_entities[rts_labs], i_mapper_abs },
- { &rts_entities[rts_llabs], i_mapper_abs },
- { &rts_entities[rts_imaxabs], i_mapper_abs },
-
- /* double -> double */
- { &rts_entities[rts_fabs], i_mapper_abs },
- { &rts_entities[rts_sqrt], i_mapper_sqrt },
- { &rts_entities[rts_cbrt], i_mapper_cbrt },
- { &rts_entities[rts_pow], i_mapper_pow },
- { &rts_entities[rts_exp], i_mapper_exp },
- { &rts_entities[rts_exp2], i_mapper_exp },
- { &rts_entities[rts_exp10], i_mapper_exp },
- { &rts_entities[rts_log], i_mapper_log },
- { &rts_entities[rts_log2], i_mapper_log2 },
- { &rts_entities[rts_log10], i_mapper_log10 },
- { &rts_entities[rts_sin], i_mapper_sin },
- { &rts_entities[rts_cos], i_mapper_cos },
- { &rts_entities[rts_tan], i_mapper_tan },
- { &rts_entities[rts_asin], i_mapper_asin },
- { &rts_entities[rts_acos], i_mapper_acos },
- { &rts_entities[rts_atan], i_mapper_atan },
- { &rts_entities[rts_sinh], i_mapper_sinh },
- { &rts_entities[rts_cosh], i_mapper_cosh },
- { &rts_entities[rts_tanh], i_mapper_tanh },
-
- /* float -> float */
- { &rts_entities[rts_fabsf], i_mapper_abs },
- { &rts_entities[rts_sqrtf], i_mapper_sqrt },
- { &rts_entities[rts_cbrtf], i_mapper_cbrt },
- { &rts_entities[rts_powf], i_mapper_pow },
- { &rts_entities[rts_expf], i_mapper_exp },
- { &rts_entities[rts_exp2f], i_mapper_exp },
- { &rts_entities[rts_exp10f], i_mapper_exp },
- { &rts_entities[rts_logf], i_mapper_log },
- { &rts_entities[rts_log2f], i_mapper_log2 },
- { &rts_entities[rts_log10f], i_mapper_log10 },
- { &rts_entities[rts_sinf], i_mapper_sin },
- { &rts_entities[rts_cosf], i_mapper_cos },
- { &rts_entities[rts_tanf], i_mapper_tan },
- { &rts_entities[rts_asinf], i_mapper_asin },
- { &rts_entities[rts_acosf], i_mapper_acos },
- { &rts_entities[rts_atanf], i_mapper_atan },
- { &rts_entities[rts_sinhf], i_mapper_sinh },
- { &rts_entities[rts_coshf], i_mapper_cosh },
- { &rts_entities[rts_tanhf], i_mapper_tanh },
-
- /* long double -> long double */
- { &rts_entities[rts_fabsl], i_mapper_abs },
- { &rts_entities[rts_sqrtl], i_mapper_sqrt },
- { &rts_entities[rts_cbrtl], i_mapper_cbrt },
- { &rts_entities[rts_powl], i_mapper_pow },
- { &rts_entities[rts_expl], i_mapper_exp },
- { &rts_entities[rts_exp2l], i_mapper_exp },
- { &rts_entities[rts_exp10l], i_mapper_exp },
- { &rts_entities[rts_logl], i_mapper_log },
- { &rts_entities[rts_log2l], i_mapper_log2 },
- { &rts_entities[rts_log10l], i_mapper_log10 },
- { &rts_entities[rts_sinl], i_mapper_sin },
- { &rts_entities[rts_cosl], i_mapper_cos },
- { &rts_entities[rts_tanl], i_mapper_tan },
- { &rts_entities[rts_asinl], i_mapper_asin },
- { &rts_entities[rts_acosl], i_mapper_acos },
- { &rts_entities[rts_atanl], i_mapper_atan },
- { &rts_entities[rts_sinhl], i_mapper_sinh },
- { &rts_entities[rts_coshl], i_mapper_cosh },
- { &rts_entities[rts_tanhl], i_mapper_tanh },
-
- /* string */
- { &rts_entities[rts_strcmp], i_mapper_strcmp },
- { &rts_entities[rts_strncmp], i_mapper_strncmp },
- { &rts_entities[rts_strcpy], i_mapper_strcpy },
- { &rts_entities[rts_strlen], i_mapper_strlen },
- { &rts_entities[rts_memcpy], i_mapper_memcpy },
- { &rts_entities[rts_mempcpy], i_mapper_mempcpy },
- { &rts_entities[rts_memmove], i_mapper_memmove },
- { &rts_entities[rts_memset], i_mapper_memset },
- { &rts_entities[rts_memcmp], i_mapper_memcmp }
- };
- i_record rec[sizeof(mapper)/sizeof(mapper[0])];
- unsigned i, n_map;
-
- for (i = n_map = 0; i < sizeof(mapper)/sizeof(mapper[0]); ++i)
- if (*mapper[i].ent != NULL) {
- rec[n_map].i_call.kind = INTRINSIC_CALL;
- rec[n_map].i_call.i_ent = *mapper[i].ent;
- rec[n_map].i_call.i_mapper = mapper[i].func;
- rec[n_map].i_call.ctx = NULL;
- rec[n_map].i_call.link = NULL;
- ++n_map;
- } /* if */
- if (n_map > 0)
- lower_intrinsics(rec, n_map, /* part_block_used=*/0);
-} /* rts_map */
+ static const struct {
+ ir_entity_ptr *ent; /**< address of the rts entity */
+ i_mapper_func func; /**< mapper function. */
+ } mapper[] = {
+ /* integer */
+ { &rts_entities[rts_abs], i_mapper_abs },
+ { &rts_entities[rts_labs], i_mapper_abs },
+ { &rts_entities[rts_llabs], i_mapper_abs },
+ { &rts_entities[rts_imaxabs], i_mapper_abs },
+
+ /* double -> double */
+ { &rts_entities[rts_fabs], i_mapper_abs },
+ { &rts_entities[rts_sqrt], i_mapper_sqrt },
+ { &rts_entities[rts_cbrt], i_mapper_cbrt },
+ { &rts_entities[rts_pow], i_mapper_pow },
+ { &rts_entities[rts_exp], i_mapper_exp },
+ { &rts_entities[rts_exp2], i_mapper_exp },
+ { &rts_entities[rts_exp10], i_mapper_exp },
+ { &rts_entities[rts_log], i_mapper_log },
+ { &rts_entities[rts_log2], i_mapper_log2 },
+ { &rts_entities[rts_log10], i_mapper_log10 },
+ { &rts_entities[rts_sin], i_mapper_sin },
+ { &rts_entities[rts_cos], i_mapper_cos },
+ { &rts_entities[rts_tan], i_mapper_tan },
+ { &rts_entities[rts_asin], i_mapper_asin },
+ { &rts_entities[rts_acos], i_mapper_acos },
+ { &rts_entities[rts_atan], i_mapper_atan },
+ { &rts_entities[rts_sinh], i_mapper_sinh },
+ { &rts_entities[rts_cosh], i_mapper_cosh },
+ { &rts_entities[rts_tanh], i_mapper_tanh },
+
+ /* float -> float */
+ { &rts_entities[rts_fabsf], i_mapper_abs },
+ { &rts_entities[rts_sqrtf], i_mapper_sqrt },
+ { &rts_entities[rts_cbrtf], i_mapper_cbrt },
+ { &rts_entities[rts_powf], i_mapper_pow },
+ { &rts_entities[rts_expf], i_mapper_exp },
+ { &rts_entities[rts_exp2f], i_mapper_exp },
+ { &rts_entities[rts_exp10f], i_mapper_exp },
+ { &rts_entities[rts_logf], i_mapper_log },
+ { &rts_entities[rts_log2f], i_mapper_log2 },
+ { &rts_entities[rts_log10f], i_mapper_log10 },
+ { &rts_entities[rts_sinf], i_mapper_sin },
+ { &rts_entities[rts_cosf], i_mapper_cos },
+ { &rts_entities[rts_tanf], i_mapper_tan },
+ { &rts_entities[rts_asinf], i_mapper_asin },
+ { &rts_entities[rts_acosf], i_mapper_acos },
+ { &rts_entities[rts_atanf], i_mapper_atan },
+ { &rts_entities[rts_sinhf], i_mapper_sinh },
+ { &rts_entities[rts_coshf], i_mapper_cosh },
+ { &rts_entities[rts_tanhf], i_mapper_tanh },
+
+ /* long double -> long double */
+ { &rts_entities[rts_fabsl], i_mapper_abs },
+ { &rts_entities[rts_sqrtl], i_mapper_sqrt },
+ { &rts_entities[rts_cbrtl], i_mapper_cbrt },
+ { &rts_entities[rts_powl], i_mapper_pow },
+ { &rts_entities[rts_expl], i_mapper_exp },
+ { &rts_entities[rts_exp2l], i_mapper_exp },
+ { &rts_entities[rts_exp10l], i_mapper_exp },
+ { &rts_entities[rts_logl], i_mapper_log },
+ { &rts_entities[rts_log2l], i_mapper_log2 },
+ { &rts_entities[rts_log10l], i_mapper_log10 },
+ { &rts_entities[rts_sinl], i_mapper_sin },
+ { &rts_entities[rts_cosl], i_mapper_cos },
+ { &rts_entities[rts_tanl], i_mapper_tan },
+ { &rts_entities[rts_asinl], i_mapper_asin },
+ { &rts_entities[rts_acosl], i_mapper_acos },
+ { &rts_entities[rts_atanl], i_mapper_atan },
+ { &rts_entities[rts_sinhl], i_mapper_sinh },
+ { &rts_entities[rts_coshl], i_mapper_cosh },
+ { &rts_entities[rts_tanhl], i_mapper_tanh },
+
+ /* string */
+ { &rts_entities[rts_strcmp], i_mapper_strcmp },
+ { &rts_entities[rts_strncmp], i_mapper_strncmp },
+ { &rts_entities[rts_strcpy], i_mapper_strcpy },
+ { &rts_entities[rts_strlen], i_mapper_strlen },
+ { &rts_entities[rts_memcpy], i_mapper_memcpy },
+ { &rts_entities[rts_mempcpy], i_mapper_mempcpy },
+ { &rts_entities[rts_memmove], i_mapper_memmove },
+ { &rts_entities[rts_memset], i_mapper_memset },
+ { &rts_entities[rts_memcmp], i_mapper_memcmp }
+ };
+ i_record rec[sizeof(mapper)/sizeof(mapper[0])];
+ unsigned i, n_map;
+
+ for (i = n_map = 0; i < sizeof(mapper)/sizeof(mapper[0]); ++i) {
+ if (*mapper[i].ent != NULL) {
+ rec[n_map].i_call.kind = INTRINSIC_CALL;
+ rec[n_map].i_call.i_ent = *mapper[i].ent;
+ rec[n_map].i_call.i_mapper = mapper[i].func;
+ rec[n_map].i_call.ctx = NULL;
+ rec[n_map].i_call.link = NULL;
+ ++n_map;
+ }
+ }
+
+ if (n_map > 0)
+ lower_intrinsics(rec, n_map, /* part_block_used=*/0);
+}
static int *irg_dump_no;
static void dump_graph_count(ir_graph *const irg, const char *const suffix)
{
- char name[64];
- snprintf(name, sizeof(name), "-%02d_%s", irg_dump_no[get_irg_idx(irg)]++, suffix);
- DUMP_ONE(1, irg, name);
+ char name[64];
+ snprintf(name, sizeof(name), "-%02d_%s", irg_dump_no[get_irg_idx(irg)]++,
+ suffix);
+
+ timer_push(t_vcg_dump);
+ if (firm_dump.no_blocks)
+ dump_ir_graph(irg, suffix);
+ else if (firm_dump.extbb)
+ dump_ir_extblock_graph(irg, suffix);
+ else
+ dump_ir_block_graph(irg, suffix);
+ timer_pop(t_vcg_dump);
}
-static void dump_all_count(const char *const suffix)
-{
- const int n_irgs = get_irp_n_irgs();
- int i;
-
- for (i = 0; i < n_irgs; ++i)
- dump_graph_count(get_irp_irg(i), suffix);
-}
-
-#define DUMP_ONE_C(cond, irg, suffix) \
- do { \
- if (cond) { \
- dump_graph_count((irg), (suffix)); \
- } \
- } while (0)
-
-#define DUMP_ALL_C(cond, suffix) \
- do { \
- if (cond) { \
- dump_all_count((suffix)); \
- } \
- } while (0)
-
static void remove_unused_functions(void)
{
ir_entity **keep_methods;
func(irg);
timer_pop(timers[n]);
- DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, config->name);
+ if (firm_dump.all_phases && firm_dump.ir_graph) {
+ dump_graph_count(irg, config->name);
+ }
if (firm_opt.check_all) {
timer_push(t_verify);
func();
timer_pop(timers[n]);
- DUMP_ALL_C(firm_dump.ir_graph && firm_dump.all_phases, config->name);
+ if (firm_dump.ir_graph && firm_dump.all_phases) {
+ int i;
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+ dump_graph_count(irg, config->name);
+ }
+ }
if (firm_opt.check_all) {
int i;
*/
static void do_firm_optimizations(const char *input_filename)
{
- int i;
- unsigned aa_opt;
-
- /* FIXME: cloning might ADD new graphs. */
- irg_dump_no = calloc(get_irp_last_idx(), sizeof(*irg_dump_no));
-
- set_opt_alias_analysis(firm_opt.alias_analysis);
-
- aa_opt = aa_opt_no_opt;
- if (firm_opt.strict_alias)
- aa_opt |= aa_opt_type_based | aa_opt_byte_type_may_alias;
- if (firm_opt.no_alias)
- aa_opt = aa_opt_no_alias;
-
- set_irp_memory_disambiguator_options(aa_opt);
-
- /* parameter passing code should set them directly sometime... */
- set_opt_enabled("rts", !firm_opt.freestanding);
- set_opt_enabled("gcse", firm_opt.gcse);
- set_opt_enabled("place", !firm_opt.gcse);
- set_opt_enabled("confirm", firm_opt.confirm);
- set_opt_enabled("remove-confirms", firm_opt.confirm);
-
- /* osr supersedes remove_phi_cycles */
- if (get_opt_enabled("ivopts"))
- set_opt_enabled("remove-phi-cycles", false);
-
- timer_start(t_all_opt);
-
- do_irp_opt("rts");
-
- /* first step: kill dead code */
- for (i = 0; i < get_irp_n_irgs(); i++) {
- ir_graph *irg = get_irp_irg(i);
- do_irg_opt(irg, "combo");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- }
-
- do_irp_opt("remove-unused");
- do_irp_opt("opt-tail-rec");
- do_irp_opt("opt-func-call");
- do_irp_opt("lower-const");
-
- for (i = 0; i < get_irp_n_irgs(); i++) {
- ir_graph *irg = get_irp_irg(i);
-
- do_irg_opt(irg, "scalar-replace");
- do_irg_opt(irg, "invert-loops");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "reassociation");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "gcse");
-
- 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. */
- do_irg_opt(irg, "control-flow");
- do_irg_opt(irg, "confirm");
- do_irg_opt(irg, "local");
- }
-
- do_irg_opt(irg, "control-flow");
- do_irg_opt(irg, "opt-load-store");
- do_irg_opt(irg, "lower");
- do_irg_opt(irg, "deconv");
- do_irg_opt(irg, "thread-jumps");
- do_irg_opt(irg, "remove-confirms");
- do_irg_opt(irg, "gvn-pre");
- do_irg_opt(irg, "place");
- 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, "bool");
- do_irg_opt(irg, "shape-blocks");
- do_irg_opt(irg, "lower-switch");
- do_irg_opt(irg, "ivopts");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "dead");
- }
-
- do_irp_opt("inline");
- do_irp_opt("opt-proc-clone");
-
- for (i = 0; i < get_irp_n_irgs(); i++) {
- ir_graph *irg = get_irp_irg(i);
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- do_irg_opt(irg, "thread-jumps");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
- }
-
- if (firm_dump.ir_graph) {
- /* recompute backedges for nicer dumps */
- for (i = 0; i < get_irp_n_irgs(); i++)
- construct_cf_backedges(get_irp_irg(i));
- }
-
- do_irp_opt("remove-unused");
-
- DUMP_ALL(firm_dump.ir_graph, "-opt");
-
- if (firm_dump.statistic & STAT_AFTER_OPT)
- stat_dump_snapshot(input_filename, "opt");
-
- timer_stop(t_all_opt);
+ int i;
+ unsigned aa_opt;
+
+ /* FIXME: cloning might ADD new graphs. */
+ irg_dump_no = calloc(get_irp_last_idx(), sizeof(*irg_dump_no));
+
+ set_opt_alias_analysis(firm_opt.alias_analysis);
+
+ aa_opt = aa_opt_no_opt;
+ if (firm_opt.strict_alias)
+ aa_opt |= aa_opt_type_based | aa_opt_byte_type_may_alias;
+ if (firm_opt.no_alias)
+ aa_opt = aa_opt_no_alias;
+
+ set_irp_memory_disambiguator_options(aa_opt);
+
+ /* parameter passing code should set them directly sometime... */
+ set_opt_enabled("rts", !firm_opt.freestanding);
+ set_opt_enabled("gcse", firm_opt.gcse);
+ set_opt_enabled("place", !firm_opt.gcse);
+ set_opt_enabled("confirm", firm_opt.confirm);
+ set_opt_enabled("remove-confirms", firm_opt.confirm);
+
+ /* osr supersedes remove_phi_cycles */
+ if (get_opt_enabled("ivopts"))
+ set_opt_enabled("remove-phi-cycles", false);
+
+ timer_start(t_all_opt);
+
+ do_irp_opt("rts");
+
+ /* first step: kill dead code */
+ for (i = 0; i < get_irp_n_irgs(); i++) {
+ ir_graph *irg = get_irp_irg(i);
+ do_irg_opt(irg, "combo");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "control-flow");
+ }
+
+ do_irp_opt("remove-unused");
+ do_irp_opt("opt-tail-rec");
+ do_irp_opt("opt-func-call");
+ do_irp_opt("lower-const");
+
+ for (i = 0; i < get_irp_n_irgs(); i++) {
+ ir_graph *irg = get_irp_irg(i);
+
+ do_irg_opt(irg, "scalar-replace");
+ do_irg_opt(irg, "invert-loops");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "reassociation");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "gcse");
+
+ 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.
+ */
+ do_irg_opt(irg, "control-flow");
+ do_irg_opt(irg, "confirm");
+ do_irg_opt(irg, "local");
+ }
+
+ do_irg_opt(irg, "control-flow");
+ do_irg_opt(irg, "opt-load-store");
+ do_irg_opt(irg, "lower");
+ do_irg_opt(irg, "deconv");
+ do_irg_opt(irg, "thread-jumps");
+ do_irg_opt(irg, "remove-confirms");
+ do_irg_opt(irg, "gvn-pre");
+ do_irg_opt(irg, "place");
+ 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, "bool");
+ do_irg_opt(irg, "shape-blocks");
+ do_irg_opt(irg, "lower-switch");
+ do_irg_opt(irg, "ivopts");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "dead");
+ }
+
+ do_irp_opt("inline");
+ do_irp_opt("opt-proc-clone");
+
+ for (i = 0; i < get_irp_n_irgs(); i++) {
+ ir_graph *irg = get_irp_irg(i);
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "control-flow");
+ do_irg_opt(irg, "thread-jumps");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "control-flow");
+ }
+
+ if (firm_dump.ir_graph) {
+ /* recompute backedges for nicer dumps */
+ for (i = 0; i < get_irp_n_irgs(); i++)
+ construct_cf_backedges(get_irp_irg(i));
+ }
+
+ do_irp_opt("remove-unused");
+
+ dump_all("-opt");
+
+ if (firm_dump.statistic & STAT_AFTER_OPT)
+ stat_dump_snapshot(input_filename, "opt");
+
+ timer_stop(t_all_opt);
}
/**
*/
static int compute_type_size(ir_type *ty)
{
- optimization_state_t state;
- unsigned align_all = 1;
- int n, size = 0, set = 0;
- int i, dims, s;
-
- if (get_type_state(ty) == layout_fixed) {
- /* do not layout already layouted types again */
- return 1;
- }
-
- if (is_Method_type(ty) || ty == get_glob_type()) {
- /* no need for size calculation for method types or the global type */
- return 1;
- }
-
- DBG(("compute type size visiting: %s\n", get_type_name(ty)));
-
- switch (get_type_tpop_code(ty)) {
- case tpo_class:
- case tpo_struct:
- for (i = 0, n = get_compound_n_members(ty); i < n; ++i) {
- ir_entity *ent = get_compound_member(ty, i);
- ir_type *ent_ty = get_entity_type(ent);
- unsigned align, misalign;
-
- /* inner functions do not expand the frame */
- if (is_Method_type(ent_ty) && is_frame_type(ty))
- continue;
-
- /* compute member types */
- if (! compute_type_size(ent_ty))
- return 0;
-
- align = get_type_alignment_bytes(ent_ty);
- align_all = align > align_all ? align : align_all;
- misalign = (align ? size % align : 0);
- size += (misalign ? align - misalign : 0);
-
- set_entity_offset(ent, size);
- size += get_type_size_bytes(ent_ty);
-
- DBG((" member %s %s -> (size: %u, align: %u)\n",
- get_type_name(ent_ty), get_entity_name(ent),
- get_type_size_bytes(ent_ty), get_type_alignment_bytes(ent_ty)));
- }
- if (align_all > 0 && size % align_all) {
- DBG(("align of the struct member: %u, type size: %d\n", align_all, size));
- size += align_all - (size % align_all);
- DBG(("correcting type-size to %d\n", size));
- }
- set_type_alignment_bytes(ty, align_all);
- set = 1;
- break;
-
- case tpo_union:
- for (i = 0, n = get_union_n_members(ty); i < n; ++i) {
- ir_entity *ent = get_union_member(ty, i);
-
- if (! compute_type_size(get_entity_type(ent)))
- return 0;
- s = get_type_size_bytes(get_entity_type(ent));
-
- set_entity_offset(ent, 0);
- size = (s > size ? s : size);
- }
- set = 1;
- break;
-
- case tpo_array:
- dims = get_array_n_dimensions(ty);
-
- if (! compute_type_size(get_array_element_type(ty)))
- return 0;
-
- size = 1;
-
- save_optimization_state(&state);
- set_optimize(1);
- set_opt_constant_folding(1);
- set_opt_algebraic_simplification(1);
-
- for (i = 0; i < dims; ++i) {
- ir_node *lower = get_array_lower_bound(ty, i);
- ir_node *upper = get_array_upper_bound(ty, i);
- ir_graph *rem = current_ir_graph;
- tarval *tv_lower, *tv_upper;
- long val_lower, val_upper;
-
- current_ir_graph = get_const_code_irg();
- local_optimize_node(lower);
- local_optimize_node(upper);
- current_ir_graph = rem;
-
- tv_lower = computed_value(lower);
- tv_upper = computed_value(upper);
-
- if (tv_lower == tarval_bad || tv_upper == tarval_bad) {
- /*
- * we cannot calculate the size of this array yet, it
- * even might be unknown until the end, like argv[]
- */
- restore_optimization_state(&state);
- return 0;
- }
-
- val_upper = get_tarval_long(tv_upper);
- val_lower = get_tarval_long(tv_lower);
- size *= val_upper - val_lower;
- }
- restore_optimization_state(&state);
-
- DBG(("array %s -> (elements: %d, element type size: %d)\n",
- get_type_name(ty),
- size, get_type_size_bytes(get_array_element_type(ty))));
- size *= get_type_size_bytes(get_array_element_type(ty));
- set = 1;
- break;
-
- default:
- break;
- }
-
- if (set) {
- set_type_size_bytes(ty, size);
- set_type_state(ty, layout_fixed);
- }
-
- DBG(("size: %d\n", get_type_size_bytes(ty)));
-
- return set;
-} /* compute_type_size */
+ optimization_state_t state;
+ unsigned align_all = 1;
+ int n, size = 0, set = 0;
+ int i, dims, s;
+
+ if (get_type_state(ty) == layout_fixed) {
+ /* do not layout already layouted types again */
+ return 1;
+ }
+
+ if (is_Method_type(ty) || ty == get_glob_type()) {
+ /* no need for size calculation for method types or the global type */
+ return 1;
+ }
+
+ DBG(("compute type size visiting: %s\n", get_type_name(ty)));
+
+ switch (get_type_tpop_code(ty)) {
+ case tpo_class:
+ case tpo_struct:
+ for (i = 0, n = get_compound_n_members(ty); i < n; ++i) {
+ ir_entity *ent = get_compound_member(ty, i);
+ ir_type *ent_ty = get_entity_type(ent);
+ unsigned align, misalign;
+
+ /* inner functions do not expand the frame */
+ if (is_Method_type(ent_ty) && is_frame_type(ty))
+ continue;
+
+ /* compute member types */
+ if (! compute_type_size(ent_ty))
+ return 0;
+
+ align = get_type_alignment_bytes(ent_ty);
+ align_all = align > align_all ? align : align_all;
+ misalign = (align ? size % align : 0);
+ size += (misalign ? align - misalign : 0);
+
+ set_entity_offset(ent, size);
+ size += get_type_size_bytes(ent_ty);
+
+ DBG((" member %s %s -> (size: %u, align: %u)\n",
+ get_type_name(ent_ty), get_entity_name(ent),
+ get_type_size_bytes(ent_ty), get_type_alignment_bytes(ent_ty)));
+ }
+ if (align_all > 0 && size % align_all) {
+ DBG(("align of the struct member: %u, type size: %d\n", align_all, size));
+ size += align_all - (size % align_all);
+ DBG(("correcting type-size to %d\n", size));
+ }
+ set_type_alignment_bytes(ty, align_all);
+ set = 1;
+ break;
+
+ case tpo_union:
+ for (i = 0, n = get_union_n_members(ty); i < n; ++i) {
+ ir_entity *ent = get_union_member(ty, i);
+
+ if (! compute_type_size(get_entity_type(ent)))
+ return 0;
+ s = get_type_size_bytes(get_entity_type(ent));
+
+ set_entity_offset(ent, 0);
+ size = (s > size ? s : size);
+ }
+ set = 1;
+ break;
+
+ case tpo_array:
+ dims = get_array_n_dimensions(ty);
+
+ if (! compute_type_size(get_array_element_type(ty)))
+ return 0;
+
+ size = 1;
+
+ save_optimization_state(&state);
+ set_optimize(1);
+ set_opt_constant_folding(1);
+ set_opt_algebraic_simplification(1);
+
+ for (i = 0; i < dims; ++i) {
+ ir_node *lower = get_array_lower_bound(ty, i);
+ ir_node *upper = get_array_upper_bound(ty, i);
+ ir_graph *rem = current_ir_graph;
+ tarval *tv_lower, *tv_upper;
+ long val_lower, val_upper;
+
+ current_ir_graph = get_const_code_irg();
+ local_optimize_node(lower);
+ local_optimize_node(upper);
+ current_ir_graph = rem;
+
+ tv_lower = computed_value(lower);
+ tv_upper = computed_value(upper);
+
+ if (tv_lower == tarval_bad || tv_upper == tarval_bad) {
+ /*
+ * we cannot calculate the size of this array yet, it
+ * even might be unknown until the end, like argv[]
+ */
+ restore_optimization_state(&state);
+ return 0;
+ }
+
+ val_upper = get_tarval_long(tv_upper);
+ val_lower = get_tarval_long(tv_lower);
+ size *= val_upper - val_lower;
+ }
+ restore_optimization_state(&state);
+
+ DBG(("array %s -> (elements: %d, element type size: %d)\n",
+ get_type_name(ty),
+ size, get_type_size_bytes(get_array_element_type(ty))));
+ size *= get_type_size_bytes(get_array_element_type(ty));
+ set = 1;
+ break;
+
+ default:
+ break;
+ }
+
+ if (set) {
+ set_type_size_bytes(ty, size);
+ set_type_state(ty, layout_fixed);
+ }
+
+ DBG(("size: %d\n", get_type_size_bytes(ty)));
+
+ return set;
+}
/**
* layout all non-frame types of the Firm graph
*/
static void compute_type_sizes(void)
{
- int i;
- ir_type *tp;
+ int i;
+ ir_type *tp;
- /* all non-frame other types */
- for (i = get_irp_n_types() - 1; i >= 0; --i) {
- tp = get_irp_type(i);
- compute_type_size(tp);
+ /* all non-frame other types */
+ for (i = get_irp_n_types() - 1; i >= 0; --i) {
+ tp = get_irp_type(i);
+ compute_type_size(tp);
- if (is_Method_type(tp)) {
- tp = get_method_value_res_type(tp);
+ if (is_Method_type(tp)) {
+ tp = get_method_value_res_type(tp);
- if (tp) {
- /* we have a value result type for this method, lower */
- compute_type_size(tp);
- }
- }
- }
-} /* compute_type_sizes */
+ if (tp) {
+ /* we have a value result type for this method, lower */
+ compute_type_size(tp);
+ }
+ }
+ }
+}
/**
* layout all frame-types of the Firm graph
*/
static void compute_frame_type_sizes(void)
{
- int i;
- ir_graph *irg;
-
- /* all frame types */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- irg = get_irp_irg(i);
- /* do not optimize away variables in debug mode */
- if (firm_opt.debug_mode == DBG_MODE_NONE)
- opt_frame_irg(irg);
- compute_type_size(get_irg_frame_type(irg));
- }
-} /* compute_frame_type_sizes */
+ int i;
+ ir_graph *irg;
+
+ /* all frame types */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ irg = get_irp_irg(i);
+ /* do not optimize away variables in debug mode */
+ if (firm_opt.debug_mode == DBG_MODE_NONE)
+ opt_frame_irg(irg);
+ compute_type_size(get_irg_frame_type(irg));
+ }
+}
/**
* do Firm lowering
*/
static void do_firm_lowering(const char *input_filename)
{
- int i;
+ int i;
- do_irp_opt("lower-dw");
+ do_irp_opt("lower-dw");
- if (firm_dump.statistic & STAT_AFTER_LOWER)
- stat_dump_snapshot(input_filename, "low");
+ if (firm_dump.statistic & STAT_AFTER_LOWER)
+ stat_dump_snapshot(input_filename, "low");
- DUMP_ALL(firm_dump.ir_graph, "-low");
+ dump_all("-low");
- if (firm_opt.enabled) {
- timer_start(t_all_opt);
+ if (firm_opt.enabled) {
+ timer_start(t_all_opt);
- /* run reassociation first on all graphs BEFORE the architecture dependent optimizations
- are enabled */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
- do_irg_opt(irg, "reassociation");
- }
+ /* run reassociation first on all graphs BEFORE the architecture
+ dependent optimizations are enabled */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+ do_irg_opt(irg, "reassociation");
+ }
- /* 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) ));
+ /* 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) {
- ir_graph *irg = get_irp_irg(i);
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
- current_ir_graph = irg;
+ current_ir_graph = irg;
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "gcse");
- do_irg_opt(irg, "opt-load-store");
- do_irg_opt(irg, "local");
- do_irg_opt(irg, "control-flow");
+ do_irg_opt(irg, "local");
+ do_irg_opt(irg, "gcse");
+ do_irg_opt(irg, "opt-load-store");
+ 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");
- }
+ 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_irg_opt(irg, "parallelize-mem");
+ }
+ timer_stop(t_all_opt);
- DUMP_ALL(firm_dump.ir_graph, "-low-opt");
- }
+ dump_all("-low-opt");
+ }
- if (firm_opt.cc_opt)
- mark_private_methods();
+ if (firm_opt.cc_opt)
+ mark_private_methods();
- /* set the phase to low */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i)
- set_irg_phase_low(get_irp_irg(i));
+ /* set the phase to low */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i)
+ set_irg_phase_low(get_irp_irg(i));
- /* all graphs are lowered, set the irp phase to low */
- set_irp_phase_state(phase_low);
+ /* all graphs are lowered, set the irp phase to low */
+ set_irp_phase_state(phase_low);
- if (firm_dump.statistic & STAT_FINAL) {
- stat_dump_snapshot(input_filename, "final");
- }
+ if (firm_dump.statistic & STAT_FINAL) {
+ stat_dump_snapshot(input_filename, "final");
+ }
}
/**
*/
void gen_firm_init(void)
{
- firm_parameter_t params;
- unsigned pattern = 0;
- int i;
-
- for (i = 0; i < n_opts; ++i) {
- timers[i] = ir_timer_new();
- timer_register(timers[i], opts[i].description);
- }
- t_verify = ir_timer_new();
- timer_register(t_verify, "Firm: verify pass");
- t_vcg_dump = ir_timer_new();
- timer_register(t_vcg_dump, "Firm: vcg dumping");
- t_all_opt = ir_timer_new();
- timer_register(t_all_opt, "Firm: all optimizations");
-
- if (firm_dump.stat_pattern)
- pattern |= FIRMSTAT_PATTERN_ENABLED;
-
- if (firm_dump.stat_dag)
- pattern |= FIRMSTAT_COUNT_DAG;
-
- memset(¶ms, 0, sizeof(params));
- params.size = sizeof(params);
- params.enable_statistics = firm_dump.statistic == STAT_NONE ? 0 :
- FIRMSTAT_ENABLED | FIRMSTAT_COUNT_STRONG_OP | FIRMSTAT_COUNT_CONSTS | pattern;
- params.initialize_local_func = uninitialized_local_var;
- params.cc_mask = 0; /* no regparam, cdecl */
- params.builtin_dbg = NULL;
-
- ir_init(¶ms);
-
- if (firm_be_opt.selection == BE_FIRM_BE) {
- const backend_params *be_params = be_get_backend_param();
-
- if (be_params->do_dw_lowering)
- set_opt_enabled("lower-dw", true);
-
- arch_create_intrinsic = be_params->arch_create_intrinsic_fkt;
- create_intrinsic_ctx = be_params->create_intrinsic_ctx;
-
- ad_param = be_params->dep_param;
- if_conv_info = be_params->if_conv_info;
- }
-
- dbg_init(NULL, NULL, dbg_snprint);
- edges_init_dbg(firm_opt.vrfy_edges);
-
- /* Sel node cannot produce NULL pointers */
- set_opt_sel_based_null_check_elim(1);
-
- /* dynamic dispatch works currently only if whole world scenarios */
- set_opt_dyn_meth_dispatch(0);
-
- arch_dep_init(arch_factory);
-
- /* do not run architecture dependent optimizations in building phase */
- arch_dep_set_opts(arch_dep_none);
-
- do_node_verification((firm_verification_t) firm_opt.vrfy);
- if (firm_dump.filter)
- only_dump_method_with_name(new_id_from_str(firm_dump.filter));
-
- 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);
- set_opt_control_flow(firm_opt.control_flow);
- set_opt_control_flow_weak_simplification(1);
- set_opt_control_flow_strong_simplification(1);
- } else {
- set_optimize(0);
- }
-
- /* do not dump entity ld names */
- dump_ld_names(0);
+ firm_parameter_t params;
+ unsigned pattern = 0;
+ int i;
+
+ for (i = 0; i < n_opts; ++i) {
+ timers[i] = ir_timer_new();
+ timer_register(timers[i], opts[i].description);
+ }
+ t_verify = ir_timer_new();
+ timer_register(t_verify, "Firm: verify pass");
+ t_vcg_dump = ir_timer_new();
+ timer_register(t_vcg_dump, "Firm: vcg dumping");
+ t_all_opt = ir_timer_new();
+ timer_register(t_all_opt, "Firm: all optimizations");
+
+ if (firm_dump.stat_pattern)
+ pattern |= FIRMSTAT_PATTERN_ENABLED;
+
+ if (firm_dump.stat_dag)
+ pattern |= FIRMSTAT_COUNT_DAG;
+
+ memset(¶ms, 0, sizeof(params));
+ params.size = sizeof(params);
+ params.enable_statistics = firm_dump.statistic == STAT_NONE ? 0 :
+ FIRMSTAT_ENABLED | FIRMSTAT_COUNT_STRONG_OP | FIRMSTAT_COUNT_CONSTS
+ | pattern;
+ params.initialize_local_func = uninitialized_local_var;
+ params.cc_mask = 0; /* no regparam, cdecl */
+ params.builtin_dbg = NULL;
+
+ ir_init(¶ms);
+
+ if (firm_be_opt.selection == BE_FIRM_BE) {
+ const backend_params *be_params = be_get_backend_param();
+
+ if (be_params->do_dw_lowering)
+ set_opt_enabled("lower-dw", true);
+
+ arch_create_intrinsic = be_params->arch_create_intrinsic_fkt;
+ create_intrinsic_ctx = be_params->create_intrinsic_ctx;
+
+ ad_param = be_params->dep_param;
+ if_conv_info = be_params->if_conv_info;
+ }
+
+ dbg_init(NULL, NULL, dbg_snprint);
+ edges_init_dbg(firm_opt.vrfy_edges);
+
+ /* Sel node cannot produce NULL pointers */
+ set_opt_sel_based_null_check_elim(1);
+
+ /* dynamic dispatch works currently only if whole world scenarios */
+ set_opt_dyn_meth_dispatch(0);
+
+ arch_dep_init(arch_factory);
+
+ /* do not run architecture dependent optimizations in building phase */
+ arch_dep_set_opts(arch_dep_none);
+
+ do_node_verification((firm_verification_t) firm_opt.vrfy);
+ if (firm_dump.filter)
+ only_dump_method_with_name(new_id_from_str(firm_dump.filter));
+
+ 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);
+ set_opt_control_flow(firm_opt.control_flow);
+ set_opt_control_flow_weak_simplification(1);
+ set_opt_control_flow_strong_simplification(1);
+ } else {
+ set_optimize(0);
+ }
+
+ /* do not dump entity ld names */
+ dump_ld_names(0);
}
/**
* @param c_mode non-zero if "C" was compiled
* @param new_firm_const_exists non-zero, if the const attribute was used on functions
*/
-void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int new_firm_const_exists)
+void gen_firm_finish(FILE *out, const char *input_filename, int c_mode,
+ int new_firm_const_exists)
{
- int i;
+ 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);
- }
+ 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;
+ firm_const_exists = new_firm_const_exists;
- /* the general for dumping option must be set, or the others will not work */
- firm_dump.ir_graph
- = (a_byte) (firm_dump.ir_graph | firm_dump.all_phases | firm_dump.extbb);
+ /* the general for dumping option must be set, or the others will not work*/
+ firm_dump.ir_graph
+ = (a_byte) (firm_dump.ir_graph | firm_dump.all_phases | firm_dump.extbb);
- dump_keepalive_edges(1);
- dump_consts_local(1);
- dump_dominator_information(1);
- dump_loop_information(0);
+ dump_keepalive_edges(1);
+ dump_consts_local(1);
+ dump_dominator_information(1);
+ dump_loop_information(0);
- if (!firm_dump.edge_labels)
- turn_off_edge_labels();
+ if (!firm_dump.edge_labels)
+ turn_off_edge_labels();
- if (firm_dump.all_types) {
- dump_all_types("");
- if (! c_mode) {
- dump_class_hierarchy(0, "");
- dump_class_hierarchy(1, "-with-entities");
- }
- }
+ if (firm_dump.all_types) {
+ dump_all_types("");
+ if (! c_mode) {
+ dump_class_hierarchy(0, "");
+ dump_class_hierarchy(1, "-with-entities");
+ }
+ }
- /* finalize all graphs */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
+ /* finalize all graphs */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
- irg_finalize_cons(irg);
- DUMP_ONE(firm_dump.ir_graph, irg, "");
- }
+ irg_finalize_cons(irg);
+ if (firm_dump.ir_graph) {
+ dump_graph_count(irg, "");
+ }
+ }
- timer_push(t_verify);
- tr_vrfy();
- timer_pop(t_verify);
+ timer_push(t_verify);
+ tr_vrfy();
+ timer_pop(t_verify);
- /* all graphs are finalized, set the irp phase to high */
- set_irp_phase_state(phase_high);
+ /* all graphs are finalized, set the irp phase to high */
+ set_irp_phase_state(phase_high);
- /* BEWARE: kill unreachable code before doing compound lowering */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
- do_irg_opt(irg, "control-flow");
- }
+ /* BEWARE: kill unreachable code before doing compound lowering */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+ do_irg_opt(irg, "control-flow");
+ }
- /* lower all compound call return values */
- lower_compound_params();
+ /* lower all compound call return values */
+ lower_compound_params();
- /* computes the sizes of all types that are still not computed */
- compute_type_sizes();
+ /* computes the sizes of all types that are still not computed */
+ compute_type_sizes();
- /* lower copyb nodes */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
- ir_graph *irg = get_irp_irg(i);
- lower_CopyB(irg, 128, 4);
- }
+ /* lower copyb nodes */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ ir_graph *irg = get_irp_irg(i);
+ lower_CopyB(irg, 128, 4);
+ }
- if (firm_dump.statistic & STAT_BEFORE_OPT) {
- stat_dump_snapshot(input_filename, "noopt");
- }
+ if (firm_dump.statistic & STAT_BEFORE_OPT) {
+ stat_dump_snapshot(input_filename, "noopt");
+ }
- if (firm_opt.enabled)
- do_firm_optimizations(input_filename);
+ if (firm_opt.enabled)
+ do_firm_optimizations(input_filename);
- if (firm_dump.gen_firm_asm) {
- ir_timer_t *timer = ir_timer_new();
- timer_register(timer, "Firm: Firm assembler");
- timer_push(timer);
- gen_Firm_assembler(input_filename);
- timer_pop(timer);
- return;
- }
+ if (firm_dump.gen_firm_asm) {
+ ir_timer_t *timer = ir_timer_new();
+ timer_register(timer, "Firm: Firm assembler");
+ timer_push(timer);
+ gen_Firm_assembler(input_filename);
+ timer_pop(timer);
+ return;
+ }
- if (firm_opt.lower)
- do_firm_lowering(input_filename);
+ if (firm_opt.lower)
+ do_firm_lowering(input_filename);
- /* computes the sizes of all frame types */
- compute_frame_type_sizes();
+ /* computes the sizes of all frame types */
+ compute_frame_type_sizes();
- /* set the phase to low */
- for (i = get_irp_n_irgs() - 1; i >= 0; --i)
- set_irg_phase_low(get_irp_irg(i));
+ /* set the phase to low */
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i)
+ set_irg_phase_low(get_irp_irg(i));
- if (firm_dump.statistic & STAT_FINAL_IR)
- stat_dump_snapshot(input_filename, "final-ir");
+ if (firm_dump.statistic & STAT_FINAL_IR)
+ stat_dump_snapshot(input_filename, "final-ir");
- /* run the code generator */
- if (firm_be_opt.selection != BE_NONE)
- do_codegen(out, input_filename);
+ /* run the code generator */
+ if (firm_be_opt.selection != BE_NONE)
+ do_codegen(out, input_filename);
- if (firm_dump.statistic & STAT_FINAL)
- stat_dump_snapshot(input_filename, "final");
+ if (firm_dump.statistic & STAT_FINAL)
+ stat_dump_snapshot(input_filename, "final");
}
int firm_opt_option(const char *opt)
*/
void firm_early_init(void)
{
- /* arg: need this here for command line options */
- be_opt_register();
+ /* arg: need this here for command line options */
+ be_opt_register();
- enable_safe_defaults();
+ enable_safe_defaults();
}