-
-
-INLINE void fix_backedges(struct obstack *obst, ir_node *n) {
- opcode opc = get_irn_opcode(n);
- int *arr = mere_get_backarray(n);
- if (ARR_LEN(arr) == ARR_LEN(get_irn_in(n))-1)
- return;
- if (ARR_LEN(arr) != ARR_LEN(get_irn_in(n))-1) {
- arr = new_backedge_arr(obst, ARR_LEN(get_irn_in(n))-1);
- if (opc == iro_Phi) n->attr.phi_backedge = arr;
- if ((opc == iro_Block) && !interprocedural_view)
- n->attr.block.backedge = arr;
- if ((opc == iro_Block) && interprocedural_view)
- n->attr.block.cg_backedge = arr;
- if (opc == iro_Filter) n->attr.filter.backedge = arr;
- return;
- }
- assert(legal_backarray(n));
- // @@@ more efficient in memory consumption, not possible with
- // array implementation.
- //if (ARR_LEN(arr) < ARR_LEN(get_irn_in(n))-1) {
- // ARR_SETLEN(int, arr, ARR_LEN(get_irn_in(n))-1);
- //}
+#endif
+
+void fix_backedges(struct obstack *obst, ir_node *n)
+{
+ bitset_t *arr = mere_get_backarray(n);
+ unsigned opc;
+ int arity;
+
+ if (! arr)
+ return;
+
+ arity = get_irn_arity(n);
+ if (bitset_size(arr) != (unsigned) arity) {
+ arr = new_backedge_arr(obst, arity);
+
+ opc = get_irn_opcode(n);
+ if (opc == iro_Phi)
+ n->attr.phi.u.backedge = arr;
+ else if (opc == iro_Block) {
+ n->attr.block.backedge = arr;
+ }
+ }
+
+ assert(legal_backarray(n));