Skip to content

Commit a5261d9

Browse files
committed
Make omp.target[_{enter,exit}]_data and omp.target_update host-only ops
1 parent 9b5e759 commit a5261d9

File tree

5 files changed

+56
-102
lines changed

5 files changed

+56
-102
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
!===----------------------------------------------------------------------===!
2+
! This directory can be used to add Integration tests involving multiple
3+
! stages of the compiler (for eg. from Fortran to LLVM IR). It should not
4+
! contain executable tests. We should only add tests here sparingly and only
5+
! if there is no other way to test. Repeat this message in each test that is
6+
! added to this directory and sub-directories.
7+
!===----------------------------------------------------------------------===!
8+
9+
! This tests check that target code nested inside a target data region which
10+
! has only use_device_ptr mapping corectly generates code on the device pass.
11+
12+
!REQUIRES: amdgpu-registered-target
13+
!RUN: %flang_fc1 -triple amdgcn-amd-amdhsa -emit-llvm -fopenmp -fopenmp-version=50 -fopenmp-is-target-device %s -o - | FileCheck %s
14+
15+
program main
16+
use iso_c_binding
17+
implicit none
18+
type(c_ptr) :: a
19+
!$omp target data use_device_ptr(a)
20+
!$omp target map(tofrom: a)
21+
call foo(a)
22+
!$omp end target
23+
!$omp end target data
24+
end program
25+
26+
! CHECK: define weak_odr protected amdgpu_kernel void @__omp_offloading{{.*}}main_
27+
! CHECK-NEXT: entry:
28+
! CHECK-NEXT: %[[VAL_3:.*]] = alloca ptr, align 8, addrspace(5)
29+
! CHECK-NEXT: %[[ASCAST:.*]] = addrspacecast ptr addrspace(5) %[[VAL_3]] to ptr
30+
! CHECK-NEXT: store ptr %[[VAL_4:.*]], ptr %[[ASCAST]], align 8
31+
! CHECK-NEXT: %[[VAL_5:.*]] = call i32 @__kmpc_target_init(ptr addrspacecast (ptr addrspace(1) @__omp_offloading_{{.*}}_kernel_environment to ptr), ptr %[[VAL_6:.*]])
32+
! CHECK-NEXT: %[[VAL_7:.*]] = icmp eq i32 %[[VAL_5]], -1
33+
! CHECK-NEXT: br i1 %[[VAL_7]], label %[[VAL_8:.*]], label %[[VAL_9:.*]]
34+
! CHECK: user_code.entry: ; preds = %[[VAL_10:.*]]
35+
! CHECK-NEXT: %[[VAL_11:.*]] = load ptr, ptr %[[ASCAST]], align 8
36+
! CHECK-NEXT: br label %[[AFTER_ALLOC:.*]]
37+
38+
! CHECK: [[AFTER_ALLOC]]:
39+
! CHECK-NEXT: br label %[[VAL_12:.*]]
40+
41+
! CHECK: [[VAL_12]]:
42+
! CHECK-NEXT: br label %[[TARGET_REG_ENTRY:.*]]
43+
44+
! CHECK: [[TARGET_REG_ENTRY]]: ; preds = %[[VAL_12]]
45+
! CHECK-NEXT: call void @{{.*}}foo{{.*}}(ptr %[[VAL_11]])
46+
! CHECK-NEXT: br label

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7080,17 +7080,6 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTargetData(
70807080
return InsertPointTy();
70817081

70827082
Builder.restoreIP(CodeGenIP);
7083-
// Disable TargetData CodeGen on Device pass.
7084-
if (Config.IsTargetDevice.value_or(false)) {
7085-
if (BodyGenCB) {
7086-
InsertPointOrErrorTy AfterIP =
7087-
BodyGenCB(Builder.saveIP(), BodyGenTy::NoPriv);
7088-
if (!AfterIP)
7089-
return AfterIP.takeError();
7090-
Builder.restoreIP(*AfterIP);
7091-
}
7092-
return Builder.saveIP();
7093-
}
70947083

70957084
bool IsStandAlone = !BodyGenCB;
70967085
MapInfosTy *MapInfo;

llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6281,27 +6281,6 @@ TEST_F(OpenMPIRBuilderTest, TargetDataRegion) {
62816281
EXPECT_TRUE(TargetDataCall->getOperand(2)->getType()->isIntegerTy(32));
62826282
EXPECT_TRUE(TargetDataCall->getOperand(8)->getType()->isPointerTy());
62836283

6284-
// Check that BodyGenCB is still made when IsTargetDevice is set to true.
6285-
OMPBuilder.Config.setIsTargetDevice(true);
6286-
bool CheckDevicePassBodyGen = false;
6287-
auto BodyTargetCB = [&](InsertPointTy CodeGenIP, BodyGenTy BodyGenType) {
6288-
CheckDevicePassBodyGen = true;
6289-
Builder.restoreIP(CodeGenIP);
6290-
CallInst *TargetDataCall =
6291-
dyn_cast<CallInst>(BB->back().getPrevNode()->getPrevNode());
6292-
// Make sure no begin_mapper call is present for device pass.
6293-
EXPECT_EQ(TargetDataCall, nullptr);
6294-
return Builder.saveIP();
6295-
};
6296-
ASSERT_EXPECTED_INIT(
6297-
OpenMPIRBuilder::InsertPointTy, TargetDataIP2,
6298-
OMPBuilder.createTargetData(Loc, AllocaIP, Builder.saveIP(),
6299-
Builder.getInt64(DeviceID),
6300-
/* IfCond= */ nullptr, Info, GenMapInfoCB,
6301-
CustomMapperCB, nullptr, BodyTargetCB));
6302-
Builder.restoreIP(TargetDataIP2);
6303-
EXPECT_TRUE(CheckDevicePassBodyGen);
6304-
63056284
Builder.CreateRetVoid();
63066285
EXPECT_FALSE(verifyModule(*M, &errs()));
63076286
}

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4510,8 +4510,8 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
45104510
llvm::OpenMPIRBuilder::TargetDataInfo info(/*RequiresDevicePointerInfo=*/true,
45114511
/*SeparateBeginEndCalls=*/true);
45124512
bool isTargetDevice = ompBuilder->Config.isTargetDevice();
4513-
bool isOffloadEntry =
4514-
isTargetDevice || !ompBuilder->Config.TargetTriples.empty();
4513+
assert(!isTargetDevice && "target data/enter/exit/update are host ops");
4514+
bool isOffloadEntry = !ompBuilder->Config.TargetTriples.empty();
45154515

45164516
LogicalResult result =
45174517
llvm::TypeSwitch<Operation *, LogicalResult>(op)
@@ -4687,30 +4687,17 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
46874687
if (info.DevicePtrInfoMap.empty()) {
46884688
// For host device we still need to do the mapping for codegen,
46894689
// otherwise it may try to lookup a missing value.
4690-
if (!ompBuilder->Config.IsTargetDevice.value_or(false)) {
4691-
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Address,
4692-
blockArgIface.getUseDeviceAddrBlockArgs(),
4693-
useDeviceAddrVars, mapData);
4694-
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Pointer,
4695-
blockArgIface.getUseDevicePtrBlockArgs(),
4696-
useDevicePtrVars, mapData);
4697-
}
4690+
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Address,
4691+
blockArgIface.getUseDeviceAddrBlockArgs(),
4692+
useDeviceAddrVars, mapData);
4693+
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Pointer,
4694+
blockArgIface.getUseDevicePtrBlockArgs(), useDevicePtrVars,
4695+
mapData);
46984696
}
46994697
break;
47004698
case BodyGenTy::NoPriv:
47014699
// If device info is available then region has already been generated
47024700
if (info.DevicePtrInfoMap.empty()) {
4703-
// For device pass, if use_device_ptr(addr) mappings were present,
4704-
// we need to link them here before codegen.
4705-
if (ompBuilder->Config.IsTargetDevice.value_or(false)) {
4706-
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Address,
4707-
blockArgIface.getUseDeviceAddrBlockArgs(),
4708-
useDeviceAddrVars, mapData);
4709-
mapUseDevice(llvm::OpenMPIRBuilder::DeviceInfoTy::Pointer,
4710-
blockArgIface.getUseDevicePtrBlockArgs(),
4711-
useDevicePtrVars, mapData);
4712-
}
4713-
47144701
if (failed(inlineConvertOmpRegions(region, "omp.data.region", builder,
47154702
moduleTranslation)))
47164703
return llvm::make_error<PreviouslyReportedError>();
@@ -6086,9 +6073,8 @@ LogicalResult OpenMPDialectLLVMIRTranslationInterface::convertOperation(
60866073
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
60876074

60886075
if (ompBuilder->Config.isTargetDevice() &&
6089-
!isa<omp::TargetOp, omp::TargetDataOp, omp::TargetEnterDataOp,
6090-
omp::TargetExitDataOp, omp::TargetUpdateOp, omp::MapInfoOp,
6091-
omp::TerminatorOp, omp::YieldOp>(op) &&
6076+
!isa<omp::TargetOp, omp::MapInfoOp, omp::TerminatorOp, omp::YieldOp>(
6077+
op) &&
60926078
isHostDeviceOp(op))
60936079
return op->emitOpError() << "unsupported host op found in device";
60946080

mlir/test/Target/LLVMIR/openmp-target-use-device-nested.mlir

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)