mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[OpenMPIRBuilder][Fix] Move llvm::omp::types to OpenMPIRBuilder.
Summary: D82193 exposed a problem with global type definitions in `OMPConstants.h`. This causes a race when running in thinLTO mode. Types now live inside of OpenMPIRBuilder to prevent this from happening. Reviewers: jdoerfert Subscribers: yaxunl, hiraditya, guansong, dexonsmith, aaron.ballman, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D83176
This commit is contained in:
parent
6a04f24d67
commit
7cc76647fc
@ -89,35 +89,6 @@ enum class IdentFlag {
|
||||
#define OMP_IDENT_FLAG(Enum, ...) constexpr auto Enum = omp::IdentFlag::Enum;
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
|
||||
/// Forward declarations for LLVM-IR types (simple, function and structure) are
|
||||
/// generated below. Their names are defined and used in OpenMP/OMPKinds.def.
|
||||
/// Here we provide the forward declarations, the initializeTypes function will
|
||||
/// provide the values.
|
||||
///
|
||||
///{
|
||||
namespace types {
|
||||
|
||||
#define OMP_TYPE(VarName, InitValue) extern Type *VarName;
|
||||
#define OMP_ARRAY_TYPE(VarName, ElemTy, ArraySize) \
|
||||
extern ArrayType *VarName##Ty; \
|
||||
extern PointerType *VarName##PtrTy;
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
extern FunctionType *VarName; \
|
||||
extern PointerType *VarName##Ptr;
|
||||
#define OMP_STRUCT_TYPE(VarName, StrName, ...) \
|
||||
extern StructType *VarName; \
|
||||
extern PointerType *VarName##Ptr;
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
|
||||
/// Helper to initialize all types defined in OpenMP/OMPKinds.def.
|
||||
void initializeTypes(Module &M);
|
||||
|
||||
/// Helper to uninitialize all types defined in OpenMP/OMPKinds.def.
|
||||
void uninitializeTypes();
|
||||
|
||||
} // namespace types
|
||||
///}
|
||||
|
||||
} // end namespace omp
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -39,7 +39,7 @@ public:
|
||||
void finalize();
|
||||
|
||||
/// Add attributes known for \p FnID to \p Fn.
|
||||
static void addAttributes(omp::RuntimeFunction FnID, Function &Fn);
|
||||
void addAttributes(omp::RuntimeFunction FnID, Function &Fn);
|
||||
|
||||
/// Type used throughout for insertion points.
|
||||
using InsertPointTy = IRBuilder<>::InsertPoint;
|
||||
@ -199,7 +199,7 @@ public:
|
||||
}
|
||||
|
||||
/// Return the function declaration for the runtime function with \p FnID.
|
||||
static FunctionCallee getOrCreateRuntimeFunction(Module &M,
|
||||
FunctionCallee getOrCreateRuntimeFunction(Module &M,
|
||||
omp::RuntimeFunction FnID);
|
||||
|
||||
Function *getOrCreateRuntimeFunctionPtr(omp::RuntimeFunction FnID);
|
||||
@ -381,7 +381,31 @@ public:
|
||||
llvm::ConstantInt *Size,
|
||||
const llvm::Twine &Name = Twine(""));
|
||||
|
||||
/// Declarations for LLVM-IR types (simple, array, function and structure) are
|
||||
/// generated below. Their names are defined and used in OpenMPKinds.def. Here
|
||||
/// we provide the declarations, the initializeTypes function will provide the
|
||||
/// values.
|
||||
///
|
||||
///{
|
||||
#define OMP_TYPE(VarName, InitValue) Type *VarName = nullptr;
|
||||
#define OMP_ARRAY_TYPE(VarName, ElemTy, ArraySize) \
|
||||
ArrayType *VarName##Ty = nullptr; \
|
||||
PointerType *VarName##PtrTy = nullptr;
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
FunctionType *VarName = nullptr; \
|
||||
PointerType *VarName##Ptr = nullptr;
|
||||
#define OMP_STRUCT_TYPE(VarName, StrName, ...) \
|
||||
StructType *VarName = nullptr; \
|
||||
PointerType *VarName##Ptr = nullptr;
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
|
||||
///}
|
||||
|
||||
private:
|
||||
/// Create all simple and struct types exposed by the runtime and remember
|
||||
/// the llvm::PointerTypes of them for easy access later.
|
||||
void initializeTypes(Module &M);
|
||||
|
||||
/// Common interface for generating entry calls for OMP Directives.
|
||||
/// if the directive has a region/body, It will set the insertion
|
||||
/// point to the body
|
||||
|
@ -17,61 +17,5 @@
|
||||
|
||||
using namespace llvm;
|
||||
using namespace omp;
|
||||
using namespace types;
|
||||
|
||||
#include "llvm/Frontend/OpenMP/OMP.cpp.inc"
|
||||
|
||||
/// Declarations for LLVM-IR types (simple, array, function and structure) are
|
||||
/// generated below. Their names are defined and used in OpenMPKinds.def. Here
|
||||
/// we provide the declarations, the initializeTypes function will provide the
|
||||
/// values.
|
||||
///
|
||||
///{
|
||||
#define OMP_TYPE(VarName, InitValue) Type *llvm::omp::types::VarName = nullptr;
|
||||
#define OMP_ARRAY_TYPE(VarName, ElemTy, ArraySize) \
|
||||
ArrayType *llvm::omp::types::VarName##Ty = nullptr; \
|
||||
PointerType *llvm::omp::types::VarName##PtrTy = nullptr;
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
FunctionType *llvm::omp::types::VarName = nullptr; \
|
||||
PointerType *llvm::omp::types::VarName##Ptr = nullptr;
|
||||
#define OMP_STRUCT_TYPE(VarName, StrName, ...) \
|
||||
StructType *llvm::omp::types::VarName = nullptr; \
|
||||
PointerType *llvm::omp::types::VarName##Ptr = nullptr;
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
|
||||
///}
|
||||
|
||||
void llvm::omp::types::initializeTypes(Module &M) {
|
||||
if (Void)
|
||||
return;
|
||||
|
||||
LLVMContext &Ctx = M.getContext();
|
||||
// Create all simple and struct types exposed by the runtime and remember
|
||||
// the llvm::PointerTypes of them for easy access later.
|
||||
StructType *T;
|
||||
#define OMP_TYPE(VarName, InitValue) VarName = InitValue;
|
||||
#define OMP_ARRAY_TYPE(VarName, ElemTy, ArraySize) \
|
||||
VarName##Ty = ArrayType::get(ElemTy, ArraySize); \
|
||||
VarName##PtrTy = PointerType::getUnqual(VarName##Ty);
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
VarName = FunctionType::get(ReturnType, {__VA_ARGS__}, IsVarArg); \
|
||||
VarName##Ptr = PointerType::getUnqual(VarName);
|
||||
#define OMP_STRUCT_TYPE(VarName, StructName, ...) \
|
||||
T = M.getTypeByName(StructName); \
|
||||
if (!T) \
|
||||
T = StructType::create(Ctx, {__VA_ARGS__}, StructName); \
|
||||
VarName = T; \
|
||||
VarName##Ptr = PointerType::getUnqual(T);
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
}
|
||||
|
||||
void llvm::omp::types::uninitializeTypes() {
|
||||
#define OMP_TYPE(VarName, InitValue) VarName = nullptr;
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
VarName = nullptr; \
|
||||
VarName##Ptr = nullptr;
|
||||
#define OMP_STRUCT_TYPE(VarName, StrName, ...) \
|
||||
VarName = nullptr; \
|
||||
VarName##Ptr = nullptr;
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
}
|
||||
|
@ -31,7 +31,6 @@
|
||||
|
||||
using namespace llvm;
|
||||
using namespace omp;
|
||||
using namespace types;
|
||||
|
||||
static cl::opt<bool>
|
||||
OptimisticAttributes("openmp-ir-builder-optimistic-attributes", cl::Hidden,
|
||||
@ -1092,3 +1091,24 @@ Value *OpenMPIRBuilder::getOMPCriticalRegionLock(StringRef CriticalName) {
|
||||
std::string Name = getNameWithSeparators({Prefix, "var"}, ".", ".");
|
||||
return getOrCreateOMPInternalVariable(KmpCriticalNameTy, Name);
|
||||
}
|
||||
|
||||
// Create all simple and struct types exposed by the runtime and remember
|
||||
// the llvm::PointerTypes of them for easy access later.
|
||||
void OpenMPIRBuilder::initializeTypes(Module &M) {
|
||||
LLVMContext &Ctx = M.getContext();
|
||||
StructType *T;
|
||||
#define OMP_TYPE(VarName, InitValue) VarName = InitValue;
|
||||
#define OMP_ARRAY_TYPE(VarName, ElemTy, ArraySize) \
|
||||
VarName##Ty = ArrayType::get(ElemTy, ArraySize); \
|
||||
VarName##PtrTy = PointerType::getUnqual(VarName##Ty);
|
||||
#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \
|
||||
VarName = FunctionType::get(ReturnType, {__VA_ARGS__}, IsVarArg); \
|
||||
VarName##Ptr = PointerType::getUnqual(VarName);
|
||||
#define OMP_STRUCT_TYPE(VarName, StructName, ...) \
|
||||
T = M.getTypeByName(StructName); \
|
||||
if (!T) \
|
||||
T = StructType::create(Ctx, {__VA_ARGS__}, StructName); \
|
||||
VarName = T; \
|
||||
VarName##Ptr = PointerType::getUnqual(T);
|
||||
#include "llvm/Frontend/OpenMP/OMPKinds.def"
|
||||
}
|
||||
|
@ -29,7 +29,6 @@
|
||||
|
||||
using namespace llvm;
|
||||
using namespace omp;
|
||||
using namespace types;
|
||||
|
||||
#define DEBUG_TYPE "openmp-opt"
|
||||
|
||||
@ -263,11 +262,11 @@ struct OMPInformationCache : public InformationCache {
|
||||
ICV.InitValue = nullptr; \
|
||||
break; \
|
||||
case ICV_ZERO: \
|
||||
ICV.InitValue = \
|
||||
ConstantInt::get(Type::getInt32Ty(Int32->getContext()), 0); \
|
||||
ICV.InitValue = ConstantInt::get( \
|
||||
Type::getInt32Ty(OMPBuilder.Int32->getContext()), 0); \
|
||||
break; \
|
||||
case ICV_FALSE: \
|
||||
ICV.InitValue = ConstantInt::getFalse(Int1->getContext()); \
|
||||
ICV.InitValue = ConstantInt::getFalse(OMPBuilder.Int1->getContext()); \
|
||||
break; \
|
||||
case ICV_LAST: \
|
||||
break; \
|
||||
@ -332,16 +331,39 @@ struct OMPInformationCache : public InformationCache {
|
||||
|
||||
Module &M = *((*ModuleSlice.begin())->getParent());
|
||||
|
||||
// Helper macros for handling __VA_ARGS__ in OMP_RTL
|
||||
#define OMP_TYPE(VarName, ...) \
|
||||
Type *VarName = OMPBuilder.VarName; \
|
||||
(void)VarName;
|
||||
|
||||
#define OMP_ARRAY_TYPE(VarName, ...) \
|
||||
ArrayType *VarName##Ty = OMPBuilder.VarName##Ty; \
|
||||
(void)VarName##Ty; \
|
||||
PointerType *VarName##PtrTy = OMPBuilder.VarName##PtrTy; \
|
||||
(void)VarName##PtrTy;
|
||||
|
||||
#define OMP_FUNCTION_TYPE(VarName, ...) \
|
||||
FunctionType *VarName = OMPBuilder.VarName; \
|
||||
(void)VarName; \
|
||||
PointerType *VarName##Ptr = OMPBuilder.VarName##Ptr; \
|
||||
(void)VarName##Ptr;
|
||||
|
||||
#define OMP_STRUCT_TYPE(VarName, ...) \
|
||||
StructType *VarName = OMPBuilder.VarName; \
|
||||
(void)VarName; \
|
||||
PointerType *VarName##Ptr = OMPBuilder.VarName##Ptr; \
|
||||
(void)VarName##Ptr;
|
||||
|
||||
#define OMP_RTL(_Enum, _Name, _IsVarArg, _ReturnType, ...) \
|
||||
{ \
|
||||
SmallVector<Type *, 8> ArgsTypes({__VA_ARGS__}); \
|
||||
Function *F = M.getFunction(_Name); \
|
||||
if (declMatchesRTFTypes(F, _ReturnType, ArgsTypes)) { \
|
||||
if (declMatchesRTFTypes(F, OMPBuilder._ReturnType, ArgsTypes)) { \
|
||||
auto &RFI = RFIs[_Enum]; \
|
||||
RFI.Kind = _Enum; \
|
||||
RFI.Name = _Name; \
|
||||
RFI.IsVarArg = _IsVarArg; \
|
||||
RFI.ReturnType = _ReturnType; \
|
||||
RFI.ReturnType = OMPBuilder._ReturnType; \
|
||||
RFI.ArgumentTypes = std::move(ArgsTypes); \
|
||||
RFI.Declaration = F; \
|
||||
unsigned NumUses = CollectUses(RFI); \
|
||||
@ -593,11 +615,11 @@ private:
|
||||
"Unexpected replacement value!");
|
||||
|
||||
// TODO: Use dominance to find a good position instead.
|
||||
auto CanBeMoved = [](CallBase &CB) {
|
||||
auto CanBeMoved = [this](CallBase &CB) {
|
||||
unsigned NumArgs = CB.getNumArgOperands();
|
||||
if (NumArgs == 0)
|
||||
return true;
|
||||
if (CB.getArgOperand(0)->getType() != IdentPtr)
|
||||
if (CB.getArgOperand(0)->getType() != OMPInfoCache.OMPBuilder.IdentPtr)
|
||||
return false;
|
||||
for (unsigned u = 1; u < NumArgs; ++u)
|
||||
if (isa<Instruction>(CB.getArgOperand(u)))
|
||||
@ -632,7 +654,7 @@ private:
|
||||
// existing and used by one of the calls, or created from scratch.
|
||||
if (CallBase *CI = dyn_cast<CallBase>(ReplVal)) {
|
||||
if (CI->getNumArgOperands() > 0 &&
|
||||
CI->getArgOperand(0)->getType() == IdentPtr) {
|
||||
CI->getArgOperand(0)->getType() == OMPInfoCache.OMPBuilder.IdentPtr) {
|
||||
Value *Ident = getCombinedIdentFromCallUsesIn(RFI, F,
|
||||
/* GlobalOnly */ true);
|
||||
CI->setArgOperand(0, Ident);
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
using namespace llvm;
|
||||
using namespace omp;
|
||||
using namespace types;
|
||||
|
||||
namespace {
|
||||
|
||||
@ -50,7 +49,6 @@ protected:
|
||||
void TearDown() override {
|
||||
BB = nullptr;
|
||||
M.reset();
|
||||
uninitializeTypes();
|
||||
}
|
||||
|
||||
LLVMContext Ctx;
|
||||
|
Loading…
Reference in New Issue
Block a user