aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp5
-rw-r--r--llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp17
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index c74c898..c07ee34 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4883,8 +4883,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/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index fdbe8df..5c415ca 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -5856,6 +5856,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()));
}