/*------------------------------------------------------------------*/
/* A new in array via a hashmap. */
/*------------------------------------------------------------------*/
/* A new in array via a hashmap. */
void *get_region_in(void *region, int pos) {
assert(0 <= pos && pos < get_region_n_ins(region));
void *get_region_in(void *region, int pos) {
assert(0 <= pos && pos < get_region_n_ins(region));
void *get_loop_cfop(void *region, int pos) {
assert(0 <= pos && pos < get_region_n_ins(region));
void *get_loop_cfop(void *region, int pos) {
assert(0 <= pos && pos < get_region_n_ins(region));
/* Walk a loop and add all edges. Walk inner loops by recursion. */
/*------------------------------------------------------------------*/
/* Walk a loop and add all edges. Walk inner loops by recursion. */
/*------------------------------------------------------------------*/
static int find_outer_loop(ir_loop *inner, ir_loop *outer, ir_node *b, ir_node *cfop) {
if (get_loop_outer_loop(inner) == outer) {
add_region_in(inner, b);
add_loop_cfop(inner, cfop);
exc_outs(b, cfop);
static int find_outer_loop(ir_loop *inner, ir_loop *outer, ir_node *b, ir_node *cfop) {
if (get_loop_outer_loop(inner) == outer) {
add_region_in(inner, b);
add_loop_cfop(inner, cfop);
exc_outs(b, cfop);
}
static int find_inner_loop(ir_node *b, ir_loop *l, ir_node *pred, ir_node *cfop) {
int i, n_elems = get_loop_n_elements(l);
}
static int find_inner_loop(ir_node *b, ir_loop *l, ir_node *pred, ir_node *cfop) {
int i, n_elems = get_loop_n_elements(l);
for (i = 0; (i < n_elems) && !found; ++i) {
loop_element e = get_loop_element(l, i);
switch (*e.kind) {
case k_ir_node: {
for (i = 0; (i < n_elems) && !found; ++i) {
loop_element e = get_loop_element(l, i);
switch (*e.kind) {
case k_ir_node: {
- add_region_in(b, e.son);
- exc_outs(e.son, cfop);
- //if (is_fragile_op(cfop)) inc_region_n_exc_outs(b);
- return found;
+ add_region_in(b, e.son);
+ exc_outs(e.son, cfop);
+ //if (is_fragile_op(cfop)) inc_region_n_exc_outs(b);
+ return found;
ir_loop *k = get_loop_element(outer, i).son;
if (is_ir_loop(k)) {
found = test_loop_nest(pred_b, k);
if (found) {
ir_loop *k = get_loop_element(outer, i).son;
if (is_ir_loop(k)) {
found = test_loop_nest(pred_b, k);
if (found) {
- add_region_in(l, k);
- //if (is_fragile_op(cfop)) inc_region_n_exc_outs(k);
- exc_outs(k, cfop);
- add_loop_cfop(l, cfop);
- add_region_in(b, NULL);
+ add_region_in(l, k);
+ //if (is_fragile_op(cfop)) inc_region_n_exc_outs(k);
+ exc_outs(k, cfop);
+ add_loop_cfop(l, cfop);
+ add_region_in(b, NULL);
- ir_node *cfop = skip_Proj(get_Block_cfgpred(b, i));
- ir_node *pred = get_nodes_block(cfop);
+ cfop = get_Block_cfgpred(b, i);
+ if (is_Proj(cfop)) {
+ if (get_irn_op(get_Proj_pred(cfop)) != op_Cond) {
+ cfop = skip_Proj(cfop);
+ } else {
+ assert(get_nodes_block(cfop) == get_nodes_block(skip_Proj(cfop)));
+ }
+ }
+
+ pred = skip_Proj(get_nodes_block(cfop));
/* We want nice blocks. */
assert( get_irn_op(pred) != op_Bad
&& get_irn_op(skip_Proj(get_Block_cfgpred(b, i))) != op_Bad);
/* We want nice blocks. */
assert( get_irn_op(pred) != op_Bad
&& get_irn_op(skip_Proj(get_Block_cfgpred(b, i))) != op_Bad);
} else {
int found = find_inner_loop(b, l, pred, cfop);
if (!found) {
} else {
int found = find_inner_loop(b, l, pred, cfop);
if (!found) {
- if (b != get_loop_element(l, 0).node) {
- if (get_firm_verbosity()) {
- printf("Loop entry not at loop position 0. "); DDMN(b);
- }
- }
- found = find_outer_loop(l, pred_l, pred, cfop);
- if (found) add_region_in(b, NULL); /* placeholder */
+ if (b != get_loop_element(l, 0).node) {
+ if (get_firm_verbosity()) {
+ printf("Loop entry not at loop position 0. "); DDMN(b);
+ }
+ }
+ found = find_outer_loop(l, pred_l, pred, cfop);
+ if (found) add_region_in(b, NULL); /* placeholder */
- found = find_previous_loop(l, pred_l, b, pred, cfop);
+ found = find_previous_loop(l, pred_l, b, pred, cfop);
- DDMG(current_ir_graph);
- DDMN(b);
- DDMN(pred);
- assert(is_backedge(b, i));
- assert(found && "backedge from inner loop");
+ DDMG(current_ir_graph);
+ DDMN(b);
+ DDMN(pred);
+ assert(is_backedge(b, i));
+ assert(found && "backedge from inner loop");
}
}
if (b != get_loop_element(l, 0).node) {
/* Check for improper region */
if (has_backedges(b)) {
}
}
if (b != get_loop_element(l, 0).node) {
/* Check for improper region */
if (has_backedges(b)) {
if (is_ir_node(reg) && get_Block_n_cfgpreds((ir_node *)reg) > get_region_n_ins(reg)) {
for (i = n_ins; i < get_Block_n_cfgpreds((ir_node *)reg); ++i) {
if (is_backedge((ir_node *)reg, i))
if (is_ir_node(reg) && get_Block_n_cfgpreds((ir_node *)reg) > get_region_n_ins(reg)) {
for (i = n_ins; i < get_Block_n_cfgpreds((ir_node *)reg); ++i) {
if (is_backedge((ir_node *)reg, i))
PRINT_NODEID(((ir_node *)reg));
fprintf (F, "\" targetname: \"");
PRINT_NODEID(get_nodes_block(skip_Proj(get_Block_cfgpred((ir_node *)reg, i))));
PRINT_NODEID(((ir_node *)reg));
fprintf (F, "\" targetname: \"");
PRINT_NODEID(get_nodes_block(skip_Proj(get_Block_cfgpred((ir_node *)reg, i))));
- printf("n_cfgpreds = %d, n_ins = %d\n", get_Block_n_cfgpreds((ir_node *)reg), get_region_n_ins(reg));
- DDMN((ir_node *)reg);
+ printf("n_cfgpreds = %d, n_ins = %d\n", get_Block_n_cfgpreds((ir_node *)reg), get_region_n_ins(reg));
+ DDMN((ir_node *)reg);
}
}
if ((!target || (is_ir_node(reg) && !is_ir_node(target))) && i < get_Block_n_cfgpreds((ir_node *)reg)) {
assert(is_ir_node(reg));
if (is_backedge((ir_node *)reg, i))
}
}
if ((!target || (is_ir_node(reg) && !is_ir_node(target))) && i < get_Block_n_cfgpreds((ir_node *)reg)) {
assert(is_ir_node(reg));
if (is_backedge((ir_node *)reg, i))
PRINT_NODEID(((ir_node *)reg));
fprintf (F, "\" targetname: \"");
PRINT_NODEID(get_nodes_block(skip_Proj(get_Block_cfgpred((ir_node *)reg, i))));
PRINT_NODEID(((ir_node *)reg));
fprintf (F, "\" targetname: \"");
PRINT_NODEID(get_nodes_block(skip_Proj(get_Block_cfgpred((ir_node *)reg, i))));