"::mlir::transform::TransformResults &":$transformResults,
"::mlir::transform::TransformState &":$state
)>,
+ InterfaceMethod<
+ /*desc=*/[{
+ Indicates whether the op instance allows its handle operands to be
+ associated with the same payload operations.
+ }],
+ /*returnType=*/"bool",
+ /*name=*/"allowsRepeatedHandleOperands",
+ /*arguments=*/(ins),
+ /*methodBody=*/"",
+ /*defaultImplementation=*/[{
+ return false;
+ }]
+ >,
];
let extraSharedClassDeclaration = [{
}
def MergeHandlesOp : TransformDialectOp<"merge_handles",
- [DeclareOpInterfaceMethods<TransformOpInterface>,
+ [DeclareOpInterfaceMethods<TransformOpInterface, ["allowsRepeatedHandleOperands"]>,
DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,
SameOperandsAndResultType]> {
let summary = "Merges handles into one pointing to the union of payload ops";
for (OpOperand &target : transform->getOpOperands()) {
// If the operand uses an invalidated handle, report it.
auto it = invalidatedHandles.find(target.get());
- if (it != invalidatedHandles.end())
+ if (!transform.allowsRepeatedHandleOperands() &&
+ it != invalidatedHandles.end())
return it->getSecond()(transform->getLoc()), failure();
// Invalidate handles pointing to the operations nested in the operation
if (llvm::any_of(effects, consumesTarget))
recordHandleInvalidation(target);
}
+
return success();
}
return DiagnosedSilenceableFailure::success();
}
+bool transform::MergeHandlesOp::allowsRepeatedHandleOperands() {
+ // Handles may be the same if deduplicating is enabled.
+ return getDeduplicate();
+}
+
void transform::MergeHandlesOp::getEffects(
SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {
consumesHandle(getHandles(), effects);
transform.test_consume_operand %1, %2
}
}
+
+// -----
+
+// Deduplication attribute allows "merge_handles" to take repeated operands.
+
+module {
+
+ transform.sequence failures(propagate) {
+ ^bb0(%0: !pdl.operation):
+ %1 = transform.test_copy_payload %0
+ %2 = transform.test_copy_payload %0
+ transform.merge_handles %1, %2 { deduplicate } : !pdl.operation
+ }
+}