[Mlir-commits] [mlir] [MLIR][CAPI][Python] Add support for constructing memory effect instances (PR #210586)
Maksim Levental
llvmlistbot at llvm.org
Sun Jul 19 11:07:37 PDT 2026
================
@@ -34,6 +34,70 @@ its return shaped type components. Raises ValueError on failure.)";
namespace {
+MlirAttribute unwrapOptionalAttribute(const nb::object &attribute) {
+ if (attribute.is_none())
+ return mlirAttributeGetNull();
+
+ PyAttribute *pyAttribute = nullptr;
+ if (!nb::try_cast<PyAttribute *>(attribute, pyAttribute) || !pyAttribute)
+ throw nb::type_error("parameters must be an Attribute or None");
+ return pyAttribute->get();
+}
+
+void appendMemoryEffectInstance(PyMemoryEffectsInstanceList &effects,
+ const PyMemoryEffect &effect,
+ const nb::object &target,
+ const nb::object ¶meters, int stage,
+ bool effectOnFullRegion,
+ const PySideEffectResource &resource) {
+ MlirMemoryEffectInstancesList list = effects.get();
+ MlirAttribute unwrappedParameters = unwrapOptionalAttribute(parameters);
+
+ MlirMemoryEffectInstance rawInstance{nullptr};
+ if (target.is_none()) {
+ rawInstance =
+ mlirMemoryEffectInstanceCreate(effect.get(), unwrappedParameters, stage,
+ effectOnFullRegion, resource.get());
+ } else {
+ PyOpOperand *opOperand = nullptr;
+ PyValue *value = nullptr;
+ PyAttribute *attribute = nullptr;
+ if (nb::try_cast<PyOpOperand *>(target, opOperand) && opOperand) {
+ rawInstance = mlirMemoryEffectInstanceCreateForOpOperand(
+ effect.get(), *opOperand, unwrappedParameters, stage,
+ effectOnFullRegion, resource.get());
+ } else if (nb::try_cast<PyValue *>(target, value) && value) {
+ MlirValue mlirValue = value->get();
+ if (mlirValueIsAOpResult(mlirValue)) {
+ rawInstance = mlirMemoryEffectInstanceCreateForOpResult(
+ effect.get(), mlirValue, unwrappedParameters, stage,
+ effectOnFullRegion, resource.get());
+ } else if (mlirValueIsABlockArgument(mlirValue)) {
+ rawInstance = mlirMemoryEffectInstanceCreateForBlockArgument(
+ effect.get(), mlirValue, unwrappedParameters, stage,
+ effectOnFullRegion, resource.get());
+ } else {
+ throw nb::type_error(
+ "target Value must be an OpResult or BlockArgument");
+ }
+ } else if (nb::try_cast<PyAttribute *>(target, attribute) && attribute) {
+ MlirAttribute symbol = attribute->get();
+ if (!mlirAttributeIsASymbolRef(symbol))
+ throw nb::type_error("target Attribute must be a SymbolRefAttr");
+ rawInstance = mlirMemoryEffectInstanceCreateForSymbol(
+ effect.get(), symbol, unwrappedParameters, stage, effectOnFullRegion,
+ resource.get());
+ } else {
+ throw nb::type_error(
+ "target must be an OpOperand, OpResult, BlockArgument, "
+ "SymbolRefAttr, or None");
+ }
+ }
+
+ PyMemoryEffectInstance instance(rawInstance);
+ mlirMemoryEffectInstancesListAppend(list, instance.get());
----------------
makslevental wrote:
```suggestion
mlirMemoryEffectInstancesListAppend(list, rawInstance);
```
no?
https://github.com/llvm/llvm-project/pull/210586
More information about the Mlir-commits
mailing list