-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[mlir][Transforms] Support rolling back properties in dialect conversion #82474
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
matthias-springer
merged 1 commit into
main
from
users/matthias-springer/dialect_conversion_properties
Feb 21, 2024
Merged
[mlir][Transforms] Support rolling back properties in dialect conversion #82474
matthias-springer
merged 1 commit into
main
from
users/matthias-springer/dialect_conversion_properties
Feb 21, 2024
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@llvm/pr-subscribers-mlir @llvm/pr-subscribers-mlir-core Author: Matthias Springer (matthias-springer) ChangesThe dialect conversion rolls back in-place op modifications upon failure. Rolling back modifications of attributes is already supported, but there was no support for properties until now. Full diff: https://github.com/llvm/llvm-project/pull/82474.diff 3 Files Affected:
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index 673bd0383809cb..495e9d8df19d0a 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -1002,12 +1002,31 @@ class ModifyOperationRewrite : public OperationRewrite {
: OperationRewrite(Kind::ModifyOperation, rewriterImpl, op),
loc(op->getLoc()), attrs(op->getAttrDictionary()),
operands(op->operand_begin(), op->operand_end()),
- successors(op->successor_begin(), op->successor_end()) {}
+ successors(op->successor_begin(), op->successor_end()) {
+ if (OpaqueProperties prop = op->getPropertiesStorage()) {
+ // Make a copy of the properties.
+ int size = op->getPropertiesStorageSize();
+ propertiesStorage = operator new(size);
+ memcpy(propertiesStorage, prop.as<void *>(), size);
+ }
+ }
static bool classof(const IRRewrite *rewrite) {
return rewrite->getKind() == Kind::ModifyOperation;
}
+ ~ModifyOperationRewrite() override {
+ assert(!propertiesStorage &&
+ "rewrite was neither committed nor rolled back");
+ }
+
+ void commit() override {
+ if (propertiesStorage) {
+ operator delete(propertiesStorage);
+ propertiesStorage = nullptr;
+ }
+ }
+
/// Discard the transaction state and reset the state of the original
/// operation.
void rollback() override {
@@ -1016,6 +1035,12 @@ class ModifyOperationRewrite : public OperationRewrite {
op->setOperands(operands);
for (const auto &it : llvm::enumerate(successors))
op->setSuccessor(it.value(), it.index());
+ if (propertiesStorage) {
+ OpaqueProperties prop(propertiesStorage);
+ op->copyProperties(prop);
+ operator delete(propertiesStorage);
+ propertiesStorage = nullptr;
+ }
}
private:
@@ -1023,6 +1048,7 @@ class ModifyOperationRewrite : public OperationRewrite {
DictionaryAttr attrs;
SmallVector<Value, 8> operands;
SmallVector<Block *, 2> successors;
+ void *propertiesStorage = nullptr;
};
} // namespace
diff --git a/mlir/test/Transforms/test-legalizer.mlir b/mlir/test/Transforms/test-legalizer.mlir
index 84fcc18ab7d370..62d776cd7573ee 100644
--- a/mlir/test/Transforms/test-legalizer.mlir
+++ b/mlir/test/Transforms/test-legalizer.mlir
@@ -334,3 +334,15 @@ func.func @test_move_op_before_rollback() {
}) : () -> ()
"test.return"() : () -> ()
}
+
+// -----
+
+// CHECK-LABEL: func @test_properties_rollback()
+func.func @test_properties_rollback() {
+ // CHECK: test.with_properties <{a = 32 : i64,
+ // expected-remark @below{{op 'test.with_properties' is not legalizable}}
+ test.with_properties
+ <{a = 32 : i64, array = array<i64: 1, 2, 3, 4>, b = "foo"}>
+ {modify_inplace}
+ "test.return"() : () -> ()
+}
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index 1c02232b8adbb1..57e846294f8b9f 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -806,6 +806,21 @@ struct TestUndoBlockErase : public ConversionPattern {
}
};
+/// A pattern that modifies a property in-place, but keeps the op illegal.
+struct TestUndoPropertiesModification : public ConversionPattern {
+ TestUndoPropertiesModification(MLIRContext *ctx)
+ : ConversionPattern("test.with_properties", /*benefit=*/1, ctx) {}
+ LogicalResult
+ matchAndRewrite(Operation *op, ArrayRef<Value> operands,
+ ConversionPatternRewriter &rewriter) const final {
+ if (!op->hasAttr("modify_inplace"))
+ return failure();
+ rewriter.modifyOpInPlace(
+ op, [&]() { cast<TestOpWithProperties>(op).getProperties().setA(42); });
+ return success();
+ }
+};
+
//===----------------------------------------------------------------------===//
// Type-Conversion Rewrite Testing
@@ -1085,7 +1100,8 @@ struct TestLegalizePatternDriver
TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType,
TestNonRootReplacement, TestBoundedRecursiveRewrite,
TestNestedOpCreationUndoRewrite, TestReplaceEraseOp,
- TestCreateUnregisteredOp, TestUndoMoveOpBefore>(&getContext());
+ TestCreateUnregisteredOp, TestUndoMoveOpBefore,
+ TestUndoPropertiesModification>(&getContext());
patterns.add<TestDropOpSignatureConversion>(&getContext(), converter);
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern(patterns,
converter);
|
joker-eph
reviewed
Feb 21, 2024
7be59f6
to
33f2ae9
Compare
joker-eph
reviewed
Feb 21, 2024
joker-eph
reviewed
Feb 21, 2024
joker-eph
reviewed
Feb 21, 2024
f7a0cc4
to
1795b6d
Compare
joker-eph
approved these changes
Feb 21, 2024
8a8a79d
to
5cabd6c
Compare
Base automatically changed from
users/matthias-springer/dialect_conversion_modify_op_inplace
to
main
February 21, 2024 15:34
The dialect conversion rolls back inplace op modifications upon failure. Rolling back modifications of op properties was not supported before this commit.
1795b6d
to
ceeb3c1
Compare
matthias-springer
added a commit
that referenced
this pull request
Feb 21, 2024
When a `ModifyOperationRewrite` is committed, the operation may already have been erased, so `OperationName` must be cached in the rewrite object. Note: This will no longer be needed with #81757, which adds a "cleanup" method to `IRRewrite`.
matthias-springer
added a commit
that referenced
this pull request
Feb 21, 2024
When a `ModifyOperationRewrite` is committed, the operation may already have been erased, so `OperationName` must be cached in the rewrite object. Note: This will no longer be needed with #81757, which adds a "cleanup" method to `IRRewrite`.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The dialect conversion rolls back in-place op modifications upon failure. Rolling back modifications of attributes is already supported, but there was no support for properties until now.