X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fircfscc.c;h=889e3c5d482fa8cda30edaa821dcc0657c7627c3;hb=3d306914ac98469e3d43b59de125efe64ddea8a5;hp=4b60116d5ebab277fac2e54b6da7c8a248c82529;hpb=3245e882cc975385e090d2c36d8a2aae198452e2;p=libfirm diff --git a/ir/ana/ircfscc.c b/ir/ana/ircfscc.c index 4b60116d5..889e3c5d4 100644 --- a/ir/ana/ircfscc.c +++ b/ir/ana/ircfscc.c @@ -1,18 +1,31 @@ /* - * Project: libFIRM - * File name: ir/ana/irscc.c - * Purpose: Compute the strongly connected regions and build - * backedge/cfloop datastructures. - * A variation on the Tarjan algorithm. See also [Trapp:99], - * Chapter 5.2.1.2. - * Author: Goetz Lindenmaier - * Modified by: - * Created: 7.2002 - * CVS-ID: $Id$ - * Copyright: (c) 2002-2003 Universität Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2007 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 the strongly connected regions and build backedge/cfloop + * datastructures. A variation on the Tarjan algorithm. See also + * [Trapp:99], Chapter 5.2.1.2. + * @author Goetz Lindenmaier + * @date 7.2002 + * @version $Id$ + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -59,7 +72,7 @@ void link_to_reg_end (ir_node *n, void *env); * construction. */ typedef struct scc_info { - bool in_stack; /**< Marks whether node is on the stack. */ + int in_stack; /**< Marks whether node is on the stack. */ int dfn; /**< Depth first search number. */ int uplink; /**< dfn number of ancestor. */ } scc_info; @@ -77,7 +90,7 @@ static INLINE scc_info *new_scc_info(void) { static INLINE void mark_irn_in_stack (ir_node *n) { scc_info *info = get_irn_link(n); - info->in_stack = true; + info->in_stack = 1; } /** @@ -86,13 +99,13 @@ mark_irn_in_stack (ir_node *n) { static INLINE void mark_irn_not_in_stack (ir_node *n) { scc_info *info = get_irn_link(n); - info->in_stack = false; + info->in_stack = 0; } /** * Returns whether node n is on the stack. */ -static INLINE bool +static INLINE int irn_is_in_stack (ir_node *n) { scc_info *info = get_irn_link(n); return info->in_stack; @@ -291,7 +304,9 @@ static ir_loop *new_loop (void) { * Called from a walker. */ static INLINE void -init_node (ir_node *n, void *env) { +init_node (ir_node *n, void *env) +{ + (void) env; if (is_Block(n)) set_irn_link (n, new_scc_info()); clear_backedges(n); @@ -309,6 +324,7 @@ init_scc_common (void) { /** * Initializes the scc algorithm for the intraprocedural case. + * Add scc info to every block node. */ static INLINE void init_scc (ir_graph *irg) { @@ -333,25 +349,25 @@ init_ip_scc (void) { * Condition for breaking the recursion: n is the block * that gets the initial control flow from the Start node. */ -static bool is_outermost_StartBlock(ir_node *n) { +static int is_outermost_StartBlock(ir_node *n) { /* Test whether this is the outermost Start node. If so recursion must end. */ assert(is_Block(n)); if ((get_Block_n_cfgpreds(n) == 1) && (get_irn_op(skip_Proj(get_Block_cfgpred(n, 0))) == op_Start) && (get_nodes_block(skip_Proj(get_Block_cfgpred(n, 0))) == n)) { - return true; + return 1; } - return false; + return 0; } -/** Returns true if n is a loop header, i.e., it is a Block node +/** Returns non-zero if n is a loop header, i.e., it is a Block node * and has predecessors within the cfloop and out of the cfloop. * * @param n the block node to check * @param root only needed for assertion. */ -static bool +static int is_head (ir_node *n, ir_node *root) { int i, arity; @@ -368,7 +384,6 @@ is_head (ir_node *n, ir_node *root) some_outof_loop = 1; } else { if (get_irn_uplink(pred) < get_irn_uplink(root)) { - DDMN(pred); DDMN(root); assert(get_irn_uplink(pred) >= get_irn_uplink(root)); } some_in_loop = 1; @@ -380,14 +395,14 @@ is_head (ir_node *n, ir_node *root) /** - * Returns true if n is possible loop head of an endless loop. + * Returns non-zero if n is possible loop head of an endless loop. * I.e., it is a Block, Phi or Filter node and has only predecessors * within the loop. * * @param n the block node to check * @param root only needed for assertion. */ -static bool +static int is_endless_head (ir_node *n, ir_node *root) { int i, arity; @@ -405,7 +420,6 @@ is_endless_head (ir_node *n, ir_node *root) some_outof_loop = 1; //printf(" some out of loop "); } else { if(get_irn_uplink(pred) < get_irn_uplink(root)) { - DDMN(pred); DDMN(root); assert(get_irn_uplink(pred) >= get_irn_uplink(root)); } some_in_loop = 1; @@ -696,7 +710,7 @@ int construct_ip_cf_backedges (void) { current_loop = NULL; new_loop(); /* sets current_loop */ - set_interprocedural_view(true); + set_interprocedural_view(1); inc_max_irg_visited(); for (i = 0; i < get_irp_n_irgs(); i++) @@ -763,9 +777,9 @@ static void reset_backedges(ir_node *block) { int rem = get_interprocedural_view(); assert(is_Block(block)); - set_interprocedural_view(true); + set_interprocedural_view(1); clear_backedges(block); - set_interprocedural_view(false); + set_interprocedural_view(0); clear_backedges(block); set_interprocedural_view(rem); } @@ -791,7 +805,7 @@ void free_cfloop_information(ir_graph *irg) { if (get_irg_loop(irg)) loop_reset_backedges(get_irg_loop(irg)); set_irg_loop(irg, NULL); - set_irg_loopinfo_state(current_ir_graph, loopinfo_none); + set_irg_loopinfo_state(irg, loopinfo_none); /* We cannot free the cfloop nodes, they are on the obstack. */ } @@ -799,8 +813,8 @@ void free_cfloop_information(ir_graph *irg) { void free_all_cfloop_information (void) { int i; int rem = get_interprocedural_view(); - set_interprocedural_view(true); /* To visit all filter nodes */ - for (i = 0; i < get_irp_n_irgs(); i++) { + set_interprocedural_view(1); /* To visit all filter nodes */ + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { free_cfloop_information(get_irp_irg(i)); } set_interprocedural_view(rem);