@@ -9105,82 +9105,6 @@ void CGOpenMPRuntime::emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
91059105 FunctionUDMMap[CGF->CurFn].push_back(D);
91069106}
91079107
9108- /// Emit the array initialization or deletion portion for user-defined mapper
9109- /// code generation. First, it evaluates whether an array section is mapped and
9110- /// whether the \a MapType instructs to delete this section. If \a IsInit is
9111- /// true, and \a MapType indicates to not delete this array, array
9112- /// initialization code is generated. If \a IsInit is false, and \a MapType
9113- /// indicates to not this array, array deletion code is generated.
9114- void CGOpenMPRuntime::emitUDMapperArrayInitOrDel(
9115- CodeGenFunction &MapperCGF, llvm::Value *Handle, llvm::Value *Base,
9116- llvm::Value *Begin, llvm::Value *Size, llvm::Value *MapType,
9117- llvm::Value *MapName, CharUnits ElementSize, llvm::BasicBlock *ExitBB,
9118- bool IsInit) {
9119- StringRef Prefix = IsInit ? ".init" : ".del";
9120-
9121- // Evaluate if this is an array section.
9122- llvm::BasicBlock *BodyBB =
9123- MapperCGF.createBasicBlock(getName({"omp.array", Prefix}));
9124- llvm::Value *IsArray = MapperCGF.Builder.CreateICmpSGT(
9125- Size, MapperCGF.Builder.getInt64(1), "omp.arrayinit.isarray");
9126- llvm::Value *DeleteBit = MapperCGF.Builder.CreateAnd(
9127- MapType,
9128- MapperCGF.Builder.getInt64(
9129- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9130- OpenMPOffloadMappingFlags::OMP_MAP_DELETE)));
9131- llvm::Value *DeleteCond;
9132- llvm::Value *Cond;
9133- if (IsInit) {
9134- // base != begin?
9135- llvm::Value *BaseIsBegin = MapperCGF.Builder.CreateICmpNE(Base, Begin);
9136- // IsPtrAndObj?
9137- llvm::Value *PtrAndObjBit = MapperCGF.Builder.CreateAnd(
9138- MapType,
9139- MapperCGF.Builder.getInt64(
9140- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9141- OpenMPOffloadMappingFlags::OMP_MAP_PTR_AND_OBJ)));
9142- PtrAndObjBit = MapperCGF.Builder.CreateIsNotNull(PtrAndObjBit);
9143- BaseIsBegin = MapperCGF.Builder.CreateAnd(BaseIsBegin, PtrAndObjBit);
9144- Cond = MapperCGF.Builder.CreateOr(IsArray, BaseIsBegin);
9145- DeleteCond = MapperCGF.Builder.CreateIsNull(
9146- DeleteBit, getName({"omp.array", Prefix, ".delete"}));
9147- } else {
9148- Cond = IsArray;
9149- DeleteCond = MapperCGF.Builder.CreateIsNotNull(
9150- DeleteBit, getName({"omp.array", Prefix, ".delete"}));
9151- }
9152- Cond = MapperCGF.Builder.CreateAnd(Cond, DeleteCond);
9153- MapperCGF.Builder.CreateCondBr(Cond, BodyBB, ExitBB);
9154-
9155- MapperCGF.EmitBlock(BodyBB);
9156- // Get the array size by multiplying element size and element number (i.e., \p
9157- // Size).
9158- llvm::Value *ArraySize = MapperCGF.Builder.CreateNUWMul(
9159- Size, MapperCGF.Builder.getInt64(ElementSize.getQuantity()));
9160- // Remove OMP_MAP_TO and OMP_MAP_FROM from the map type, so that it achieves
9161- // memory allocation/deletion purpose only.
9162- llvm::Value *MapTypeArg = MapperCGF.Builder.CreateAnd(
9163- MapType,
9164- MapperCGF.Builder.getInt64(
9165- ~static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9166- OpenMPOffloadMappingFlags::OMP_MAP_TO |
9167- OpenMPOffloadMappingFlags::OMP_MAP_FROM)));
9168- MapTypeArg = MapperCGF.Builder.CreateOr(
9169- MapTypeArg,
9170- MapperCGF.Builder.getInt64(
9171- static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
9172- OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT)));
9173-
9174- // Call the runtime API __tgt_push_mapper_component to fill up the runtime
9175- // data structure.
9176- llvm::Value *OffloadingArgs[] = {Handle, Base, Begin,
9177- ArraySize, MapTypeArg, MapName};
9178- MapperCGF.EmitRuntimeCall(
9179- OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(),
9180- OMPRTL___tgt_push_mapper_component),
9181- OffloadingArgs);
9182- }
9183-
91849108llvm::Function *CGOpenMPRuntime::getOrCreateUserDefinedMapperFunc(
91859109 const OMPDeclareMapperDecl *D) {
91869110 auto I = UDMMap.find(D);
0 commit comments