some more testcases I had lying around here
[cparser] / driver / firm_opt.c
index b234948..bacf110 100644 (file)
@@ -143,7 +143,6 @@ static void rts_map(void) {
   } mapper[] = {
     /* integer */
     { &rts_entities[rts_abs],     i_mapper_abs },
-       { &rts_entities[rts_alloca],  i_mapper_alloca },
     { &rts_entities[rts_labs],    i_mapper_abs },
     { &rts_entities[rts_llabs],   i_mapper_abs },
     { &rts_entities[rts_imaxabs], i_mapper_abs },
@@ -221,7 +220,7 @@ static void rts_map(void) {
   i_record rec[sizeof(mapper)/sizeof(mapper[0])];
   unsigned i, n_map;
 
-  for (i = n_map = 0; i < sizeof(mapper)/sizeof(mapper[0]); ++i) {
+  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;
@@ -229,8 +228,7 @@ static void rts_map(void) {
       rec[n_map].i_call.ctx      = NULL;
       rec[n_map].i_call.link     = NULL;
       ++n_map;
-    }  /* if */
-  }
+  }  /* if */
   if (n_map > 0)
     lower_intrinsics(rec, n_map, /* part_block_used=*/0);
 }  /* rts_map */
@@ -392,7 +390,7 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
     compute_doms(irg);
     CHECK_ONE(firm_opt.check_all, irg);
 
-    if (firm_opt.code_place) {
+    if (firm_opt.gcse) {
       timer_push(TV_CODE_PLACE);
         set_opt_global_cse(1);
         optimize_graph_df(irg);
@@ -437,14 +435,6 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
     DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
     CHECK_ONE(firm_opt.check_all, irg);
 
-    irg_verify(irg, VRFY_ENFORCE_SSA);
-    if (firm_opt.gvn_pre) {
-      do_gvn_pre(irg);
-      DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "pre");
-      CHECK_ONE(firm_opt.check_all, irg);
-      irg_verify(irg, VRFY_ENFORCE_SSA);
-    }
-
     if (firm_opt.load_store) {
       timer_push(TV_LOAD_STORE);
         optimize_load_store(irg);
@@ -478,6 +468,22 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
       timer_pop();
     }
 
+    if (firm_opt.gvn_pre) {
+      do_gvn_pre(irg);
+      DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "pre");
+      CHECK_ONE(firm_opt.check_all, irg);
+      irg_verify(irg, VRFY_ENFORCE_SSA);
+    }
+
+    if (! firm_opt.gcse) {
+      timer_push(TV_CODE_PLACE);
+        optimize_graph_df(irg);
+        place_code(irg);
+      timer_pop();
+      DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "place");
+      CHECK_ONE(firm_opt.check_all, irg);
+    }
+
     compute_doms(irg);
     compute_postdoms(irg);
     DUMP_ONE_CFG_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "dom");
@@ -561,15 +567,25 @@ static void do_firm_optimizations(const char *input_filename, int firm_const_exi
       timer_pop();
       DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cond_eval");
       CHECK_ONE(firm_opt.check_all, irg);
-
-      timer_push(TV_CF_OPT);
-        optimize_cf(irg);
-      timer_pop();
-      DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
-      CHECK_ONE(firm_opt.check_all, irg);
     }
   }
 
+  /* final run of local optimizations */
+  for (i = 0; i < get_irp_n_irgs(); i++) {
+    irg = get_irp_irg(i);
+    timer_push(TV_LOCAL_OPT);
+      optimize_graph_df(irg);
+    timer_pop();
+    DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "local_opt");
+    CHECK_ONE(firm_opt.check_all, irg);
+
+    timer_push(TV_CF_OPT);
+      optimize_cf(irg);
+    timer_pop();
+    DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, irg, "cfopt");
+    CHECK_ONE(firm_opt.check_all, irg);
+  }
+
   if (firm_dump.ir_graph) {
     /* recompute backedges for nicer dumps */
     for (i = 0; i < get_irp_n_irgs(); i++)
@@ -688,6 +704,7 @@ static int compute_type_size(ir_type *ty)
     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);
@@ -855,17 +872,17 @@ static void do_firm_lowering(const char *input_filename)
     for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
       current_ir_graph = get_irp_irg(i);
 
-      if (firm_opt.code_place)
+      if (firm_opt.gcse)
         set_opt_global_cse(1);
 
       timer_push(TV_LOCAL_OPT);
         optimize_graph_df(current_ir_graph);
       timer_pop();
       DUMP_ONE_C(firm_dump.ir_graph && firm_dump.all_phases, current_ir_graph, "lopt");
-      if (! firm_opt.code_place)
+      if (! firm_opt.gcse)
         CHECK_ONE(firm_opt.check_all, current_ir_graph);
 
-      if (firm_opt.code_place) {
+      if (firm_opt.gcse) {
         timer_push(TV_CODE_PLACE);
           place_code(current_ir_graph);
           set_opt_global_cse(0);
@@ -935,7 +952,6 @@ static void do_firm_lowering(const char *input_filename)
 void gen_firm_init(void)
 {
   firm_parameter_t params;
-  char             *dump_filter;
   unsigned         pattern = 0;
 
   /* the automatic state is only set if inlining is enabled */
@@ -979,6 +995,19 @@ void gen_firm_init(void)
     if (be_params->has_imm_fp_mode)
       firm_imm_fp_mode = be_params->imm_fp_mode;
   }
+  /* OS option must be set to the backend */
+  switch (firm_opt.os_support) {
+  case OS_SUPPORT_MINGW:
+    firm_be_option("ia32-gasmode=mingw");
+    break;
+  case OS_SUPPORT_MACHO:
+    firm_be_option("ia32-gasmode=macho");
+    break;
+  case OS_SUPPORT_LINUX:
+  default:
+    firm_be_option("ia32-gasmode=linux");
+    break;
+  }
 
   dbg_init(NULL, NULL, dbg_snprint);
   edges_init_dbg(firm_opt.vrfy_edges);
@@ -1005,19 +1034,16 @@ void gen_firm_init(void)
   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_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
+  } else {
     set_optimize(0);
-
-  dump_filter = getenv("FIRM_DUMP_FILTER");
-  if (dump_filter)
-    only_dump_method_with_name(new_id_from_str(dump_filter));
+  }
 
   /* do not dump entity ld names */
   dump_ld_names(0);