Skip to content

Commit 4b42836

Browse files
[mlir][transform] Add PrintOp to transform dialect
This op dumps the associated payload IR to stderr. It has proven useful for printf-style debugging. Differential Revision: https://reviews.llvm.org/D137151
1 parent 67437dd commit 4b42836

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

mlir/include/mlir/Dialect/Transform/IR/TransformOps.td

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,25 @@ def PDLMatchOp : TransformDialectOp<"pdl_match",
290290
"functional-type(operands, results)";
291291
}
292292

293+
def PrintOp : TransformDialectOp<"print",
294+
[DeclareOpInterfaceMethods<TransformOpInterface>,
295+
DeclareOpInterfaceMethods<MemoryEffectsOpInterface>]> {
296+
let summary = "Dump each payload op";
297+
let description = [{
298+
This op dumps each payload op that is associated with the `target` operand
299+
to stderr. It also prints the `name` string attribute. If no target is
300+
specified, the top-level op is dumped.
301+
302+
This op is useful for printf-style debugging.
303+
}];
304+
305+
let arguments = (ins Optional<TransformTypeInterface>:$target,
306+
OptionalAttr<StrAttr>:$name);
307+
let results = (outs);
308+
let assemblyFormat = "$target attr-dict (`:` type($target)^)?";
309+
}
310+
311+
293312
def ReplicateOp : TransformDialectOp<"replicate",
294313
[DeclareOpInterfaceMethods<TransformOpInterface>,
295314
DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,

mlir/lib/Dialect/Transform/IR/TransformOps.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,3 +807,37 @@ LogicalResult transform::WithPDLPatternsOp::verify() {
807807

808808
return success();
809809
}
810+
811+
//===----------------------------------------------------------------------===//
812+
// PrintOp
813+
//===----------------------------------------------------------------------===//
814+
815+
DiagnosedSilenceableFailure
816+
transform::PrintOp::apply(transform::TransformResults &results,
817+
transform::TransformState &state) {
818+
llvm::errs() << "[[[ IR printer: ";
819+
if (getName().has_value())
820+
llvm::errs() << *getName() << " ";
821+
822+
if (!getTarget()) {
823+
llvm::errs() << "top-level ]]]\n" << *state.getTopLevel() << "\n";
824+
return DiagnosedSilenceableFailure::success();
825+
}
826+
827+
llvm::errs() << "]]]\n";
828+
ArrayRef<Operation *> targets = state.getPayloadOps(getTarget());
829+
for (Operation *target : targets)
830+
llvm::errs() << *target << "\n";
831+
832+
return DiagnosedSilenceableFailure::success();
833+
}
834+
835+
void transform::PrintOp::getEffects(
836+
SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {
837+
onlyReadsHandle(getTarget(), effects);
838+
onlyReadsPayload(effects);
839+
840+
// There is no resource for stderr file descriptor, so just declare print
841+
// writes into the default resource.
842+
effects.emplace_back(MemoryEffects::Write::get());
843+
}

mlir/test/Dialect/Transform/ops.mlir

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,16 @@ transform.sequence failures(propagate) {
6767
// CHECK: cast %{{.*}} : !transform.any_op to !transform.op<"builtin.module">
6868
%1 = cast %0: !transform.any_op to !transform.op<"builtin.module">
6969
}
70+
71+
// CHECK: transform.sequence
72+
// CHECK: print
73+
// CHECK: print
74+
// CHECK: print
75+
// CHECK: print
76+
transform.sequence failures(propagate) {
77+
^bb0(%arg0: !pdl.operation):
78+
transform.print %arg0 : !pdl.operation
79+
transform.print
80+
transform.print %arg0 {name = "test"} : !pdl.operation
81+
transform.print {name = "test"}
82+
}

0 commit comments

Comments
 (0)