@@ -9042,257 +9042,65 @@ void CGOpenMPRuntime::emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
9042
9042
return;
9043
9043
ASTContext &C = CGM.getContext();
9044
9044
QualType Ty = D->getType();
9045
- QualType PtrTy = C.getPointerType(Ty).withRestrict();
9046
- QualType Int64Ty = C.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/true);
9047
9045
auto *MapperVarDecl =
9048
9046
cast<VarDecl>(cast<DeclRefExpr>(D->getMapperVarRef())->getDecl());
9049
- SourceLocation Loc = D->getLocation();
9050
9047
CharUnits ElementSize = C.getTypeSizeInChars(Ty);
9051
9048
llvm::Type *ElemTy = CGM.getTypes().ConvertTypeForMem(Ty);
9052
9049
9053
- // Prepare mapper function arguments and attributes.
9054
- ImplicitParamDecl HandleArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr,
9055
- C.VoidPtrTy, ImplicitParamKind::Other);
9056
- ImplicitParamDecl BaseArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr, C.VoidPtrTy,
9057
- ImplicitParamKind::Other);
9058
- ImplicitParamDecl BeginArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr,
9059
- C.VoidPtrTy, ImplicitParamKind::Other);
9060
- ImplicitParamDecl SizeArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr, Int64Ty,
9061
- ImplicitParamKind::Other);
9062
- ImplicitParamDecl TypeArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr, Int64Ty,
9063
- ImplicitParamKind::Other);
9064
- ImplicitParamDecl NameArg(C, /*DC=*/nullptr, Loc, /*Id=*/nullptr, C.VoidPtrTy,
9065
- ImplicitParamKind::Other);
9066
- FunctionArgList Args;
9067
- Args.push_back(&HandleArg);
9068
- Args.push_back(&BaseArg);
9069
- Args.push_back(&BeginArg);
9070
- Args.push_back(&SizeArg);
9071
- Args.push_back(&TypeArg);
9072
- Args.push_back(&NameArg);
9073
- const CGFunctionInfo &FnInfo =
9074
- CGM.getTypes().arrangeBuiltinFunctionDeclaration(C.VoidTy, Args);
9075
- llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FnInfo);
9076
- SmallString<64> TyStr;
9077
- llvm::raw_svector_ostream Out(TyStr);
9078
- CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out);
9079
- std::string Name = getName({"omp_mapper", TyStr, D->getName()});
9080
- auto *Fn = llvm::Function::Create(FnTy, llvm::GlobalValue::InternalLinkage,
9081
- Name, &CGM.getModule());
9082
- CGM.SetInternalFunctionAttributes(GlobalDecl(), Fn, FnInfo);
9083
- Fn->removeFnAttr(llvm::Attribute::OptimizeNone);
9084
- // Start the mapper function code generation.
9085
9050
CodeGenFunction MapperCGF(CGM);
9086
- MapperCGF.StartFunction(GlobalDecl(), C.VoidTy, Fn, FnInfo, Args, Loc, Loc);
9087
- // Compute the starting and end addresses of array elements.
9088
- llvm::Value *Size = MapperCGF.EmitLoadOfScalar(
9089
- MapperCGF.GetAddrOfLocalVar(&SizeArg), /*Volatile=*/false,
9090
- C.getPointerType(Int64Ty), Loc);
9091
- // Prepare common arguments for array initiation and deletion.
9092
- llvm::Value *Handle = MapperCGF.EmitLoadOfScalar(
9093
- MapperCGF.GetAddrOfLocalVar(&HandleArg),
9094
- /*Volatile=*/false, C.getPointerType(C.VoidPtrTy), Loc);
9095
- llvm::Value *BaseIn = MapperCGF.EmitLoadOfScalar(
9096
- MapperCGF.GetAddrOfLocalVar(&BaseArg),
9097
- /*Volatile=*/false, C.getPointerType(C.VoidPtrTy), Loc);
9098
- llvm::Value *BeginIn = MapperCGF.EmitLoadOfScalar(
9099
- MapperCGF.GetAddrOfLocalVar(&BeginArg),
9100
- /*Volatile=*/false, C.getPointerType(C.VoidPtrTy), Loc);
9101
- // Convert the size in bytes into the number of array elements.
9102
- Size = MapperCGF.Builder.CreateExactUDiv(
9103
- Size, MapperCGF.Builder.getInt64(ElementSize.getQuantity()));
9104
- llvm::Value *PtrBegin = MapperCGF.Builder.CreateBitCast(
9105
- BeginIn, CGM.getTypes().ConvertTypeForMem(PtrTy));
9106
- llvm::Value *PtrEnd = MapperCGF.Builder.CreateGEP(ElemTy, PtrBegin, Size);
9107
- llvm::Value *MapType = MapperCGF.EmitLoadOfScalar(
9108
- MapperCGF.GetAddrOfLocalVar(&TypeArg), /*Volatile=*/false,
9109
- C.getPointerType(Int64Ty), Loc);
9110
- llvm::Value *MapName = MapperCGF.EmitLoadOfScalar(
9111
- MapperCGF.GetAddrOfLocalVar(&NameArg),
9112
- /*Volatile=*/false, C.getPointerType(C.VoidPtrTy), Loc);
9113
-
9114
- // Emit array initiation if this is an array section and \p MapType indicates
9115
- // that memory allocation is required.
9116
- llvm::BasicBlock *HeadBB = MapperCGF.createBasicBlock("omp.arraymap.head");
9117
- emitUDMapperArrayInitOrDel(MapperCGF, Handle, BaseIn, BeginIn, Size, MapType,
9118
- MapName, ElementSize, HeadBB, /*IsInit=*/true);
9119
-
9120
- // Emit a for loop to iterate through SizeArg of elements and map all of them.
9121
-
9122
- // Emit the loop header block.
9123
- MapperCGF.EmitBlock(HeadBB);
9124
- llvm::BasicBlock *BodyBB = MapperCGF.createBasicBlock("omp.arraymap.body");
9125
- llvm::BasicBlock *DoneBB = MapperCGF.createBasicBlock("omp.done");
9126
- // Evaluate whether the initial condition is satisfied.
9127
- llvm::Value *IsEmpty =
9128
- MapperCGF.Builder.CreateICmpEQ(PtrBegin, PtrEnd, "omp.arraymap.isempty");
9129
- MapperCGF.Builder.CreateCondBr(IsEmpty, DoneBB, BodyBB);
9130
- llvm::BasicBlock *EntryBB = MapperCGF.Builder.GetInsertBlock();
9051
+ MappableExprsHandler::MapCombinedInfoTy CombinedInfo;
9052
+ auto PrivatizeAndGenMapInfoCB =
9053
+ [&](llvm::OpenMPIRBuilder::InsertPointTy CodeGenIP, llvm::Value *PtrPHI,
9054
+ llvm::Value *BeginArg) -> llvm::OpenMPIRBuilder::MapInfosTy & {
9055
+ MapperCGF.Builder.restoreIP(CodeGenIP);
9056
+
9057
+ // Privatize the declared variable of mapper to be the current array
9058
+ // element.
9059
+ Address PtrCurrent(
9060
+ PtrPHI, ElemTy,
9061
+ Address(BeginArg, MapperCGF.VoidPtrTy, CGM.getPointerAlign())
9062
+ .getAlignment()
9063
+ .alignmentOfArrayElement(ElementSize));
9064
+ CodeGenFunction::OMPPrivateScope Scope(MapperCGF);
9065
+ Scope.addPrivate(MapperVarDecl, PtrCurrent);
9066
+ (void)Scope.Privatize();
9131
9067
9132
- // Emit the loop body block.
9133
- MapperCGF.EmitBlock(BodyBB);
9134
- llvm::BasicBlock *LastBB = BodyBB;
9135
- llvm::PHINode *PtrPHI = MapperCGF.Builder.CreatePHI(
9136
- PtrBegin->getType(), 2, "omp.arraymap.ptrcurrent");
9137
- PtrPHI->addIncoming(PtrBegin, EntryBB);
9138
- Address PtrCurrent(PtrPHI, ElemTy,
9139
- MapperCGF.GetAddrOfLocalVar(&BeginArg)
9140
- .getAlignment()
9141
- .alignmentOfArrayElement(ElementSize));
9142
- // Privatize the declared variable of mapper to be the current array element.
9143
- CodeGenFunction::OMPPrivateScope Scope(MapperCGF);
9144
- Scope.addPrivate(MapperVarDecl, PtrCurrent);
9145
- (void)Scope.Privatize();
9068
+ // Get map clause information.
9069
+ MappableExprsHandler MEHandler(*D, MapperCGF);
9070
+ MEHandler.generateAllInfoForMapper(CombinedInfo, OMPBuilder);
9071
+
9072
+ auto FillInfoMap = [&](MappableExprsHandler::MappingExprInfo &MapExpr) {
9073
+ return emitMappingInformation(MapperCGF, OMPBuilder, MapExpr);
9074
+ };
9075
+ if (CGM.getCodeGenOpts().getDebugInfo() !=
9076
+ llvm::codegenoptions::NoDebugInfo) {
9077
+ CombinedInfo.Names.resize(CombinedInfo.Exprs.size());
9078
+ llvm::transform(CombinedInfo.Exprs, CombinedInfo.Names.begin(),
9079
+ FillInfoMap);
9080
+ }
9146
9081
9147
- // Get map clause information. Fill up the arrays with all mapped variables.
9148
- MappableExprsHandler::MapCombinedInfoTy Info;
9149
- MappableExprsHandler MEHandler(*D, MapperCGF);
9150
- MEHandler.generateAllInfoForMapper(Info, OMPBuilder);
9082
+ return CombinedInfo;
9083
+ };
9151
9084
9152
- // Call the runtime API __tgt_mapper_num_components to get the number of
9153
- // pre-existing components.
9154
- llvm::Value *OffloadingArgs[] = {Handle};
9155
- llvm::Value *PreviousSize = MapperCGF.EmitRuntimeCall(
9156
- OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(),
9157
- OMPRTL___tgt_mapper_num_components),
9158
- OffloadingArgs);
9159
- llvm::Value *ShiftedPreviousSize = MapperCGF.Builder.CreateShl(
9160
- PreviousSize,
9161
- MapperCGF.Builder.getInt64(MappableExprsHandler::getFlagMemberOffset()));
9162
-
9163
- // Fill up the runtime mapper handle for all components.
9164
- for (unsigned I = 0; I < Info.BasePointers.size(); ++I) {
9165
- llvm::Value *CurBaseArg = MapperCGF.Builder.CreateBitCast(
9166
- Info.BasePointers[I], CGM.getTypes().ConvertTypeForMem(C.VoidPtrTy));
9167
- llvm::Value *CurBeginArg = MapperCGF.Builder.CreateBitCast(
9168
- Info.Pointers[I], CGM.getTypes().ConvertTypeForMem(C.VoidPtrTy));
9169
- llvm::Value *CurSizeArg = Info.Sizes[I];
9170
- llvm::Value *CurNameArg =
9171
- (CGM.getCodeGenOpts().getDebugInfo() ==
9172
- llvm::codegenoptions::NoDebugInfo)
9173
- ? llvm::ConstantPointerNull::get(CGM.VoidPtrTy)
9174
- : emitMappingInformation(MapperCGF, OMPBuilder, Info.Exprs[I]);
9175
-
9176
- // Extract the MEMBER_OF field from the map type.
9177
- llvm::Value *OriMapType = MapperCGF.Builder.getInt64(
9178
- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9179
- Info.Types[I]));
9180
- llvm::Value *MemberMapType =
9181
- MapperCGF.Builder.CreateNUWAdd(OriMapType, ShiftedPreviousSize);
9182
-
9183
- // Combine the map type inherited from user-defined mapper with that
9184
- // specified in the program. According to the OMP_MAP_TO and OMP_MAP_FROM
9185
- // bits of the \a MapType, which is the input argument of the mapper
9186
- // function, the following code will set the OMP_MAP_TO and OMP_MAP_FROM
9187
- // bits of MemberMapType.
9188
- // [OpenMP 5.0], 1.2.6. map-type decay.
9189
- // | alloc | to | from | tofrom | release | delete
9190
- // ----------------------------------------------------------
9191
- // alloc | alloc | alloc | alloc | alloc | release | delete
9192
- // to | alloc | to | alloc | to | release | delete
9193
- // from | alloc | alloc | from | from | release | delete
9194
- // tofrom | alloc | to | from | tofrom | release | delete
9195
- llvm::Value *LeftToFrom = MapperCGF.Builder.CreateAnd(
9196
- MapType,
9197
- MapperCGF.Builder.getInt64(
9198
- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9199
- OpenMPOffloadMappingFlags::OMP_MAP_TO |
9200
- OpenMPOffloadMappingFlags::OMP_MAP_FROM)));
9201
- llvm::BasicBlock *AllocBB = MapperCGF.createBasicBlock("omp.type.alloc");
9202
- llvm::BasicBlock *AllocElseBB =
9203
- MapperCGF.createBasicBlock("omp.type.alloc.else");
9204
- llvm::BasicBlock *ToBB = MapperCGF.createBasicBlock("omp.type.to");
9205
- llvm::BasicBlock *ToElseBB = MapperCGF.createBasicBlock("omp.type.to.else");
9206
- llvm::BasicBlock *FromBB = MapperCGF.createBasicBlock("omp.type.from");
9207
- llvm::BasicBlock *EndBB = MapperCGF.createBasicBlock("omp.type.end");
9208
- llvm::Value *IsAlloc = MapperCGF.Builder.CreateIsNull(LeftToFrom);
9209
- MapperCGF.Builder.CreateCondBr(IsAlloc, AllocBB, AllocElseBB);
9210
- // In case of alloc, clear OMP_MAP_TO and OMP_MAP_FROM.
9211
- MapperCGF.EmitBlock(AllocBB);
9212
- llvm::Value *AllocMapType = MapperCGF.Builder.CreateAnd(
9213
- MemberMapType,
9214
- MapperCGF.Builder.getInt64(
9215
- ~static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9216
- OpenMPOffloadMappingFlags::OMP_MAP_TO |
9217
- OpenMPOffloadMappingFlags::OMP_MAP_FROM)));
9218
- MapperCGF.Builder.CreateBr(EndBB);
9219
- MapperCGF.EmitBlock(AllocElseBB);
9220
- llvm::Value *IsTo = MapperCGF.Builder.CreateICmpEQ(
9221
- LeftToFrom,
9222
- MapperCGF.Builder.getInt64(
9223
- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9224
- OpenMPOffloadMappingFlags::OMP_MAP_TO)));
9225
- MapperCGF.Builder.CreateCondBr(IsTo, ToBB, ToElseBB);
9226
- // In case of to, clear OMP_MAP_FROM.
9227
- MapperCGF.EmitBlock(ToBB);
9228
- llvm::Value *ToMapType = MapperCGF.Builder.CreateAnd(
9229
- MemberMapType,
9230
- MapperCGF.Builder.getInt64(
9231
- ~static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9232
- OpenMPOffloadMappingFlags::OMP_MAP_FROM)));
9233
- MapperCGF.Builder.CreateBr(EndBB);
9234
- MapperCGF.EmitBlock(ToElseBB);
9235
- llvm::Value *IsFrom = MapperCGF.Builder.CreateICmpEQ(
9236
- LeftToFrom,
9237
- MapperCGF.Builder.getInt64(
9238
- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9239
- OpenMPOffloadMappingFlags::OMP_MAP_FROM)));
9240
- MapperCGF.Builder.CreateCondBr(IsFrom, FromBB, EndBB);
9241
- // In case of from, clear OMP_MAP_TO.
9242
- MapperCGF.EmitBlock(FromBB);
9243
- llvm::Value *FromMapType = MapperCGF.Builder.CreateAnd(
9244
- MemberMapType,
9245
- MapperCGF.Builder.getInt64(
9246
- ~static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9247
- OpenMPOffloadMappingFlags::OMP_MAP_TO)));
9248
- // In case of tofrom, do nothing.
9249
- MapperCGF.EmitBlock(EndBB);
9250
- LastBB = EndBB;
9251
- llvm::PHINode *CurMapType =
9252
- MapperCGF.Builder.CreatePHI(CGM.Int64Ty, 4, "omp.maptype");
9253
- CurMapType->addIncoming(AllocMapType, AllocBB);
9254
- CurMapType->addIncoming(ToMapType, ToBB);
9255
- CurMapType->addIncoming(FromMapType, FromBB);
9256
- CurMapType->addIncoming(MemberMapType, ToElseBB);
9257
-
9258
- llvm::Value *OffloadingArgs[] = {Handle, CurBaseArg, CurBeginArg,
9259
- CurSizeArg, CurMapType, CurNameArg};
9260
- if (Info.Mappers[I]) {
9085
+ auto CustomMapperCB = [&](unsigned I, llvm::Function **MapperFunc) {
9086
+ if (CombinedInfo.Mappers[I]) {
9261
9087
// Call the corresponding mapper function.
9262
- llvm::Function *MapperFunc = getOrCreateUserDefinedMapperFunc(
9263
- cast<OMPDeclareMapperDecl>(Info.Mappers[I]));
9264
- assert(MapperFunc && "Expect a valid mapper function is available.");
9265
- MapperCGF.EmitNounwindRuntimeCall(MapperFunc, OffloadingArgs);
9266
- } else {
9267
- // Call the runtime API __tgt_push_mapper_component to fill up the runtime
9268
- // data structure.
9269
- MapperCGF.EmitRuntimeCall(
9270
- OMPBuilder.getOrCreateRuntimeFunction(
9271
- CGM.getModule(), OMPRTL___tgt_push_mapper_component),
9272
- OffloadingArgs);
9273
- }
9274
- }
9275
-
9276
- // Update the pointer to point to the next element that needs to be mapped,
9277
- // and check whether we have mapped all elements.
9278
- llvm::Value *PtrNext = MapperCGF.Builder.CreateConstGEP1_32(
9279
- ElemTy, PtrPHI, /*Idx0=*/1, "omp.arraymap.next");
9280
- PtrPHI->addIncoming(PtrNext, LastBB);
9281
- llvm::Value *IsDone =
9282
- MapperCGF.Builder.CreateICmpEQ(PtrNext, PtrEnd, "omp.arraymap.isdone");
9283
- llvm::BasicBlock *ExitBB = MapperCGF.createBasicBlock("omp.arraymap.exit");
9284
- MapperCGF.Builder.CreateCondBr(IsDone, ExitBB, BodyBB);
9285
-
9286
- MapperCGF.EmitBlock(ExitBB);
9287
- // Emit array deletion if this is an array section and \p MapType indicates
9288
- // that deletion is required.
9289
- emitUDMapperArrayInitOrDel(MapperCGF, Handle, BaseIn, BeginIn, Size, MapType,
9290
- MapName, ElementSize, DoneBB, /*IsInit=*/false);
9291
-
9292
- // Emit the function exit block.
9293
- MapperCGF.EmitBlock(DoneBB, /*IsFinished=*/true);
9294
- MapperCGF.FinishFunction();
9295
- UDMMap.try_emplace(D, Fn);
9088
+ *MapperFunc = getOrCreateUserDefinedMapperFunc(
9089
+ cast<OMPDeclareMapperDecl>(CombinedInfo.Mappers[I]));
9090
+ assert(*MapperFunc && "Expect a valid mapper function is available.");
9091
+ return true;
9092
+ }
9093
+ return false;
9094
+ };
9095
+
9096
+ SmallString<64> TyStr;
9097
+ llvm::raw_svector_ostream Out(TyStr);
9098
+ CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out);
9099
+ std::string Name = getName({"omp_mapper", TyStr, D->getName()});
9100
+
9101
+ auto *newFn = OMPBuilder.emitUserDefinedMapper(PrivatizeAndGenMapInfoCB,
9102
+ ElemTy, Name, CustomMapperCB);
9103
+ UDMMap.try_emplace(D, newFn);
9296
9104
if (CGF)
9297
9105
FunctionUDMMap[CGF->CurFn].push_back(D);
9298
9106
}
0 commit comments