================
@@ -8811,8 +8829,19 @@ class MappableExprsHandler {
         ++EI;
       }
     }
-    llvm::stable_sort(DeclComponentLists, [](const MapData &LHS,
-                                             const MapData &RHS) {
+    llvm::stable_sort(DeclComponentLists, [VD](const MapData &LHS,
+                                               const MapData &RHS) {
+      // For cases like map(p, p[0], p[0][0]), the shortest map, like map(p)
----------------
abhinavgaba wrote:

Looks like this is not sufficient for cases like `map(sp, sp->x)`. In that 
case, the problem is that sp->x populates PartialStruct in 
https://github.com/llvm/llvm-project/blob/90f3147424a36652dae51aa690d9948117f8d906/clang/lib/CodeGen/CGOpenMPRuntime.cpp#L8985-L8990,

And even though initially after going through generateInfoFroCapture, `map(sp)` 
occupies the top of the map-chain in CurInfo:

```
&sp, &sp, sizeof(sp), TO | PARAM
&sp[0], &sp->x, sizeof(sp->x), TO
```

After, emitCombinedEntry, a new entry gets added for:
```
&sp[0], &sp[0], sizeof(sp[0]), ALLOC | PARAM
```
and all existing entries in CurInfo get the MEMBER_OF(1) bit applied to them.

https://github.com/llvm/llvm-project/blob/90f3147424a36652dae51aa690d9948117f8d906/clang/lib/CodeGen/CGOpenMPRuntime.cpp#L9516

So the final CombinedInfo after emitCombinedEntry and then appending CurInfo to 
it becomes:

```
&sp[0], &sp[0], sizeof(sp[0]), ALLOC | PARAM
&sp, &sp, sizeof(sp), TO | MEMBER_OF(1)
&sp[0], &sp->x, sizeof(sp->x), TO | MEMBER_OF(1)
```

instead of the desired:

```
&sp, &sp, sizeof(sp), TO | PARAM
&sp[0], &sp[0], sizeof(sp[0]), ALLOC
&sp[0], &sp->x, sizeof(sp->x), TO | MEMBER_OF(2)
```

(Note that this &sp getting MEMBER_OF(1) issue currently exists on target enter 
data as well.)

Maybe we can split up 
https://github.com/llvm/llvm-project/blob/90f3147424a36652dae51aa690d9948117f8d906/clang/lib/CodeGen/CGOpenMPRuntime.cpp#L9489-L9491
 to first work on is_device_ptr, has_device_addr, and maps on pointers with 
component-lists of size one, and then subsequently on the remaining 
component-lists, but I'm not sure if I'm thinking of all the cases there, and 
if that'll cause issues.

```cpp
// Pseudo code-flow
// Directly pass the original CombinedInfo to the first two
generateInfoForCaptureForIDP/HDA(...&CombinedInfo...)
generateInfoForCaptureForMaps(&CombinedInfo..., /*filter for only 
component-lists that are single-length and for pointer base decls*/)

// Pass CurInfo to the next two
generateInfoForCaptureForMaps(&CurInfo, &PartialStruct, /*Filter for remining 
component-lists*/)
emitCombinedEntry(...&CurInfo, &PartialStruct...)
CombinedInfo.append(CurInfo)
```

@alexey-bataev, do you have any suggestions/feedback?

-----
Future Issue:

The problem long-term is that we currently assume that all component-lists for 
the same VAR should contribute towards a single combined PartialStruct, if any. 
That should not be the case for cases like:


```
map(to: sp->x, sp->y) map(to: sp->sq->a, sp->sq->b) map(sp)
```

In the above case, we should get two independent "containing-structs" mapped by 
themselves:

```
&sp, &sp, sizeof(sp), TO | PARAM

// map-chain for the containing-struct sp[0] with base-pointer sp
&sp[0], &sp[0], sizeof(sp[0]), ALLOC /* Can be optimized to not alloc the full 
struct */
&sp[0], &sp->x, sizeof(sp->x), TO | MEMBER_OF(2)
&sp[0], &sp->y, sizeof(sp->y), TO | MEMBER_OF(2)
&sp, &sp[0], ATTACH

// map-chain for the containing-struct sp->sq[0] with base-pointer sp->sq
&(sp->sq[0]), &(sp->sq[0]), sizeof(sp->sq[0]), ALLOC
&sp->sq[0], &sp->sq->a, sizeof(sp->sq->a), TO | MEMBER_OF(6)
&sp->sq[0], &sp->sq->a, sizeof(sp->sq->a), TO | MEMBER_OF(6)
&sp->sq, &sp->sq[0], ATTACH
```

So we need to loop-over all component-lists, and only process those together 
that share the same attachable-base-pointer (sp or sp->sq in this case).

So, our second invocation for the "remaining component-lists" would become 
something like:

```
for (Expr* AttachBasePtr: AttachBasePtrs) {
  MapCombinedInfoTy PerAttachBaseCurInfo;
  StructRangeInfoTy PerAttachBasePartialStruct;

// Pass CurInfo to the next two
generateInfoForCaptureForMaps(&PerAttachBaseCurInfo, 
&PerAttachBasePartialStruct, /*Filter for every component-list that has 
AttachBaseptr as its attachable base-pointer*/)
emitCombinedEntry(...&PerAttachBaseCurInfo, &PerAttachBasePartialStruct...)
CombinedInfo.append(CurInfo)
}
```

Alexey, do you foresee any issues with this?

https://github.com/llvm/llvm-project/pull/145454
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to