Skip to content

Commit bc0c178

Browse files
authored
[Clang][OpenMP][OMPIRBuilder] Move Clang's OpenMP Member/MemberOf flag helpers into the OMPIRBuilder (llvm#67844)
This patch seeks to move the following functions to the OMPIRBuilder: - getFlagMemberOffset - getMemberOfFlag - setCorrectMemberOfFlag These small helper functions help set the end bits of the OpenMPOffloadMappingFlags flag that correspond to the reserved segment for OMP_MAP_MEMBER_OF. They will be of use in the future for lowering MLIR types/values that can contian members and can be lowered similarly to a structure or class type within the OpenMPToLLVMIRTranslation step of the OpenMP dialects lowering to LLVM-IR. In particular for Flang which currently uses this flow. Types with descriptors like pointers/allocatables, and likely derived types in certain cases can be lowered as if they were structures with explicitly mapped members.
1 parent 0bb4b24 commit bc0c178

File tree

3 files changed

+84
-40
lines changed

3 files changed

+84
-40
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 24 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7734,30 +7734,6 @@ class MappableExprsHandler {
77347734
OpenMPOffloadMappingFlags::OMP_MAP_FROM;
77357735
}
77367736

7737-
static OpenMPOffloadMappingFlags getMemberOfFlag(unsigned Position) {
7738-
// Rotate by getFlagMemberOffset() bits.
7739-
return static_cast<OpenMPOffloadMappingFlags>(((uint64_t)Position + 1)
7740-
<< getFlagMemberOffset());
7741-
}
7742-
7743-
static void setCorrectMemberOfFlag(OpenMPOffloadMappingFlags &Flags,
7744-
OpenMPOffloadMappingFlags MemberOfFlag) {
7745-
// If the entry is PTR_AND_OBJ but has not been marked with the special
7746-
// placeholder value 0xFFFF in the MEMBER_OF field, then it should not be
7747-
// marked as MEMBER_OF.
7748-
if (static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
7749-
Flags & OpenMPOffloadMappingFlags::OMP_MAP_PTR_AND_OBJ) &&
7750-
static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
7751-
(Flags & OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF) !=
7752-
OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF))
7753-
return;
7754-
7755-
// Reset the placeholder value to prepare the flag for the assignment of the
7756-
// proper MEMBER_OF value.
7757-
Flags &= ~OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF;
7758-
Flags |= MemberOfFlag;
7759-
}
7760-
77617737
void getPlainLayout(const CXXRecordDecl *RD,
77627738
llvm::SmallVectorImpl<const FieldDecl *> &Layout,
77637739
bool AsBase) const {
@@ -7825,6 +7801,7 @@ class MappableExprsHandler {
78257801
/// the device pointers info array.
78267802
void generateAllInfoForClauses(
78277803
ArrayRef<const OMPClause *> Clauses, MapCombinedInfoTy &CombinedInfo,
7804+
llvm::OpenMPIRBuilder &OMPBuilder,
78287805
const llvm::DenseSet<CanonicalDeclPtr<const Decl>> &SkipVarSet =
78297806
llvm::DenseSet<CanonicalDeclPtr<const Decl>>()) const {
78307807
// We have to process the component lists that relate with the same
@@ -8159,7 +8136,7 @@ class MappableExprsHandler {
81598136
if (PartialStruct.Base.isValid()) {
81608137
CurInfo.NonContigInfo.Dims.push_back(0);
81618138
emitCombinedEntry(CombinedInfo, CurInfo.Types, PartialStruct,
8162-
/*IsMapThis*/ !VD, VD);
8139+
/*IsMapThis*/ !VD, OMPBuilder, VD);
81638140
}
81648141

81658142
// We need to append the results of this capture to what we already
@@ -8226,6 +8203,7 @@ class MappableExprsHandler {
82268203
void emitCombinedEntry(MapCombinedInfoTy &CombinedInfo,
82278204
MapFlagsArrayTy &CurTypes,
82288205
const StructRangeInfoTy &PartialStruct, bool IsMapThis,
8206+
llvm::OpenMPIRBuilder &OMPBuilder,
82298207
const ValueDecl *VD = nullptr,
82308208
bool NotTargetParams = true) const {
82318209
if (CurTypes.size() == 1 &&
@@ -8313,9 +8291,9 @@ class MappableExprsHandler {
83138291
// (except for PTR_AND_OBJ entries which do not have a placeholder value
83148292
// 0xFFFF in the MEMBER_OF field).
83158293
OpenMPOffloadMappingFlags MemberOfFlag =
8316-
getMemberOfFlag(CombinedInfo.BasePointers.size() - 1);
8294+
OMPBuilder.getMemberOfFlag(CombinedInfo.BasePointers.size() - 1);
83178295
for (auto &M : CurTypes)
8318-
setCorrectMemberOfFlag(M, MemberOfFlag);
8296+
OMPBuilder.setCorrectMemberOfFlag(M, MemberOfFlag);
83198297
}
83208298

83218299
/// Generate all the base pointers, section pointers, sizes, map types, and
@@ -8324,23 +8302,26 @@ class MappableExprsHandler {
83248302
/// pair of the relevant declaration and index where it occurs is appended to
83258303
/// the device pointers info array.
83268304
void generateAllInfo(
8327-
MapCombinedInfoTy &CombinedInfo,
8305+
MapCombinedInfoTy &CombinedInfo, llvm::OpenMPIRBuilder &OMPBuilder,
83288306
const llvm::DenseSet<CanonicalDeclPtr<const Decl>> &SkipVarSet =
83298307
llvm::DenseSet<CanonicalDeclPtr<const Decl>>()) const {
83308308
assert(CurDir.is<const OMPExecutableDirective *>() &&
83318309
"Expect a executable directive");
83328310
const auto *CurExecDir = CurDir.get<const OMPExecutableDirective *>();
8333-
generateAllInfoForClauses(CurExecDir->clauses(), CombinedInfo, SkipVarSet);
8311+
generateAllInfoForClauses(CurExecDir->clauses(), CombinedInfo, OMPBuilder,
8312+
SkipVarSet);
83348313
}
83358314

83368315
/// Generate all the base pointers, section pointers, sizes, map types, and
83378316
/// mappers for the extracted map clauses of user-defined mapper (all included
83388317
/// in \a CombinedInfo).
8339-
void generateAllInfoForMapper(MapCombinedInfoTy &CombinedInfo) const {
8318+
void generateAllInfoForMapper(MapCombinedInfoTy &CombinedInfo,
8319+
llvm::OpenMPIRBuilder &OMPBuilder) const {
83408320
assert(CurDir.is<const OMPDeclareMapperDecl *>() &&
83418321
"Expect a declare mapper directive");
83428322
const auto *CurMapperDir = CurDir.get<const OMPDeclareMapperDecl *>();
8343-
generateAllInfoForClauses(CurMapperDir->clauses(), CombinedInfo);
8323+
generateAllInfoForClauses(CurMapperDir->clauses(), CombinedInfo,
8324+
OMPBuilder);
83448325
}
83458326

83468327
/// Emit capture info for lambdas for variables captured by reference.
@@ -8422,6 +8403,7 @@ class MappableExprsHandler {
84228403

84238404
/// Set correct indices for lambdas captures.
84248405
void adjustMemberOfForLambdaCaptures(
8406+
llvm::OpenMPIRBuilder &OMPBuilder,
84258407
const llvm::DenseMap<llvm::Value *, llvm::Value *> &LambdaPointers,
84268408
MapBaseValuesArrayTy &BasePointers, MapValuesArrayTy &Pointers,
84278409
MapFlagsArrayTy &Types) const {
@@ -8446,8 +8428,9 @@ class MappableExprsHandler {
84468428
// All other current entries will be MEMBER_OF the combined entry
84478429
// (except for PTR_AND_OBJ entries which do not have a placeholder value
84488430
// 0xFFFF in the MEMBER_OF field).
8449-
OpenMPOffloadMappingFlags MemberOfFlag = getMemberOfFlag(TgtIdx);
8450-
setCorrectMemberOfFlag(Types[I], MemberOfFlag);
8431+
OpenMPOffloadMappingFlags MemberOfFlag =
8432+
OMPBuilder.getMemberOfFlag(TgtIdx);
8433+
OMPBuilder.setCorrectMemberOfFlag(Types[I], MemberOfFlag);
84518434
}
84528435
}
84538436

@@ -9141,7 +9124,7 @@ void CGOpenMPRuntime::emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
91419124
// Get map clause information. Fill up the arrays with all mapped variables.
91429125
MappableExprsHandler::MapCombinedInfoTy Info;
91439126
MappableExprsHandler MEHandler(*D, MapperCGF);
9144-
MEHandler.generateAllInfoForMapper(Info);
9127+
MEHandler.generateAllInfoForMapper(Info, OMPBuilder);
91459128

91469129
// Call the runtime API __tgt_mapper_num_components to get the number of
91479130
// pre-existing components.
@@ -9525,19 +9508,20 @@ static void emitTargetCallKernelLaunch(
95259508
CombinedInfo.append(PartialStruct.PreliminaryMapData);
95269509
MEHandler.emitCombinedEntry(
95279510
CombinedInfo, CurInfo.Types, PartialStruct, CI->capturesThis(),
9528-
nullptr, !PartialStruct.PreliminaryMapData.BasePointers.empty());
9511+
OMPBuilder, nullptr,
9512+
!PartialStruct.PreliminaryMapData.BasePointers.empty());
95299513
}
95309514

95319515
// We need to append the results of this capture to what we already have.
95329516
CombinedInfo.append(CurInfo);
95339517
}
95349518
// Adjust MEMBER_OF flags for the lambdas captures.
95359519
MEHandler.adjustMemberOfForLambdaCaptures(
9536-
LambdaPointers, CombinedInfo.BasePointers, CombinedInfo.Pointers,
9537-
CombinedInfo.Types);
9520+
OMPBuilder, LambdaPointers, CombinedInfo.BasePointers,
9521+
CombinedInfo.Pointers, CombinedInfo.Types);
95389522
// Map any list items in a map clause that were not captures because they
95399523
// weren't referenced within the construct.
9540-
MEHandler.generateAllInfo(CombinedInfo, MappedVarSet);
9524+
MEHandler.generateAllInfo(CombinedInfo, OMPBuilder, MappedVarSet);
95419525

95429526
CGOpenMPRuntime::TargetDataInfo Info;
95439527
// Fill up the arrays and create the arguments.
@@ -10272,7 +10256,7 @@ void CGOpenMPRuntime::emitTargetDataCalls(
1027210256
CGF.Builder.restoreIP(CodeGenIP);
1027310257
// Get map clause information.
1027410258
MappableExprsHandler MEHandler(D, CGF);
10275-
MEHandler.generateAllInfo(CombinedInfo);
10259+
MEHandler.generateAllInfo(CombinedInfo, OMPBuilder);
1027610260

1027710261
auto FillInfoMap = [&](MappableExprsHandler::MappingExprInfo &MapExpr) {
1027810262
return emitMappingInformation(CGF, OMPBuilder, MapExpr);
@@ -10478,7 +10462,7 @@ void CGOpenMPRuntime::emitTargetDataStandAloneCall(
1047810462

1047910463
// Get map clause information.
1048010464
MappableExprsHandler MEHandler(D, CGF);
10481-
MEHandler.generateAllInfo(CombinedInfo);
10465+
MEHandler.generateAllInfo(CombinedInfo, OMPBuilder);
1048210466

1048310467
CGOpenMPRuntime::TargetDataInfo Info;
1048410468
// Fill up the arrays and create the arguments.

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,30 @@ class OpenMPIRBuilder {
877877
std::function<GlobalValue::LinkageTypes()> VariableLinkage,
878878
Type *LlvmPtrTy, Constant *Addr);
879879

880+
/// Get the offset of the OMP_MAP_MEMBER_OF field.
881+
unsigned getFlagMemberOffset();
882+
883+
/// Get OMP_MAP_MEMBER_OF flag with extra bits reserved based on
884+
/// the position given.
885+
/// \param Position - A value indicating the position of the parent
886+
/// of the member in the kernel argument structure, often retrieved
887+
/// by the parents position in the combined information vectors used
888+
/// to generate the structure itself. Multiple children (member's of)
889+
/// with the same parent will use the same returned member flag.
890+
omp::OpenMPOffloadMappingFlags getMemberOfFlag(unsigned Position);
891+
892+
/// Given an initial flag set, this function modifies it to contain
893+
/// the passed in MemberOfFlag generated from the getMemberOfFlag
894+
/// function. The results are dependent on the existing flag bits
895+
/// set in the original flag set.
896+
/// \param Flags - The original set of flags to be modified with the
897+
/// passed in MemberOfFlag.
898+
/// \param MemberOfFlag - A modified OMP_MAP_MEMBER_OF flag, adjusted
899+
/// slightly based on the getMemberOfFlag which adjusts the flag bits
900+
/// based on the members position in its parent.
901+
void setCorrectMemberOfFlag(omp::OpenMPOffloadMappingFlags &Flags,
902+
omp::OpenMPOffloadMappingFlags MemberOfFlag);
903+
880904
private:
881905
/// Modifies the canonical loop to be a statically-scheduled workshare loop.
882906
///

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6126,6 +6126,42 @@ OpenMPIRBuilder::getTargetEntryUniqueInfo(FileIdentifierInfoCallbackTy CallBack,
61266126
std::get<1>(FileIDInfo));
61276127
}
61286128

6129+
unsigned OpenMPIRBuilder::getFlagMemberOffset() {
6130+
unsigned Offset = 0;
6131+
for (uint64_t Remain =
6132+
static_cast<std::underlying_type_t<omp::OpenMPOffloadMappingFlags>>(
6133+
omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF);
6134+
!(Remain & 1); Remain = Remain >> 1)
6135+
Offset++;
6136+
return Offset;
6137+
}
6138+
6139+
omp::OpenMPOffloadMappingFlags
6140+
OpenMPIRBuilder::getMemberOfFlag(unsigned Position) {
6141+
// Rotate by getFlagMemberOffset() bits.
6142+
return static_cast<omp::OpenMPOffloadMappingFlags>(((uint64_t)Position + 1)
6143+
<< getFlagMemberOffset());
6144+
}
6145+
6146+
void OpenMPIRBuilder::setCorrectMemberOfFlag(
6147+
omp::OpenMPOffloadMappingFlags &Flags,
6148+
omp::OpenMPOffloadMappingFlags MemberOfFlag) {
6149+
// If the entry is PTR_AND_OBJ but has not been marked with the special
6150+
// placeholder value 0xFFFF in the MEMBER_OF field, then it should not be
6151+
// marked as MEMBER_OF.
6152+
if (static_cast<std::underlying_type_t<omp::OpenMPOffloadMappingFlags>>(
6153+
Flags & omp::OpenMPOffloadMappingFlags::OMP_MAP_PTR_AND_OBJ) &&
6154+
static_cast<std::underlying_type_t<omp::OpenMPOffloadMappingFlags>>(
6155+
(Flags & omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF) !=
6156+
omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF))
6157+
return;
6158+
6159+
// Reset the placeholder value to prepare the flag for the assignment of the
6160+
// proper MEMBER_OF value.
6161+
Flags &= ~omp::OpenMPOffloadMappingFlags::OMP_MAP_MEMBER_OF;
6162+
Flags |= MemberOfFlag;
6163+
}
6164+
61296165
Constant *OpenMPIRBuilder::getAddrOfDeclareTargetVar(
61306166
OffloadEntriesInfoManager::OMPTargetGlobalVarEntryKind CaptureClause,
61316167
OffloadEntriesInfoManager::OMPTargetDeviceClauseKind DeviceClause,

0 commit comments

Comments
 (0)