X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fheight.c;h=f7a813a35e5bb2d0acbaa3caf834c50b1b6efce7;hb=7e8388fa7996ff182d3aa4e0cdd41b27bed4982f;hp=94142ada0b7c69cf2c1889bdb5c01c60b9f80f97;hpb=b16a398e4144b5285342ca15104e88452a28a7ac;p=libfirm diff --git a/ir/ana/height.c b/ir/ana/height.c index 94142ada0..f7a813a35 100644 --- a/ir/ana/height.c +++ b/ir/ana/height.c @@ -1,15 +1,33 @@ /* - * Project: libFIRM - * File name: ir/ana/height.c - * Purpose: Compute heights of nodes inside basic blocks - * Author: Sebastian Hack - * Modified by: - * Created: 19.04.2006 - * CVS-ID: $Id$ - * Copyright: (c) 2006 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. */ +/** + * @file + * @brief Compute heights of nodes inside basic blocks + * @author Sebastian Hack + * @date 19.04.2006 + * @version $Id$ + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include @@ -24,7 +42,7 @@ typedef struct _heights_t heights_t; struct _heights_t { - phase_t ph; + ir_phase ph; unsigned visited; void *dump_handle; }; @@ -34,9 +52,10 @@ typedef struct { unsigned visited; } irn_height_t; -static void *irn_height_init(phase_t *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; } @@ -67,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); @@ -136,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); } @@ -147,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); @@ -224,7 +246,7 @@ void heights_recompute(heights_t *h) heights_t *heights_new(ir_graph *irg) { heights_t *res = xmalloc(sizeof(res[0])); - phase_init(&res->ph, "heights", irg, PHASE_DEFAULT_GROWTH, irn_height_init); + phase_init(&res->ph, "heights", irg, PHASE_DEFAULT_GROWTH, irn_height_init, NULL); res->dump_handle = dump_add_node_info_callback(height_dump_cb, res); heights_recompute(res);