[mlir][StorageUniquer] Properly call the destructor on non-trivially destructible storage instances
This allows for storage instances to store data that isn't uniqued in the context, or contain otherwise non-trivial logic, in the rare situations that they occur. Storage instances with trivial destructors will still have their destructor skipped. A consequence of this is that the storage instance definition must be visible from the place that registers the type.
Differential Revision: https://reviews.llvm.org/D98311
GitOrigin-RevId: 31bb8efd698304a8385ff79229ffbaa5613efdfb
diff --git a/include/flang/Optimizer/Dialect/FIRDialect.h b/include/flang/Optimizer/Dialect/FIRDialect.h
index fb82d52..4bafb4a 100644
--- a/include/flang/Optimizer/Dialect/FIRDialect.h
+++ b/include/flang/Optimizer/Dialect/FIRDialect.h
@@ -32,6 +32,12 @@
mlir::Type type) const override;
void printAttribute(mlir::Attribute attr,
mlir::DialectAsmPrinter &p) const override;
+
+private:
+ // Register the Attributes of this dialect.
+ void registerAttributes();
+ // Register the Types of this dialect.
+ void registerTypes();
};
} // namespace fir
diff --git a/lib/Optimizer/Dialect/FIRAttr.cpp b/lib/Optimizer/Dialect/FIRAttr.cpp
index 035245d..a2fdf7c 100644
--- a/lib/Optimizer/Dialect/FIRAttr.cpp
+++ b/lib/Optimizer/Dialect/FIRAttr.cpp
@@ -243,3 +243,12 @@
os << "<(unknown attribute)>";
}
}
+
+//===----------------------------------------------------------------------===//
+// FIROpsDialect
+//===----------------------------------------------------------------------===//
+
+void FIROpsDialect::registerAttributes() {
+ addAttributes<ClosedIntervalAttr, ExactTypeAttr, LowerBoundAttr,
+ PointIntervalAttr, RealAttr, SubclassAttr, UpperBoundAttr>();
+}
diff --git a/lib/Optimizer/Dialect/FIRDialect.cpp b/lib/Optimizer/Dialect/FIRDialect.cpp
index 889b5ef..f80aa7d 100644
--- a/lib/Optimizer/Dialect/FIRDialect.cpp
+++ b/lib/Optimizer/Dialect/FIRDialect.cpp
@@ -19,13 +19,8 @@
fir::FIROpsDialect::FIROpsDialect(mlir::MLIRContext *ctx)
: mlir::Dialect("fir", ctx, mlir::TypeID::get<FIROpsDialect>()) {
- addTypes<BoxType, BoxCharType, BoxProcType, CharacterType, fir::ComplexType,
- FieldType, HeapType, fir::IntegerType, LenType, LogicalType,
- PointerType, RealType, RecordType, ReferenceType, SequenceType,
- ShapeType, ShapeShiftType, ShiftType, SliceType, TypeDescType,
- fir::VectorType>();
- addAttributes<ClosedIntervalAttr, ExactTypeAttr, LowerBoundAttr,
- PointIntervalAttr, RealAttr, SubclassAttr, UpperBoundAttr>();
+ registerTypes();
+ registerAttributes();
addOperations<
#define GET_OP_LIST
#include "flang/Optimizer/Dialect/FIROps.cpp.inc"
diff --git a/lib/Optimizer/Dialect/FIRType.cpp b/lib/Optimizer/Dialect/FIRType.cpp
index 873f589..beab54e 100644
--- a/lib/Optimizer/Dialect/FIRType.cpp
+++ b/lib/Optimizer/Dialect/FIRType.cpp
@@ -866,3 +866,15 @@
bool fir::VectorType::isValidElementType(mlir::Type t) {
return isa_real(t) || isa_integer(t);
}
+
+//===----------------------------------------------------------------------===//
+// FIROpsDialect
+//===----------------------------------------------------------------------===//
+
+void FIROpsDialect::registerTypes() {
+ addTypes<BoxType, BoxCharType, BoxProcType, CharacterType, fir::ComplexType,
+ FieldType, HeapType, fir::IntegerType, LenType, LogicalType,
+ PointerType, RealType, RecordType, ReferenceType, SequenceType,
+ ShapeType, ShapeShiftType, ShiftType, SliceType, TypeDescType,
+ fir::VectorType>();
+}