Skip to content

Commit 540250c

Browse files
authored
[OpenMP][Clang] Add codegen support for dyn_groupprivate clause (llvm#152830)
This adds the codegen support for the dyn_groupprivate clause.
1 parent b4a6151 commit 540250c

File tree

5 files changed

+2718
-29
lines changed

5 files changed

+2718
-29
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10013,19 +10013,44 @@ static llvm::Value *emitDeviceID(
1001310013
return DeviceID;
1001410014
}
1001510015

10016-
static llvm::Value *emitDynCGGroupMem(const OMPExecutableDirective &D,
10017-
CodeGenFunction &CGF) {
10018-
llvm::Value *DynCGroupMem = CGF.Builder.getInt32(0);
10019-
10020-
if (auto *DynMemClause = D.getSingleClause<OMPXDynCGroupMemClause>()) {
10021-
CodeGenFunction::RunCleanupsScope DynCGroupMemScope(CGF);
10022-
llvm::Value *DynCGroupMemVal = CGF.EmitScalarExpr(
10023-
DynMemClause->getSize(), /*IgnoreResultAssign=*/true);
10024-
DynCGroupMem = CGF.Builder.CreateIntCast(DynCGroupMemVal, CGF.Int32Ty,
10025-
/*isSigned=*/false);
10016+
static std::pair<llvm::Value *, OMPDynGroupprivateFallbackType>
10017+
emitDynCGroupMem(const OMPExecutableDirective &D, CodeGenFunction &CGF) {
10018+
llvm::Value *DynGP = CGF.Builder.getInt32(0);
10019+
auto DynGPFallback = OMPDynGroupprivateFallbackType::Abort;
10020+
10021+
if (auto *DynGPClause = D.getSingleClause<OMPDynGroupprivateClause>()) {
10022+
CodeGenFunction::RunCleanupsScope DynGPScope(CGF);
10023+
llvm::Value *DynGPVal =
10024+
CGF.EmitScalarExpr(DynGPClause->getSize(), /*IgnoreResultAssign=*/true);
10025+
DynGP = CGF.Builder.CreateIntCast(DynGPVal, CGF.Int32Ty,
10026+
/*isSigned=*/false);
10027+
auto FallbackModifier = DynGPClause->getDynGroupprivateFallbackModifier();
10028+
switch (FallbackModifier) {
10029+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_abort:
10030+
DynGPFallback = OMPDynGroupprivateFallbackType::Abort;
10031+
break;
10032+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_null:
10033+
DynGPFallback = OMPDynGroupprivateFallbackType::Null;
10034+
break;
10035+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_default_mem:
10036+
case OMPC_DYN_GROUPPRIVATE_FALLBACK_unknown:
10037+
// This is the default for dyn_groupprivate.
10038+
DynGPFallback = OMPDynGroupprivateFallbackType::DefaultMem;
10039+
break;
10040+
default:
10041+
llvm_unreachable("Unknown fallback modifier for OpenMP dyn_groupprivate");
10042+
}
10043+
} else if (auto *OMPXDynCGClause =
10044+
D.getSingleClause<OMPXDynCGroupMemClause>()) {
10045+
CodeGenFunction::RunCleanupsScope DynCGMemScope(CGF);
10046+
llvm::Value *DynCGMemVal = CGF.EmitScalarExpr(OMPXDynCGClause->getSize(),
10047+
/*IgnoreResultAssign=*/true);
10048+
DynGP = CGF.Builder.CreateIntCast(DynCGMemVal, CGF.Int32Ty,
10049+
/*isSigned=*/false);
1002610050
}
10027-
return DynCGroupMem;
10051+
return {DynGP, DynGPFallback};
1002810052
}
10053+
1002910054
static void genMapInfoForCaptures(
1003010055
MappableExprsHandler &MEHandler, CodeGenFunction &CGF,
1003110056
const CapturedStmt &CS, llvm::SmallVectorImpl<llvm::Value *> &CapturedVars,
@@ -10234,7 +10259,7 @@ static void emitTargetCallKernelLaunch(
1023410259
llvm::Value *RTLoc = OMPRuntime->emitUpdateLocation(CGF, D.getBeginLoc());
1023510260
llvm::Value *NumIterations =
1023610261
OMPRuntime->emitTargetNumIterationsCall(CGF, D, SizeEmitter);
10237-
llvm::Value *DynCGGroupMem = emitDynCGGroupMem(D, CGF);
10262+
auto [DynCGroupMem, DynCGroupMemFallback] = emitDynCGroupMem(D, CGF);
1023810263
llvm::OpenMPIRBuilder::InsertPointTy AllocaIP(
1023910264
CGF.AllocaInsertPt->getParent(), CGF.AllocaInsertPt->getIterator());
1024010265

@@ -10244,7 +10269,7 @@ static void emitTargetCallKernelLaunch(
1024410269

1024510270
llvm::OpenMPIRBuilder::TargetKernelArgs Args(
1024610271
NumTargetItems, RTArgs, NumIterations, NumTeams, NumThreads,
10247-
DynCGGroupMem, HasNoWait);
10272+
DynCGroupMem, HasNoWait, DynCGroupMemFallback);
1024810273

1024910274
llvm::OpenMPIRBuilder::InsertPointTy AfterIP =
1025010275
cantFail(OMPRuntime->getOMPBuilder().emitKernelLaunch(

0 commit comments

Comments
 (0)