[Openmp-commits] [openmp] Fix mapping of struct to device (PR #70821)

Joseph Huber via Openmp-commits openmp-commits at lists.llvm.org
Tue Oct 31 10:08:53 PDT 2023


================
@@ -573,11 +573,38 @@ int targetDataBegin(ident_t *Loc, DeviceTy &Device, int32_t ArgNum,
                     void **ArgMappers, AsyncInfoTy &AsyncInfo,
                     bool FromMapper) {
   TIMESCOPE_WITH_IDENT(Loc);
+
+  // Initialize new map type with old type:
+  SmallVector<int64_t> NewArgTypes = SmallVector<int64_t>(ArgNum);
+  for (int32_t I = 0; I < ArgNum; ++I) {
+    NewArgTypes[I] = ArgTypes[I];
+  }
+
+  // Try to prevent mapping a struct multiple times in the same construct.
+  // Mapping the struct more than once will potentially overwrite previously
+  // mapped information.
+  for (int32_t I = 0; I < ArgNum; ++I) {
+    if (NewArgTypes[I] < 0)
+      continue;
+    for (int32_t J = I + 1; J < ArgNum; ++J) {
+      if (Args[I] == ArgsBase[I] && Args[I] == Args[J] &&
+          ArgsBase[I] == ArgsBase[J] && ArgSizes[I] == ArgSizes[J] &&
+          NewArgTypes[J] >= 0) {
+        NewArgTypes[I] |= ArgTypes[J];
+        NewArgTypes[J] = -1;
+      }
+    }
+  }
+
   // process each input.
   for (int32_t I = 0; I < ArgNum; ++I) {
+    int64_t ArgType = NewArgTypes[I];
+    if (ArgType < 0)
----------------
jhuber6 wrote:

Is the logic here that we skip the mapping if we previously set it as a duplicate?

https://github.com/llvm/llvm-project/pull/70821


More information about the Openmp-commits mailing list