| ! { dg-additional-options "-fdump-tree-gimple" } |
| module m |
| use iso_c_binding |
| use omp_lib |
| implicit none (type, external) |
| integer(c_intptr_t) :: intptr |
| |
| ! { dg-final { scan-tree-dump-not "__builtin_stack_save" "gimple" } } |
| ! { dg-final { scan-tree-dump-not "__builtin_alloca" "gimple" } } |
| ! { dg-final { scan-tree-dump-not "__builtin_stack_restore" "gimple" } } |
| |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 5 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 5 "gimple" } } |
| |
| contains |
| |
| subroutine one () |
| integer :: result, n, i |
| result = 0 |
| n = 3 |
| !$omp target map(tofrom: result) firstprivate(n) |
| block |
| integer :: var, var2(n) |
| !$omp allocate(var,var2) align(128) allocator(omp_low_lat_mem_alloc) |
| var = 5 |
| ! { dg-final { scan-tree-dump-times "var\\.\[0-9\]+ = __builtin_GOMP_alloc \\(128, 4, 5\\);" 1 "gimple" } } */ |
| ! { dg-final { scan-tree-dump-times "var2 = __builtin_GOMP_alloc \\(128, D\\.\[0-9\]+, 5\\);" 1 "gimple" } } */ |
| |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(var\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */ |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(var2, 0B\\);" 1 "gimple" } } */ |
| |
| if (mod(transfer(loc(var), intptr), 128_c_intptr_t) /= 0) & |
| stop 1 |
| if (mod(transfer(loc(var2), intptr), 128_c_intptr_t) /= 0) & |
| stop 2 |
| if (var /= 5) & |
| stop 3 |
| |
| !$omp parallel do |
| do i = 1, n |
| var2(i) = (i+32); |
| end do |
| |
| !$omp parallel loop reduction(+:result) |
| do i = 1, n |
| result = result + var + var2(i) |
| end do |
| end block |
| if (result /= (3*5 + 33 + 34 + 35)) & |
| stop 4 |
| end |
| |
| subroutine two () |
| type st |
| integer :: a, b |
| end type |
| integer :: scalar, array(5), i |
| type(st) s |
| !$omp allocate(scalar, array, s) |
| ! { dg-final { scan-tree-dump-times "scalar\\.\[0-9\]+ = __builtin_GOMP_alloc \\(4, 4, 0B\\);" 1 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "array\\.\[0-9\]+ = __builtin_GOMP_alloc \\(4, 20, 0B\\);" 1 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "s\\.\[0-9\]+ = __builtin_GOMP_alloc \\(4, 8, 0B\\);" 1 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(scalar\\.\[0-9\]+, 0B\\);" 1 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(array\\.\[0-9\]+, 0B\\);" 1 "gimple" } } |
| ! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(s\\.\[0-9\]+, 0B\\);" 1 "gimple" } } |
| |
| scalar = 44 |
| array = [1,2,3,4,5] |
| s = st(a=11, b=56) |
| |
| !$omp parallel firstprivate(scalar) firstprivate(array) firstprivate(s) |
| if (scalar /= 44) & |
| stop 5 |
| scalar = 33; |
| if (any (array /= [1,2,3,4,5])) & |
| stop 6 |
| array = [10,20,30,40,50] |
| if (s%a /= 11 .or. s%b /= 56) & |
| stop 7 |
| s%a = 74 |
| s%b = 674 |
| !$omp end parallel |
| |
| if (scalar /= 44) & |
| stop 8 |
| if (any (array /= [1,2,3,4,5])) & |
| stop 9 |
| if (s%a /= 11 .or. s%b /= 56) & |
| stop 10 |
| |
| !$omp target defaultmap(firstprivate : scalar) defaultmap(none : aggregate) defaultmap(none : pointer) |
| if (scalar /= 44) & |
| stop 11 |
| scalar = 33; |
| !$omp end target |
| |
| if (scalar /= 44) & |
| stop 12 |
| |
| !$omp target defaultmap(none : scalar) defaultmap(firstprivate : aggregate) defaultmap(none : pointer) private(i) |
| if (any (array /= [1,2,3,4,5])) & |
| stop 13 |
| do i = 1, 5 |
| array(i) = 10*i |
| end do |
| !$omp end target |
| |
| if (any(array /= [1,2,3,4,5])) & |
| stop 13 |
| !$omp target defaultmap(none : scalar) defaultmap(firstprivate : aggregate) defaultmap(none : pointer) |
| if (s%a /= 11 .or. s%b /= 56) & |
| stop 14 |
| s%a = 74 |
| s%b = 674 |
| !$omp end target |
| if (s%a /= 11 .or. s%b /= 56) & |
| stop 15 |
| end |
| end module |
| |
| use m |
| call one () |
| call two () |
| end |