@@ -1197,6 +1197,35 @@ class PrivateArgumentManagerTy {
11971197 }
11981198};
11991199
1200+ static std::unique_ptr<int64_t []> maskIgnorableMappings (int64_t DeviceId, int32_t ArgNum, int64_t *ArgTypes,
1201+ int64_t *ArgSizes, map_var_info_t *ArgNames) {
1202+ std::unique_ptr<int64_t []> ArgTypesOverride = std::make_unique<int64_t []>(ArgNum);
1203+
1204+ for (int32_t I = 0 ; I < ArgNum; ++I) {
1205+ bool IsTargetParam = ArgTypes[I] & OMP_TGT_MAPTYPE_TARGET_PARAM;
1206+
1207+ bool IsMapTo = ArgTypes[I] & OMP_TGT_MAPTYPE_TO;
1208+ if (IsTargetParam || !IsMapTo) {
1209+ ArgTypesOverride[I] = ArgTypes[I];
1210+ continue ;
1211+ }
1212+
1213+ bool IsMapFrom = ArgTypes[I] & OMP_TGT_MAPTYPE_FROM;
1214+ const char *Type = IsMapFrom ? " tofrom" : " to" ;
1215+
1216+ // Optimisation: A 'to' or 'tofrom' mapping is not
1217+ // used by the kernel. Change its type such that
1218+ // no new mapping is created, but any existing
1219+ // mapping has its counter decremented.
1220+ INFO (OMP_INFOTYPE_ALL, DeviceId, " %s(%s)[%" PRId64 " ] %s\n " , Type,
1221+ getNameFromMapping (ArgNames[I]).c_str (), ArgSizes[I], " is not used and will not be copied" );
1222+
1223+ ArgTypesOverride[I] = ArgTypes[I] & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
1224+ }
1225+
1226+ return ArgTypesOverride;
1227+ }
1228+
12001229// / Process data before launching the kernel, including calling targetDataBegin
12011230// / to map and transfer data to target device, transferring (first-)private
12021231// / variables.
@@ -1417,11 +1446,16 @@ int target(ident_t *Loc, DeviceTy &Device, void *HostPtr,
14171446
14181447 int NumClangLaunchArgs = KernelArgs.NumArgs ;
14191448 int Ret = OFFLOAD_SUCCESS;
1449+
1450+ std::unique_ptr<int64_t []> ArgTypesOverride =
1451+ maskIgnorableMappings (DeviceId, NumClangLaunchArgs, KernelArgs.ArgTypes ,
1452+ KernelArgs.ArgSizes , KernelArgs.ArgNames );
1453+
14201454 if (NumClangLaunchArgs) {
14211455 // Process data, such as data mapping, before launching the kernel
14221456 Ret = processDataBefore (Loc, DeviceId, HostPtr, NumClangLaunchArgs,
14231457 KernelArgs.ArgBasePtrs , KernelArgs.ArgPtrs ,
1424- KernelArgs.ArgSizes , KernelArgs. ArgTypes ,
1458+ KernelArgs.ArgSizes , ArgTypesOverride. get () ,
14251459 KernelArgs.ArgNames , KernelArgs.ArgMappers , TgtArgs,
14261460 TgtOffsets, PrivateArgumentManager, AsyncInfo);
14271461 if (Ret != OFFLOAD_SUCCESS) {
@@ -1473,7 +1507,7 @@ int target(ident_t *Loc, DeviceTy &Device, void *HostPtr,
14731507 // variables
14741508 Ret = processDataAfter (Loc, DeviceId, HostPtr, NumClangLaunchArgs,
14751509 KernelArgs.ArgBasePtrs , KernelArgs.ArgPtrs ,
1476- KernelArgs.ArgSizes , KernelArgs. ArgTypes ,
1510+ KernelArgs.ArgSizes , ArgTypesOverride. get () ,
14771511 KernelArgs.ArgNames , KernelArgs.ArgMappers ,
14781512 PrivateArgumentManager, AsyncInfo);
14791513 if (Ret != OFFLOAD_SUCCESS) {
0 commit comments