@@ -240,22 +240,24 @@ class MapInfoFinalizationPass
240240 // / allowing `to` mappings, and `target update` not allowing both `to` and
241241 // / `from` simultaneously. We currently try to maintain the `implicit` flag
242242 // / where necessary, although it does not seem strictly required.
243-
244- unsigned long getDescriptorMapType (mlir::omp::MapInfoOp op,
243+ unsigned long getDescriptorMapType (unsigned long mapTypeFlag,
245244 mlir::Operation *target) {
246- unsigned long mapType = op.getMapType ().value_or (0 );
247245 if (llvm::isa_and_nonnull<mlir::omp::TargetExitDataOp,
248246 mlir::omp::TargetUpdateOp>(target))
249- return mapType;
250-
251- using MappingFlags = llvm::omp::OpenMPOffloadMappingFlags;
252- auto flags = MappingFlags::OMP_MAP_TO;
253- flags |= MappingFlags::OMP_MAP_ALWAYS;
254- flags |= MappingFlags (mapType) & MappingFlags::OMP_MAP_IMPLICIT;
255- if (fir::isTypeWithDescriptor (op.getVarType ()))
256- flags |= MappingFlags::OMP_MAP_DESCRIPTOR;
257-
258- return llvm::to_underlying (flags);
247+ return mapTypeFlag;
248+
249+ bool hasImplicitMap =
250+ (llvm::omp::OpenMPOffloadMappingFlags (mapTypeFlag) &
251+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT) ==
252+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
253+
254+ return llvm::to_underlying (
255+ hasImplicitMap
256+ ? llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
257+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT |
258+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_ALWAYS
259+ : llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
260+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_ALWAYS);
259261 }
260262
261263 mlir::omp::MapInfoOp genDescriptorMemberMaps (mlir::omp::MapInfoOp op,
@@ -326,8 +328,9 @@ unsigned long getDescriptorMapType(mlir::omp::MapInfoOp op,
326328 mlir::TypeAttr::get (fir::unwrapRefType (descriptor.getType ())),
327329 /* varPtrPtr=*/ mlir::Value{}, newMembers, newMembersAttr,
328330 /* bounds=*/ mlir::SmallVector<mlir::Value>{},
329- builder.getIntegerAttr (builder.getIntegerType (64 , false ),
330- getDescriptorMapType (op, target)),
331+ builder.getIntegerAttr (
332+ builder.getIntegerType (64 , false ),
333+ getDescriptorMapType (op.getMapType ().value_or (0 ), target)),
331334 op.getMapCaptureTypeAttr (), op.getNameAttr (),
332335 /* partial_map=*/ builder.getBoolAttr (false ));
333336 op.replaceAllUsesWith (newDescParentMapOp.getResult ());
0 commit comments