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

Reply via email to