Skip to content

Commit a3463a9

Browse files
committed
[OpenMP][OpenMPIRBuilder] Migrate loadOffloadInfoMetadata from clang to OMPIRbuilder
This patch moves the implementation of the loadOffloadInfoMetadata to the OMPIRbuilder. Differential Revision: https://reviews.llvm.org/D136872
1 parent 990c189 commit a3463a9

File tree

3 files changed

+62
-46
lines changed

3 files changed

+62
-46
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3171,52 +3171,7 @@ void CGOpenMPRuntime::loadOffloadInfoMetadata() {
31713171
return;
31723172
}
31733173

3174-
llvm::NamedMDNode *MD = ME.get()->getNamedMetadata("omp_offload.info");
3175-
if (!MD)
3176-
return;
3177-
3178-
for (llvm::MDNode *MN : MD->operands()) {
3179-
auto &&GetMDInt = [MN](unsigned Idx) {
3180-
auto *V = cast<llvm::ConstantAsMetadata>(MN->getOperand(Idx));
3181-
return cast<llvm::ConstantInt>(V->getValue())->getZExtValue();
3182-
};
3183-
3184-
auto &&GetMDString = [MN](unsigned Idx) {
3185-
auto *V = cast<llvm::MDString>(MN->getOperand(Idx));
3186-
return V->getString();
3187-
};
3188-
3189-
switch (GetMDInt(0)) {
3190-
default:
3191-
llvm_unreachable("Unexpected metadata!");
3192-
break;
3193-
case llvm::OffloadEntriesInfoManager::OffloadEntryInfo::
3194-
OffloadingEntryInfoTargetRegion: {
3195-
assert(CGM.getLangOpts().OpenMPIsDevice && "Initialization of entries is "
3196-
"only required for the "
3197-
"device code generation.");
3198-
llvm::TargetRegionEntryInfo EntryInfo(/*ParentName=*/GetMDString(3),
3199-
/*DeviceID=*/GetMDInt(1),
3200-
/*FileID=*/GetMDInt(2),
3201-
/*Line=*/GetMDInt(4));
3202-
OffloadEntriesInfoManager.initializeTargetRegionEntryInfo(
3203-
EntryInfo, /*Order=*/GetMDInt(5));
3204-
break;
3205-
}
3206-
case llvm::OffloadEntriesInfoManager::OffloadEntryInfo::
3207-
OffloadingEntryInfoDeviceGlobalVar:
3208-
assert(CGM.getLangOpts().OpenMPIsDevice && "Initialization of entries is "
3209-
"only required for the "
3210-
"device code generation.");
3211-
OffloadEntriesInfoManager.initializeDeviceGlobalVarEntryInfo(
3212-
/*MangledName=*/GetMDString(1),
3213-
static_cast<
3214-
llvm::OffloadEntriesInfoManager::OMPTargetGlobalVarEntryKind>(
3215-
/*Flags=*/GetMDInt(2)),
3216-
/*Order=*/GetMDInt(3));
3217-
break;
3218-
}
3219-
}
3174+
OMPBuilder.loadOffloadInfoMetadata(*ME.get(), OffloadEntriesInfoManager);
32203175
}
32213176

32223177
void CGOpenMPRuntime::emitKmpRoutineEntryT(QualType KmpInt32Ty) {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,19 @@ class OpenMPIRBuilder {
16811681
BasicBlock *PreInsertBefore,
16821682
BasicBlock *PostInsertBefore,
16831683
const Twine &Name = {});
1684+
/// OMP Offload Info Metadata name string
1685+
const std::string ompOffloadInfoName = "omp_offload.info";
1686+
1687+
/// Loads all the offload entries information from the host IR
1688+
/// metadata. This function is only meant to be used with device code
1689+
/// generation.
1690+
///
1691+
/// \param M Module to load Metadata info from. Module passed maybe
1692+
/// loaded from bitcode file, i.e, different from OpenMPIRBuilder::M module.
1693+
/// \param OffloadEntriesInfoManager Initialize Offload Entry information.
1694+
void
1695+
loadOffloadInfoMetadata(Module &M,
1696+
OffloadEntriesInfoManager &OffloadEntriesInfoManager);
16841697
};
16851698

16861699
/// Data structure to contain the information needed to uniquely identify

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4705,6 +4705,54 @@ void TargetRegionEntryInfo::getTargetRegionEntryFnName(
47054705
getTargetRegionEntryFnName(Name, ParentName, DeviceID, FileID, Line);
47064706
}
47074707

4708+
/// Loads all the offload entries information from the host IR
4709+
/// metadata.
4710+
void OpenMPIRBuilder::loadOffloadInfoMetadata(
4711+
Module &M, OffloadEntriesInfoManager &OffloadEntriesInfoManager) {
4712+
// If we are in target mode, load the metadata from the host IR. This code has
4713+
// to match the metadata creation in createOffloadEntriesAndInfoMetadata().
4714+
4715+
NamedMDNode *MD = M.getNamedMetadata(ompOffloadInfoName);
4716+
if (!MD)
4717+
return;
4718+
4719+
for (MDNode *MN : MD->operands()) {
4720+
auto &&GetMDInt = [MN](unsigned Idx) {
4721+
auto *V = cast<ConstantAsMetadata>(MN->getOperand(Idx));
4722+
return cast<ConstantInt>(V->getValue())->getZExtValue();
4723+
};
4724+
4725+
auto &&GetMDString = [MN](unsigned Idx) {
4726+
auto *V = cast<MDString>(MN->getOperand(Idx));
4727+
return V->getString();
4728+
};
4729+
4730+
switch (GetMDInt(0)) {
4731+
default:
4732+
llvm_unreachable("Unexpected metadata!");
4733+
break;
4734+
case OffloadEntriesInfoManager::OffloadEntryInfo::
4735+
OffloadingEntryInfoTargetRegion: {
4736+
TargetRegionEntryInfo EntryInfo(/*ParentName=*/GetMDString(3),
4737+
/*DeviceID=*/GetMDInt(1),
4738+
/*FileID=*/GetMDInt(2),
4739+
/*Line=*/GetMDInt(4));
4740+
OffloadEntriesInfoManager.initializeTargetRegionEntryInfo(
4741+
EntryInfo, /*Order=*/GetMDInt(5));
4742+
break;
4743+
}
4744+
case OffloadEntriesInfoManager::OffloadEntryInfo::
4745+
OffloadingEntryInfoDeviceGlobalVar:
4746+
OffloadEntriesInfoManager.initializeDeviceGlobalVarEntryInfo(
4747+
/*MangledName=*/GetMDString(1),
4748+
static_cast<OffloadEntriesInfoManager::OMPTargetGlobalVarEntryKind>(
4749+
/*Flags=*/GetMDInt(2)),
4750+
/*Order=*/GetMDInt(3));
4751+
break;
4752+
}
4753+
}
4754+
}
4755+
47084756
bool OffloadEntriesInfoManager::empty() const {
47094757
return OffloadEntriesTargetRegion.empty() &&
47104758
OffloadEntriesDeviceGlobalVar.empty();

0 commit comments

Comments
 (0)