From 81e72eeaea0db015f84c6fc93e8e9537d37a53a6 Mon Sep 17 00:00:00 2001 From: Akash Banerjee 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 f6cf358119fb7..bd58f9ebba1c2 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 0000000000000..5508690c82ddd --- /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 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 bd58f9ebba1c2..d9baf3fa82797 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 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 e79d0bb2f65ae..35f0591eda02c 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(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 5508690c82ddd..a694f2464546c 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