Skip to content

Commit 32f7672

Browse files
[Clang][OpenMP] This is addition fix for #92210. (#94802)
Fix another runtime problem when explicit map both pointer and pointee in target data region. In #92210, problem is only addressed in target region, but missing for target data region. The change just passing AreBothBasePtrAndPteeMapped in generateInfoForComponentList when processing target data. --------- Co-authored-by: Alexey Bataev <[email protected]>
1 parent ac20135 commit 32f7672

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8034,6 +8034,21 @@ class MappableExprsHandler {
80348034
MapCombinedInfoTy StructBaseCurInfo;
80358035
const Decl *D = Data.first;
80368036
const ValueDecl *VD = cast_or_null<ValueDecl>(D);
8037+
bool HasMapBasePtr = false;
8038+
bool HasMapArraySec = false;
8039+
if (VD && VD->getType()->isAnyPointerType()) {
8040+
for (const auto &M : Data.second) {
8041+
HasMapBasePtr = any_of(M, [](const MapInfo &L) {
8042+
return isa_and_present<DeclRefExpr>(L.VarRef);
8043+
});
8044+
HasMapArraySec = any_of(M, [](const MapInfo &L) {
8045+
return isa_and_present<ArraySectionExpr, ArraySubscriptExpr>(
8046+
L.VarRef);
8047+
});
8048+
if (HasMapBasePtr && HasMapArraySec)
8049+
break;
8050+
}
8051+
}
80378052
for (const auto &M : Data.second) {
80388053
for (const MapInfo &L : M) {
80398054
assert(!L.Components.empty() &&
@@ -8050,7 +8065,8 @@ class MappableExprsHandler {
80508065
CurInfo, StructBaseCurInfo, PartialStruct,
80518066
/*IsFirstComponentList=*/false, L.IsImplicit,
80528067
/*GenerateAllInfoForClauses*/ true, L.Mapper, L.ForDeviceAddr, VD,
8053-
L.VarRef);
8068+
L.VarRef, /*OverlappedElements*/ std::nullopt,
8069+
HasMapBasePtr && HasMapArraySec);
80548070

80558071
// If this entry relates to a device pointer, set the relevant
80568072
// declaration and add the 'return pointer' flag.

clang/test/OpenMP/target_data_use_device_addr_codegen.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
// CHECK-DAG: [[SIZES1:@.+]] = private unnamed_addr constant [6 x i64] [i64 4, i64 16, i64 4, i64 4, i64 0, i64 4]
1515
// 64 = 0x40 = OMP_MAP_RETURN_PARAM
16-
// CHECK-DAG: [[MAPTYPES1:@.+]] = private unnamed_addr constant [6 x i64] [i64 67, i64 67, i64 3, i64 67, i64 67, i64 67]
16+
// CHECK-DAG: [[MAPTYPES1:@.+]] = private unnamed_addr constant [6 x i64] [i64 67, i64 115, i64 51, i64 67, i64 67, i64 67]
1717
// CHECK-DAG: [[SIZES2:@.+]] = private unnamed_addr constant [6 x i64] [i64 0, i64 4, i64 16, i64 4, i64 4, i64 0]
1818
// 0 = OMP_MAP_NONE
1919
// 281474976710720 = 0x1000000000040 = OMP_MAP_MEMBER_OF | OMP_MAP_RETURN_PARAM
@@ -54,11 +54,9 @@ int main() {
5454
// CHECK: [[SIZES:%.+]] = alloca [6 x i64],
5555
// CHECK: [[VLA_ADDR:%.+]] = alloca float, i64 %{{.+}},
5656
// CHECK: [[PTR:%.+]] = load ptr, ptr [[PTR_ADDR]],
57-
// CHECK-NEXT: [[P4:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8
58-
// CHECK-NEXT: [[ARR_IDX:%.+]] = getelementptr inbounds float, ptr [[P4]], i64 3
57+
// CHECK-NEXT: [[ARR_IDX:%.+]] = getelementptr inbounds float, ptr [[PTR]], i64 3
5958
// CHECK: [[P5:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8
60-
// CHECK-NEXT: [[P6:%.+]] = load ptr, ptr [[PTR_ADDR]], align 8
61-
// CHECK-NEXT: [[ARR_IDX1:%.+]] = getelementptr inbounds float, ptr [[P6]], i64 0
59+
// CHECK-NEXT: [[ARR_IDX1:%.+]] = getelementptr inbounds float, ptr [[P5]], i64 0
6260
// CHECK: [[P7:%.+]] = load ptr, ptr [[REF_ADDR]],
6361
// CHECK-NEXT: [[REF:%.+]] = load ptr, ptr [[REF_ADDR]],
6462
// CHECK-NEXT: [[ARR_IDX2:%.+]] = getelementptr inbounds [4 x float], ptr [[ARR_ADDR]], i64 0, i64 0
@@ -70,11 +68,11 @@ int main() {
7068
// CHECK: [[PTR0:%.+]] = getelementptr inbounds [6 x ptr], ptr [[PTRS]], i32 0, i32 0
7169
// CHECK: store ptr [[A_ADDR]], ptr [[PTR0]],
7270
// CHECK: [[BPTR1:%.+]] = getelementptr inbounds [6 x ptr], ptr [[BPTRS]], i32 0, i32 1
73-
// CHECK: store ptr [[PTR]], ptr [[BPTR1]],
71+
// CHECK: store ptr [[PTR_ADDR]], ptr [[BPTR1]],
7472
// CHECK: [[PTR1:%.+]] = getelementptr inbounds [6 x ptr], ptr [[PTRS]], i32 0, i32 1
7573
// CHECK: store ptr [[ARR_IDX]], ptr [[PTR1]],
7674
// CHECK: [[BPTR2:%.+]] = getelementptr inbounds [6 x ptr], ptr [[BPTRS]], i32 0, i32 2
77-
// CHECK: store ptr [[P5]], ptr [[BPTR2]],
75+
// CHECK: store ptr [[PTR_ADDR]], ptr [[BPTR2]],
7876
// CHECK: [[PTR2:%.+]] = getelementptr inbounds [6 x ptr], ptr [[PTRS]], i32 0, i32 2
7977
// CHECK: store ptr [[ARR_IDX1]], ptr [[PTR2]],
8078
// CHECK: [[BPTR3:%.+]] = getelementptr inbounds [6 x ptr], ptr [[BPTRS]], i32 0, i32 3

clang/test/OpenMP/target_map_both_pointer_pointee_codegen.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ void foo() {
2020
{
2121
ptr[2] = 8;
2222
}
23+
#pragma omp target data map(ptr, ptr[2])
24+
{
25+
ptr[2] = 9;
26+
}
2327
}
2428
#endif
2529
// CHECK-LABEL: define {{[^@]+}}@_Z3foov
@@ -34,6 +38,9 @@ void foo() {
3438
// CHECK-NEXT: [[DOTOFFLOAD_PTRS3:%.*]] = alloca [1 x ptr], align 8
3539
// CHECK-NEXT: [[DOTOFFLOAD_MAPPERS4:%.*]] = alloca [1 x ptr], align 8
3640
// CHECK-NEXT: [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
41+
// CHECK-NEXT: [[DOTOFFLOAD_BASEPTRS9:%.*]] = alloca [1 x ptr], align 8
42+
// CHECK-NEXT: [[DOTOFFLOAD_PTRS10:%.*]] = alloca [1 x ptr], align 8
43+
// CHECK-NEXT: [[DOTOFFLOAD_MAPPERS11:%.*]] = alloca [1 x ptr], align 8
3744
// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef ptr @_Z6malloci(i32 noundef signext 12) #[[ATTR3:[0-9]+]]
3845
// CHECK-NEXT: store ptr [[CALL]], ptr [[PTR]], align 8
3946
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR]], align 8
@@ -124,6 +131,23 @@ void foo() {
124131
// CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l19(ptr [[TMP22]]) #[[ATTR3]]
125132
// CHECK-NEXT: br label [[OMP_OFFLOAD_CONT7]]
126133
// CHECK: omp_offload.cont7:
134+
// CHECK-NEXT: [[TMP44:%.*]] = load ptr, ptr [[PTR]], align 8
135+
// CHECK-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, ptr [[TMP44]], i64 2
136+
// CHECK-NEXT: [[TMP45:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 0
137+
// CHECK-NEXT: store ptr [[PTR]], ptr [[TMP45]], align 8
138+
// CHECK-NEXT: [[TMP46:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 0
139+
// CHECK-NEXT: store ptr [[ARRAYIDX8]], ptr [[TMP46]], align 8
140+
// CHECK-NEXT: [[TMP47:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS11]], i64 0, i64 0
141+
// CHECK-NEXT: store ptr null, ptr [[TMP47]], align 8
142+
// CHECK-NEXT: [[TMP48:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 0
143+
// CHECK-NEXT: [[TMP49:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 0
144+
// CHECK-NEXT: call void @__tgt_target_data_begin_mapper(ptr @[[GLOB1]], i64 -1, i32 1, ptr [[TMP48]], ptr [[TMP49]], ptr @.offload_sizes.3, ptr @.offload_maptypes.4, ptr null, ptr null)
145+
// CHECK-NEXT: [[TMP50:%.*]] = load ptr, ptr [[PTR]], align 8
146+
// CHECK-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds i32, ptr [[TMP50]], i64 2
147+
// CHECK-NEXT: store i32 9, ptr [[ARRAYIDX12]], align 4
148+
// CHECK-NEXT: [[TMP51:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 0
149+
// CHECK-NEXT: [[TMP52:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 0
150+
// CHECK-NEXT: call void @__tgt_target_data_end_mapper(ptr @[[GLOB1]], i64 -1, i32 1, ptr [[TMP51]], ptr [[TMP52]], ptr @.offload_sizes.3, ptr @.offload_maptypes.4, ptr null, ptr null)
127151
// CHECK-NEXT: ret void
128152
//
129153
//

offload/test/mapping/map_both_pointer_pointee.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#pragma omp declare target
1111
int *ptr1;
1212
#pragma omp end declare target
13+
int a[10];
1314

1415
#include <stdio.h>
1516
#include <stdlib.h>
@@ -38,5 +39,24 @@ int main() {
3839
// CHECK: 6
3940
printf(" %d \n", ptr2[1]);
4041
free(ptr2);
42+
43+
a[1] = 111;
44+
int *p = &a[0];
45+
// CHECK: 111
46+
printf("%d %p %p\n", p[1], p, &p); // 111 hst_p1 hst_p2
47+
#pragma omp target data map(to : p[1 : 3]) map(p)
48+
#pragma omp target data use_device_addr(p)
49+
{
50+
#pragma omp target has_device_addr(p)
51+
{
52+
// CHECK: 111
53+
printf("%d %p %p\n", p[1], p, &p); // 111 dev_p1 dev_p2
54+
p[1] = 222;
55+
// CHECK: 222
56+
printf("%d %p %p\n", p[1], p, &p); // 222 dev_p1 dev_p2
57+
}
58+
}
59+
// CHECK: 111
60+
printf("%d %p %p\n", p[1], p, &p); // 111 hst_p1 hst_p2
4161
return 0;
4262
}

0 commit comments

Comments
 (0)