X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firouts.c;h=3ebce10d3a640b4590141a6de320f082098e8692;hb=4bad1346ff2abc3923beea23e5ac949acc7ca514;hp=2a3b7a00d95e18b64173761f84f65988c00f3d5f;hpb=001f2dd9cd7b5c492a14728435b1ed96bd89bc0d;p=libfirm diff --git a/ir/ana/irouts.c b/ir/ana/irouts.c index 2a3b7a00d..3ebce10d3 100644 --- a/ir/ana/irouts.c +++ b/ir/ana/irouts.c @@ -10,29 +10,29 @@ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ + /** + * @file irouts.c Compute out edges for ir nodes (also called def-use edges). + * + * Copyright (C) 2002 by Universitaet Karlsruhe + * All rights reserved. + * + * Authors: Goetz Lindenmaier + */ - - /* Copyright (C) 2002 by Universitaet Karlsruhe -* All rights reserved. -* -* Authors: Goetz Lindenmaier -* -* irouts.c --- Compute out edges for ir nodes (also called def-use -* edges). -* -*/ - -/* $Id$ */ #ifdef HAVE_CONFIG_H #include "config.h" -#endif /* defined HAVE_CONFIG_H */ +#endif + +#ifdef HAVE_STRING_H +#include +#endif +#include "xmalloc.h" #include "irouts.h" #include "irnode_t.h" #include "irgraph_t.h" #include "irprog_t.h" #include "irgwalk.h" -#include "string.h" #ifdef DEBUG_libfirm /* Note: ir_node.out_valid and ir_graph.n_outs are only present when DEBUG_libfirm is defined */ @@ -40,10 +40,11 @@ when compiling with neither DEBUG_libfirm or NDEBUG defined */ #endif /* defined DEBUG_libfirm */ -/**********************************************************************/ +/*--------------------------------------------------------------------*/ /** Accessing the out datastructures **/ -/**********************************************************************/ +/*--------------------------------------------------------------------*/ +/** Clear the outs of a node */ static void reset_outs (ir_node *node, void *unused) { node->out = NULL; @@ -53,7 +54,8 @@ static void reset_outs (ir_node *node, void *unused) } /* returns the number of successors of the node: */ -INLINE int get_irn_n_outs (ir_node *node) { +int get_irn_n_outs (ir_node *node) { + assert(node && node->kind == k_ir_node); #ifdef DEBUG_libfirm /* assert (node->out_valid); */ #endif /* defined DEBUG_libfirm */ @@ -61,8 +63,7 @@ INLINE int get_irn_n_outs (ir_node *node) { } /* Access successor n */ -INLINE ir_node *get_irn_out (ir_node *node, int pos) { - assert(node); +ir_node *get_irn_out (ir_node *node, int pos) { assert(pos >= 0 && pos < get_irn_n_outs(node)); #ifdef DEBUG_libfirm /* assert (node->out_valid); */ @@ -70,7 +71,7 @@ INLINE ir_node *get_irn_out (ir_node *node, int pos) { return node->out[pos+1]; } -INLINE void set_irn_out (ir_node *node, int pos, ir_node *out) { +void set_irn_out (ir_node *node, int pos, ir_node *out) { assert(node && out); assert(pos >= 0 && pos < get_irn_n_outs(node)); #ifdef DEBUG_libfirm @@ -80,7 +81,7 @@ INLINE void set_irn_out (ir_node *node, int pos, ir_node *out) { } -INLINE int get_Block_n_cfg_outs (ir_node *bl) { +int get_Block_n_cfg_outs (ir_node *bl) { int i, n_cfg_outs = 0; assert(bl && (get_irn_op(bl) == op_Block)); #ifdef DEBUG_libfirm @@ -88,12 +89,13 @@ INLINE int get_Block_n_cfg_outs (ir_node *bl) { #endif /* defined DEBUG_libfirm */ for (i = 0; i < (int)bl->out[0]; i++) if ((get_irn_mode(bl->out[i+1]) == mode_X) && - (get_irn_op(bl->out[i+1]) != op_End)) n_cfg_outs++; + (get_irn_op(bl->out[i+1]) != op_End)) + n_cfg_outs++; return n_cfg_outs; } -INLINE ir_node *get_Block_cfg_out (ir_node *bl, int pos) { +ir_node *get_Block_cfg_out (ir_node *bl, int pos) { int i, out_pos = 0; assert(bl && (get_irn_op(bl) == op_Block)); #ifdef DEBUG_libfirm @@ -101,10 +103,10 @@ INLINE ir_node *get_Block_cfg_out (ir_node *bl, int pos) { #endif /* defined DEBUG_libfirm */ for (i = 0; i < (int)bl->out[0]; i++) if ((get_irn_mode(bl->out[i+1]) == mode_X) && - (get_irn_op(bl->out[i+1]) != op_End)) { + (get_irn_op(bl->out[i+1]) != op_End)) { if (out_pos == pos) { - ir_node *cfop = bl->out[i+1]; - return cfop->out[0+1]; + ir_node *cfop = bl->out[i+1]; + return cfop->out[0+1]; } else { out_pos++; } @@ -112,7 +114,7 @@ INLINE ir_node *get_Block_cfg_out (ir_node *bl, int pos) { return NULL; } -void irg_out_walk_2(ir_node *node, irg_walk_func *pre, +static void irg_out_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env) { int i; ir_node *succ; @@ -146,7 +148,7 @@ void irg_out_walk(ir_node *node, return; } -void irg_out_block_walk2(ir_node *bl, +static void irg_out_block_walk2(ir_node *bl, irg_walk_func *pre, irg_walk_func *post, void *env) { int i; @@ -188,7 +190,7 @@ void irg_out_block_walk(ir_node *node, } -/**********************************************************************/ +/*--------------------------------------------------------------------*/ /** Building and Removing the out datasturcture **/ /** **/ /** The outs of a graph are allocated in a single, large array. **/ @@ -205,34 +207,43 @@ void irg_out_block_walk(ir_node *node, /** the large array into smaller parts, sets the out edges and **/ /** recounts the out edges. **/ /** Removes Tuple nodes! **/ -/**********************************************************************/ +/*--------------------------------------------------------------------*/ -/* Returns the amount of out edges for not yet visited successors. */ +/** Returns the amount of out edges for not yet visited successors. */ static int count_outs(ir_node *n) { int start, i, res, irn_arity; - ir_node *succ; set_irn_visited(n, get_irg_visited(current_ir_graph)); n->out = (ir_node **) 1; /* Space for array size. */ - start = get_irn_op(n) == op_Block ? 0 : -1; + start = is_Block(n) ? 0 : -1; irn_arity = get_irn_arity(n); - res = irn_arity - start +1; /* --1 or --0; 1 for array size. */ + res = irn_arity - start + 1; /* --1 or --0; 1 for array size. */ + for (i = start; i < irn_arity; i++) { /* Optimize Tuples. They annoy if walking the cfg. */ - succ = skip_Tuple(get_irn_n(n, i)); + ir_node *succ = skip_Tuple(get_irn_n(n, i)); set_irn_n(n, i, succ); + /* count outs for successors */ if (get_irn_visited(succ) < get_irg_visited(current_ir_graph)) { res += count_outs(succ); } /* Count my outs */ - succ->out = (ir_node **)( (int)succ->out +1); + succ->out = (ir_node **)( (int)succ->out + 1); } return res; } +/** + * Enter memory for the outs to a node. + * + * @param n current node + * @param free current free address in the chunk allocated for the outs + * + * @return The next free address + */ static ir_node **set_out_edges(ir_node *n, ir_node **free) { int n_outs, start, i, irn_arity; ir_node *succ; @@ -245,14 +256,15 @@ static ir_node **set_out_edges(ir_node *n, ir_node **free) { #ifdef DEBUG_libfirm n->out_valid = 1; #endif /* defined DEBUG_libfirm */ - free = &free[n_outs]; + free += n_outs; /* We count the successors again, the space will be sufficient. We use this counter to remember the position for the next back edge. */ n->out[0] = (ir_node *)0; - if (get_irn_op(n) == op_Block) start = 0; else start = -1; + start = is_Block(n) ? 0 : -1; irn_arity = get_irn_arity(n); + for (i = start; i < irn_arity; i++) { succ = get_irn_n(n, i); /* Recursion */ @@ -265,9 +277,9 @@ static ir_node **set_out_edges(ir_node *n, ir_node **free) { return free; } - /* We want that the out of ProjX from Start contains the next block at - position 1, the Start block at position 2. This is necessary for - the out block walker. */ +/* We want that the out of ProjX from Start contains the next block at + position 1, the Start block at position 2. This is necessary for + the out block walker. */ static INLINE void fix_start_proj(ir_graph *irg) { ir_node *proj = NULL; ir_node *startbl = get_irg_start_block(irg); @@ -288,6 +300,7 @@ static INLINE void fix_start_proj(ir_graph *irg) { } } +/* compute the outs for a given graph */ void compute_outs(ir_graph *irg) { ir_graph *rem = current_ir_graph; int n_out_edges = 0; @@ -297,7 +310,9 @@ void compute_outs(ir_graph *irg) { /* Update graph state */ assert(get_irg_phase_state(current_ir_graph) != phase_building); - if (current_ir_graph->outs_state != outs_none) free_outs(current_ir_graph); + + if (current_ir_graph->outs_state != outs_none) + free_outs(current_ir_graph); current_ir_graph->outs_state = outs_consistent; /* This first iteration counts the overall number of out edges and the @@ -306,7 +321,7 @@ void compute_outs(ir_graph *irg) { n_out_edges = count_outs(get_irg_end(irg)); /* allocate memory for all out edges. */ - irg->outs = (ir_node **) xmalloc (n_out_edges * sizeof(ir_node *)); + irg->outs = xcalloc(n_out_edges, sizeof(irg->outs[0])); #ifdef DEBUG_libfirm irg->n_outs = n_out_edges; #endif /* defined DEBUG_libfirm */ @@ -316,10 +331,8 @@ void compute_outs(ir_graph *irg) { inc_irg_visited(irg); end = set_out_edges(get_irg_end(irg), irg->outs); -#ifdef DEBUG_libfirm /* Check how much memory we have used */ assert (end == (irg->outs + n_out_edges)); -#endif /* defined DEBUG_libfirm */ /* We want that the out of ProjX from Start contains the next block at position 1, the Start block at position 2. This is necessary for @@ -341,23 +354,20 @@ void compute_outs(ir_graph *irg) { *------------------------------------------------------------*/ -/* ------------------------------------------ - Inits the number of outedges for each node - before counting. - ------------------------------------------ */ - -static void init_count(ir_node * node, void * env) -{ +/** + * Inits the number of outedges for each node + * before counting. + */ +static void init_count(ir_node * node, void *env) { node->out = (ir_node **) 1; /* 1 for the array size */ } -/* ----------------------------------------------- - Adjusts the out edge count for its predecessors - and adds the current arity to the overall count, - which is saved in "env" - ------------------------------------------------ */ - +/** + * Adjusts the out edge count for its predecessors + * and adds the current arity to the overall count, + * which is saved in "env" + */ static void node_arity_count(ir_node * node, void * env) { int *anz = (int *) env, arity, n_outs, i, start; @@ -376,11 +386,10 @@ static void node_arity_count(ir_node * node, void * env) } -/* ---------------------------------------- - Inits all nodes for setting the outedges - Returns the overall count of edges - ---------------------------------------- */ - +/* + * Inits all nodes for setting the outedges + * Returns the overall count of edges + */ int count_ip_outs(void) { int res = 0; @@ -390,14 +399,13 @@ int count_ip_outs(void) { return(res); } -int dummy_count = 0, global_count; /* Only for debugging */ - -/* --------------------------------------------- - For each node: Sets the pointer to array - in which the outedges are written later. - The current array start is transported in env - --------------------------------------------- */ +static int dummy_count = 0, global_count; /* Only for debugging */ +/** + * For each node: Sets the pointer to array + * in which the outedges are written later. + * The current array start is transported in env + */ static void set_array_pointer(ir_node *node, void *env) { int n_outs; @@ -416,11 +424,10 @@ static void set_array_pointer(ir_node *node, void *env) { } -/* ------------------------------------------- - Adds an outedge from the predecessor to the - current node. - ------------------------------------------- */ - +/** + * Adds an outedge from the predecessor to the + * current node. + */ static void set_out_pointer(ir_node * node, void * env) { int i, arity = get_irn_arity(node); ir_node *succ; @@ -434,10 +441,9 @@ static void set_out_pointer(ir_node * node, void * env) { } -/* ------------------------------- - Sets the outedges for all nodes. - -------------------------------- */ - +/* + * Sets the outedges for all nodes. + */ void set_ip_outs(void) { ir_node **outedge_array = get_irp_ip_outedges(); @@ -446,12 +452,11 @@ void set_ip_outs(void) -/* -------------------------------------------------------- - Counts the outedges, allocates memory to save the - outedges and fills this outedge array in interprocedural - view! - -------------------------------------------------------- */ - +/* + * Counts the outedges, allocates memory to save the + * outedges and fills this outedge array in interprocedural + * view! + */ void compute_ip_outs(void) { int n_out_edges; @@ -465,7 +470,7 @@ void compute_ip_outs(void) { } global_count = n_out_edges = count_ip_outs(); - out_edges = (ir_node **) malloc (n_out_edges * sizeof(ir_node *)); + out_edges = xcalloc(n_out_edges, sizeof(out_edges[0])); set_irp_ip_outedges(out_edges); set_ip_outs(); }