! { dg-additional-options "-fdump-tree-gimple" } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 5 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 5 "gimple" } } module m use omp_lib use iso_c_binding implicit none (type, external) integer(c_intptr_t) :: intptr contains integer function one () integer :: sum, i !$omp allocate(sum) ! { dg-final { scan-tree-dump-times "sum\\.\[0-9\]+ = __builtin_GOMP_alloc \\(4, 4, 0B\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(sum\\.\[0-9\]+, 0B\\);" 1 "gimple" } } ! NOTE: Initializer cannot be omp_init_allocator - as 'A' is ! in the same scope and the auto-omp_free comes later than ! any omp_destroy_allocator. integer(omp_allocator_handle_kind) :: my_allocator = omp_low_lat_mem_alloc integer :: n = 25 sum = 0 block type(omp_alloctrait) :: traits(1) = [ omp_alloctrait(omp_atk_alignment, 64) ] integer :: A(n) !$omp allocate(A) align(128) allocator(my_allocator) ! { dg-final { scan-tree-dump-times "a = __builtin_GOMP_alloc \\(128, D\\.\[0-9\]+, D\\.\[0-9\]+\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(a, 0B\\);" 1 "gimple" } } if (mod (transfer(loc(A), intptr), 128_c_intptr_t) /= 0) & stop 2 do i = 1, n A(i) = i end do my_allocator = omp_init_allocator(omp_low_lat_mem_space,1,traits) block integer B(n) integer C(5) !$omp allocate(B,C) allocator(my_allocator) ! { dg-final { scan-tree-dump-times "b = __builtin_GOMP_alloc \\(\[0-9\]+, D\\.\[0-9\]+, D\\.\[0-9\]+\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "c\\.\[0-9\]+ = __builtin_GOMP_alloc \\(\[0-9\]+, 20, D\\.\[0-9\]+\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(b, 0B\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(c\\.\[0-9\]+, 0B\\);" 1 "gimple" } } integer :: D(5) !$omp allocate(D) align(256) ! { dg-final { scan-tree-dump-times "d\\.\[0-9\]+ = __builtin_GOMP_alloc \\(256, 20, 0B\\);" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(d\\.\[0-9\]+, 0B\\);" 1 "gimple" } } B = 0 C = [1,2,3,4,5] D = [11,22,33,44,55] if (mod (transfer(loc(B), intptr), 64_c_intptr_t) /= 0) & stop 3 if (mod (transfer(loc(C), intptr), 64_c_intptr_t) /= 0) & stop 4 if (mod (transfer(loc(D), intptr), 256_c_intptr_t) /= 0) & stop 5 do i = 1, 5 if (C(i) /= i) & stop 6 if (D(i) /= i + 10*i) & stop 7 end do do i = 1, n if (B(i) /= 0) & stop 9 sum = sum + A(i)+B(i)+C(mod(i,5)+1)+D(mod(i,5)+1) end do end block call omp_destroy_allocator (my_allocator) end block one = sum end end module use m if (one () /= 1225) & stop 1 end