Skip to content

Commit 230b06b

Browse files
[OpenMP] Clang Codegen Interop : Accept multiple init (#82604)
Modifying clang/lib/CodeGen/CGStmtOpenMP.cpp to accept multiple `init` clauses with `interop` directive. --------- Co-authored-by: Sunil Kuravinakop
1 parent 95aab69 commit 230b06b

File tree

2 files changed

+53
-12
lines changed

2 files changed

+53
-12
lines changed

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7023,19 +7023,25 @@ void CodeGenFunction::EmitOMPInteropDirective(const OMPInteropDirective &S) {
70237023
S.getSingleClause<OMPUseClause>())) &&
70247024
"OMPNowaitClause clause is used separately in OMPInteropDirective.");
70257025

7026-
if (const auto *C = S.getSingleClause<OMPInitClause>()) {
7027-
llvm::Value *InteropvarPtr =
7028-
EmitLValue(C->getInteropVar()).getPointer(*this);
7029-
llvm::omp::OMPInteropType InteropType = llvm::omp::OMPInteropType::Unknown;
7030-
if (C->getIsTarget()) {
7031-
InteropType = llvm::omp::OMPInteropType::Target;
7032-
} else {
7033-
assert(C->getIsTargetSync() && "Expected interop-type target/targetsync");
7034-
InteropType = llvm::omp::OMPInteropType::TargetSync;
7026+
auto ItOMPInitClause = S.getClausesOfKind<OMPInitClause>();
7027+
if (!ItOMPInitClause.empty()) {
7028+
// Look at the multiple init clauses
7029+
for (const OMPInitClause *C : ItOMPInitClause) {
7030+
llvm::Value *InteropvarPtr =
7031+
EmitLValue(C->getInteropVar()).getPointer(*this);
7032+
llvm::omp::OMPInteropType InteropType =
7033+
llvm::omp::OMPInteropType::Unknown;
7034+
if (C->getIsTarget()) {
7035+
InteropType = llvm::omp::OMPInteropType::Target;
7036+
} else {
7037+
assert(C->getIsTargetSync() &&
7038+
"Expected interop-type target/targetsync");
7039+
InteropType = llvm::omp::OMPInteropType::TargetSync;
7040+
}
7041+
OMPBuilder.createOMPInteropInit(Builder, InteropvarPtr, InteropType,
7042+
Device, NumDependences, DependenceList,
7043+
Data.HasNowaitClause);
70357044
}
7036-
OMPBuilder.createOMPInteropInit(Builder, InteropvarPtr, InteropType, Device,
7037-
NumDependences, DependenceList,
7038-
Data.HasNowaitClause);
70397045
} else if (const auto *C = S.getSingleClause<OMPDestroyClause>()) {
70407046
llvm::Value *InteropvarPtr =
70417047
EmitLValue(C->getInteropVar()).getPointer(*this);

clang/test/OpenMP/interop_codegen.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// expected-no-diagnostics
2+
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fopenmp-targets=amdgcn-amd-amdhsa -emit-llvm %s -o - | FileCheck %s
3+
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -o - | FileCheck %s
4+
// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s
5+
6+
#ifndef HEADER
7+
#define HEADER
8+
9+
typedef void *omp_interop_t;
10+
#define omp_interop_none 0
11+
#define omp_ipr_fr_id -1
12+
typedef long omp_intptr_t;
13+
#define NULL 0
14+
15+
extern omp_intptr_t omp_get_interop_int(const omp_interop_t, int, int *);
16+
17+
int main() {
18+
omp_interop_t obj = omp_interop_none;
19+
omp_interop_t i1 = omp_interop_none;
20+
omp_interop_t i2 = omp_interop_none;
21+
omp_interop_t i3 = omp_interop_none;
22+
omp_interop_t i4 = omp_interop_none;
23+
omp_interop_t i5 = omp_interop_none;
24+
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);
28+
29+
30+
}
31+
#endif
32+
33+
// CHECK-LABEL: define {{.+}}main{{.+}}
34+
// CHECK: call {{.+}}__tgt_interop_init({{.+}}i1{{.*}})
35+
// CHECK: call {{.+}}__tgt_interop_init({{.+}}obj{{.*}})

0 commit comments

Comments
 (0)