X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fana%2Firouts.c;h=c95fd431f064f676b045629e682ba26c4ebfb5c7;hb=0a7d7324b9baa076d1322e82b92f8fc2c8f1892e;hp=6f00283505ebdbf0f28cd96af0cad39ebca43f3a;hpb=b519dd6a1e6d85e843eff533be787d1f138a07ff;p=libfirm diff --git a/ir/ana/irouts.c b/ir/ana/irouts.c index 6f0028350..c95fd431f 100644 --- a/ir/ana/irouts.c +++ b/ir/ana/irouts.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -22,15 +22,10 @@ * @brief Compute and access out edges (also called def-use edges). * @author Goetz Lindenmaier, Michael Beck * @date 1.2002 - * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif -#ifdef HAVE_STRING_H #include -#endif #include "xmalloc.h" #include "irouts.h" @@ -38,13 +33,10 @@ #include "irgraph_t.h" #include "irprog_t.h" #include "irgwalk.h" -#include "irtools.h" - -#ifdef DEBUG_libfirm -/* Note: ir_node.out_valid and ir_graph.n_outs are only present when DEBUG_libfirm is defined */ -/* Accesses to out_valid and n_outs are fenced out to avoid breakage - when compiling with neither DEBUG_libfirm or NDEBUG defined */ -#endif /* defined DEBUG_libfirm */ +#include "util.h" +#include "irprintf.h" +#include "error.h" +#include "ircons.h" /*--------------------------------------------------------------------*/ /** Accessing the out datastructures **/ @@ -52,119 +44,157 @@ #ifdef DEBUG_libfirm /** Clear the outs of a node */ -static void reset_outs(ir_node *node, void *unused) { +static void reset_outs(ir_node *node, void *unused) +{ (void) unused; node->out = NULL; node->out_valid = 0; } #endif -/* returns the number of successors of the node: */ -int get_irn_n_outs(ir_node *node) { +int get_irn_outs_computed(const ir_node *node) +{ + return node->out != NULL; +} + +int get_irn_n_outs(const ir_node *node) +{ assert(node && node->kind == k_ir_node); #ifdef DEBUG_libfirm - /* assert(node->out_valid); */ + assert(node->out_valid); +#endif /* defined DEBUG_libfirm */ + /* we misuse the first for the size info of the out array */ + return node->out[0].pos; +} + +ir_node *get_irn_out(const ir_node *def, int pos) +{ + assert(pos >= 0 && pos < get_irn_n_outs(def)); +#ifdef DEBUG_libfirm + assert(def->out_valid); #endif /* defined DEBUG_libfirm */ - return PTR_TO_INT(node->out[0]); + return def->out[pos+1].use; } -/* Access successor n */ -ir_node *get_irn_out(ir_node *node, int pos) { - assert(pos >= 0 && pos < get_irn_n_outs(node)); +ir_node *get_irn_out_ex(const ir_node *def, int pos, int *in_pos) +{ + assert(pos >= 0 && pos < get_irn_n_outs(def)); #ifdef DEBUG_libfirm - /* assert(node->out_valid); */ + assert(def->out_valid); #endif /* defined DEBUG_libfirm */ -return node->out[pos+1]; + *in_pos = def->out[pos+1].pos; + return def->out[pos+1].use; } -void set_irn_out(ir_node *node, int pos, ir_node *out) { - assert(node && out); - assert(pos >= 0 && pos < get_irn_n_outs(node)); +void set_irn_out(ir_node *def, int pos, ir_node *use, int in_pos) +{ + assert(def && use); + assert(pos >= 0 && pos < get_irn_n_outs(def)); #ifdef DEBUG_libfirm - node->out_valid = 1; /* assume that this function is used correctly */ + assert(def->out_valid); #endif /* defined DEBUG_libfirm */ - node->out[pos+1] = out; + def->out[pos+1].use = use; + def->out[pos+1].pos = in_pos; } -/* Return the number of control flow successors, ignore keep-alives. */ -int get_Block_n_cfg_outs(ir_node *bl) { +int get_Block_n_cfg_outs(const ir_node *bl) +{ int i, n_cfg_outs = 0; assert(bl && is_Block(bl)); #ifdef DEBUG_libfirm assert(bl->out_valid); #endif /* defined DEBUG_libfirm */ - for (i = 1; i <= PTR_TO_INT(bl->out[0]); ++i) - if ((get_irn_mode(bl->out[i]) == mode_X) && - (get_irn_op(bl->out[i]) != op_End)) - ++n_cfg_outs; + for (i = 1; i <= bl->out[0].pos; ++i) { + ir_node *succ = bl->out[i].use; + if (get_irn_mode(succ) == mode_X && !is_End(succ) && !is_Bad(succ)) + n_cfg_outs += succ->out[0].pos; + } return n_cfg_outs; } -/* Return the number of control flow successors, honor keep-alives. */ -int get_Block_n_cfg_outs_ka(ir_node *bl) { +int get_Block_n_cfg_outs_ka(const ir_node *bl) +{ int i, n_cfg_outs = 0; assert(bl && is_Block(bl)); #ifdef DEBUG_libfirm assert(bl->out_valid); #endif /* defined DEBUG_libfirm */ - for (i = 1; i <= PTR_TO_INT(bl->out[0]); ++i) - if (get_irn_mode(bl->out[i]) == mode_X) { - /* ignore End if we are in the Endblock */ - if (get_irn_op(bl->out[i]) == op_End && - get_nodes_block(bl->out[i]) == bl) + for (i = 1; i <= bl->out[0].pos; ++i) { + ir_node *succ = bl->out[i].use; + if (get_irn_mode(succ) == mode_X) { + if (is_Bad(succ)) continue; - else - ++n_cfg_outs; + if (is_End(succ)) { + /* ignore End if we are in the Endblock */ + if (get_nodes_block(succ) == bl) + continue; + else /* count Keep-alive as one */ + n_cfg_outs += 1; + } else + n_cfg_outs += succ->out[0].pos; } + } return n_cfg_outs; } -/* Access predecessor n, ignore keep-alives. */ -ir_node *get_Block_cfg_out(ir_node *bl, int pos) { - int i, out_pos = 0; +ir_node *get_Block_cfg_out(const ir_node *bl, int pos) +{ + int i; assert(bl && is_Block(bl)); #ifdef DEBUG_libfirm - assert (bl->out_valid); + assert(bl->out_valid); #endif /* defined DEBUG_libfirm */ - for (i = 1; i <= PTR_TO_INT(bl->out[0]); ++i) - if ((get_irn_mode(bl->out[i]) == mode_X) && - (get_irn_op(bl->out[i]) != op_End)) { - if (out_pos == pos) { - ir_node *cfop = bl->out[i]; - return cfop->out[1]; - } else - ++out_pos; + for (i = 1; i <= bl->out[0].pos; ++i) { + ir_node *succ = bl->out[i].use; + if (get_irn_mode(succ) == mode_X && !is_End(succ) && !is_Bad(succ)) { + int n_outs = succ->out[0].pos; + if (pos < n_outs) + return succ->out[pos + 1].use; + else + pos -= n_outs; } + } return NULL; } -/* Access predecessor n, honor keep-alives. */ -ir_node *get_Block_cfg_out_ka(ir_node *bl, int pos) { - int i, out_pos = 0; +ir_node *get_Block_cfg_out_ka(const ir_node *bl, int pos) +{ + int i, n_outs; assert(bl && is_Block(bl)); #ifdef DEBUG_libfirm assert (bl->out_valid); #endif /* defined DEBUG_libfirm */ - for (i = 1; i <= PTR_TO_INT(bl->out[0]); ++i) - if (get_irn_mode(bl->out[i]) == mode_X) { - /* ignore End if we are in the Endblock */ - if (get_irn_op(bl->out[i]) == op_End && - get_nodes_block(bl->out[i]) == bl) + for (i = 1; i <= bl->out[0].pos; ++i) { + ir_node *succ = bl->out[i].use; + if (get_irn_mode(succ) == mode_X) { + if (is_Bad(succ)) continue; - if (out_pos == pos) { - ir_node *cfop = bl->out[i]; - /* handle keep-alive here */ - if (get_irn_op(cfop) == op_End) - return get_nodes_block(cfop); - return cfop->out[1]; - } else - ++out_pos; + if (is_End(succ)) { + ir_node *end_bl = get_nodes_block(succ); + if (end_bl == bl) { + /* ignore End if we are in the Endblock */ + continue; + } + if (pos == 0) { + /* handle keep-alive here: return the Endblock instead of the End node */ + return end_bl; + } else + --pos; + } else { + n_outs = succ->out[0].pos; + if (pos < n_outs) + return succ->out[pos + 1].use; + else + pos -= n_outs; + } } + } return NULL; } static void irg_out_walk_2(ir_node *node, irg_walk_func *pre, - irg_walk_func *post, void *env) { + irg_walk_func *post, void *env) +{ int i, n; ir_node *succ; @@ -182,27 +212,25 @@ static void irg_out_walk_2(ir_node *node, irg_walk_func *pre, } if (post) post(node, env); - - return; } -void irg_out_walk(ir_node *node, - irg_walk_func *pre, irg_walk_func *post, - void *env) { +void irg_out_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, + void *env) +{ assert(node); - if (get_irg_outs_state(current_ir_graph) != outs_none) { - inc_irg_visited (current_ir_graph); + ir_graph *irg = get_irn_irg(node); + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS)) { + inc_irg_visited (irg); irg_out_walk_2(node, pre, post, env); } - return; } -static void irg_out_block_walk2(ir_node *bl, - irg_walk_func *pre, irg_walk_func *post, - void *env) { +static void irg_out_block_walk2(ir_node *bl, irg_walk_func *pre, + irg_walk_func *post, void *env) +{ int i, n; - if (Block_not_block_visited(bl)) { + if (!Block_block_visited(bl)) { mark_Block_block_visited(bl); if (pre) @@ -220,20 +248,25 @@ static void irg_out_block_walk2(ir_node *bl, } } -/* Walks only over Block nodes in the graph. Has it's own visited - flag, so that it can be interleaved with the other walker. */ -void irg_out_block_walk(ir_node *node, - irg_walk_func *pre, irg_walk_func *post, - void *env) { +void irg_out_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, + void *env) +{ assert(is_Block(node) || (get_irn_mode(node) == mode_X)); inc_irg_block_visited(current_ir_graph); - if (get_irn_mode(node) == mode_X) - node = node->out[1]; + if (get_irn_mode(node) == mode_X) { + int i, n; - irg_out_block_walk2(node, pre, post, env); + for (i = 0, n = get_irn_n_outs(node); i < n; ++i) { + ir_node *succ = get_irn_out(node, i); + irg_out_block_walk2(succ, pre, post, env); + } + } + else { + irg_out_block_walk2(node, pre, post, env); + } } /*--------------------------------------------------------------------*/ @@ -257,37 +290,32 @@ void irg_out_block_walk(ir_node *node, /** Returns the amount of out edges for not yet visited successors. */ -static int _count_outs(ir_node *n) { - int i, res, irn_arity; +static int _count_outs(ir_node *n) +{ + int start, i, res, irn_arity; mark_irn_visited(n); - n->out = (ir_node **) 1; /* Space for array size. */ + n->out = (ir_def_use_edge*) INT_TO_PTR(1); /* Space for array size. */ + start = is_Block(n) ? 0 : -1; irn_arity = get_irn_arity(n); - res = irn_arity + 1; - - if (is_no_Block(n)) { - ir_node *pred = get_nodes_block(n); + res = irn_arity - start + 1; /* --1 or --0; 1 for array size. */ - /* count outs for predecessors */ - if (irn_not_visited(pred)) - res += _count_outs(pred); - - /* Count my outs */ - pred->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(pred->out) + 1); - ++res; - } - for (i = 0; i < irn_arity; ++i) { + for (i = start; i < irn_arity; ++i) { /* Optimize Tuples. They annoy if walking the cfg. */ - ir_node *pred = skip_Tuple(get_irn_n(n, i)); - set_irn_n(n, i, pred); + ir_node *pred = get_irn_n(n, i); + ir_node *skipped_pred = skip_Tuple(pred); - /* count outs for predecessors */ - if (irn_not_visited(pred)) - res += _count_outs(pred); + if (skipped_pred != pred) { + set_irn_n(n, i, skipped_pred); + } + + /* count Def-Use edges for predecessors */ + if (!irn_visited(skipped_pred)) + res += _count_outs(skipped_pred); - /* Count my outs */ - pred->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(pred->out) + 1); + /*count my Def-Use edges */ + skipped_pred->out = (ir_def_use_edge*) INT_TO_PTR(PTR_TO_INT(skipped_pred->out) + 1); } return res; } @@ -296,74 +324,70 @@ static int _count_outs(ir_node *n) { /** Returns the amount of out edges for not yet visited successors. * This version handles some special nodes like irg_frame, irg_args etc. */ -static int count_outs(ir_graph *irg) { +static int count_outs(ir_graph *irg) +{ ir_node *n; - int res; + int i, res; inc_irg_visited(irg); res = _count_outs(get_irg_end(irg)); - /* now handle special nodes */ - n = get_irg_frame(irg); - if (irn_not_visited(n)) { - n->out = (ir_node **)1; - ++res; - } - - n = get_irg_args(irg); - if (irn_not_visited(n)) { - n->out = (ir_node **)1; - ++res; + /* Now handle anchored nodes. We need the out count of those + even if they are not visible. */ + for (i = anchor_last; i >= anchor_first; --i) { + n = get_irg_anchor(irg, i); + if (!irn_visited_else_mark(n)) { + n->out = (ir_def_use_edge*) INT_TO_PTR(1); + ++res; + } } - return res; } /** * Enter memory for the outs to a node. * - * @param n current node + * @param use 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, i, irn_arity; - ir_node *pred; +static ir_def_use_edge *_set_out_edges(ir_node *use, ir_def_use_edge *free) +{ + int start, i, irn_arity, pos; + size_t n_outs; - set_irn_visited(n, get_irg_visited(current_ir_graph)); + mark_irn_visited(use); /* Allocate my array */ - n_outs = PTR_TO_INT(n->out); - n->out = free; + n_outs = PTR_TO_INT(use->out); + use->out = free; #ifdef DEBUG_libfirm - n->out_valid = 1; + use->out_valid = 1; #endif /* defined DEBUG_libfirm */ 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; + use->out[0].pos = 0; - if (is_no_Block(n)) { - pred = get_nodes_block(n); - /* Recursion */ - if (get_irn_visited(pred) < get_irg_visited(current_ir_graph)) - free = _set_out_edges(pred, free); - /* Remember our back edge */ - pred->out[get_irn_n_outs(pred)+1] = n; - pred->out[0] = INT_TO_PTR(get_irn_n_outs(pred) + 1); - } + start = is_Block(use) ? 0 : -1; + irn_arity = get_irn_arity(use); + + for (i = start; i < irn_arity; ++i) { + ir_node *def = get_irn_n(use, i); - irn_arity = get_irn_arity(n); - for (i = 0; i < irn_arity; ++i) { - pred = get_irn_n(n, i); /* Recursion */ - if (get_irn_visited(pred) < get_irg_visited(current_ir_graph)) - free = _set_out_edges(pred, free); - /* Remember our back edge */ - pred->out[get_irn_n_outs(pred)+1] = n; - pred->out[0] = INT_TO_PTR(get_irn_n_outs(pred) + 1); + if (!irn_visited(def)) + free = _set_out_edges(def, free); + + /* Remember this Def-Use edge */ + pos = def->out[0].pos + 1; + def->out[pos].use = use; + def->out[pos].pos = i; + + /* increase the number of Def-Use edges so far */ + def->out[0].pos = pos; } return free; } @@ -376,22 +400,19 @@ static ir_node **_set_out_edges(ir_node *n, ir_node **free) { * * @return The next free address */ -static ir_node **set_out_edges(ir_graph *irg, ir_node **free) { - ir_node *n, *special[2]; - int i, n_outs; +static ir_def_use_edge *set_out_edges(ir_graph *irg, ir_def_use_edge *free) +{ + ir_node *n; + int i; inc_irg_visited(irg); free = _set_out_edges(get_irg_end(irg), free); - /* handle special nodes */ - special[0] = get_irg_frame(irg); - special[1] = get_irg_args(irg); - - for (i = 1; i >= 0; --i) { - n = special[i]; - - if (get_irn_visited(n) < get_irg_visited(current_ir_graph)) { - n_outs = PTR_TO_INT(n->out); + /* handle anchored nodes */ + for (i = anchor_last; i >= anchor_first; --i) { + n = get_irg_anchor(irg, i); + if (!irn_visited_else_mark(n)) { + size_t n_outs = PTR_TO_INT(n->out); n->out = free; #ifdef DEBUG_libfirm n->out_valid = 1; @@ -403,52 +424,25 @@ static ir_node **set_out_edges(ir_graph *irg, 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. - */ -static INLINE void fix_start_proj(ir_graph *irg) { - ir_node *proj = NULL; - ir_node *startbl = get_irg_start_block(irg); - int i; - - if (get_Block_n_cfg_outs(startbl)) { - for (i = get_irn_n_outs(startbl) - 1; i >= 0; --i) - if (get_irn_mode(get_irn_out(startbl, i)) == mode_X) { - proj = get_irn_out(startbl, i); - break; - } - - if (get_irn_out(proj, 0) == startbl) { - assert(get_irn_n_outs(proj) == 2); - set_irn_out(proj, 0, get_irn_out(proj, 1)); - set_irn_out(proj, 1, startbl); - } - } -} - -/* compute the outs for a given graph */ -void compute_irg_outs(ir_graph *irg) { - ir_graph *rem = current_ir_graph; - int n_out_edges = 0; - ir_node **end = NULL; /* Only for debugging */ +void compute_irg_outs(ir_graph *irg) +{ + ir_graph *rem = current_ir_graph; + int n_out_edges = 0; + ir_def_use_edge *end = NULL; /* Only for debugging */ current_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_irg_outs(current_ir_graph); + free_irg_outs(current_ir_graph); /* This first iteration counts the overall number of out edges and the number of out edges for each node. */ n_out_edges = count_outs(irg); /* allocate memory for all out edges. */ - irg->outs = xcalloc(n_out_edges, sizeof(irg->outs[0])); + irg->outs = XMALLOCNZ(ir_def_use_edge, n_out_edges); #ifdef DEBUG_libfirm irg->n_outs = n_out_edges; #endif /* defined DEBUG_libfirm */ @@ -460,182 +454,33 @@ void compute_irg_outs(ir_graph *irg) { /* Check how much memory we have used */ assert (end == (irg->outs + n_out_edges)); - /* 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. */ - fix_start_proj(irg); - - current_ir_graph->outs_state = outs_consistent; + add_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS); current_ir_graph = rem; } -void assure_irg_outs(ir_graph *irg) { - if (get_irg_outs_state(irg) != outs_consistent) +void assure_irg_outs(ir_graph *irg) +{ + if (! irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS)) compute_irg_outs(irg); } -void compute_irp_outs(void) { - int i; - for (i = get_irp_n_irgs() -1; i >= 0; --i) +void compute_irp_outs(void) +{ + size_t i, n; + for (i = 0, n = get_irp_n_irgs(); i < n; ++i) compute_irg_outs(get_irp_irg(i)); } -void free_irp_outs(void) { - int i; - for (i = get_irp_n_irgs() -1; i >= 0; --i) +void free_irp_outs(void) +{ + size_t i, n; + for (i = 0, n = get_irp_n_irgs(); i < n; ++i) free_irg_outs(get_irp_irg(i)); } - -/*------------------------------------------------------------* - * This computes the outedges for in interprocedural graph. * - * There is one quirk: * - * The number of the outedges for each node is saved in * - * the first member of the ir_node** array. Maybe we should * - * change this to make it more portable... * - *------------------------------------------------------------*/ - - -/** - * Inits the number of outedges for each node - * before counting. - */ -static void init_count(ir_node * node, void *env) { - (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" - */ -static void node_arity_count(ir_node * node, void * env) { - int *anz = (int *) env, arity, n_outs, i; - ir_node *succ; - - arity = get_irn_arity(node); - n_outs = 1 + arity; - - if (is_no_Block(node)) { - succ = get_nodes_block(node); - succ->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(succ->out) + 1); - - ++n_outs; - } - *anz += n_outs; - for (i = 0; i < arity; i++) { - succ = get_irn_n(node, i); - succ->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(succ->out) + 1); - } -} - - -/* - * Inits all nodes for setting the outedges - * Returns the overall count of edges - */ -int count_ip_outs(void) { - int res = 0; - - cg_walk(init_count, node_arity_count, &res); - - return(res); -} - -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; - ir_node ***free = (ir_node ***) env; - - /* Allocate my array */ - n_outs = PTR_TO_INT(node->out); /* We wrote the count here in count_ip_outs */ - dummy_count += n_outs; - assert(dummy_count <= global_count && "More outedges than initially counted!"); - node -> out = *free; - *free = &((*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. */ - node -> out[0] = (ir_node *) 0; -} - - -/** - * 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; - (void) env; - - if (is_no_Block(node)) { - succ = get_nodes_block(node); - succ->out[get_irn_n_outs(succ)+1] = node; - succ->out[0] = INT_TO_PTR(get_irn_n_outs(succ) + 1); - - } - for (i = 0; i < arity; ++i) { - succ = get_irn_n(node, i); - succ->out[get_irn_n_outs(succ)+1] = node; - succ->out[0] = INT_TO_PTR(get_irn_n_outs(succ) + 1); - } -} - - -/* - * Sets the outedges for all nodes. - */ -void set_ip_outs(void) { - ir_node **outedge_array = get_irp_ip_outedges(); - cg_walk(set_array_pointer, set_out_pointer, (void *) &outedge_array); -} - - - -/* - * 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; - ir_node **out_edges; - - assert(get_irp_ip_view_state() == ip_view_valid && - "Cannot construct outs for invalid ip view."); - - if (irp->outs_state != outs_none) { - free_ip_outs(); - } - - global_count = n_out_edges = count_ip_outs(); - out_edges = xcalloc(n_out_edges, sizeof(out_edges[0])); - set_irp_ip_outedges(out_edges); - set_ip_outs(); -} - -void free_ip_outs(void) { - ir_node **out_edges = get_irp_ip_outedges(); - if (out_edges != NULL) { - free(out_edges); - set_irp_ip_outedges(NULL); - } - irp->outs_state = outs_none; -} - - -void free_irg_outs(ir_graph *irg) { +void free_irg_outs(ir_graph *irg) +{ /* current_ir_graph->outs_state = outs_none; */ - irg->outs_state = outs_none; if (irg->outs) { #ifdef DEBUG_libfirm