Author: SunilKuravinakop Date: 2024-02-29T11:32:55+05:30 New Revision: 230b06b44e6c7f710ae4817e1f34709454f420c5
URL: https://github.com/llvm/llvm-project/commit/230b06b44e6c7f710ae4817e1f34709454f420c5 DIFF: https://github.com/llvm/llvm-project/commit/230b06b44e6c7f710ae4817e1f34709454f420c5.diff LOG: [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 Added: clang/test/OpenMP/interop_codegen.cpp Modified: clang/lib/CodeGen/CGStmtOpenMP.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 8fd74697de3c0f..ffcd3ae2711e34 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -7023,19 +7023,25 @@ void CodeGenFunction::EmitOMPInteropDirective(const OMPInteropDirective &S) { S.getSingleClause<OMPUseClause>())) && "OMPNowaitClause clause is used separately in OMPInteropDirective."); - if (const auto *C = S.getSingleClause<OMPInitClause>()) { - llvm::Value *InteropvarPtr = - EmitLValue(C->getInteropVar()).getPointer(*this); - llvm::omp::OMPInteropType InteropType = llvm::omp::OMPInteropType::Unknown; - if (C->getIsTarget()) { - InteropType = llvm::omp::OMPInteropType::Target; - } else { - assert(C->getIsTargetSync() && "Expected interop-type target/targetsync"); - InteropType = llvm::omp::OMPInteropType::TargetSync; + auto ItOMPInitClause = S.getClausesOfKind<OMPInitClause>(); + if (!ItOMPInitClause.empty()) { + // Look at the multiple init clauses + for (const OMPInitClause *C : ItOMPInitClause) { + llvm::Value *InteropvarPtr = + EmitLValue(C->getInteropVar()).getPointer(*this); + llvm::omp::OMPInteropType InteropType = + llvm::omp::OMPInteropType::Unknown; + if (C->getIsTarget()) { + InteropType = llvm::omp::OMPInteropType::Target; + } else { + assert(C->getIsTargetSync() && + "Expected interop-type target/targetsync"); + InteropType = llvm::omp::OMPInteropType::TargetSync; + } + OMPBuilder.createOMPInteropInit(Builder, InteropvarPtr, InteropType, + Device, NumDependences, DependenceList, + Data.HasNowaitClause); } - OMPBuilder.createOMPInteropInit(Builder, InteropvarPtr, InteropType, Device, - NumDependences, DependenceList, - Data.HasNowaitClause); } else if (const auto *C = S.getSingleClause<OMPDestroyClause>()) { llvm::Value *InteropvarPtr = EmitLValue(C->getInteropVar()).getPointer(*this); diff --git a/clang/test/OpenMP/interop_codegen.cpp b/clang/test/OpenMP/interop_codegen.cpp new file mode 100644 index 00000000000000..ea83ef8ed4909f --- /dev/null +++ b/clang/test/OpenMP/interop_codegen.cpp @@ -0,0 +1,35 @@ +// expected-no-diagnostics +// 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 +// 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 +// 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 + +#ifndef HEADER +#define HEADER + +typedef void *omp_interop_t; +#define omp_interop_none 0 +#define omp_ipr_fr_id -1 +typedef long omp_intptr_t; +#define NULL 0 + +extern omp_intptr_t omp_get_interop_int(const omp_interop_t, int, int *); + +int main() { + omp_interop_t obj = omp_interop_none; + omp_interop_t i1 = omp_interop_none; + omp_interop_t i2 = omp_interop_none; + omp_interop_t i3 = omp_interop_none; + omp_interop_t i4 = omp_interop_none; + omp_interop_t i5 = omp_interop_none; + + #pragma omp interop init(targetsync: i1) init(targetsync: obj) + int id = (int )omp_get_interop_int(obj, omp_ipr_fr_id, NULL); + int id1 = (int )omp_get_interop_int(i1, omp_ipr_fr_id, NULL); + + +} +#endif + +// CHECK-LABEL: define {{.+}}main{{.+}} +// CHECK: call {{.+}}__tgt_interop_init({{.+}}i1{{.*}}) +// CHECK: call {{.+}}__tgt_interop_init({{.+}}obj{{.*}}) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits