[Openmp-commits] [llvm] [openmp] [OpenMP] Fix target data region codegen being omitted for device pass (PR #85218)
Akash Banerjee via Openmp-commits
openmp-commits at lists.llvm.org
Mon Mar 18 08:43:03 PDT 2024
https://github.com/TIFitis updated https://github.com/llvm/llvm-project/pull/85218
>From 81e72eeaea0db015f84c6fc93e8e9537d37a53a6 Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Thu, 14 Mar 2024 12:44:39 +0000
Subject: [PATCH 1/3] [OpenMP] Fix target data region codegen being ommitted
for device pass
---
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 5 ++-
.../fortran/target-nested-target-data.f90 | 31 +++++++++++++++++++
2 files changed, 35 insertions(+), 1 deletion(-)
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
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
>From 6bbd9d99dcb7264e610c52f63f06eb27cc4d683f Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Thu, 14 Mar 2024 12:58:31 +0000
Subject: [PATCH 2/3] Fix clang-format.
---
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index bd58f9ebba1c21..d9baf3fa82797f 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4791,8 +4791,8 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createTargetData(
return InsertPointTy();
// Disable TargetData CodeGen on Device pass.
- if (Config.IsTargetDevice.value_or(false)){
- if(BodyGenCB)
+ if (Config.IsTargetDevice.value_or(false)) {
+ if (BodyGenCB)
Builder.restoreIP(BodyGenCB(Builder.saveIP(), BodyGenTy::NoPriv));
return Builder.saveIP();
}
>From b78fbb1233dd5f8bc5a20198768bbf7ef9b56844 Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Mon, 18 Mar 2024 15:42:32 +0000
Subject: [PATCH 3/3] Added OpenMPIRBuilderTest for target-data device pass.
---
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 17 +++++++++++++++++
.../fortran/target-nested-target-data.f90 | 4 ++--
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index e79d0bb2f65aea..35f0591eda02ce 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -5711,6 +5711,23 @@ TEST_F(OpenMPIRBuilderTest, TargetDataRegion) {
EXPECT_TRUE(TargetDataCall->getOperand(2)->getType()->isIntegerTy(32));
EXPECT_TRUE(TargetDataCall->getOperand(8)->getType()->isPointerTy());
+ // Check that BodyGenCB is still made when IsTargetDevice is set to true.
+ OMPBuilder.Config.setIsTargetDevice(true);
+ bool CheckDevicePassBodyGen = false;
+ auto BodyTargetCB = [&](InsertPointTy CodeGenIP, BodyGenTy BodyGenType) {
+ CheckDevicePassBodyGen = true;
+ Builder.restoreIP(CodeGenIP);
+ CallInst *TargetDataCall =
+ dyn_cast<CallInst>(BB->back().getPrevNode()->getPrevNode());
+ // Make sure no begin_mapper call is present for device pass.
+ EXPECT_EQ(TargetDataCall, nullptr);
+ return Builder.saveIP();
+ };
+ Builder.restoreIP(OMPBuilder.createTargetData(
+ Loc, AllocaIP, Builder.saveIP(), Builder.getInt64(DeviceID),
+ /* IfCond= */ nullptr, Info, GenMapInfoCB, nullptr, BodyTargetCB));
+ EXPECT_TRUE(CheckDevicePassBodyGen);
+
Builder.CreateRetVoid();
EXPECT_FALSE(verifyModule(*M, &errs()));
}
diff --git a/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90 b/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
index 5508690c82ddd9..a694f2464546c5 100644
--- a/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
+++ b/openmp/libomptarget/test/offloading/fortran/target-nested-target-data.f90
@@ -1,5 +1,5 @@
-! Basic offloading test of arrays with provided lower
-! and upper bounds as specified by OpenMP's sectioning
+! Offloading test for target nested inside
+! a target data region
! REQUIRES: flang
! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
! UNSUPPORTED: aarch64-unknown-linux-gnu
More information about the Openmp-commits
mailing list