Hi, I am looking into DSE transformation of some fortran codes. Given below fortran declarations:
real*8 a(len) , b(len) , c(len) , d(len) common /area/ a, b, c, d real*8 src1(len), temp1(len), temp2(len), src2(len) equivalence (src1, a), (src2, b), (temp1, c), (temp2, d) with my limited understanding of fortran, the layout should be like: struct area { union {double src1[len]; double a[len]}; union {double temp1[len]; double b[len]}; union {double temp2[len]; double c[len]}; union {double src2[len]; double d[len]}; }; When debugging in tree-ssa-dse.c, if I have memory reference like area.src1[idx], the type for area dumped is like: (gdb) call debug_generic_expr(ref1->exp.operands[0]) area (gdb) call debug_generic_expr(ref1->exp.operands[0]->typed.type) union { real(kind=8) src1[100]; real(kind=8) a[100]; real(kind=8) src2[100]; real(kind=8) b[100]; real(kind=8) temp1[100]; real(kind=8) c[100]; real(kind=8) temp2[100]; real(kind=8) d[100]; } I do noticed src1/src2 fields do have different offset, although they are put into a union type here. I suppose such type are generated by fortran front-end? Is it just because it's easy to do so? And any background comment/document about this? Unfortunately middle end misses lots of dead store, redundant load because of difficulty in alias check of such type information. I guess fully support alias check of this issue would be non-trivial, so any suggestions will be highly appreciated too. Thanks, bin