Hi all, hi Richard,
On 27.08.21 21:48, Richard Biener wrote:
It looks really nice with "-O1 -fno-inline" :-)
The callee 'rank_p()' is mostly optimized and in the
caller only those struct elements are set, which are used:
integer(kind=4) rank_p (struct CFI_cdesc_t & _this)
{
_1 = _this_11(D)->base_addr;
_2 = _this_11(D)->rank;
...
rnk_13 = (integer(kind=4)) _2;
return rnk_13;
}
void selr_p ()
{
...
struct CFI_cdesc_t01 cfi.7;
...
<bb 2> [local count: 537730764]:
cfi.7.rank = 1;
cfi.7.base_addr = 0B;
You need to do the accesses above using the generic 't' type as well, otherwise
they are non-conflicting TBAA wise.
First, I wonder why the following works with C:
struct gen_t { int n; int dim[]; }
int f (struct gen_t *x) {
if (x->n > 1) x->dim[0] = 5;
return x->n;
}
void test() {
struct { int n; int dim[2]; } y;
y.n = 2;
f ((struct gen_t*) &y);
}
Or doesn't it? In any case, that's how it is suggested
and 'y.n' is not accessed using 'gen_t' – there is only
a cast in the function call. (Which is not sufficient
in the Fortran FE-code generated code – as tried)
* * *
Otherwise, I can confirm that the following works.
Does this original dump now looks fine?
struct CFI_cdesc_t01 cfi.2;
...
((struct CFI_cdesc_t *) &cfi.2)->version = 1;
((struct CFI_cdesc_t *) &cfi.2)->rank = 1;
((struct CFI_cdesc_t *) &cfi.2)->type = 1025;
((struct CFI_cdesc_t *) &cfi.2)->attribute = 0;
((struct CFI_cdesc_t *) &cfi.2)->base_addr = intp.data;
((struct CFI_cdesc_t *) &cfi.2)->elem_len = 4;
...
irnk = rank_p ((struct CFI_cdesc_t *) &cfi.2);
Thanks,
Tobias
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955