Skip to content

Commit 0869ffa

Browse files
SunilKuravinakopSunil Kuravinakop
andauthored
[OpenMP] Clang Codegen Interop : Accept multiple use & destroy clauses (#83398)
Modified clang/lib/CodeGen/CGStmtOpenMP.cpp to accept multiple use & destroy clauses with interop directive. Modified clang/test/OpenMP/interop_codegen.cpp to check for the changes. Co-authored-by: Sunil Kuravinakop <[email protected]>
1 parent 0699749 commit 0869ffa

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7042,18 +7042,28 @@ void CodeGenFunction::EmitOMPInteropDirective(const OMPInteropDirective &S) {
70427042
Device, NumDependences, DependenceList,
70437043
Data.HasNowaitClause);
70447044
}
7045-
} else if (const auto *C = S.getSingleClause<OMPDestroyClause>()) {
7046-
llvm::Value *InteropvarPtr =
7047-
EmitLValue(C->getInteropVar()).getPointer(*this);
7048-
OMPBuilder.createOMPInteropDestroy(Builder, InteropvarPtr, Device,
7049-
NumDependences, DependenceList,
7050-
Data.HasNowaitClause);
7051-
} else if (const auto *C = S.getSingleClause<OMPUseClause>()) {
7052-
llvm::Value *InteropvarPtr =
7053-
EmitLValue(C->getInteropVar()).getPointer(*this);
7054-
OMPBuilder.createOMPInteropUse(Builder, InteropvarPtr, Device,
7055-
NumDependences, DependenceList,
7056-
Data.HasNowaitClause);
7045+
}
7046+
auto ItOMPDestroyClause = S.getClausesOfKind<OMPDestroyClause>();
7047+
if (!ItOMPDestroyClause.empty()) {
7048+
// Look at the multiple destroy clauses
7049+
for (const OMPDestroyClause *C : ItOMPDestroyClause) {
7050+
llvm::Value *InteropvarPtr =
7051+
EmitLValue(C->getInteropVar()).getPointer(*this);
7052+
OMPBuilder.createOMPInteropDestroy(Builder, InteropvarPtr, Device,
7053+
NumDependences, DependenceList,
7054+
Data.HasNowaitClause);
7055+
}
7056+
}
7057+
auto ItOMPUseClause = S.getClausesOfKind<OMPUseClause>();
7058+
if (!ItOMPUseClause.empty()) {
7059+
// Look at the multiple use clauses
7060+
for (const OMPUseClause *C : ItOMPUseClause) {
7061+
llvm::Value *InteropvarPtr =
7062+
EmitLValue(C->getInteropVar()).getPointer(*this);
7063+
OMPBuilder.createOMPInteropUse(Builder, InteropvarPtr, Device,
7064+
NumDependences, DependenceList,
7065+
Data.HasNowaitClause);
7066+
}
70577067
}
70587068
}
70597069

clang/test/OpenMP/interop_codegen.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,31 @@ typedef long omp_intptr_t;
1515
extern omp_intptr_t omp_get_interop_int(const omp_interop_t, int, int *);
1616

1717
int main() {
18-
omp_interop_t obj = omp_interop_none;
18+
omp_interop_t obj1 = omp_interop_none;
19+
omp_interop_t obj2 = omp_interop_none;
1920
omp_interop_t i1 = omp_interop_none;
2021
omp_interop_t i2 = omp_interop_none;
2122
omp_interop_t i3 = omp_interop_none;
2223
omp_interop_t i4 = omp_interop_none;
2324
omp_interop_t i5 = omp_interop_none;
2425

25-
#pragma omp interop init(targetsync: i1) init(targetsync: obj)
26-
int id = (int )omp_get_interop_int(obj, omp_ipr_fr_id, NULL);
27-
int id1 = (int )omp_get_interop_int(i1, omp_ipr_fr_id, NULL);
26+
#pragma omp interop init(targetsync: obj1) init(targetsync: obj2)
27+
int id = (int )omp_get_interop_int(obj1, omp_ipr_fr_id, NULL);
28+
int id1 = (int )omp_get_interop_int(obj2, omp_ipr_fr_id, NULL);
29+
30+
#pragma omp interop init(target,targetsync: i1) use(i2) use(i3) destroy(i4) destroy(i5)
31+
int id2 = (int )omp_get_interop_int(i1, omp_ipr_fr_id, NULL);
32+
int id3 = (int )omp_get_interop_int(i2, omp_ipr_fr_id, NULL);
2833

2934

3035
}
3136
#endif
3237

33-
// CHECK-LABEL: define {{.+}}main{{.+}}
38+
// CHECK-LABEL: define {{.+}}main{{.+}}
39+
// CHECK: call {{.+}}__tgt_interop_init({{.+}}obj1{{.*}})
40+
// CHECK: call {{.+}}__tgt_interop_init({{.+}}obj2{{.*}})
3441
// CHECK: call {{.+}}__tgt_interop_init({{.+}}i1{{.*}})
35-
// CHECK: call {{.+}}__tgt_interop_init({{.+}}obj{{.*}})
42+
// CHECK: call {{.+}}__tgt_interop_destroy({{.+}}i4{{.*}})
43+
// CHECK: call {{.+}}__tgt_interop_destroy({{.+}}i5{{.*}})
44+
// CHECK: call {{.+}}__tgt_interop_use({{.+}}i2{{.*}})
45+
// CHECK: call {{.+}}__tgt_interop_use({{.+}}i3{{.*}})

0 commit comments

Comments
 (0)