https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103662

            Bug ID: 103662
           Summary: TBAA problem in Fortran FE triggering in
                    gfortran.dg/unlimited_polymorphic_3.f03
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hubicka at gcc dot gnu.org
  Target Milestone: ---

In this testcase we have:

void foo (struct __class__STAR_p & restrict tgt)
{
  struct s * ptr1;
  integer(kind=4) _1;

  <bb 2> [local count: 1073741824]:
  ptr1_4 = *tgt_3(D)._data;
  _1 = *ptr1_4.k;
  if (_1 != 42)
    goto <bb 3>; [0.04%]
  else
    goto <bb 4>; [99.96%]

  <bb 3> [local count: 429496]:
  _gfortran_stop_numeric (2, 0);

  <bb 4> [local count: 1073312329]:
  return;

}

The load ptr1_4 = *tgt_3(D)._data has alias sets:
 - Analyzing load: *tgt_3(D)._data
   - Recording base_set=9 ref_set=5  Parm 0 param offset:0 offset:0 size:64
max_size:64
 - Analyzing load: *ptr1_4.k
   - Recording base_set=11 ref_set=2 

Now the value is set in main:

void MAIN__ ()
{
  integer(kind=8) y$_len;
  struct __vtype__STAR * {ref-all} y$_vptr;
  void * y$_data;
  struct __class__STAR_p z;
  struct __class__STAR_p y;
  struct sq x;
  static struct __vtype_main_Sq __vtab_main_Sq = {._hash=85658372, ._size=4,
._extends=0B, ._def_init=&__def_init_main_Sq, ._copy=__copy_main_Sq,
._final=0B, ._deallocate=0B};
  static struct sq __def_init_main_Sq;

  <bb 2> [local count: 1073741824]:
  x.i = 42;
  z._vptr = &__vtab_main_Sq;
  z._len = 0;
  z._data = &x;
  foo (&z);
  bar ();
  x ={v} {CLOBBER};
  y ={v} {CLOBBER};
  z ={v} {CLOBBER};
  return;

}

here however the z._data store is:
ipa-modref: call stmt foo (&z);                                                 
ipa-modref: call to foo/0 does not use ref: z._data alias sets: 4->5            
  Deleted dead store: z._data = &x;                                             

So it has base alias set 4 which is not considered aliasing with alias set 9. 
With mainline version of modref we do not perform the optimization because we
are paranoid about _gfortran_stop_numeric (2, 0); possibly accessing something.
If this is replaced by code that does not perform call we get wrong code with
-Os.

So __class__STAR_p is produced twice while it should not be.

Reply via email to