When changing the type of a Function, also update the type of the respective...
authorRiver Riddle <riverriddle@google.com>
Mon, 20 May 2019 22:21:22 +0000 (15:21 -0700)
committerMehdi Amini <joker.eph@gmail.com>
Sun, 2 Jun 2019 02:53:02 +0000 (19:53 -0700)
--

PiperOrigin-RevId: 249137558

mlir/include/mlir/IR/Attributes.h
mlir/include/mlir/IR/Function.h
mlir/lib/IR/AttributeDetail.h
mlir/lib/IR/Attributes.cpp

index 00730a9..acc5e72 100644 (file)
@@ -410,6 +410,10 @@ public:
   /// This function is used by the internals of the Function class to null out
   /// attributes referring to functions that are about to be deleted.
   static void dropFunctionReference(Function *value);
+
+  /// This function is used by the internals of the Function class to update the
+  /// type of the function attribute for 'value'.
+  static void resetType(Function *value);
 };
 
 /// A base attribute that represents a reference to a vector or tensor constant.
index 9aefd79..1a7332d 100644 (file)
@@ -72,6 +72,7 @@ public:
   void setType(FunctionType newType) {
     type = newType;
     argAttrs.resize(type.getNumInputs());
+    FunctionAttr::resetType(this);
   }
 
   MLIRContext *getContext();
index 8085418..b657bbd 100644 (file)
@@ -318,6 +318,9 @@ struct FunctionAttributeStorage : public AttributeStorage {
     value = nullptr;
   }
 
+  /// Reset the type of this attribute to the type of the held function.
+  void resetType() { setType(value->getType()); }
+
   Function *value;
 };
 
index b958221..5bb4554 100644 (file)
@@ -303,6 +303,12 @@ void FunctionAttr::dropFunctionReference(Function *value) {
                                         StandardAttributes::Function, value);
 }
 
+/// This function is used by the internals of the Function class to update the
+/// type of the attribute for 'value'.
+void FunctionAttr::resetType(Function *value) {
+  FunctionAttr::get(value).getImpl()->resetType();
+}
+
 Function *FunctionAttr::getValue() const { return getImpl()->value; }
 
 FunctionType FunctionAttr::getType() const {