-void clear_backedges (ir_node *n) {
- int i, rem = interprocedural_view;
- int *ba;
- interprocedural_view = 0;
- ba = get_backarray (n);
- if (ba)
- for (i = 0; i < get_irn_arity(n); i++)
- ba[i] = 0;
- interprocedural_view = 1;
- ba = get_backarray (n);
- if (ba)
- for (i = 0; i < get_irn_arity(n); i++)
- ba[i] = 0;
- interprocedural_view = rem;
+void clear_backedges(ir_node *n) {
+ int i, arity;
+ unsigned *ba;
+#ifdef INTERPROCEDURAL_VIEW
+ int rem = get_interprocedural_view();
+ set_interprocedural_view(0);
+#endif
+ ba = get_backarray(n);
+ if (ba) {
+ arity = get_irn_arity(n);
+ for (i = 0; i < arity; i++)
+ rbitset_clear(ba, i);
+ }
+#ifdef INTERPROCEDURAL_VIEW
+ set_interprocedural_view(1);
+ ba = get_backarray (n);
+ if (ba) {
+ arity = get_irn_arity(n);
+ for (i = 0; i < arity; i++)
+ rbitset_clear(ba, i);
+ }
+ set_interprocedural_view(rem);
+#endif
+}
+
+/* Allocate a new backedge array on the obstack for given size. */
+unsigned *new_backedge_arr(struct obstack *obst, unsigned size) {
+ return rbitset_w_size_obstack_alloc(obst, size);
+}
+
+/* TODO: add an ir_op operation */
+void new_backedge_info(ir_node *n) {
+ switch (get_irn_opcode(n)) {
+ case iro_Block:
+ n->attr.block.cg_backedge = NULL;
+ n->attr.block.backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+ break;
+ case iro_Phi:
+ n->attr.phi.u.backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+ break;
+ case iro_Filter:
+ n->attr.filter.backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+ break;
+ default: ;
+ }