| ! { 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 |