wtf?
[libfirm] / ir / ana / irdom.c
index 8be3bc0..9ff0b12 100644 (file)
 #include "irdom_t.h"
 #include "irgraph_t.h"   /* To access state field. */
 #include "irnode_t.h"
+#include "ircons_t.h"
 
-/**********************************************************************/
+/*--------------------------------------------------------------------*/
 /** Accessing the dominator data structures                          **/
-/**********************************************************************/
+/*--------------------------------------------------------------------*/
 
 ir_node *get_Block_idom(ir_node *bl) {
   assert(get_irn_op(bl) == op_Block);
+  if (get_Block_dom_depth(bl) == -1) {
+    /* This block is not reachable from Start */
+    return new_Bad();
+  }
   return bl->attr.block.dom.idom;
 }
 
@@ -57,23 +62,9 @@ void set_Block_dom_depth(ir_node *bl, int depth) {
 
 
 
-/**********************************************************************/
-/** Building and Removing the dominator datasturcture                **/
-/**                                                                  **/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/** .**/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/**  **/
-/**********************************************************************/
+/*--------------------------------------------------------------------*/
+/*  Building and Removing the dominator datastructure                 */
+/*--------------------------------------------------------------------*/
 
 static void count_and_init_blocks(ir_node *bl, void *env) {
   int *n_blocks = (int *) env;
@@ -213,12 +204,13 @@ void compute_doms(ir_graph *irg) {
     tmp_dom_info *v;
 
     /* Step 2 */
-    irn_arity = intern_get_irn_arity(w->block);
+    irn_arity = get_irn_arity(w->block);
     for (j = 0;  j < irn_arity;  j++) {
-      ir_node *pred = get_nodes_Block(get_Block_cfgpred(w->block, j));
+      ir_node *cf_op = get_Block_cfgpred(w->block, j);
+      ir_node *pred  = get_nodes_block(cf_op);
       tmp_dom_info *u;
 
-      if ((is_Bad(get_Block_cfgpred(w->block, j))) ||
+      if ((is_Bad(cf_op)) || (is_Bad(pred)) ||
          (get_Block_pre_num (pred) == -1))
        continue;       /* control-dead */
 
@@ -267,7 +259,7 @@ void compute_doms(ir_graph *irg) {
 void free_dom_and_peace(ir_graph *irg) {
   /* Update graph state */
   assert(get_irg_phase_state(current_ir_graph) != phase_building);
-  current_ir_graph->dom_state = no_dom;
+  current_ir_graph->dom_state = dom_none;
 
   /* With the implementation right now there is nothing to free,
      but better call it anyways... */