From: Matthias Braun Date: Thu, 1 Mar 2012 14:49:11 +0000 (+0100) Subject: fix -O0 still performing local optimizations X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=afeb51a5d52a914105614beb8267921c9c67c658;p=cparser fix -O0 still performing local optimizations --- diff --git a/ast2firm.c b/ast2firm.c index 9fe1701..91ece40 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -3005,6 +3005,10 @@ static ir_tarval *fold_constant_to_tarval(const expression_t *expression) bool constant_folding_old = constant_folding; constant_folding = true; + int old_optimize = get_optimize(); + int old_constant_folding = get_opt_constant_folding(); + set_optimize(1); + set_opt_constant_folding(1); init_ir_types(); @@ -3015,6 +3019,8 @@ static ir_tarval *fold_constant_to_tarval(const expression_t *expression) ir_node *cnst = expression_to_firm(expression); current_ir_graph = old_current_ir_graph; + set_optimize(old_optimize); + set_opt_constant_folding(old_constant_folding); if (!is_Const(cnst)) { panic("couldn't fold constant"); diff --git a/driver/firm_opt.c b/driver/firm_opt.c index ada3dda..defb7aa 100644 --- a/driver/firm_opt.c +++ b/driver/firm_opt.c @@ -756,12 +756,9 @@ void generate_code(FILE *out, const char *input_filename) { int i; - 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); - + /* initialize implicit opts, just to be sure because really the frontend + * should have called it already before starting graph construction */ + init_implicit_optimizations(); init_statistics(); do_node_verification((firm_verification_t) firm_opt.verify); @@ -833,6 +830,7 @@ static void disable_all_opts(void) firm_opt.alias_analysis = false; firm_opt.strict_alias = false; firm_opt.no_alias = false; + firm_opt.const_folding = false; FOR_EACH_OPT(config) { if (config->flags & OPT_FLAG_ESSENTIAL) { @@ -965,3 +963,12 @@ void choose_optimization_pack(int level) break; } } + +void init_implicit_optimizations(void) +{ + 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); +} diff --git a/driver/firm_opt.h b/driver/firm_opt.h index b2614ea..90938cf 100644 --- a/driver/firm_opt.h +++ b/driver/firm_opt.h @@ -118,4 +118,10 @@ void firm_option_help(print_option_help_func func); * switches) */ void choose_optimization_pack(int level); +/** + * Initialize implicit optimization settings in firm. Frontends should call this + * before starting graph construction + */ +void init_implicit_optimizations(void); + #endif diff --git a/libfirm b/libfirm index 332cda9..63ad747 160000 --- a/libfirm +++ b/libfirm @@ -1 +1 @@ -Subproject commit 332cda9a138297c9852e2ef0f649c92b640723f4 +Subproject commit 63ad74726b302ee843058f6c7d3e14f690415fb3 diff --git a/main.c b/main.c index f8e8c92..0c9b854 100644 --- a/main.c +++ b/main.c @@ -1903,6 +1903,7 @@ do_parsing: if (already_constructed_firm) { panic("compiling multiple files/translation units not possible"); } + init_implicit_optimizations(); translation_unit_to_firm(unit); already_constructed_firm = true; timer_pop(t_construct);