diff --git a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h index c7d89420eab08..4a250d1cc6c54 100644 --- a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h +++ b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h @@ -106,6 +106,9 @@ getProcAttribute(mlir::MLIRContext *mlirContext, return {}; } +/// Returns the data attribute if the operation has one. +cuf::DataAttributeAttr getDataAttr(mlir::Operation *op); + /// Returns true if the operation has a data attribute with the given value. bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value); diff --git a/flang/lib/Optimizer/Dialect/CUF/Attributes/CUFAttr.cpp b/flang/lib/Optimizer/Dialect/CUF/Attributes/CUFAttr.cpp index 9314c46a3bdf7..bd0499f406c18 100644 --- a/flang/lib/Optimizer/Dialect/CUF/Attributes/CUFAttr.cpp +++ b/flang/lib/Optimizer/Dialect/CUF/Attributes/CUFAttr.cpp @@ -30,19 +30,26 @@ void CUFDialect::registerAttributes() { LaunchBoundsAttr, ProcAttributeAttr>(); } -bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value) { +cuf::DataAttributeAttr getDataAttr(mlir::Operation *op) { if (!op) - return false; + return {}; + + if (auto dataAttr = + op->getAttrOfType(cuf::getDataAttrName())) + return dataAttr; - cuf::DataAttributeAttr dataAttr = - op->getAttrOfType(cuf::getDataAttrName()); // When the attribute is declared on the operation, it doesn't have a prefix. - if (!dataAttr) - dataAttr = op->getAttrOfType(cuf::dataAttrName); - if (!dataAttr) - return false; + if (auto dataAttr = + op->getAttrOfType(cuf::dataAttrName)) + return dataAttr; - return dataAttr.getValue() == value; + return {}; +} + +bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value) { + if (auto dataAttr = getDataAttr(op)) + return dataAttr.getValue() == value; + return false; } } // namespace cuf