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

            Bug ID: 90743
           Summary: Device-side 'malloc' for Fortran 'allocatable' scalar
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Keywords: openacc, openmp
          Severity: enhancement
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

As '-fdump-tree-original' shows, for:

    program main
      implicit none
      integer, allocatable :: c

      allocate (c)

      c = 25

      !$omp target map(from: c)
      !$acc parallel copyout(c)
      c = 52
      !$acc end parallel
      !$omp end target

      if (c /= 52) stop 2

      deallocate (c)
    end program main

... we currently generate code as follows:

    [...]
      *c = 25;
      #pragma omp target map(from:*c) map(alloc:c [pointer assign, bias: 0])
        {
          {
            {
              if (c != 0B) goto L.3;
              c = (integer(kind=4) *) __builtin_malloc (4);
              L.3:;
              *c = 52;
            }
          }
        }
    [...]

Same for OpenACC.

At least in the case of nvptx offloading that I just tried, we're not actually
executing that 'malloc' on the device.  Will this always be the case?  Could
code generation then be changed to turn this into an 'abort', to make this less
surprising for the human reader?

---

I just saw Jakub's Comment 1 in PR90741, so I suppose the 'c = 52' assignment
is where this device-side 'malloc' is coming from.

Reply via email to