Skip to content

Commit

Permalink
[OpenMP][OMPIRBuilder] Mirgrate getName from clang to OMPIRBuilder
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jsjodin committed Nov 24, 2022
1 parent 4f17734 commit 2aa338f
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 25 deletions.
16 changes: 3 additions & 13 deletions clang/lib/CodeGen/CGOpenMPRuntime.cpp
Expand Up @@ -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);
Expand All @@ -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 *
Expand Down
8 changes: 1 addition & 7 deletions clang/lib/CodeGen/CGOpenMPRuntime.h
Expand Up @@ -306,15 +306,10 @@ class CGOpenMPRuntime {

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.
Expand Down Expand Up @@ -691,8 +686,7 @@ class CGOpenMPRuntime {
Address DependenciesArray);

public:
explicit CGOpenMPRuntime(CodeGenModule &CGM)
: CGOpenMPRuntime(CGM, ".", ".") {}
explicit CGOpenMPRuntime(CodeGenModule &CGM);
virtual ~CGOpenMPRuntime() {}
virtual void clear();

Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
Expand Up @@ -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);
Expand Down
45 changes: 41 additions & 4 deletions llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
Expand Up @@ -92,34 +92,61 @@ class OpenMPIRBuilderConfig {
/// 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.
Expand Down Expand Up @@ -150,6 +177,16 @@ class OpenMPIRBuilder {
/// 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
Expand Down
6 changes: 6 additions & 0 deletions llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Expand Up @@ -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) {
Expand Down

0 comments on commit 2aa338f

Please sign in to comment.