Another variant without index, but shifts with different modes.
[libfirm] / ir / ana / height.c
index 2b35665..f7a813a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -52,9 +52,10 @@ typedef struct {
        unsigned visited;
 } irn_height_t;
 
-static void *irn_height_init(ir_phase *ph, ir_node *irn, void *data)
+static void *irn_height_init(ir_phase *ph, const ir_node *irn, void *data)
 {
        irn_height_t *h = data ? data : phase_alloc(ph, sizeof(h[0]));
+       (void)irn;
        memset(h, 0, sizeof(h[0]));
        return h;
 }
@@ -85,9 +86,11 @@ static int search(heights_t *h, const ir_node *curr, const ir_node *tgt)
        if(curr == tgt)
                return 1;
 
-       /* If we are in another block we won't find our target. */
+       /* If we are in another block or at a phi we won't find our target. */
        if(get_nodes_block(curr) != get_nodes_block(tgt))
                return 0;
+       if(is_Phi(curr))
+               return 0;
 
        /* Check, if we have already been here. Coming more often won't help :-) */
        h_curr = phase_get_irn_data(&h->ph, curr);
@@ -154,7 +157,7 @@ static unsigned compute_height(heights_t *h, ir_node *irn, const ir_node *bl)
        foreach_out_edge(irn, edge) {
                ir_node *dep = get_edge_src_irn(edge);
 
-               if(!is_Block(dep) && get_nodes_block(dep) == bl) {
+               if(!is_Block(dep) && !is_Phi(dep) && get_nodes_block(dep) == bl) {
                        unsigned dep_height = compute_height(h, dep, bl);
                        ih->height          = MAX(ih->height, dep_height);
                }
@@ -165,6 +168,7 @@ static unsigned compute_height(heights_t *h, ir_node *irn, const ir_node *bl)
        foreach_out_edge_kind(irn, edge, EDGE_KIND_DEP) {
                ir_node *dep = get_edge_src_irn(edge);
 
+               assert(!is_Phi(dep));
                if(!is_Block(dep) && get_nodes_block(dep) == bl) {
                        unsigned dep_height = compute_height(h, dep, bl);
                        ih->height          = MAX(ih->height, dep_height);