! { dg-additional-options "-fdump-tree-omplower" } ! For the 4 vars in omp_parallel, 4 in omp_target and 2 in no_alloc2_func. ! { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 10 "omplower" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 10 "omplower" } } module m use iso_c_binding use omp_lib implicit none (type, external) integer(c_intptr_t) :: intptr contains subroutine check_int (x, y) integer :: x, y value :: y if (x /= y) & stop 1 end subroutine check_ptr (x, y) type(c_ptr) :: x integer(c_intptr_t), value :: y if (transfer(x,intptr) /= y) & stop 2 end integer function no_alloc_func () result(res) ! There is no __builtin_GOMP_alloc / __builtin_GOMP_free as ! allocator == omp_default_mem_alloc (known at compile time. integer :: no_alloc !$omp allocate(no_alloc) allocator(omp_default_mem_alloc) no_alloc = 7 res = no_alloc end integer function no_alloc2_func() result(res) ! If no_alloc2 were TREE_UNUSED, there would be no ! __builtin_GOMP_alloc / __builtin_GOMP_free ! However, as the parser already marks no_alloc2 ! and is_alloc2 as used, the tree is generated for both vars. integer :: no_alloc2, is_alloc2 !$omp allocate(no_alloc2, is_alloc2) is_alloc2 = 7 res = is_alloc2 end subroutine omp_parallel () integer :: i, n, iii, jjj(5) type(c_ptr) :: ptr !$omp allocate(iii, jjj, ptr) n = 6 iii = 5 ptr = transfer (int(z'1234', c_intptr_t), ptr) block integer :: kkk(n) !$omp allocate(kkk) do i = 1, 5 jjj(i) = 3*i end do do i = 1, 6 kkk(i) = 7*i end do !$omp parallel default(none) firstprivate(iii, jjj, kkk, ptr) if(.false.) if (iii /= 5) & stop 3 iii = 7 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 3*i) & stop 4 end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 5 end do do i = 1, 5 jjj(i) = 4*i end do do i = 1, 6 kkk(i) = 8*i end do do i = 1, 5 call check_int (jjj(i), 4*i) end do do i = 1, 6 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 6 ptr = transfer (int(z'abcd', c_intptr_t), ptr) if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 7 call check_ptr (ptr, int(z'abcd', c_intptr_t)) !$omp end parallel if (iii /= 5) & stop 8 call check_int (iii, 5) do i = 1, 5 if (jjj(i) /= 3*i) & stop 9 call check_int (jjj(i), 3*i) end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 10 call check_int (kkk(i), 7*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 11 call check_ptr (ptr, int(z'1234', c_intptr_t)) !$omp parallel default(firstprivate) if(.false.) if (iii /= 5) & stop 12 iii = 7 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 3*i) & stop 13 end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 14 end do do i = 1, 5 jjj(i) = 4*i end do do i = 1, 6 kkk(i) = 8*i end do do i = 1, 5 call check_int (jjj(i), 4*i) end do do i = 1, 6 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 15 ptr = transfer (int (z'abcd', c_intptr_t), ptr) if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 16 call check_ptr (ptr, int (z'abcd', c_intptr_t)) !$omp end parallel if (iii /= 5) & stop 17 call check_int (iii, 5) do i = 1, 5 if (jjj(i) /= 3*i) & stop 18 call check_int (jjj(i), 3*i) end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 19 call check_int (kkk(i), 7*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 20 call check_ptr (ptr, int (z'1234', c_intptr_t)) end block end subroutine omp_target () integer :: i, n, iii, jjj(5) type(c_ptr) :: ptr !$omp allocate(iii, jjj, ptr) n = 6 iii = 5 ptr = transfer (int (z'1234', c_intptr_t), ptr) block integer :: kkk(n) !$omp allocate(kkk) do i = 1, 5 jjj(i) = 3*i end do do i = 1, 6 kkk(i) = 7*i end do !$omp target defaultmap(none) firstprivate(iii, jjj, kkk, ptr) private(i) if (iii /= 5) & stop 21 iii = 7 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 3*i) & stop 22 end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 23 end do do i = 1, 5 jjj(i) = 4*i end do do i = 1, 6 kkk(i) = 8*i end do do i = 1, 5 call check_int (jjj(i), 4*i) end do do i = 1, 6 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 24 ptr = transfer (int (z'abcd', c_intptr_t), ptr) if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 25 call check_ptr (ptr, int (z'abcd', c_intptr_t)) !$omp end target if (iii /= 5) & stop 26 call check_int (iii, 5) do i = 1, 5 if (jjj(i) /= 3*i) & stop 27 call check_int (jjj(i), 3*i) end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 28 call check_int (kkk(i), 7*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 29 call check_ptr (ptr, int (z'1234', c_intptr_t)) !$omp target defaultmap(firstprivate) if (iii /= 5) & stop 30 iii = 7 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 3*i) & stop 31 end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 32 end do do i = 1, 5 jjj(i) = 4*i end do do i = 1, 6 kkk(i) = 8*i end do do i = 1, 5 call check_int (jjj(i), 4*i) end do do i = 1, 6 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 33 ptr = transfer (int (z'abcd', c_intptr_t), ptr) if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 34 call check_ptr (ptr, int (z'abcd', c_intptr_t)) !$omp end target if (iii /= 5) & stop 35 call check_int (iii, 5) do i = 1, 5 if (jjj(i) /= 3*i) & stop 36 call check_int (jjj(i), 3*i) end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 37 call check_int (kkk(i), 7*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 38 call check_ptr (ptr, int (z'1234', c_intptr_t)) !$omp target defaultmap(tofrom) if (iii /= 5) & stop 39 iii = 7 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 3*i) & stop 40 end do do i = 1, 6 if (kkk(i) /= 7*i) & stop 41 end do do i = 1, 5 jjj(i) = 4*i end do do i = 1, 6 kkk(i) = 8*i end do do i = 1, 5 call check_int (jjj(i), 4*i) end do do i = 1, 6 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) & stop 42 ptr = transfer (int(z'abcd',c_intptr_t), ptr) if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 43 call check_ptr (ptr, int (z'abcd', c_intptr_t)) !$omp end target if (iii /= 7) & stop 44 call check_int (iii, 7) do i = 1, 5 if (jjj(i) /= 4*i) & stop 45 call check_int (jjj(i), 4*i) end do do i = 1, 6 if (kkk(i) /= 8*i) & stop 46 call check_int (kkk(i), 8*i) end do if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) & stop 47 call check_ptr (ptr, int (z'abcd', c_intptr_t)) end block end end module use m call omp_parallel () call omp_target () end