__attribute__((sentinel)) is first available in GCC 4.
[cparser] / driver / firm_opt.c
index 4d4e90c..1314336 100644 (file)
 #include "firm_cmdline.h"
 #include "firm_timing.h"
 
+#ifdef _WIN32
+#define snprintf _snprintf
+#endif
+
 #if defined(_DEBUG) || defined(FIRM_DEBUG)
 #define DBG(x)  dbg_printf x
 #else
@@ -352,6 +356,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
     CHECK_ALL(firm_opt.check_all);
   }
 
+  /* do lowering on the const code irg */
   lower_const_code();
 
   for (i = 0; i < get_irp_n_irgs(); i++) {
@@ -359,9 +364,9 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
 
 
 #ifdef FIRM_EXT_GRS
-    /* If SIMD optimization is on, make sure we have only 1 return */
-    if (firm_ext_grs.create_pattern || firm_ext_grs.simd_opt)
-         normalize_one_return(irg);
+  /* If SIMD optimization is on, make sure we have only 1 return */
+  if (firm_ext_grs.create_pattern || firm_ext_grs.simd_opt)
+    normalize_one_return(irg);
 #endif
 
 
@@ -452,14 +457,6 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
       irg_verify(irg, VRFY_ENFORCE_SSA);
     }
 
-    if (firm_opt.loop_unrolling) {
-      timer_push(TV_LOOP_UNROLL);
-        optimize_loop_unrolling(irg);
-      timer_pop();
-      DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "loop");
-      CHECK_ONE(firm_opt.check_all, irg);
-       }
-
     if (firm_opt.load_store) {
       timer_push(TV_LOAD_STORE);
         optimize_load_store(irg);
@@ -523,7 +520,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
     }
 
     timer_push(TV_OSR);
-      opt_osr(current_ir_graph, osr_flag_default /*| osr_flag_ignore_x86_shift*/);
+      opt_osr(current_ir_graph, osr_flag_default | osr_flag_keep_reg_pressure | osr_flag_ignore_x86_shift);
     timer_pop();
     DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "stred");
     CHECK_ONE(firm_opt.check_all, irg);
@@ -717,24 +714,14 @@ static int compute_type_size(ir_type *ty)
 }  /* compute_type_size */
 
 /**
- * layout all types of the Firm graph
+ * layout all non-frame types of the Firm graph
  */
 static void compute_type_sizes(void)
 {
   int i;
   ir_type *tp;
-  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));
-  }
-
-  /* all other types */
+  /* all non-frame other types */
   for (i = get_irp_n_types() - 1; i >= 0; --i) {
     tp = get_irp_type(i);
     compute_type_size(tp);
@@ -750,6 +737,24 @@ static void compute_type_sizes(void)
   }
 }  /* compute_type_sizes */
 
+/**
+ * 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 */
+
 /**
  * do Firm lowering
  *
@@ -949,6 +954,9 @@ void gen_firm_init(void)
   set_opt_precise_exc_context(firm_opt.precise_exc);
   set_opt_fragile_ops(firm_opt.fragile_ops);
 
+  /* 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);
 
@@ -1047,6 +1055,12 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm
   /* 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);
+  }
+
   if (firm_dump.statistic & STAT_BEFORE_OPT) {
     stat_dump_snapshot(input_filename, "noopt");
   }
@@ -1064,6 +1078,9 @@ void gen_firm_finish(FILE *out, const char *input_filename, int c_mode, int firm
   if (firm_opt.lower)
     do_firm_lowering(input_filename);
 
+  /* 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));