[OpenMP][OMPIRBuilder] Mirgrate getName from clang to OMPIRBuilder

This change moves the getName function from clang and moves the separator class
members from CGOpenMPRuntime into OMPIRBuilder. Also enusre all the getters
in the config class are const.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D137725
This commit is contained in:
Jan Sjodin 2022-11-09 11:59:30 -05:00
parent 4f17734175
commit 2aa338f68e
5 changed files with 52 additions and 25 deletions

View File

@ -1057,14 +1057,11 @@ static FieldDecl *addFieldToRecordDecl(ASTContext &C, DeclContext *DC,
return Field;
}
CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM, StringRef FirstSeparator,
StringRef Separator)
: CGM(CGM), FirstSeparator(FirstSeparator), Separator(Separator),
OMPBuilder(CGM.getModule()), OffloadEntriesInfoManager() {
CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
: CGM(CGM), OMPBuilder(CGM.getModule()), OffloadEntriesInfoManager() {
KmpCriticalNameTy = llvm::ArrayType::get(CGM.Int32Ty, /*NumElements*/ 8);
llvm::OpenMPIRBuilderConfig Config(CGM.getLangOpts().OpenMPIsDevice, false,
hasRequiresUnifiedSharedMemory());
// Initialize Types used in OpenMPIRBuilder from OMPKinds.def
OMPBuilder.initialize();
OMPBuilder.setConfig(Config);
@ -1088,14 +1085,7 @@ void CGOpenMPRuntime::clear() {
}
std::string CGOpenMPRuntime::getName(ArrayRef<StringRef> Parts) const {
SmallString<128> Buffer;
llvm::raw_svector_ostream OS(Buffer);
StringRef Sep = FirstSeparator;
for (StringRef Part : Parts) {
OS << Sep << Part;
Sep = Separator;
}
return std::string(OS.str());
return OMPBuilder.createPlatformSpecificName(Parts);
}
static llvm::Function *

View File

@ -306,15 +306,10 @@ public:
protected:
CodeGenModule &CGM;
StringRef FirstSeparator, Separator;
/// An OpenMP-IR-Builder instance.
llvm::OpenMPIRBuilder OMPBuilder;
/// Constructor allowing to redefine the name separator for the variables.
explicit CGOpenMPRuntime(CodeGenModule &CGM, StringRef FirstSeparator,
StringRef Separator);
/// Helper to emit outlined function for 'target' directive.
/// \param D Directive to emit.
/// \param ParentName Name of the function that encloses the target region.
@ -691,8 +686,7 @@ protected:
Address DependenciesArray);
public:
explicit CGOpenMPRuntime(CodeGenModule &CGM)
: CGOpenMPRuntime(CGM, ".", ".") {}
explicit CGOpenMPRuntime(CodeGenModule &CGM);
virtual ~CGOpenMPRuntime() {}
virtual void clear();

View File

@ -889,7 +889,7 @@ unsigned CGOpenMPRuntimeGPU::getDefaultLocationReserved2Flags() const {
}
CGOpenMPRuntimeGPU::CGOpenMPRuntimeGPU(CodeGenModule &CGM)
: CGOpenMPRuntime(CGM, "_", "$") {
: CGOpenMPRuntime(CGM) {
llvm::OpenMPIRBuilderConfig Config(CGM.getLangOpts().OpenMPIsDevice, true,
hasRequiresUnifiedSharedMemory());
OMPBuilder.setConfig(Config);

View File

@ -92,34 +92,61 @@ public:
/// directive is present or not.
Optional<bool> HasRequiresUnifiedSharedMemory;
/// First separator used between the initial two parts of a name.
Optional<StringRef> FirstSeparator;
/// Separator used between all of the rest consecutive parts of s name
Optional<StringRef> Separator;
OpenMPIRBuilderConfig() {}
OpenMPIRBuilderConfig(bool IsEmbedded, bool IsTargetCodegen,
bool HasRequiresUnifiedSharedMemory)
: IsEmbedded(IsEmbedded), IsTargetCodegen(IsTargetCodegen),
HasRequiresUnifiedSharedMemory(HasRequiresUnifiedSharedMemory) {}
// Convenience getter functions that assert if the value is not present.
bool isEmbedded() {
// Getters functions that assert if the required values are not present.
bool isEmbedded() const {
assert(IsEmbedded.has_value() && "IsEmbedded is not set");
return IsEmbedded.value();
}
bool isTargetCodegen() {
bool isTargetCodegen() const {
assert(IsTargetCodegen.has_value() && "IsTargetCodegen is not set");
return IsTargetCodegen.value();
}
bool hasRequiresUnifiedSharedMemory() {
bool hasRequiresUnifiedSharedMemory() const {
assert(HasRequiresUnifiedSharedMemory.has_value() &&
"HasUnifiedSharedMemory is not set");
return HasRequiresUnifiedSharedMemory.value();
}
// Returns the FirstSeparator if set, otherwise use the default
// separator depending on isTargetCodegen
StringRef firstSeparator() const {
if (FirstSeparator.has_value())
return FirstSeparator.value();
if (isTargetCodegen())
return "_";
return ".";
}
// Returns the Separator if set, otherwise use the default
// separator depending on isTargetCodegen
StringRef separator() const {
if (Separator.has_value())
return Separator.value();
if (isTargetCodegen())
return "$";
return ".";
}
void setIsEmbedded(bool Value) { IsEmbedded = Value; }
void setIsTargetCodegen(bool Value) { IsTargetCodegen = Value; }
void setHasRequiresUnifiedSharedMemory(bool Value) {
HasRequiresUnifiedSharedMemory = Value;
}
void setFirstSeparator(StringRef FS) { FirstSeparator = FS; }
void setSeparator(StringRef S) { Separator = S; }
};
/// An interface to create LLVM-IR for OpenMP directives.
@ -150,6 +177,16 @@ public:
/// Type used throughout for insertion points.
using InsertPointTy = IRBuilder<>::InsertPoint;
/// Get the create a name using the platform specific separators.
/// \param Parts parts of the final name that needs separation
/// The created name has a first separator between the first and second part
/// and a second separator between all other parts.
/// E.g. with FirstSeparator "$" and Separator "." and
/// parts: "p1", "p2", "p3", "p4"
/// The resulting name is "p1$p2.p3.p4"
/// The separators are retrieved from the OpenMPIRBuilderConfig.
std::string createPlatformSpecificName(ArrayRef<StringRef> Parts) const;
/// Callback type for variable finalization (think destructors).
///
/// \param CodeGenIP is the insertion point at which the finalization code

View File

@ -3963,6 +3963,12 @@ std::string OpenMPIRBuilder::getNameWithSeparators(ArrayRef<StringRef> Parts,
return OS.str().str();
}
std::string
OpenMPIRBuilder::createPlatformSpecificName(ArrayRef<StringRef> Parts) const {
return OpenMPIRBuilder::getNameWithSeparators(Parts, Config.firstSeparator(),
Config.separator());
}
GlobalVariable *
OpenMPIRBuilder::getOrCreateInternalVariable(Type *Ty, const StringRef &Name,
unsigned AddressSpace) {