forked from OSchip/llvm-project
[OPENMP][NVPTX]Emit default locations as constant with undefined mode.
For the NVPTX target default locations should be emitted as constants + additional info must be emitted in the reserved_2 field of the ident_t structure. The 1st bit controls the execution mode and the 2nd bit controls use of the lightweight runtime. The combination of the bits for Non-SPMD mode + lightweight runtime represents special undefined mode, used outside of the target regions for orphaned directives or functions. Should allow and additional optimization inside of the target regions. llvm-svn: 347425
This commit is contained in:
parent
20935e0ab5
commit
ceeaa48052
|
@ -1467,7 +1467,9 @@ createConstantGlobalStructAndAddToParent(CodeGenModule &CGM, QualType Ty,
|
|||
|
||||
Address CGOpenMPRuntime::getOrCreateDefaultLocation(unsigned Flags) {
|
||||
CharUnits Align = CGM.getContext().getTypeAlignInChars(IdentQTy);
|
||||
llvm::Value *Entry = OpenMPDefaultLocMap.lookup(Flags);
|
||||
unsigned Reserved2Flags = getDefaultLocationReserved2Flags();
|
||||
FlagsTy FlagsKey(Flags, Reserved2Flags);
|
||||
llvm::Value *Entry = OpenMPDefaultLocMap.lookup(FlagsKey);
|
||||
if (!Entry) {
|
||||
if (!DefaultOpenMPPSource) {
|
||||
// Initialize default location for psource field of ident_t structure of
|
||||
|
@ -1480,18 +1482,18 @@ Address CGOpenMPRuntime::getOrCreateDefaultLocation(unsigned Flags) {
|
|||
llvm::ConstantExpr::getBitCast(DefaultOpenMPPSource, CGM.Int8PtrTy);
|
||||
}
|
||||
|
||||
llvm::Constant *Data[] = {llvm::ConstantInt::getNullValue(CGM.Int32Ty),
|
||||
llvm::ConstantInt::get(CGM.Int32Ty, Flags),
|
||||
llvm::ConstantInt::getNullValue(CGM.Int32Ty),
|
||||
llvm::ConstantInt::getNullValue(CGM.Int32Ty),
|
||||
DefaultOpenMPPSource};
|
||||
llvm::Constant *Data[] = {
|
||||
llvm::ConstantInt::getNullValue(CGM.Int32Ty),
|
||||
llvm::ConstantInt::get(CGM.Int32Ty, Flags),
|
||||
llvm::ConstantInt::get(CGM.Int32Ty, Reserved2Flags),
|
||||
llvm::ConstantInt::getNullValue(CGM.Int32Ty), DefaultOpenMPPSource};
|
||||
llvm::GlobalValue *DefaultOpenMPLocation =
|
||||
createGlobalStruct(CGM, IdentQTy, /*IsConstant=*/false, Data, "",
|
||||
createGlobalStruct(CGM, IdentQTy, isDefaultLocationConstant(), Data, "",
|
||||
llvm::GlobalValue::PrivateLinkage);
|
||||
DefaultOpenMPLocation->setUnnamedAddr(
|
||||
llvm::GlobalValue::UnnamedAddr::Global);
|
||||
|
||||
OpenMPDefaultLocMap[Flags] = Entry = DefaultOpenMPLocation;
|
||||
OpenMPDefaultLocMap[FlagsKey] = Entry = DefaultOpenMPLocation;
|
||||
}
|
||||
return Address(Entry, Align);
|
||||
}
|
||||
|
|
|
@ -282,12 +282,21 @@ protected:
|
|||
bool AtCurrentPoint = false);
|
||||
void clearLocThreadIdInsertPt(CodeGenFunction &CGF);
|
||||
|
||||
/// Check if the default location must be constant.
|
||||
/// Default is false to support OMPT/OMPD.
|
||||
virtual bool isDefaultLocationConstant() const { return false; }
|
||||
|
||||
/// Returns additional flags that can be stored in reserved_2 field of the
|
||||
/// default location.
|
||||
virtual unsigned getDefaultLocationReserved2Flags() const { return 0; }
|
||||
|
||||
private:
|
||||
/// Default const ident_t object used for initialization of all other
|
||||
/// ident_t objects.
|
||||
llvm::Constant *DefaultOpenMPPSource = nullptr;
|
||||
using FlagsTy = std::pair<unsigned, unsigned>;
|
||||
/// Map of flags and corresponding default locations.
|
||||
typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDefaultLocMapTy;
|
||||
using OpenMPDefaultLocMapTy = llvm::DenseMap<FlagsTy, llvm::Value *>;
|
||||
OpenMPDefaultLocMapTy OpenMPDefaultLocMap;
|
||||
Address getOrCreateDefaultLocation(unsigned Flags);
|
||||
|
||||
|
|
|
@ -1902,6 +1902,26 @@ void CGOpenMPRuntimeNVPTX::emitTargetOutlinedFunction(
|
|||
setPropertyExecutionMode(CGM, OutlinedFn->getName(), Mode);
|
||||
}
|
||||
|
||||
namespace {
|
||||
LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
|
||||
/// Enum for accesseing the reserved_2 field of the ident_t struct.
|
||||
enum ModeFlagsTy : unsigned {
|
||||
/// Bit set to 1 when in SPMD mode.
|
||||
KMP_IDENT_SPMD_MODE = 0x01,
|
||||
/// Bit set to 1 when a simplified runtime is used.
|
||||
KMP_IDENT_SIMPLE_RT_MODE = 0x02,
|
||||
LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/KMP_IDENT_SIMPLE_RT_MODE)
|
||||
};
|
||||
|
||||
/// Special mode Undefined. Is the combination of Non-SPMD mode + SimpleRuntime.
|
||||
static const ModeFlagsTy UndefinedMode =
|
||||
(~KMP_IDENT_SPMD_MODE) & KMP_IDENT_SIMPLE_RT_MODE;
|
||||
} // anonymous namespace
|
||||
|
||||
unsigned CGOpenMPRuntimeNVPTX::getDefaultLocationReserved2Flags() const {
|
||||
return UndefinedMode;
|
||||
}
|
||||
|
||||
CGOpenMPRuntimeNVPTX::CGOpenMPRuntimeNVPTX(CodeGenModule &CGM)
|
||||
: CGOpenMPRuntime(CGM, "_", "$") {
|
||||
if (!CGM.getLangOpts().OpenMPIsDevice)
|
||||
|
|
|
@ -180,6 +180,16 @@ protected:
|
|||
return "__omp_outlined__";
|
||||
}
|
||||
|
||||
/// Check if the default location must be constant.
|
||||
/// Constant for NVPTX for better optimization.
|
||||
bool isDefaultLocationConstant() const override { return true; }
|
||||
|
||||
/// Returns additional flags that can be stored in reserved_2 field of the
|
||||
/// default location.
|
||||
/// For NVPTX target contains data about SPMD/Non-SPMD execution mode +
|
||||
/// Full/Lightweight runtime mode. Used for better optimization.
|
||||
unsigned getDefaultLocationReserved2Flags() const override;
|
||||
|
||||
public:
|
||||
explicit CGOpenMPRuntimeNVPTX(CodeGenModule &CGM);
|
||||
void clear() override;
|
||||
|
|
|
@ -8,6 +8,11 @@
|
|||
#ifndef HEADER
|
||||
#define HEADER
|
||||
|
||||
// CHECK-NOT: @__omp_offloading_{{.+}}_exec_mode = weak constant i8 1
|
||||
// CHECK-DAG: private unnamed_addr constant %struct.ident_t { i32 0, i32 2050, i32 2, i32 0, i8* getelementptr inbounds
|
||||
// CHECK-DAG: private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 2, i32 0, i8* getelementptr inbounds
|
||||
// CHECK-DAG: private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 2, i32 0, i8* getelementptr inbounds
|
||||
// CHECK-DAG: private unnamed_addr constant %struct.ident_t { i32 0, i32 66, i32 2, i32 0, i8* getelementptr inbounds
|
||||
// CHECK-NOT: @__omp_offloading_{{.+}}_exec_mode = weak constant i8 1
|
||||
|
||||
void foo() {
|
||||
|
|
|
@ -6,8 +6,10 @@
|
|||
// expected-no-diagnostics
|
||||
extern int printf(const char *, ...);
|
||||
|
||||
// CHECK-DAG: private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 2, i32 0, i8* getelementptr inbounds
|
||||
|
||||
// Check a simple call to printf end-to-end.
|
||||
// CHECK: [[SIMPLE_PRINTF_TY:%[a-zA-Z0-9_]+]] = type { i32, i64, double }
|
||||
// CHECK-DAG: [[SIMPLE_PRINTF_TY:%[a-zA-Z0-9_]+]] = type { i32, i64, double }
|
||||
int CheckSimple() {
|
||||
// CHECK: define {{.*}}void [[T1:@__omp_offloading_.+CheckSimple.+]]_worker()
|
||||
#pragma omp target
|
||||
|
|
Loading…
Reference in New Issue