[llvm] [openmp] [OpenMP] Fix target data region codegen being omitted for device pass (PR #85218)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 14 05:47:19 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: Akash Banerjee (TIFitis)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/85218.diff
2 Files Affected:
- (modified) llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp (+4-1)
- (added) openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90 (+31)
``````````diff
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index f6cf358119fb71..bd58f9ebba1c21 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4791,8 +4791,11 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createTargetData(
return InsertPointTy();
// Disable TargetData CodeGen on Device pass.
- if (Config.IsTargetDevice.value_or(false))
+ if (Config.IsTargetDevice.value_or(false)){
+ if(BodyGenCB)
+ Builder.restoreIP(BodyGenCB(Builder.saveIP(), BodyGenTy::NoPriv));
return Builder.saveIP();
+ }
Builder.restoreIP(CodeGenIP);
bool IsStandAlone = !BodyGenCB;
diff --git a/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90 b/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
new file mode 100644
index 00000000000000..5508690c82ddd9
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
@@ -0,0 +1,31 @@
+! Basic offloading test of arrays with provided lower
+! and upper bounds as specified by OpenMP's sectioning
+! REQUIRES: flang
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ integer :: A(10), B(10), C(10)
+
+ do I = 1, 10
+ A(I) = 1
+ B(I) = 2
+ end do
+ !$omp target data map(to: A, B) map(alloc: C)
+ !$omp target map(from: C)
+ do I = 1, 10
+ C(I) = A(I) + B(I) ! assigns 3, A:1 + B:2
+ end do
+ !$omp end target
+ !$omp target update from(C) ! updates C device -> host
+ !$omp end target data
+
+ print *, C ! should be all 3's
+
+end program
+
+! CHECK: 3 3 3 3 3 3 3 3 3 3
``````````
</details>
https://github.com/llvm/llvm-project/pull/85218
More information about the llvm-commits
mailing list