193 lines · plain
1!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 %s -o - | FileCheck %s2!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -fopenmp-is-target-device %s -o - | FileCheck %s --check-prefix=DEVICE3!RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=52 %s -o - | FileCheck %s4!RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=52 -fopenmp-is-target-device %s -o - | FileCheck %s --check-prefix=DEVICE5 6! CHECK-LABEL: func.func @_QPimplicitly_captured_twice7! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}8function implicitly_captured_twice() result(k)9 integer :: i10 i = 1011 k = i12end function implicitly_captured_twice13 14! CHECK-LABEL: func.func @_QPtarget_function_twice_host15! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (enter), automap = false>{{.*}}}16function target_function_twice_host() result(i)17!$omp declare target enter(target_function_twice_host) device_type(host)18 integer :: i19 i = implicitly_captured_twice()20end function target_function_twice_host21 22! DEVICE-LABEL: func.func @_QPtarget_function_twice_device23! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}24function target_function_twice_device() result(i)25!$omp declare target enter(target_function_twice_device) device_type(nohost)26 integer :: i27 i = implicitly_captured_twice()28end function target_function_twice_device29 30!! -----31 32! DEVICE-LABEL: func.func @_QPimplicitly_captured_nest33! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}34function implicitly_captured_nest() result(k)35 integer :: i36 i = 1037 k = i38end function implicitly_captured_nest39 40! DEVICE-LABEL: func.func @_QPimplicitly_captured_one41! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter){{.*}}}42function implicitly_captured_one() result(k)43 k = implicitly_captured_nest()44end function implicitly_captured_one45 46! DEVICE-LABEL: func.func @_QPimplicitly_captured_two47! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}48function implicitly_captured_two() result(k)49 integer :: i50 i = 1051 k = i52end function implicitly_captured_two53 54! DEVICE-LABEL: func.func @_QPtarget_function_test55! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}56function target_function_test() result(j)57!$omp declare target enter(target_function_test) device_type(nohost)58 integer :: i, j59 i = implicitly_captured_one()60 j = implicitly_captured_two() + i61end function target_function_test62 63!! -----64 65! CHECK-LABEL: func.func @_QPimplicitly_captured_nest_twice66! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}67function implicitly_captured_nest_twice() result(k)68 integer :: i69 i = 1070 k = i71end function implicitly_captured_nest_twice72 73! CHECK-LABEL: func.func @_QPimplicitly_captured_one_twice74! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}75function implicitly_captured_one_twice() result(k)76 k = implicitly_captured_nest_twice()77end function implicitly_captured_one_twice78 79! CHECK-LABEL: func.func @_QPimplicitly_captured_two_twice80! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}81function implicitly_captured_two_twice() result(k)82 integer :: i83 i = 1084 k = i85end function implicitly_captured_two_twice86 87! DEVICE-LABEL: func.func @_QPtarget_function_test_device88! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}89function target_function_test_device() result(j)90 !$omp declare target enter(target_function_test_device) device_type(nohost)91 integer :: i, j92 i = implicitly_captured_one_twice()93 j = implicitly_captured_two_twice() + i94end function target_function_test_device95 96! CHECK-LABEL: func.func @_QPtarget_function_test_host97! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (enter), automap = false>{{.*}}}98function target_function_test_host() result(j)99 !$omp declare target enter(target_function_test_host) device_type(host)100 integer :: i, j101 i = implicitly_captured_one_twice()102 j = implicitly_captured_two_twice() + i103end function target_function_test_host104 105!! -----106 107! DEVICE-LABEL: func.func @_QPimplicitly_captured_with_dev_type_recursive108! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}109recursive function implicitly_captured_with_dev_type_recursive(increment) result(k)110!$omp declare target enter(implicitly_captured_with_dev_type_recursive) device_type(host)111 integer :: increment, k112 if (increment == 10) then113 k = increment114 else115 k = implicitly_captured_with_dev_type_recursive(increment + 1)116 end if117end function implicitly_captured_with_dev_type_recursive118 119! DEVICE-LABEL: func.func @_QPtarget_function_with_dev_type_recurse120! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}121function target_function_with_dev_type_recurse() result(i)122!$omp declare target enter(target_function_with_dev_type_recurse) device_type(nohost)123 integer :: i124 i = implicitly_captured_with_dev_type_recursive(0)125end function target_function_with_dev_type_recurse126 127!! -----128 129module test_module130contains131! CHECK-LABEL: func.func @_QMtest_modulePimplicitly_captured_nest_twice132! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}133 function implicitly_captured_nest_twice() result(i)134 integer :: i135 i = 10136 end function implicitly_captured_nest_twice137 138! CHECK-LABEL: func.func @_QMtest_modulePimplicitly_captured_one_twice139! CHECK-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = false>{{.*}}}140 function implicitly_captured_one_twice() result(k)141 !$omp declare target enter(implicitly_captured_one_twice) device_type(host)142 k = implicitly_captured_nest_twice()143 end function implicitly_captured_one_twice144 145! DEVICE-LABEL: func.func @_QMtest_modulePimplicitly_captured_two_twice146! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}147 function implicitly_captured_two_twice() result(y)148 integer :: y149 y = 5150 end function implicitly_captured_two_twice151 152! DEVICE-LABEL: func.func @_QMtest_modulePtarget_function_test_device153! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}154 function target_function_test_device() result(j)155 !$omp declare target enter(target_function_test_device) device_type(nohost)156 integer :: i, j157 i = implicitly_captured_one_twice()158 j = implicitly_captured_two_twice() + i159 end function target_function_test_device160end module test_module161 162!! -----163 164program mb165 interface166 subroutine caller_recursive167 !$omp declare target enter(caller_recursive) device_type(nohost)168 end subroutine169 170 recursive subroutine implicitly_captured_recursive(increment)171 integer :: increment172 end subroutine173 end interface174end program175 176! DEVICE-LABEL: func.func @_QPimplicitly_captured_recursive177! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}178recursive subroutine implicitly_captured_recursive(increment)179 integer :: increment180 if (increment == 10) then181 return182 else183 call implicitly_captured_recursive(increment + 1)184 end if185end subroutine186 187! DEVICE-LABEL: func.func @_QPcaller_recursive188! DEVICE-SAME: {{.*}}attributes {omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (enter), automap = false>{{.*}}}189subroutine caller_recursive190!$omp declare target enter(caller_recursive) device_type(nohost)191 call implicitly_captured_recursive(0)192end subroutine193