+ for (;;) {
+ if (is_Add(ptr)) {
+ ir_node *l = get_Add_left(ptr);
+ ir_node *r = get_Add_right(ptr);
+
+ if (get_irn_mode(l) != mode || !is_Const(r))
+ break;
+
+ offset += get_tarval_long(get_Const_tarval(r));
+ ptr = l;
+ } else if (is_Sub(ptr)) {
+ ir_node *l = get_Sub_left(ptr);
+ ir_node *r = get_Sub_right(ptr);
+
+ if (get_irn_mode(l) != mode || !is_Const(r))
+ break;
+
+ offset -= get_tarval_long(get_Const_tarval(r));
+ ptr = l;
+ } else if (is_Sel(ptr)) {
+ ir_entity *ent = get_Sel_entity(ptr);
+ ir_type *tp = get_entity_owner(ent);
+
+ if (is_Array_type(tp)) {
+ int size;
+ ir_node *index;
+
+ /* only one dimensional arrays yet */
+ if (get_Sel_n_indexs(ptr) != 1)
+ break;
+ index = get_Sel_index(ptr, 0);
+ if (! is_Const(index))
+ break;
+
+ tp = get_entity_type(ent);
+ if (get_type_state(tp) != layout_fixed)
+ break;
+
+ size = get_type_size_bytes(tp);
+ offset += size * get_tarval_long(get_Const_tarval(index));
+ } else {
+ if (get_type_state(tp) != layout_fixed)
+ break;
+ offset += get_entity_offset(ent);
+ }
+ ptr = get_Sel_ptr(ptr);
+ } else