Hello, > >Remarks: > >-- it would be guaranteed that the indices of each memory reference are > > independent, i.e., that &ref[idx1][idx2] == &ref[idx1'][idx2'] only > > if idx1 == idx1' and idx2 = idx2'; this is important for dependency > > analysis (and for this reason we also need to remember the list of > > indices, rather than trying to reconstruct them from the address). > > I didn't completely think through this, > but how would this property help in the presence of array flattening ? > e.g. suppose two adjacent loops, both two-nest-deep, > and only one of them is flattened, then > one loop will have one dimensional access (hence will have only one index) > vs the other loop will have two dimensional. > In other words, &ref[idx1] == &ref[idx1'][idx2'] can happen.
this cannot happen. Suppose you have a declaration int ref[100][100]; Then the first reference would be represented as tmp = (int (*)[10000])) &ref; tmp[idx1] It cannot have ref as its base. Similarly, if one wanted to implement the reverse transformation, recovering multidimensional arrays from the flat representation, he would have to transform int a[10000]; for (i = 0; i < 100; i++) for (j = 0; j < 100; j++) a[100 * i + j] = ... to tmp = (int (*)[100][100]) &a; for (i = 0; i < 100; i++) for (j = 0; j < 100; j++) ref with base: tmp, indices: (i,j) = ... > Another question is, how would the representation look > for more complicated address calculations > e.g. a closed hashtable access like: > > table[hash_value % hash_size] > > and would it help in such cases ? I am not quite sure what you ask for here; this would just be represented as idx = hash_value % hash_size; and reference with base: table, indices: (idx) Zdenek