@@ -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+
1002910054static 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