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