| !===----------------------------------------------------------------------===! |
| ! This directory can be used to add Integration tests involving multiple |
| ! stages of the compiler (for eg. from Fortran to LLVM IR). It should not |
| ! contain executable tests. We should only add tests here sparingly and only |
| ! if there is no other way to test. Repeat this message in each test that is |
| ! added to this directory and sub-directories. |
| !===----------------------------------------------------------------------===! |
| |
| !RUN: %flang_fc1 -emit-llvm -fopenmp %s -o - | FileCheck %s --check-prefixes HOST,ALL |
| !RUN: %flang_fc1 -emit-llvm -fopenmp -fopenmp-is-target-device %s -o - | FileCheck %s --check-prefixes DEVICE,ALL |
| |
| !HOST: define {{.*}}@{{.*}}before{{.*}}( |
| !DEVICE-NOT: define {{.*}}@before{{.*}}( |
| !DEVICE-NOT: declare {{.*}}@before{{.*}} |
| integer function before(x) |
| integer, intent(in) :: x |
| before = x + 200 |
| end function |
| |
| !ALL: define {{.*}}@{{.*}}main{{.*}}( |
| program main |
| integer :: x, before, after |
| !$omp target map(tofrom : x) |
| x = 100 |
| !$omp end target |
| !HOST: call {{.*}}@{{.*}}before{{.*}}( |
| !DEVICE-NOT: call {{.*}}@before{{.*}}( |
| !HOST: call {{.*}}@{{.*}}after{{.*}}( |
| !DEVICE-NOT: call {{.*}}@after{{.*}}( |
| x = x + before(x) + after(x) |
| end program |
| |
| !HOST: define {{.*}}@{{.*}}after{{.*}}( |
| !DEVICE-NOT: define {{.*}}@after{{.*}}( |
| !DEVICE-NOT: declare {{.*}}@after{{.*}} |
| integer function after(x) |
| integer, intent(in) :: x |
| after = x + 300 |
| end function |
| |
| !ALL: define {{.*}}@{{.*}}before_target{{.*}}( |
| subroutine before_target(x) |
| integer, intent(out) :: x |
| !$omp target map(from: x) |
| x = 1 |
| !$omp end target |
| end subroutine |
| |
| !ALL: define {{.*}}@{{.*}}middle{{.*}}( |
| subroutine middle() |
| integer :: x |
| !$omp target map(from: x) |
| x = 0 |
| !$omp end target |
| !HOST: call {{.*}}@{{.*}}before_target{{.*}}( |
| !DEVICE-NOT: call {{.*}}@{{.*}}before_target{{.*}}( |
| !HOST: call {{.*}}@{{.*}}after_target{{.*}}( |
| !DEVICE-NOT: call {{.*}}@{{.*}}after_target{{.*}}( |
| call before_target(x) |
| call after_target(x) |
| end subroutine |
| |
| !ALL: define {{.*}}@{{.*}}after_target{{.*}}( |
| subroutine after_target(x) |
| integer, intent(out) :: x |
| !$omp target map(from:x) |
| x = 2 |
| !$omp end target |
| end subroutine |