https://github.com/skatrak updated https://github.com/llvm/llvm-project/pull/217295
>From 3897e36f502e39d422f02ec1efb61eb90d09be39 Mon Sep 17 00:00:00 2001 From: Sergio Afonso <[email protected]> Date: Tue, 18 Aug 2026 11:49:55 +0100 Subject: [PATCH] [MLIR][OpenMP] DeclareTargetInterface and DeclareTargetAttr cleanup The changes introduced by this patch are intended to avoid triggering multiple by name lookups to the "omp.declare_target" attribute every time any data from the `DeclareTargetInterface` is queried, remove the need for keeping multiple default values for the same data, clean up the assembly format and generally improve the usage of the interface. List of changes: - `DeclareTargetInterface` only provides `setDeclareTarget` and `getDeclareTarget` methods to handle the "omp.declare_target" attribute, maintaining a single canonical way of accessing it. - `DeclareTargetAttr` provides direct access to the capture clause and device type enums, rather than wrapping them into an `Attribute`. These are now mandatory as well. Both changes together make accessing them more straightforward and simplify the attribute representation. --- .../CodeGenOpenMP/emit-device-functions.cpp | 2 +- .../Transforms/omp-mark-declare-target.cir | 8 +- flang/docs/OpenMP-declare-target.md | 7 +- flang/lib/Lower/OpenMP/OpenMP.cpp | 13 ++-- .../Optimizer/OpenMP/AutomapToTargetData.cpp | 8 +- .../OpenMP/UnimplementedDeviceCheck.cpp | 7 +- .../OpenMP/declare-target-funcs.f90 | 4 +- .../declare-target-named-main-interface.f90 | 2 +- .../OpenMP/declare-target-multiple-entry.f90 | 6 +- .../mlir/Dialect/OpenMP/OpenMPAttrDefs.td | 4 +- .../Dialect/OpenMP/OpenMPOpsInterfaces.td | 76 ++++--------------- mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp | 2 +- .../OpenMP/Transforms/FunctionFiltering.cpp | 8 +- .../OpenMP/Transforms/HostOpFiltering.cpp | 6 +- .../OpenMP/Transforms/MarkDeclareTarget.cpp | 16 ++-- mlir/lib/Dialect/OpenMP/Utils/Utils.cpp | 7 +- .../OpenMP/OpenMPToLLVMIRTranslation.cpp | 44 ++++++----- .../Dialect/OpenMP/invalid-interface.mlir | 8 +- 18 files changed, 103 insertions(+), 125 deletions(-) diff --git a/clang/test/CIR/CodeGenOpenMP/emit-device-functions.cpp b/clang/test/CIR/CodeGenOpenMP/emit-device-functions.cpp index 53a8e2b7aab71..014529d2104d3 100644 --- a/clang/test/CIR/CodeGenOpenMP/emit-device-functions.cpp +++ b/clang/test/CIR/CodeGenOpenMP/emit-device-functions.cpp @@ -33,7 +33,7 @@ void caller() { #pragma omp end declare target -// CIR-DAG: cir.func {{.*}} @_Z12regular_funcv() {{.*}}omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (to) +// CIR-DAG: cir.func {{.*}} @_Z12regular_funcv() {{.*}}omp.declare_target = #omp.declaretarget<device_type = any, capture_clause = to // CIR-DAG: cir.func {{.*}} @_Z6callerv() {{.*}}omp.declare_target // CIR-DAG: cir.func {{.*}} @_ZN1SC2Ev({{.*}}) // CIR-DAG: cir.func {{.*}} @_ZN1SC1Ev({{.*}}) diff --git a/clang/test/CIR/Transforms/omp-mark-declare-target.cir b/clang/test/CIR/Transforms/omp-mark-declare-target.cir index a32fccc20f970..daa082683d03a 100644 --- a/clang/test/CIR/Transforms/omp-mark-declare-target.cir +++ b/clang/test/CIR/Transforms/omp-mark-declare-target.cir @@ -10,22 +10,22 @@ module { // A helper function with no declare_target attribute initially. // After the pass, it should be marked because @caller calls it. // CHECK-LABEL: cir.func private @helper - // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (to) + // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = host, capture_clause = to cir.func private @helper() { cir.return } // Explicitly marked as declare_target; calls @helper. // CHECK-LABEL: cir.func @caller - // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (to)> - cir.func @caller() attributes {omp.declare_target = #omp.declaretarget<device_type = (host), capture_clause = (to)>} { + // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = host, capture_clause = to> + cir.func @caller() attributes {omp.declare_target = #omp.declaretarget<device_type = host, capture_clause = to>} { cir.call @helper() : () -> () cir.return } // Called from within an omp.target region; should be marked as nohost. // CHECK-LABEL: cir.func private @device_helper - // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = (nohost), capture_clause = (to) + // CHECK-SAME: omp.declare_target = #omp.declaretarget<device_type = nohost, capture_clause = to cir.func private @device_helper() { cir.return } diff --git a/flang/docs/OpenMP-declare-target.md b/flang/docs/OpenMP-declare-target.md index 3a7d001d15846..1e98068a2961b 100644 --- a/flang/docs/OpenMP-declare-target.md +++ b/flang/docs/OpenMP-declare-target.md @@ -93,8 +93,11 @@ operations to access the appropriate interface functions, e.g.: ```C++ auto declareTargetGlobal = -llvm::dyn_cast<mlir::omp::DeclareTargetInterface>(Op.getOperation()); -declareTargetGlobal.isDeclareTarget(); + llvm::cast<mlir::omp::DeclareTargetInterface>(op.getOperation()); +auto declareTargetAttr = declareTargetGlobal.getDeclareTarget(); +if (declareTargetAttr) { + auto deviceType = declareTargetAttr.getDeviceType(); +} ``` ## Declare Target Fortran OpenMP Lowering diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index becb05b5af2c2..28b7458981d76 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1764,10 +1764,12 @@ getImplicitMapTypeAndKind(fir::FirOpBuilder &firOpBuilder, } } - if (declareTargetOp && declareTargetOp.isDeclareTarget()) { - if (declareTargetOp.getDeclareTargetCaptureClause() == + mlir::omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp ? declareTargetOp.getDeclareTarget() : nullptr; + if (declareTargetAttr) { + if (declareTargetAttr.getCaptureClause() == mlir::omp::DeclareTargetCaptureClause::link && - declareTargetOp.getDeclareTargetDeviceType() != + declareTargetAttr.getDeviceType() != mlir::omp::DeclareTargetDeviceType::nohost) { mapFlag |= mlir::omp::ClauseMapFlags::to; mapFlag |= mlir::omp::ClauseMapFlags::from; @@ -1847,8 +1849,9 @@ markDeclareTarget(mlir::Operation *op, lower::AbstractConverter &converter, // likely through implicit capture (usage in another declare target // function/subroutine). It should be marked as any if it has been assigned // both host and nohost, else we skip, as there is no change - if (declareTargetOp.isDeclareTarget()) { - if (declareTargetOp.getDeclareTargetDeviceType() != deviceType) + if (mlir::omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp.getDeclareTarget()) { + if (declareTargetAttr.getDeviceType() != deviceType) declareTargetOp.setDeclareTarget(mlir::omp::DeclareTargetDeviceType::any, captureClause, automap, /*implicit=*/false); diff --git a/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp b/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp index bf269b5dd3ff2..0ec0c9193e969 100644 --- a/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp +++ b/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp @@ -97,11 +97,13 @@ class AutomapToTargetDataPass llvm::DenseSet<fir::GlobalOp> automapGlobals; module.walk([&](fir::GlobalOp globalOp) { if (auto iface = - dyn_cast<omp::DeclareTargetInterface>(globalOp.getOperation())) - if (iface.isDeclareTarget() && iface.getDeclareTargetAutomap() && - iface.getDeclareTargetDeviceType() != + dyn_cast<omp::DeclareTargetInterface>(globalOp.getOperation())) { + omp::DeclareTargetAttr declareTargetAttr = iface.getDeclareTarget(); + if (declareTargetAttr && declareTargetAttr.getAutomap() && + declareTargetAttr.getDeviceType() != omp::DeclareTargetDeviceType::host) automapGlobals.insert(globalOp); + } }); auto addMapInfo = [&](auto globalOp, auto memOp) { diff --git a/flang/lib/Optimizer/OpenMP/UnimplementedDeviceCheck.cpp b/flang/lib/Optimizer/OpenMP/UnimplementedDeviceCheck.cpp index c393e2f90f88f..faf7274444104 100644 --- a/flang/lib/Optimizer/OpenMP/UnimplementedDeviceCheck.cpp +++ b/flang/lib/Optimizer/OpenMP/UnimplementedDeviceCheck.cpp @@ -37,9 +37,10 @@ static bool allUsesInHostCode(Operation *moduleOp, SymbolOpInterface symOp) { if (auto declareTargetOp = symUser->getParentOfType<omp::DeclareTargetInterface>()) { - if (declareTargetOp.isDeclareTarget() && - declareTargetOp.getDeclareTargetDeviceType() != - omp::DeclareTargetDeviceType::host) + omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp.getDeclareTarget(); + if (declareTargetAttr && declareTargetAttr.getDeviceType() != + omp::DeclareTargetDeviceType::host) return false; } } diff --git a/flang/test/Integration/OpenMP/declare-target-funcs.f90 b/flang/test/Integration/OpenMP/declare-target-funcs.f90 index 66010b9b0838f..6a4ac0538c06b 100644 --- a/flang/test/Integration/OpenMP/declare-target-funcs.f90 +++ b/flang/test/Integration/OpenMP/declare-target-funcs.f90 @@ -16,8 +16,8 @@ ! CHECK-LABEL: IR Dump Before HostOpFilteringPass: omp-host-op-filter ! CHECK: llvm.func{{.*}}@__mlir_math_ipowi_i32 -! CHECK-SAME: attributes{{.*}}omp.declare_target{{.*}}device_type = -! CHECK-NOT: (host) +! CHECK-SAME: attributes{{.*}}omp.declare_target = #omp.declaretarget< +! CHECK-NOT: device_type = host module m contains diff --git a/flang/test/Integration/OpenMP/declare-target-named-main-interface.f90 b/flang/test/Integration/OpenMP/declare-target-named-main-interface.f90 index 7f85324fc6869..1fa1ad12ec87c 100644 --- a/flang/test/Integration/OpenMP/declare-target-named-main-interface.f90 +++ b/flang/test/Integration/OpenMP/declare-target-named-main-interface.f90 @@ -16,7 +16,7 @@ ! CHECK-NOT: llvm.func @_QQmain{{.*}}device_type = any ! CHECK-NOT: llvm.func @_QQmain{{.*}}device_type = nohost -! CHECK: llvm.func @_QPsub_a{{.*}}device_type = any, {{.*}}sym_visibility = "private" +! CHECK: llvm.func @_QPsub_a{{.*}}#omp.declaretarget<device_type = any, capture_clause = to>, {{.*}}sym_visibility = "private" program named_main interface diff --git a/flang/test/Lower/OpenMP/declare-target-multiple-entry.f90 b/flang/test/Lower/OpenMP/declare-target-multiple-entry.f90 index e983093cbacee..2c46e567d1b76 100644 --- a/flang/test/Lower/OpenMP/declare-target-multiple-entry.f90 +++ b/flang/test/Lower/OpenMP/declare-target-multiple-entry.f90 @@ -4,9 +4,9 @@ ! Test that a bare '!$omp declare target' inside a multiple entry subprogram ! marks all entries as declare-target functions. -! CHECK: func.func @_QPfirst_entry{{.*}}device_type = any -! CHECK: func.func @_QPsecond_entry{{.*}}device_type = any -! CHECK: func.func @_QPthird_entry{{.*}}device_type = any +! CHECK: func.func @_QPfirst_entry{{.*}}omp.declare_target +! CHECK: func.func @_QPsecond_entry{{.*}}omp.declare_target +! CHECK: func.func @_QPthird_entry{{.*}}omp.declare_target subroutine first_entry() implicit none diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td index b80c2f6aba441..a7c865dc3b11c 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td @@ -43,8 +43,8 @@ def AtomicControlAttr : OpenMP_Attr<"AtomicControl", "atomic_control"> { def DeclareTargetAttr : OpenMP_Attr<"DeclareTarget", "declaretarget"> { let parameters = - (ins OptionalEnumAttrParameter<DeclareTargetDeviceTypeAttr>:$device_type, - OptionalEnumAttrParameter<DeclareTargetCaptureClauseAttr>:$capture_clause, + (ins "mlir::omp::DeclareTargetDeviceType":$device_type, + "mlir::omp::DeclareTargetCaptureClause":$capture_clause, DefaultValuedParameter<"bool", "false">:$automap, DefaultValuedParameter<"bool", "false">:$implicit); diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td index 9e1699e0482b5..a087439c87cb2 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td @@ -399,74 +399,28 @@ def DeclareTargetInterface : OpInterface<"DeclareTargetInterface"> { "bool":$automap, "bool":$implicit), [{}], [{ $_op->setDiscardableAttr("omp.declare_target", mlir::omp::DeclareTargetAttr::get( - $_op->getContext(), - mlir::omp::DeclareTargetDeviceTypeAttr::get( - $_op->getContext(), deviceType), - mlir::omp::DeclareTargetCaptureClauseAttr::get( - $_op->getContext(), captureClause), - automap, implicit)); + $_op->getContext(), deviceType, captureClause, automap, + implicit)); }]>, - InterfaceMethod< - /*description=*/[{ - Checks if the declare target attribute has been applied and exists on the - current operation. Returns true if it exists on it, otherwise returns - false. - }], - /*retTy=*/"bool", - /*methodName=*/"isDeclareTarget", - (ins), [{}], [{ - return $_op->hasDiscardableAttr("omp.declare_target"); - }]>, - InterfaceMethod< - /*description=*/[{ - Returns the DeclareTargetDeviceType segment of the DeclareTarget attribute if it - exists on the current operation. Otherwise it returns null. - }], - /*retTy=*/"mlir::omp::DeclareTargetDeviceType", - /*methodName=*/"getDeclareTargetDeviceType", - (ins), [{}], [{ - if (mlir::Attribute dTar = $_op->getDiscardableAttr("omp.declare_target")) - if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar)) - return dAttr.getDeviceType().getValue(); - return {}; - }]>, - InterfaceMethod< - /*description=*/[{ - Returns the DeclareTargetCaptureClause segment of the DeclareTarget attribute if it - exists on the current operation. Otherwise it returns null. - }], - /*retTy=*/"mlir::omp::DeclareTargetCaptureClause", - /*methodName=*/"getDeclareTargetCaptureClause", - (ins), [{}], [{ - if (mlir::Attribute dTar = $_op->getDiscardableAttr("omp.declare_target")) - if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar)) - return dAttr.getCaptureClause().getValue(); - return {}; - }]>, - InterfaceMethod< + InterfaceMethod< /*description=*/[{ - Return true if the DeclareTarget attribute has the AUTOMAP modifier. + Set the declare target attribute on the current operation. }], - /*retTy=*/"bool", - /*methodName=*/"getDeclareTargetAutomap", - (ins), [{}], [{ - if (mlir::Attribute dTar = $_op->getDiscardableAttr("omp.declare_target")) - if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar)) - return dAttr.getAutomap(); - return false; + /*retTy=*/"void", + /*methodName=*/"setDeclareTarget", + (ins "mlir::omp::DeclareTargetAttr":$attr), [{}], [{ + $_op->setDiscardableAttr("omp.declare_target", attr); }]>, - InterfaceMethod< + InterfaceMethod< /*description=*/[{ - Return true if the DeclareTarget attribute has been implicitly added. + Returns the declare target attribute if has been applied to the current + operation. Otherwise, it returns null. }], - /*retTy=*/"bool", - /*methodName=*/"isImplicitDeclareTarget", + /*retTy=*/"mlir::omp::DeclareTargetAttr", + /*methodName=*/"getDeclareTarget", (ins), [{}], [{ - if (mlir::Attribute dTar = - $_op->getDiscardableAttr("omp.declare_target")) - if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar)) - return dAttr.getImplicit(); - return false; + return llvm::cast_if_present<mlir::omp::DeclareTargetAttr>( + $_op->getDiscardableAttr("omp.declare_target")); }]> ]; } diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp index 1f210ef60fe39..0213a80faedee 100644 --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp @@ -363,7 +363,7 @@ static LogicalResult verifyDeclareTargetAttr(Operation *op, Attribute attr) { << "omp.declare_target 'automap' is not valid on functions"; // TODO: Disallow the `local` clause (OpenMP 6.0). - if (declareTargetAttr.getCaptureClause().getValue() == + if (declareTargetAttr.getCaptureClause() == mlir::omp::DeclareTargetCaptureClause::link) return op->emitOpError() << "omp.declare_target 'link' is not valid on functions"; diff --git a/mlir/lib/Dialect/OpenMP/Transforms/FunctionFiltering.cpp b/mlir/lib/Dialect/OpenMP/Transforms/FunctionFiltering.cpp index 3b236dd69f425..626d54aa9de53 100644 --- a/mlir/lib/Dialect/OpenMP/Transforms/FunctionFiltering.cpp +++ b/mlir/lib/Dialect/OpenMP/Transforms/FunctionFiltering.cpp @@ -55,8 +55,10 @@ class FunctionFilteringPass omp::DeclareTargetDeviceType::host; auto declareTargetOp = dyn_cast<omp::DeclareTargetInterface>(funcOp.getOperation()); - if (declareTargetOp && declareTargetOp.isDeclareTarget()) - declareType = declareTargetOp.getDeclareTargetDeviceType(); + omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp ? declareTargetOp.getDeclareTarget() : nullptr; + if (declareTargetAttr) + declareType = declareTargetAttr.getDeviceType(); // Only filter host functions from device modules because the host needs // to provide fallback implementations of device code. @@ -98,7 +100,7 @@ class FunctionFilteringPass // marked as such to perform the second stage removal them from the device // module, where functions that contain target regions are deleted from // the generated LLVM IR. - if (declareTargetOp && !declareTargetOp.isDeclareTarget()) + if (declareTargetOp && !declareTargetAttr) declareTargetOp.setDeclareTarget(omp::DeclareTargetDeviceType::host, omp::DeclareTargetCaptureClause::to, /*automap=*/false, /*implicit=*/true); diff --git a/mlir/lib/Dialect/OpenMP/Transforms/HostOpFiltering.cpp b/mlir/lib/Dialect/OpenMP/Transforms/HostOpFiltering.cpp index 9c61b2717af57..f7be1fdadfdb3 100644 --- a/mlir/lib/Dialect/OpenMP/Transforms/HostOpFiltering.cpp +++ b/mlir/lib/Dialect/OpenMP/Transforms/HostOpFiltering.cpp @@ -78,8 +78,10 @@ static void collectRewrite(Value value, llvm::SetVector<Value> &rewrites) { static std::optional<omp::DeclareTargetDeviceType> getDeclareTargetDevice(Operation &op) { auto declareTargetOp = dyn_cast<omp::DeclareTargetInterface>(op); - if (declareTargetOp && declareTargetOp.isDeclareTarget()) - return declareTargetOp.getDeclareTargetDeviceType(); + omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp ? declareTargetOp.getDeclareTarget() : nullptr; + if (declareTargetAttr) + return declareTargetAttr.getDeviceType(); return std::nullopt; } diff --git a/mlir/lib/Dialect/OpenMP/Transforms/MarkDeclareTarget.cpp b/mlir/lib/Dialect/OpenMP/Transforms/MarkDeclareTarget.cpp index d988752da84b9..e1395ebe4eb15 100644 --- a/mlir/lib/Dialect/OpenMP/Transforms/MarkDeclareTarget.cpp +++ b/mlir/lib/Dialect/OpenMP/Transforms/MarkDeclareTarget.cpp @@ -218,15 +218,17 @@ class MarkDeclareTargetPass for (auto funcOp : getOperation().getOps<FunctionOpInterface>()) { auto declareTargetOp = llvm::dyn_cast<omp::DeclareTargetInterface>(funcOp.getOperation()); + omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp ? declareTargetOp.getDeclareTarget() : nullptr; - if (!declareTargetOp || !declareTargetOp.isDeclareTarget()) + if (!declareTargetAttr) continue; // Add to the worklist all called functions with the declare_target // information of this one, so it gets propagated. for (auto &callee : calls[funcOp.getName()]) worklist.push_back( - {callee.getKey(), declareTargetOp.getDeclareTargetDeviceType()}); + {callee.getKey(), declareTargetAttr.getDeviceType()}); } // Add to the worklist all functions reached from target regions. @@ -248,15 +250,17 @@ class MarkDeclareTargetPass // declare_target information to functions for which the user hasn't // specified an explicit behavior. auto declareTargetOp = dyn_cast<omp::DeclareTargetInterface>(*funcOp); - if (!declareTargetOp || (declareTargetOp.isDeclareTarget() && - !declareTargetOp.isImplicitDeclareTarget())) + omp::DeclareTargetAttr declareTargetAttr = + declareTargetOp ? declareTargetOp.getDeclareTarget() : nullptr; + if (!declareTargetOp || + (declareTargetAttr && !declareTargetAttr.getImplicit())) continue; omp::DeclareTargetDeviceType changedDeviceType; - if (declareTargetOp.isDeclareTarget()) { + if (declareTargetAttr) { // Implicit declare_target update. omp::DeclareTargetDeviceType currentDeviceType = - declareTargetOp.getDeclareTargetDeviceType(); + declareTargetAttr.getDeviceType(); // Skip the update (and adding callees to the worklist) if the added // info doesn't change anything. diff --git a/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp b/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp index 537c5cea5b387..587210772896a 100644 --- a/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp +++ b/mlir/lib/Dialect/OpenMP/Utils/Utils.cpp @@ -138,9 +138,10 @@ bool mlir::omp::opInSharedDeviceContext(Operation &op) { return false; } else { auto declTargetIface = op.getParentOfType<omp::DeclareTargetInterface>(); - if (!declTargetIface || !declTargetIface.isDeclareTarget() || - declTargetIface.getDeclareTargetDeviceType() == - omp::DeclareTargetDeviceType::host) + omp::DeclareTargetAttr declTargetAttr = + declTargetIface ? declTargetIface.getDeclareTarget() : nullptr; + if (!declTargetAttr || + declTargetAttr.getDeviceType() == omp::DeclareTargetDeviceType::host) return false; } return true; diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index 1cbad3312235c..a114e74e62a77 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -6946,22 +6946,28 @@ getDeclareTargetRefPtrSuffix(LLVM::GlobalOp globalOp, static bool isDeclareTargetLink(Value value) { if (auto declareTargetGlobal = dyn_cast_if_present<omp::DeclareTargetInterface>( - getGlobalOpFromValue(value))) - if (declareTargetGlobal.getDeclareTargetCaptureClause() == - omp::DeclareTargetCaptureClause::link) + getGlobalOpFromValue(value))) { + omp::DeclareTargetAttr declareTargetAttr = + declareTargetGlobal.getDeclareTarget(); + if (declareTargetAttr && declareTargetAttr.getCaptureClause() == + omp::DeclareTargetCaptureClause::link) return true; + } return false; } static bool isDeclareTargetTo(Value value) { if (auto declareTargetGlobal = dyn_cast_if_present<omp::DeclareTargetInterface>( - getGlobalOpFromValue(value))) - if (declareTargetGlobal.getDeclareTargetCaptureClause() == - omp::DeclareTargetCaptureClause::to || - declareTargetGlobal.getDeclareTargetCaptureClause() == - omp::DeclareTargetCaptureClause::enter) + getGlobalOpFromValue(value))) { + omp::DeclareTargetAttr declareTargetAttr = + declareTargetGlobal.getDeclareTarget(); + if (declareTargetAttr && (declareTargetAttr.getCaptureClause() == + omp::DeclareTargetCaptureClause::to || + declareTargetAttr.getCaptureClause() == + omp::DeclareTargetCaptureClause::enter)) return true; + } return false; } @@ -9771,8 +9777,7 @@ convertDeclareTargetAttr(Operation *op, mlir::omp::DeclareTargetAttr attribute, if (!offloadMod.getIsTargetDevice()) return success(); - omp::DeclareTargetDeviceType declareType = - attribute.getDeviceType().getValue(); + omp::DeclareTargetDeviceType declareType = attribute.getDeviceType(); if (declareType == omp::DeclareTargetDeviceType::host) { llvm::Function *llvmFunc = @@ -9815,10 +9820,9 @@ convertDeclareTargetAttr(Operation *op, mlir::omp::DeclareTargetAttr attribute, auto loc = op->getLoc()->findInstanceOf<FileLineColLoc>(); llvm::StringRef mangledName = gOp.getSymName(); mlir::omp::DeclareTargetCaptureClause captureClause = - attribute.getCaptureClause().getValue(); + attribute.getCaptureClause(); auto captureClauseKind = convertToCaptureClauseKind(captureClause); - auto deviceClause = - convertToDeviceClauseKind(attribute.getDeviceType().getValue()); + auto deviceClause = convertToDeviceClauseKind(attribute.getDeviceType()); llvm::StringRef entryMangledName = mangledName; llvm::Constant *entryAddr = llvm::cast<llvm::Constant>(gVal); std::function<llvm::GlobalValue::LinkageTypes()> variableLinkage; @@ -9827,8 +9831,8 @@ convertDeclareTargetAttr(Operation *op, mlir::omp::DeclareTargetAttr attribute, bool isToOrEnter = captureClause == omp::DeclareTargetCaptureClause::to || captureClause == omp::DeclareTargetCaptureClause::enter; - bool isHostOnly = attribute.getDeviceType().getValue() == - omp::DeclareTargetDeviceType::host; + bool isHostOnly = + attribute.getDeviceType() == omp::DeclareTargetDeviceType::host; // A to/enter declare-target variable needs a device-resident, // name-resolvable copy and a host offloading entry. A local-linkage @@ -10116,11 +10120,13 @@ static bool isHostDeviceOp(Operation *op) { if (auto parentFn = op->getParentOfType<LLVM::LLVMFuncOp>()) { if (auto declareTargetIface = llvm::dyn_cast<mlir::omp::DeclareTargetInterface>( - parentFn.getOperation())) - if (declareTargetIface.isDeclareTarget() && - declareTargetIface.getDeclareTargetDeviceType() != - mlir::omp::DeclareTargetDeviceType::host) + parentFn.getOperation())) { + omp::DeclareTargetAttr declareTargetAttr = + declareTargetIface.getDeclareTarget(); + if (declareTargetAttr && declareTargetAttr.getDeviceType() != + mlir::omp::DeclareTargetDeviceType::host) return false; + } return true; } diff --git a/mlir/test/Dialect/OpenMP/invalid-interface.mlir b/mlir/test/Dialect/OpenMP/invalid-interface.mlir index ecbd17db54a41..567cf5b8c9707 100644 --- a/mlir/test/Dialect/OpenMP/invalid-interface.mlir +++ b/mlir/test/Dialect/OpenMP/invalid-interface.mlir @@ -108,7 +108,7 @@ func.func @composable_conditional_combined(%x : i32) { // ----- // expected-error @below {{omp.declare_target can only be applied to DeclareTargetInterface ops}} -%0 = arith.constant { omp.declare_target = #omp.declaretarget<capture_clause = enter> } 2 : i32 +%0 = arith.constant { omp.declare_target = #omp.declaretarget<device_type = any, capture_clause = enter> } 2 : i32 // ----- @@ -118,17 +118,17 @@ func.func private @declare_target_attr_type() attributes { omp.declare_target = // ----- // expected-error @below {{omp.declare_target 'automap' is not valid on functions}} -func.func private @declare_target_automap() attributes { omp.declare_target = #omp.declaretarget<automap = true>} +func.func private @declare_target_automap() attributes { omp.declare_target = #omp.declaretarget<device_type = any, capture_clause = enter, automap = true>} // ----- // expected-error @below {{omp.declare_target 'link' is not valid on functions}} -func.func private @declare_target_link() attributes { omp.declare_target = #omp.declaretarget<capture_clause = link>} +func.func private @declare_target_link() attributes { omp.declare_target = #omp.declaretarget<device_type = any, capture_clause = link>} // ----- // expected-error @below {{omp.declare_target 'implicit' is only valid on functions}} -llvm.mlir.global @declare_target_implicit() {omp.declare_target = #omp.declaretarget<implicit = true>} : i32 { +llvm.mlir.global @declare_target_implicit() {omp.declare_target = #omp.declaretarget<device_type = any, capture_clause = enter, implicit = true>} : i32 { %0 = llvm.mlir.constant(1 : i32) : i32 llvm.return %0 : i32 } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
