fix -O0 still performing local optimizations
authorMatthias Braun <matthias.braun@kit.edu>
Thu, 1 Mar 2012 14:49:11 +0000 (15:49 +0100)
committerMatthias Braun <matthias.braun@kit.edu>
Thu, 1 Mar 2012 14:49:11 +0000 (15:49 +0100)
ast2firm.c
driver/firm_opt.c
driver/firm_opt.h
libfirm
main.c

index 9fe1701..91ece40 100644 (file)
@@ -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");
index ada3dda..defb7aa 100644 (file)
@@ -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);
+}
index b2614ea..90938cf 100644 (file)
@@ -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 (submodule)
--- a/libfirm
+++ b/libfirm
@@ -1 +1 @@
-Subproject commit 332cda9a138297c9852e2ef0f649c92b640723f4
+Subproject commit 63ad74726b302ee843058f6c7d3e14f690415fb3
diff --git a/main.c b/main.c
index f8e8c92..0c9b854 100644 (file)
--- 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);