local_optimize() now kills unrteachable code if dominance info is available.
[libfirm] / ir / ir / ircgcons.c
index 6644b0c..78df170 100644 (file)
@@ -29,7 +29,7 @@
 #include "irgmod.h"
 #include "irgwalk.h"
 #include "irflag_t.h"
-
+#include "irtools.h"
 
 /* Return the current state of the interprocedural view. */
 ip_view_state get_irp_ip_view_state(void) {
@@ -56,8 +56,8 @@ typedef struct {
 } irg_data_t;
 
 static irg_data_t * irg_data_create(void) {
-  irg_data_t * data = xmalloc(sizeof(irg_data_t));
-  memset(data, 0, sizeof(irg_data_t)); /* init */
+  irg_data_t *data = xmalloc(sizeof(*data));
+  memset(data, 0, sizeof(*data)); /* init */
   return data;
 }
 
@@ -99,11 +99,6 @@ static void caller_init(int arr_length, entity ** free_methods) {
   }
 }
 
-
-static INLINE void clear_link(ir_node * node, void * env) {
-  set_irn_link(node, NULL);
-}
-
 /*
 static INLINE ir_node * tail(ir_node * node) {
   ir_node * link;
@@ -167,7 +162,7 @@ static void collect_phicallproj(void) {
     link(start, get_irg_frame(irg));
     link(start, get_irg_globals(irg));
     /* walk */
-    irg_walk_graph(irg, clear_link, (irg_walk_func *) collect_phicallproj_walker, &end);
+    irg_walk_graph(irg, firm_clear_link, (irg_walk_func *) collect_phicallproj_walker, &end);
   }
 }
 
@@ -860,7 +855,9 @@ void cg_construct(int arr_len, entity ** free_methods_arr) {
 static void destruct_walker(ir_node * node, void * env) {
   if (get_irn_op(node) == op_Block) {
     remove_Block_cg_cfgpred_arr(node);
-    /* Do not turn Break into Jmp.  Better: merge blocks right away. */
+    /* Do not turn Break into Jmp.  Better: merge blocks right away.
+       Well, but there are Breaks left.
+       See exc1 from ajacs-rts/Exceptions.java.  */
     if (get_Block_n_cfgpreds(node) == 1) {
       ir_node *pred = get_Block_cfgpred(node, 0);
       if (get_irn_op(pred) == op_Break)
@@ -870,8 +867,8 @@ static void destruct_walker(ir_node * node, void * env) {
     set_irg_current_block(current_ir_graph, get_nodes_block(node));
     exchange(node, new_Proj(get_Filter_pred(node), get_irn_mode(node), get_Filter_proj(node)));
   } else if (get_irn_op(node) == op_Break) {
-    //set_irg_current_block(current_ir_graph, get_nodes_block(node));
-    //exchange(node, new_Jmp());
+    set_irg_current_block(current_ir_graph, get_nodes_block(node));
+    exchange(node, new_Jmp());
   } else if (get_irn_op(node) == op_Call) {
     remove_Call_callee_arr(node);
   } else if (get_irn_op(node) == op_Proj) {
@@ -886,14 +883,17 @@ void cg_destruct(void) {
   if (get_irp_ip_view_state() != ip_view_no) {
     for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
       ir_graph * irg = get_irp_irg(i);
-      irg_walk_graph(irg, destruct_walker, clear_link, NULL);
-      set_irg_frame(irg, skip_Id(get_irg_frame(irg)));
-      set_irg_globals(irg, skip_Id(get_irg_globals(irg)));
+      irg_walk_graph(irg, destruct_walker, firm_clear_link, NULL);
+
+      set_irg_frame      (irg, skip_Id(get_irg_frame(irg)));
+      set_irg_globals    (irg, skip_Id(get_irg_globals(irg)));
       set_irg_initial_mem(irg, skip_Id(get_irg_initial_mem(irg)));
+      set_irg_end_reg    (irg, get_irg_end(irg));
+      set_irg_end_except (irg, get_irg_end(irg));
+
       set_irg_callee_info_state(irg, irg_callee_info_none);
-      set_irg_end_reg(irg, get_irg_end(irg));
-      set_irg_end_except(irg, get_irg_end(irg));
     }
+
     set_irp_ip_view(ip_view_no);
   }
 }