@@ -1197,66 +1197,85 @@ class PrivateArgumentManagerTy {
11971197 }
11981198};
11991199
1200+ // / Try to determine if kernel argument is unused. This method
1201+ // / takes a conservative approach, i.e. it may return false
1202+ // / negatives but it should never return a false positive.
1203+ static bool isArgUnused (tgt_map_type ArgType) {
1204+ bool IsArgUnused = ArgType == OMP_TGT_MAPTYPE_NONE
1205+ || ArgType == OMP_TGT_MAPTYPE_FROM
1206+ || ArgType == OMP_TGT_MAPTYPE_TO
1207+ || ArgType == (OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO);
1208+ return IsArgUnused;
1209+ }
1210+
12001211// / Try to find redundant mappings associated with a kernel launch,
12011212// / and provide a masked version of the kernel argument types that
1202- // / avoid redundant to data transfers between the host and device.
1213+ // / avoid redundant data transfers between the host and the device.
12031214static std::unique_ptr<int64_t []> maskRedundantTransfers (DeviceTy &Device, int32_t ArgNum,
12041215 int64_t *ArgTypes, int64_t *ArgSizes,
12051216 map_var_info_t *ArgNames, void **ArgPtrs,
12061217 void **ArgMappers) {
12071218 std::unique_ptr<int64_t []> ArgTypesOverride = std::make_unique<int64_t []>(ArgNum);
12081219
1209- MappingInfoTy &MappingInfo = Device.getMappingInfo ();
1210- MappingInfoTy::HDTTMapAccessorTy HDTTMap = MappingInfo
1211- .HostDataToTargetMap .getExclusiveAccessor ();
1212-
1213- int64_t UnusedArgs = 0 ;
1220+ bool AllArgsUnused = true ;
12141221
12151222 for (int32_t I = 0 ; I < ArgNum; ++I) {
1223+ bool IsCustomMapped = ArgMappers && ArgMappers[I];
1224+
1225+ if (IsCustomMapped) {
1226+ ArgTypesOverride[I] = ArgTypes[I];
1227+ AllArgsUnused = false ;
1228+ continue ;
1229+ }
1230+
12161231 tgt_map_type ArgType = (tgt_map_type) ArgTypes[I];
12171232
1218- // Check for unused implicit mappings
1219- bool IsArgUnused = ArgType == OMP_TGT_MAPTYPE_NONE;
1233+ bool IsArgUnused = true ;
12201234
12211235 // Check for unused `map(buf[0:size])` mappings
1222- IsArgUnused |= ArgType == OMP_TGT_MAPTYPE_FROM
1223- || ArgType == OMP_TGT_MAPTYPE_TO
1224- || ArgType == (OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO);
1236+ IsArgUnused |= isArgUnused (ArgType);
1237+
1238+ bool IsArgMemberPtr = ArgType & OMP_TGT_MAPTYPE_MEMBER_OF
1239+ && ArgType & OMP_TGT_MAPTYPE_PTR_AND_OBJ;
1240+
1241+ tgt_map_type ArgTypeMemberPtrMasked = (tgt_map_type) (ArgType & ~(OMP_TGT_MAPTYPE_MEMBER_OF | OMP_TGT_MAPTYPE_PTR_AND_OBJ));
12251242
12261243 // Check for unused `map(wrapper.buf[0:size])` mappings
1227- IsArgUnused |= UnusedArgs == ArgNum - 1 && ArgType & OMP_TGT_MAPTYPE_MEMBER_OF
1228- && ((ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == OMP_TGT_MAPTYPE_PTR_AND_OBJ
1229- || (ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == (OMP_TGT_MAPTYPE_PTR_AND_OBJ | OMP_TGT_MAPTYPE_TO)
1230- || (ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == (OMP_TGT_MAPTYPE_PTR_AND_OBJ | OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO));
1244+ IsArgUnused |= AllArgsUnused && IsArgMemberPtr && isArgUnused (ArgTypeMemberPtrMasked);
12311245
1232- bool IsExistingMapping = !MappingInfo.lookupMapping (HDTTMap, ArgPtrs[I], ArgSizes[I]).isEmpty ();
1246+ if (!IsArgUnused) {
1247+ ArgTypesOverride[I] = ArgTypes[I];
1248+ AllArgsUnused = false ;
1249+ continue ;
1250+ }
12331251
1234- bool IsCustomMapped = ArgMappers && ArgMappers[I];
1252+ MappingInfoTy &MappingInfo = Device.getMappingInfo ();
1253+ MappingInfoTy::HDTTMapAccessorTy HDTTMap = MappingInfo
1254+ .HostDataToTargetMap .getExclusiveAccessor ();
1255+
1256+ bool IsExistingMapping = !MappingInfo.lookupMapping (HDTTMap, ArgPtrs[I], ArgSizes[I]).isEmpty ();
12351257
1236- if (IsExistingMapping | IsCustomMapped | !IsArgUnused ) {
1258+ if (IsExistingMapping) {
12371259 ArgTypesOverride[I] = ArgTypes[I];
1260+ AllArgsUnused = false ;
12381261 continue ;
12391262 }
12401263
1241- const std::string Name = ArgNames && ArgNames[I] ?
1264+ [[maybe_unused]] const std::string Name = ArgNames && ArgNames[I] ?
12421265 getNameFromMapping (ArgNames[I]) : std::string (" unknown" );
12431266
12441267 bool IsArgFrom = ArgType & OMP_TGT_MAPTYPE_FROM;
12451268 bool IsArgTo = ArgType & OMP_TGT_MAPTYPE_TO;
12461269
1247- const char *Type = IsArgFrom && IsArgTo ? " tofrom"
1270+ [[maybe_unused]] const char *Type = IsArgFrom && IsArgTo ? " tofrom"
12481271 : IsArgFrom ? " from"
12491272 : IsArgTo ? " to"
12501273 : " unknown" ;
12511274
1252- // Optimisation:
1253- // A new mapping is not used by the kernel.
1254- // Change the type such that no data is transferred to and/or from the device.
12551275 INFO (OMP_INFOTYPE_REDUNDANT_TRANSFER, Device.DeviceID , " %s(%s)[%" PRId64 " ] %s\n " , Type,
12561276 Name.c_str (), ArgSizes[I], " is not used and will not be copied" );
12571277
1258- ArgTypesOverride[I] = ArgTypes[I] & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
1259- UnusedArgs++;
1278+ ArgTypesOverride[I] = ArgType & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
12601279 }
12611280
12621281 return ArgTypesOverride;
0 commit comments