[mlir] Move attr -> properties to not require Operation
authorJacques Pienaar <jpienaar@google.com>
Fri, 21 Jul 2023 21:54:43 +0000 (14:54 -0700)
committerJacques Pienaar <jpienaar@google.com>
Fri, 21 Jul 2023 21:54:43 +0000 (14:54 -0700)
This allows for converting before/without an Operation is created.

Differential Revision: https://reviews.llvm.org/D155996

mlir/include/mlir/IR/ExtensibleDialect.h
mlir/include/mlir/IR/OperationSupport.h
mlir/lib/IR/MLIRContext.cpp
mlir/lib/IR/Operation.cpp

index 4ca27ea..9a35077 100644 (file)
@@ -24,6 +24,7 @@
 #include "mlir/IR/DialectInterface.h"
 #include "mlir/IR/MLIRContext.h"
 #include "mlir/IR/OpDefinition.h"
+#include "mlir/IR/OperationSupport.h"
 #include "mlir/Support/TypeID.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -485,7 +486,9 @@ public:
   void populateDefaultProperties(OperationName opName,
                                  OpaqueProperties properties) final {}
 
-  LogicalResult setPropertiesFromAttr(Operation *op, Attribute attr,
+  LogicalResult setPropertiesFromAttr(OperationName opName,
+                                      OpaqueProperties properties,
+                                      Attribute attr,
                                       InFlightDiagnostic *diag) final {
     return failure();
   }
index 82efa9d..303e030 100644 (file)
@@ -136,7 +136,8 @@ public:
     virtual void deleteProperties(OpaqueProperties) = 0;
     virtual void populateDefaultProperties(OperationName opName,
                                            OpaqueProperties properties) = 0;
-    virtual LogicalResult setPropertiesFromAttr(Operation *, Attribute,
+    virtual LogicalResult setPropertiesFromAttr(OperationName, OpaqueProperties,
+                                                Attribute,
                                                 InFlightDiagnostic *) = 0;
     virtual Attribute getPropertiesAsAttr(Operation *) = 0;
     virtual void copyProperties(OpaqueProperties, OpaqueProperties) = 0;
@@ -215,8 +216,8 @@ protected:
     void deleteProperties(OpaqueProperties) final;
     void populateDefaultProperties(OperationName opName,
                                    OpaqueProperties properties) final;
-    LogicalResult setPropertiesFromAttr(Operation *, Attribute,
-                                        InFlightDiagnostic *) final;
+    LogicalResult setPropertiesFromAttr(OperationName, OpaqueProperties,
+                                        Attribute, InFlightDiagnostic *) final;
     Attribute getPropertiesAsAttr(Operation *) final;
     void copyProperties(OpaqueProperties, OpaqueProperties) final;
     llvm::hash_code hashProperties(OpaqueProperties) final;
@@ -425,9 +426,11 @@ public:
 
   /// Define the op properties from the provided Attribute.
   LogicalResult
-  setOpPropertiesFromAttribute(Operation *op, Attribute properties,
+  setOpPropertiesFromAttribute(OperationName opName,
+                               OpaqueProperties properties, Attribute attr,
                                InFlightDiagnostic *diagnostic) const {
-    return getImpl()->setPropertiesFromAttr(op, properties, diagnostic);
+    return getImpl()->setPropertiesFromAttr(opName, properties, attr,
+                                            diagnostic);
   }
 
   void copyOpProperties(OpaqueProperties lhs, OpaqueProperties rhs) const {
@@ -614,11 +617,14 @@ public:
                                               *properties.as<Properties *>());
     }
 
-    LogicalResult setPropertiesFromAttr(Operation *op, Attribute attr,
+    LogicalResult setPropertiesFromAttr(OperationName opName,
+                                        OpaqueProperties properties,
+                                        Attribute attr,
                                         InFlightDiagnostic *diag) final {
-      if constexpr (hasProperties)
-        return ConcreteOp::setPropertiesFromAttr(
-            cast<ConcreteOp>(op).getProperties(), attr, diag);
+      if constexpr (hasProperties) {
+        auto p = properties.as<Properties *>();
+        return ConcreteOp::setPropertiesFromAttr(*p, attr, diag);
+      }
       if (diag)
         *diag << "This operation does not support properties";
       return failure();
index bb309d5..e19c3d4 100644 (file)
@@ -24,6 +24,7 @@
 #include "mlir/IR/IntegerSet.h"
 #include "mlir/IR/Location.h"
 #include "mlir/IR/OpImplementation.h"
+#include "mlir/IR/OperationSupport.h"
 #include "mlir/IR/Types.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseSet.h"
@@ -850,8 +851,9 @@ void OperationName::UnregisteredOpModel::deleteProperties(
 void OperationName::UnregisteredOpModel::populateDefaultProperties(
     OperationName opName, OpaqueProperties properties) {}
 LogicalResult OperationName::UnregisteredOpModel::setPropertiesFromAttr(
-    Operation *op, Attribute attr, InFlightDiagnostic *diag) {
-  *op->getPropertiesStorage().as<Attribute *>() = attr;
+    OperationName opName, OpaqueProperties properties, Attribute attr,
+    InFlightDiagnostic *diag) {
+  *properties.as<Attribute *>() = attr;
   return success();
 }
 Attribute
index 1c70bc3..3453f9d 100644 (file)
@@ -361,7 +361,8 @@ Operation::setPropertiesFromAttribute(Attribute attr,
     *getPropertiesStorage().as<Attribute *>() = attr;
     return success();
   }
-  return info->setOpPropertiesFromAttribute(this, attr, diagnostic);
+  return info->setOpPropertiesFromAttribute(
+      this->getName(), this->getPropertiesStorage(), attr, diagnostic);
 }
 
 void Operation::copyProperties(OpaqueProperties rhs) {