Skip to content

Commit 3a2fe70

Browse files
committed
Update for fallback complex modifier
1 parent f9eee16 commit 3a2fe70

File tree

4 files changed

+44
-19
lines changed

4 files changed

+44
-19
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10000,31 +10000,45 @@ static llvm::Value *emitDeviceID(
1000010000
return DeviceID;
1000110001
}
1000210002

10003-
static std::pair<llvm::Value *, bool>
10003+
static std::pair<llvm::Value *, OMPDynGroupprivateFallbackType>
1000410004
emitDynCGroupMem(const OMPExecutableDirective &D, CodeGenFunction &CGF) {
1000510005
llvm::Value *DynGP = CGF.Builder.getInt32(0);
10006-
bool DynGPFallback = false;
10006+
OMPDynGroupprivateFallbackType DynGPFallback;
1000710007

1000810008
if (auto *DynGPClause = D.getSingleClause<OMPDynGroupprivateClause>()) {
1000910009
CodeGenFunction::RunCleanupsScope DynGPScope(CGF);
1001010010
llvm::Value *DynGPVal =
1001110011
CGF.EmitScalarExpr(DynGPClause->getSize(), /*IgnoreResultAssign=*/true);
1001210012
DynGP = CGF.Builder.CreateIntCast(DynGPVal, CGF.Int32Ty,
1001310013
/*isSigned=*/false);
10014-
DynGPFallback = (DynGPClause->getFirstDynGroupprivateModifier() !=
10015-
OMPC_DYN_GROUPPRIVATE_strict &&
10016-
DynGPClause->getSecondDynGroupprivateModifier() !=
10017-
OMPC_DYN_GROUPPRIVATE_strict);
10014+
auto FallbackModifier = DynGPClause->getDynGroupprivateFallbackModifier();
10015+
switch (FallbackModifier) {
10016+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_abort:
10017+
DynGPFallback = OMPDynGroupprivateFallbackType::Abort;
10018+
break;
10019+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_null:
10020+
DynGPFallback = OMPDynGroupprivateFallbackType::Null;
10021+
break;
10022+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_default_mem:
10023+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_unknown:
10024+
// This is the default for dyn_groupprivate.
10025+
DynGPFallback = OMPDynGroupprivateFallbackType::DefaultMem;
10026+
break;
10027+
default:
10028+
llvm_unreachable("Unknown fallback modifier for OpenMP dyn_groupprivate");
10029+
}
1001810030
} else if (auto *OMPXDynCGClause =
1001910031
D.getSingleClause<OMPXDynCGroupMemClause>()) {
1002010032
CodeGenFunction::RunCleanupsScope DynCGMemScope(CGF);
1002110033
llvm::Value *DynCGMemVal = CGF.EmitScalarExpr(OMPXDynCGClause->getSize(),
1002210034
/*IgnoreResultAssign=*/true);
1002310035
DynGP = CGF.Builder.CreateIntCast(DynCGMemVal, CGF.Int32Ty,
1002410036
/*isSigned=*/false);
10037+
DynGPFallback = OMPDynGroupprivateFallbackType::Abort;
1002510038
}
1002610039
return {DynGP, DynGPFallback};
1002710040
}
10041+
1002810042
static void genMapInfoForCaptures(
1002910043
MappableExprsHandler &MEHandler, CodeGenFunction &CGF,
1003010044
const CapturedStmt &CS, llvm::SmallVectorImpl<llvm::Value *> &CapturedVars,

llvm/include/llvm/Frontend/OpenMP/OMPConstants.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,16 @@ enum class OMPScheduleType {
190190
LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask)
191191
};
192192

193+
/// The fallback types for the dyn_groupprivate clause.
194+
enum class OMPDynGroupprivateFallbackType : uint64_t {
195+
/// Abort the execution.
196+
Abort = 0,
197+
/// Return null pointer.
198+
Null = 1,
199+
/// Allocate from a implementation defined memory space.
200+
DefaultMem = 2
201+
};
202+
193203
// Default OpenMP mapper name suffix.
194204
inline constexpr const char *OmpDefaultMapperName = ".omp.default.mapper";
195205

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2449,20 +2449,21 @@ class OpenMPIRBuilder {
24492449
Value *DynCGGroupMem = nullptr;
24502450
/// True if the kernel has 'no wait' clause.
24512451
bool HasNoWait = false;
2452-
/// True if the dynamic shared memory may fallback.
2453-
bool MayFallbackDynCGroupMem = false;
2452+
/// The fallback mechanism for the shared memory.
2453+
omp::OMPDynGroupprivateFallbackType DynCGroupMemFallback =
2454+
omp::OMPDynGroupprivateFallbackType::Abort;
24542455

24552456
// Constructors for TargetKernelArgs.
24562457
TargetKernelArgs() {}
24572458
TargetKernelArgs(unsigned NumTargetItems, TargetDataRTArgs RTArgs,
24582459
Value *NumIterations, ArrayRef<Value *> NumTeams,
24592460
ArrayRef<Value *> NumThreads, Value *DynCGGroupMem,
2460-
bool HasNoWait, bool MayFallbackDynCGroupMem)
2461+
bool HasNoWait,
2462+
omp::OMPDynGroupprivateFallbackType DynCGroupMemFallback)
24612463
: NumTargetItems(NumTargetItems), RTArgs(RTArgs),
24622464
NumIterations(NumIterations), NumTeams(NumTeams),
24632465
NumThreads(NumThreads), DynCGGroupMem(DynCGGroupMem),
2464-
HasNoWait(HasNoWait),
2465-
MayFallbackDynCGroupMem(MayFallbackDynCGroupMem) {}
2466+
HasNoWait(HasNoWait), DynCGroupMemFallback(DynCGroupMemFallback) {}
24662467
};
24672468

24682469
/// Create the kernel args vector used by emitTargetKernel. This function

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,11 @@ void OpenMPIRBuilder::getKernelArgsVector(TargetKernelArgs &KernelArgs,
532532
Value *ZeroArray = Constant::getNullValue(ArrayType::get(Int32Ty, MaxDim));
533533

534534
Value *HasNoWaitFlag = Builder.getInt64(KernelArgs.HasNoWait);
535-
Value *MayFallbackDynCGroupMemFlag =
536-
Builder.getInt64(KernelArgs.MayFallbackDynCGroupMem);
537-
MayFallbackDynCGroupMemFlag =
538-
Builder.CreateShl(MayFallbackDynCGroupMemFlag, 2);
539-
Value *Flags = Builder.CreateOr(HasNoWaitFlag, MayFallbackDynCGroupMemFlag);
535+
536+
Value *DynCGroupMemFallbackFlag =
537+
Builder.getInt64(static_cast<uint64_t>(KernelArgs.DynCGroupMemFallback));
538+
DynCGroupMemFallbackFlag = Builder.CreateShl(DynCGroupMemFallbackFlag, 2);
539+
Value *Flags = Builder.CreateOr(HasNoWaitFlag, DynCGroupMemFallbackFlag);
540540

541541
assert(!KernelArgs.NumTeams.empty() && !KernelArgs.NumThreads.empty());
542542

@@ -8368,9 +8368,9 @@ static void emitTargetCall(
83688368
// TODO: Use correct DynCGGroupMem
83698369
Value *DynCGGroupMem = Builder.getInt32(0);
83708370

8371-
KArgs = OpenMPIRBuilder::TargetKernelArgs(NumTargetItems, RTArgs, TripCount,
8372-
NumTeamsC, NumThreadsC,
8373-
DynCGGroupMem, HasNoWait, false);
8371+
KArgs = OpenMPIRBuilder::TargetKernelArgs(
8372+
NumTargetItems, RTArgs, TripCount, NumTeamsC, NumThreadsC,
8373+
DynCGGroupMem, HasNoWait, OMPDynGroupprivateFallbackType::Abort);
83748374

83758375
// Assume no error was returned because TaskBodyCB and
83768376
// EmitTargetCallFallbackCB don't produce any.

0 commit comments

Comments
 (0)