#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 */
#ifdef DEBUG_libfirm
/* assert (node->out_valid); */
#endif /* defined DEBUG_libfirm */
- return (int)(node->out[0]);
+ return PTR_TO_INT(node->out[0]);
}
/* Access successor n */
#ifdef DEBUG_libfirm
assert (bl->out_valid);
#endif /* defined DEBUG_libfirm */
- for (i = 1; i <= (int)bl->out[0]; i++)
+ 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++;
ir_node *get_Block_cfg_out(ir_node *bl, int pos) {
int i, out_pos = 0;
- assert(bl && (get_irn_op(bl) == op_Block));
+ assert(bl && is_Block(bl));
#ifdef DEBUG_libfirm
assert (bl->out_valid);
#endif /* defined DEBUG_libfirm */
- for (i = 1; i <= (int)bl->out[0]; i++)
+ 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) {
irg_walk_func *pre, irg_walk_func *post,
void *env) {
- assert((get_irn_op(node) == op_Block) || (get_irn_mode(node) == mode_X));
+ assert(is_Block(node) || (get_irn_mode(node) == mode_X));
inc_irg_block_visited(current_ir_graph);
static int _count_outs(ir_node *n) {
int start, i, res, irn_arity;
- set_irn_visited(n, get_irg_visited(current_ir_graph));
+ mark_irn_visited(n);
n->out = (ir_node **) 1; /* Space for array size. */
start = is_Block(n) ? 0 : -1;
irn_arity = get_irn_arity(n);
res = irn_arity - start + 1; /* --1 or --0; 1 for array size. */
- for (i = start; 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);
/* count outs for successors */
- if (get_irn_visited(pred) < get_irg_visited(current_ir_graph)) {
+ if (irn_not_visited(pred))
res += _count_outs(pred);
- }
+
/* Count my outs */
- pred->out = (ir_node **)( (int)pred->out + 1);
+ pred->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(pred->out) + 1);
}
return res;
}
/** Returns the amount of out edges for not yet visited successors.
- * This version handles some special nodes like irg_frame etc.
+ * This version handles some special nodes like irg_frame, irg_args etc.
*/
static int count_outs(ir_graph *irg) {
ir_node *n;
/* now handle special nodes */
n = get_irg_frame(irg);
- if (get_irn_visited(n) < get_irg_visited(current_ir_graph)) {
+ 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;
}
set_irn_visited(n, get_irg_visited(current_ir_graph));
/* Allocate my array */
- n_outs = (int) n->out;
+ n_outs = PTR_TO_INT(n->out);
n->out = free;
#ifdef DEBUG_libfirm
n->out_valid = 1;
free = _set_out_edges(pred, free);
/* Remember our back edge */
pred->out[get_irn_n_outs(pred)+1] = n;
- pred->out[0] = (ir_node *) (get_irn_n_outs(pred) + 1);
+ pred->out[0] = INT_TO_PTR(get_irn_n_outs(pred) + 1);
}
return free;
}
* @return The next free address
*/
static ir_node **set_out_edges(ir_graph *irg, ir_node **free) {
- ir_node *n;
- int n_outs;
+ ir_node *n, *special[2];
+ int i, n_outs;
inc_irg_visited(irg);
free = _set_out_edges(get_irg_end(irg), free);
- n = get_irg_frame(irg);
- if (get_irn_visited(n) < get_irg_visited(current_ir_graph)) {
- n_outs = (int)n->out;
- n->out = 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);
+ n->out = free;
#ifdef DEBUG_libfirm
- n->out_valid = 1;
+ n->out_valid = 1;
#endif /* defined DEBUG_libfirm */
- free += n_outs;
+ free += n_outs;
+ }
}
return free;
int i;
if (get_Block_n_cfg_outs(startbl)) {
- for (i = 0; i < get_irn_n_outs(startbl); i++)
+ 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;
}
/* compute the outs for a given graph */
-void compute_outs(ir_graph *irg) {
+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 */
assert(get_irg_phase_state(current_ir_graph) != phase_building);
if (current_ir_graph->outs_state != outs_none)
- free_outs(current_ir_graph);
+ free_irg_outs(current_ir_graph);
current_ir_graph->outs_state = outs_consistent;
/* This first iteration counts the overall number of out edges and the
current_ir_graph = rem;
}
-
+void compute_irp_outs(void) {
+ int i, n_irgs = get_irp_n_irgs();
+ for (i = 0; i < n_irgs; ++i)
+ compute_irg_outs(get_irp_irg(i));
+}
+void free_irp_outs(void) {
+ int i, n_irgs = get_irp_n_irgs();
+ for (i = 0; i < n_irgs; ++i)
+ free_irg_outs(get_irp_irg(i));
+}
/*------------------------------------------------------------*
for(i = start; i < arity; i++) {
succ = get_irn_n(node, i);
- succ->out = (ir_node **)((int)succ->out + 1);
+ succ->out = (ir_node **)INT_TO_PTR(PTR_TO_INT(succ->out) + 1);
}
}
ir_node ***free = (ir_node ***) env;
/* Allocate my array */
- n_outs = (int) node -> out; /* We wrote the count here in count_ip_outs */
+ 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;
ir_node *succ;
int start = (!is_Block(node)) ? -1 : 0;
- for(i = start; i < arity; i++) {
+ for (i = start; i < arity; i++) {
succ = get_irn_n(node, i);
succ->out[get_irn_n_outs(succ)+1] = node;
- succ->out[0] = (ir_node *) (get_irn_n_outs(succ) + 1);
+ succ->out[0] = INT_TO_PTR(get_irn_n_outs(succ) + 1);
}
}
}
-void free_outs(ir_graph *irg) {
+void free_irg_outs(ir_graph *irg) {
/* current_ir_graph->outs_state = outs_none; */
irg->outs_state = outs_none;