This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: *ping* - Re: [Patch, Fortran] Add end-of-scope finalization (Part 2 of 2)


Dear Tobias,

Nit pick: I find that '(\\(integer\\(kind=8\\)\\) )?'  is easier to parse
than '(\\(integer\\(kind=8\\)\\) |)' (a matter of taste and I won't argue
about it).

> > /opt/gcc/work/gcc/testsuite/gfortran.dg/class_48.f90: In function '__final_test2_T.2138.constprop.0':
> > /opt/gcc/work/gcc/testsuite/gfortran.dg/class_48.f90:39:0: warning: iteration 2147483648 invokes undefined behavior [-Waggressive-loop-optimizations]
> >       class(t), allocatable :: a
>   ^
> 
> I have not fully understood why this happens.  It seems to have something
> to do with cloning/const propagation.  Looking at the original dump, the
> optimized dump at -O0, -O2 and -O3 - and at the FE code -, I believe the
> generated code is correct.
> 
> The cloning propagates the rank == 1 into the cloned finalizer, which
> permits to drastically simplify the scalarizer.  That allows to remove
> one loop (the one which is warned about?)  and to simplify another loop
> into a single trip.
> 
> Thus, my working hypothesis is that either the warning is wrong or that
> something goes wrong with the loop optimization, triggering the warning.

>From the above, I am not sure if you see the warning. Do you see it?
If yes, what are you planning?

If I comment the lines

allocate (two%a)
!  one = two
!  if (.not.allocated (one%a)) call abort ()
!  if (allocated (one%a%x)) call abort ()

allocate (two%a%x(2))
two%a%x(:) = 7890
!  one = two
!  if (any (one%a%x /= 7890)) call abort ()

the test compiles without warning and runs without failure while compiling
the following reduced test

subroutine test2 ()
  type t
    integer, allocatable :: x(:)
  end type t

  type t2
    class(t), allocatable :: a
  end type t2

  type(t2) :: one, two

  allocate (two%a)
  one = two
end subroutine test2

call test2 ()
end

gives the warning. If I grep for 'final' in 
class_48_red.f90.165t.optimized I see

;; Function __final_test2_T (__final_test2_T.1908, funcdef_no=1, decl_uid=1908, symbol_order=0)
__final_test2_T (struct array7_t & restrict array, integer(kind=8) byte_stride, logical(kind=1) fini_coarray)
  static struct __vtype_test2_T __vtab_test2_T = {._hash=84164405, ._size=48, ._extends=0B, ._def_init=&__def_init_test2_T, ._copy=__copy_test2_T, ._final=__final_test2_T};
  __final_test2_T (&desc.7, _25, 1);
  __final_test2_T (&desc.8, _25, 1);

with -O2 and -m64, but

;; Function __final_test2_T.1854.constprop.0 (__final_test2_T.1854.constprop.0, funcdef_no=5, decl_uid=2159, symbol_order=16)
__final_test2_T.1854.constprop.0 (struct array7_t & restrict array, integer(kind=4) byte_stride, logical(kind=1) fini_coarray)
  __final_test2_T.1854.constprop.0 (&desc.7, 24, 1);
  __final_test2_T.1854.constprop.0 (&desc.8, 24, 1);

with -O2 and -m32. With -O3 the last two lines of the above are no longer 
present with -m64, while there is no final with -m32.

Dominique



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]