From f56fa688aa17f651e0dfd2f18bbe2be3d15e7673 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Wed, 13 Aug 2025 09:49:56 -0400 Subject: [PATCH 01/15] Apply instrumentation to each pass within NamedSequenceOp --- .../Transforms/ApplyTransformSequencePass.cpp | 139 ++++++++++++++++-- 1 file changed, 129 insertions(+), 10 deletions(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index cfd1900e28..25faa8c6fc 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -21,18 +21,129 @@ #include "llvm/Support/Debug.h" +#include "mlir/Dialect/Transform/IR/TransformOps.h" #include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.h" +#include "mlir/Dialect/Transform/Transforms/TransformInterpreterUtils.h" #include "mlir/IR/BuiltinOps.h" +#include "mlir/Pass/AnalysisManager.h" #include "mlir/Pass/Pass.h" - -#include "Catalyst/IR/CatalystDialect.h" -#include "QEC/IR/QECDialect.h" +#include "mlir/Pass/PassInstrumentation.h" +#include "mlir/Pass/PassManager.h" using namespace llvm; using namespace mlir; -using namespace catalyst; namespace catalyst { + +/// Generate a meaningful name for a transform operation for pass instrumentation +static std::string getTransformOpName(mlir::transform::TransformOpInterface transformOp) +{ + std::string baseName = transformOp->getName().getStringRef().str(); + + llvm::errs() << "Transform op: " << baseName << "\n"; + + if (auto applyPassOp = + dyn_cast(transformOp.getOperation())) { + if (auto passName = applyPassOp.getPassName(); !passName.empty()) { + return "transform_" + passName.str(); + } + } + + // convert "." to "_" + std::replace(baseName.begin(), baseName.end(), '.', '_'); + return baseName +} + +/// A fake pass wrapper that represents a single transform operation. Allowing it to be tracked by +/// pass instrumentation. +class TransformOpSubPass : public OperationPass<> { + private: + mlir::transform::TransformOpInterface transformOp; + std::string opNameStr; + + public: + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TransformOpSubPass) + + TransformOpSubPass(mlir::transform::TransformOpInterface op) + : OperationPass(TypeID::get()), transformOp(op), + opNameStr(getTransformOpName(op)) + { + } + + void runOnOperation() override + { + llvm_unreachable("TransformOpSubPass should not be executed"); + } + + StringRef getName() const override { return opNameStr; } + StringRef getArgument() const override { return opNameStr; } + StringRef getDescription() const override { return "Transform dialect operation"; } + + std::unique_ptr clonePass() const override + { + return std::make_unique(transformOp); + } + + mlir::transform::TransformOpInterface getTransformOp() const { return transformOp; } +}; + +/// Apply transforms with individual subpass tracking by executing each transform operation +/// individually with instrumentation hooks. This implements a custom sequence +/// execution that mirrors the logic in NamedSequenceOp::apply but with instrumentation. +LogicalResult applyTransformsWithSubpassTracking(Operation *payload, Operation *namedSequence, + PassInstrumentor *passInstrumentor) +{ + auto namedSeqOp = dyn_cast(namedSequence); + if (!namedSeqOp || namedSeqOp.getBody().empty()) { + return success(); + } + + Block &sequenceBlock = namedSeqOp.getBody().front(); + if (sequenceBlock.without_terminator().empty()) { + return success(); + } + + mlir::transform::TransformState state = mlir::transform::detail::makeTransformStateForTesting( + namedSequence->getParentRegion(), payload); + + // Map the entry block argument to the list of operations. + // Note: this is the same implementation as PossibleTopLevelTransformOp but + // without attaching the interface / trait since that is tailored to a + // dangling top-level op that does not get "called". + auto scope = state.make_region_scope(namedSeqOp.getBody()); + if (failed(mlir::transform::detail::mapPossibleTopLevelTransformOpBlockArguments( + state, namedSequence, namedSeqOp.getBody()))) { + return failure(); + } + + for (Operation &transformOp : sequenceBlock.without_terminator()) { + if (auto transformInterface = + dyn_cast(transformOp)) { + auto subPass = std::make_unique(transformInterface); + + // hook before pass + passInstrumentor->runBeforePass(subPass.get(), payload); + + DiagnosedSilenceableFailure result = state.applyTransform(transformInterface); + + if (result.isDefiniteFailure()) { + // hook after pass failed + passInstrumentor->runAfterPassFailed(subPass.get(), payload); + return failure(); + } + + if (result.isSilenceableFailure()) { + (void)result.silence(); + } + + // hook after pass + passInstrumentor->runAfterPass(subPass.get(), payload); + } + } + + return success(); +} + #define GEN_PASS_DEF_APPLYTRANSFORMSEQUENCEPASS #include "Catalyst/Transforms/Passes.h.inc" @@ -79,12 +190,20 @@ struct ApplyTransformSequencePass } }); - // Perform the transform - if (failed(mlir::transform::applyTransforms( - payload, cast(transformer_main_sequence), {}, - mlir::transform::TransformOptions(), false))) { - return signalPassFailure(); - }; + if (auto *passInstrumentor = getAnalysisManager().getPassInstrumentor(); passInstrumentor) { + // Manually execute the transform sequence with individual subpass tracking + if (failed(applyTransformsWithSubpassTracking(payload, transformer_main_sequence, + passInstrumentor))) { + return signalPassFailure(); + } + } + else { + if (failed(mlir::transform::applyTransforms( + payload, cast(transformer_main_sequence), + {}, mlir::transform::TransformOptions(), false))) { + return signalPassFailure(); + } + } transformer.erase(); } From 70916bbeced0c93e9c3c23a606f412543f6793d8 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Wed, 13 Aug 2025 09:57:43 -0400 Subject: [PATCH 02/15] Fix missing ; --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 25faa8c6fc..d8c2b57ef9 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -51,7 +51,7 @@ static std::string getTransformOpName(mlir::transform::TransformOpInterface tran // convert "." to "_" std::replace(baseName.begin(), baseName.end(), '.', '_'); - return baseName + return baseName; } /// A fake pass wrapper that represents a single transform operation. Allowing it to be tracked by From e1741e7fb547a20c0e50c81c87346f0e4f63647f Mon Sep 17 00:00:00 2001 From: HSZheng Date: Thu, 14 Aug 2025 16:24:06 -0400 Subject: [PATCH 03/15] Update mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp Co-authored-by: Paul <79805239+paul0403@users.noreply.github.com> --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index d8c2b57ef9..f272c7d815 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -20,7 +20,6 @@ #include #include "llvm/Support/Debug.h" - #include "mlir/Dialect/Transform/IR/TransformOps.h" #include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.h" #include "mlir/Dialect/Transform/Transforms/TransformInterpreterUtils.h" From f4ee67e2693bf632177b1f57c821e09599d3905c Mon Sep 17 00:00:00 2001 From: HSZheng Date: Thu, 14 Aug 2025 16:24:27 -0400 Subject: [PATCH 04/15] Update mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp Co-authored-by: Paul <79805239+paul0403@users.noreply.github.com> --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index f272c7d815..20347060ce 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -39,7 +39,6 @@ static std::string getTransformOpName(mlir::transform::TransformOpInterface tran { std::string baseName = transformOp->getName().getStringRef().str(); - llvm::errs() << "Transform op: " << baseName << "\n"; if (auto applyPassOp = dyn_cast(transformOp.getOperation())) { From 53a23e4380e0c901544a2699462ed699285d85b2 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 16:27:30 -0400 Subject: [PATCH 05/15] Remove unncessary include --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 20347060ce..08bac6f2d8 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -19,7 +19,6 @@ #include -#include "llvm/Support/Debug.h" #include "mlir/Dialect/Transform/IR/TransformOps.h" #include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.h" #include "mlir/Dialect/Transform/Transforms/TransformInterpreterUtils.h" From a6f5aa525ecd0035f38df9e21ade46b660253c97 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 16:35:09 -0400 Subject: [PATCH 06/15] Formatting --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 08bac6f2d8..7d88af82ac 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -38,7 +38,6 @@ static std::string getTransformOpName(mlir::transform::TransformOpInterface tran { std::string baseName = transformOp->getName().getStringRef().str(); - if (auto applyPassOp = dyn_cast(transformOp.getOperation())) { if (auto passName = applyPassOp.getPassName(); !passName.empty()) { From 8141c9b40960774fef104624d78e1efa55fe6e92 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 17:20:23 -0400 Subject: [PATCH 07/15] Update changelog --- doc/releases/changelog-dev.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/releases/changelog-dev.md b/doc/releases/changelog-dev.md index 99576e938f..a5f3290e37 100644 --- a/doc/releases/changelog-dev.md +++ b/doc/releases/changelog-dev.md @@ -4,6 +4,14 @@

Improvements 🛠

+* Allow to apply instrumentation to each pass within NamedSequenceOp. + [(#1978)](https://github.com/PennyLaneAI/catalyst/pull/1978) + For example: + ``` + quantum-opt ... --apply-transform-sequence --mlir-print-ir-after-all + ``` + should also dump the IR result for each subpass within NamedSequeceOp + * Added `detensorizefunctionboundary` pass to remove scalar tensors across function boundaries and enabled `symbol-dce` pass to remove dead functions, reducing the number of instructions for compilation. [(#1904)](https://github.com/PennyLaneAI/catalyst/pull/1904) From d54d67b380122675cc2d9ce8d06e01487272d931 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 17:21:05 -0400 Subject: [PATCH 08/15] Add ref link to NamedSequenceOp::apply --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 7d88af82ac..4406e36ad7 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -86,6 +86,8 @@ class TransformOpSubPass : public OperationPass<> { /// Apply transforms with individual subpass tracking by executing each transform operation /// individually with instrumentation hooks. This implements a custom sequence /// execution that mirrors the logic in NamedSequenceOp::apply but with instrumentation. +/// ref: transform::NamedSequenceOp::apply in +/// /path/to/mlir/llvm-project/mlir/lib/Dialect/Transform/IR/TransformOps.cpp LogicalResult applyTransformsWithSubpassTracking(Operation *payload, Operation *namedSequence, PassInstrumentor *passInstrumentor) { From 41a78d674b923b61bf18de42ae9d14b37c7f243e Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 17:23:18 -0400 Subject: [PATCH 09/15] Add test --- ...yTransformSequenceInstrumentationTest.mlir | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 mlir/test/Catalyst/ApplyTransformSequenceInstrumentationTest.mlir diff --git a/mlir/test/Catalyst/ApplyTransformSequenceInstrumentationTest.mlir b/mlir/test/Catalyst/ApplyTransformSequenceInstrumentationTest.mlir new file mode 100644 index 0000000000..c6fdedf05a --- /dev/null +++ b/mlir/test/Catalyst/ApplyTransformSequenceInstrumentationTest.mlir @@ -0,0 +1,42 @@ +// Copyright 2025 Xanadu Quantum Technologies Inc. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// RUN: quantum-opt %s --apply-transform-sequence --mlir-print-ir-after-all --split-input-file --verify-diagnostics 2>&1 | FileCheck %s --check-prefix=CHECK-INSTRUMENTATION + +// Instrumentation should show individual transform operations as subpasses +// CHECK-INSTRUMENTATION: transform_cse +// CHECK-INSTRUMENTATION: transform_remove-chained-self-inverse +// CHECK-INSTRUMENTATION: ApplyTransformSequencePass + +module @workflow { + + module attributes {transform.with_named_sequence} { + transform.named_sequence @__transform_main(%arg0: !transform.op<"builtin.module">) { + %0 = transform.apply_registered_pass "cse" to %arg0 : (!transform.op<"builtin.module">) -> !transform.op<"builtin.module"> + %1 = transform.apply_registered_pass "remove-chained-self-inverse" to %0 : (!transform.op<"builtin.module">) -> !transform.op<"builtin.module"> + transform.yield + } + } + + func.func private @f(%arg0: tensor) -> !quantum.bit { + %c_0 = stablehlo.constant dense<0> : tensor + %extracted = tensor.extract %c_0[] : tensor + %0 = quantum.alloc( 1) : !quantum.reg + %1 = quantum.extract %0[%extracted] : !quantum.reg -> !quantum.bit + %out_qubits = quantum.custom "Hadamard"() %1 : !quantum.bit + %out_qubits_1 = quantum.custom "Hadamard"() %out_qubits : !quantum.bit + return %out_qubits_1 : !quantum.bit + } + +} From fdc37e14e7700f8b0c2ece80713fdb8cc90baefc Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 17:31:43 -0400 Subject: [PATCH 10/15] Add assertion --- .../Transforms/ApplyTransformSequencePass.cpp | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 4406e36ad7..685b945380 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -88,15 +88,14 @@ class TransformOpSubPass : public OperationPass<> { /// execution that mirrors the logic in NamedSequenceOp::apply but with instrumentation. /// ref: transform::NamedSequenceOp::apply in /// /path/to/mlir/llvm-project/mlir/lib/Dialect/Transform/IR/TransformOps.cpp -LogicalResult applyTransformsWithSubpassTracking(Operation *payload, Operation *namedSequence, +LogicalResult applyTransformsWithSubpassTracking(Operation *payload, + mlir::transform::NamedSequenceOp namedSequence, PassInstrumentor *passInstrumentor) { - auto namedSeqOp = dyn_cast(namedSequence); - if (!namedSeqOp || namedSeqOp.getBody().empty()) { - return success(); - } + assert(namedSequence.getBody().hasOneBlock() && + "Expected exactly one transform op in the sequence block"); - Block &sequenceBlock = namedSeqOp.getBody().front(); + Block &sequenceBlock = namedSequence.getBody().front(); if (sequenceBlock.without_terminator().empty()) { return success(); } @@ -108,9 +107,9 @@ LogicalResult applyTransformsWithSubpassTracking(Operation *payload, Operation * // Note: this is the same implementation as PossibleTopLevelTransformOp but // without attaching the interface / trait since that is tailored to a // dangling top-level op that does not get "called". - auto scope = state.make_region_scope(namedSeqOp.getBody()); + auto scope = state.make_region_scope(namedSequence.getBody()); if (failed(mlir::transform::detail::mapPossibleTopLevelTransformOpBlockArguments( - state, namedSequence, namedSeqOp.getBody()))) { + state, namedSequence, namedSequence.getBody()))) { return failure(); } @@ -190,9 +189,12 @@ struct ApplyTransformSequencePass if (auto *passInstrumentor = getAnalysisManager().getPassInstrumentor(); passInstrumentor) { // Manually execute the transform sequence with individual subpass tracking - if (failed(applyTransformsWithSubpassTracking(payload, transformer_main_sequence, - passInstrumentor))) { - return signalPassFailure(); + if (auto namedSequence = + dyn_cast(transformer_main_sequence)) { + if (failed(applyTransformsWithSubpassTracking(payload, namedSequence, + passInstrumentor))) { + return signalPassFailure(); + } } } else { From 5a2958cbc8f7895b7399726e4fd1927ac97beb1d Mon Sep 17 00:00:00 2001 From: HSZheng Date: Thu, 14 Aug 2025 17:34:16 -0400 Subject: [PATCH 11/15] Update mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp Co-authored-by: Paul <79805239+paul0403@users.noreply.github.com> --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 685b945380..6ef1f9d29d 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -187,7 +187,7 @@ struct ApplyTransformSequencePass } }); - if (auto *passInstrumentor = getAnalysisManager().getPassInstrumentor(); passInstrumentor) { + if (PassInstrumentor *passInstrumentor = getAnalysisManager().getPassInstrumentor()) { // Manually execute the transform sequence with individual subpass tracking if (auto namedSequence = dyn_cast(transformer_main_sequence)) { From 0f0e7128f04a0f56ef899a733dcb42dddd03c26e Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Thu, 14 Aug 2025 22:08:14 -0400 Subject: [PATCH 12/15] Add comment --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 6ef1f9d29d..d017e7bbca 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -92,6 +92,8 @@ LogicalResult applyTransformsWithSubpassTracking(Operation *payload, mlir::transform::NamedSequenceOp namedSequence, PassInstrumentor *passInstrumentor) { + // TODO: We currently only expect to have a single block in the sequence. It may change in the + // future. assert(namedSequence.getBody().hasOneBlock() && "Expected exactly one transform op in the sequence block"); From 5f13e4b2dce5fe22c6d02f56aa181756d72c68e2 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Fri, 15 Aug 2025 16:44:14 -0400 Subject: [PATCH 13/15] Update reference link of the upstream code --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index d017e7bbca..5f48cca99f 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -86,8 +86,8 @@ class TransformOpSubPass : public OperationPass<> { /// Apply transforms with individual subpass tracking by executing each transform operation /// individually with instrumentation hooks. This implements a custom sequence /// execution that mirrors the logic in NamedSequenceOp::apply but with instrumentation. -/// ref: transform::NamedSequenceOp::apply in -/// /path/to/mlir/llvm-project/mlir/lib/Dialect/Transform/IR/TransformOps.cpp +/// reference to transform::NamedSequenceOp::apply in +/// https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/Transform/IR/TransformOps.cpp LogicalResult applyTransformsWithSubpassTracking(Operation *payload, mlir::transform::NamedSequenceOp namedSequence, PassInstrumentor *passInstrumentor) From 2d734ca1abc7321c059cde465b5ed05c9eb9dc30 Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Fri, 15 Aug 2025 16:45:57 -0400 Subject: [PATCH 14/15] Update to permalink --- mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index 5f48cca99f..d106c90482 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -86,8 +86,9 @@ class TransformOpSubPass : public OperationPass<> { /// Apply transforms with individual subpass tracking by executing each transform operation /// individually with instrumentation hooks. This implements a custom sequence /// execution that mirrors the logic in NamedSequenceOp::apply but with instrumentation. -/// reference to transform::NamedSequenceOp::apply in -/// https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/Transform/IR/TransformOps.cpp +/// Reference to transform::NamedSequenceOp::apply in +/// https://github.com/llvm/llvm-project/blob/334e9bf2dd01fbbfe785624c0de477b725cde6f2/mlir/lib/ +/// Dialect/Transform/IR/TransformOps.cpp#L2378 LogicalResult applyTransformsWithSubpassTracking(Operation *payload, mlir::transform::NamedSequenceOp namedSequence, PassInstrumentor *passInstrumentor) From 103656624ff31929309db57b47e8bf56e388047e Mon Sep 17 00:00:00 2001 From: Hong-Sheng Zheng Date: Fri, 15 Aug 2025 16:48:23 -0400 Subject: [PATCH 15/15] Remove mlir:: prefix --- .../Transforms/ApplyTransformSequencePass.cpp | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp index d106c90482..e3dd1ce472 100644 --- a/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp +++ b/mlir/lib/Catalyst/Transforms/ApplyTransformSequencePass.cpp @@ -34,12 +34,11 @@ using namespace mlir; namespace catalyst { /// Generate a meaningful name for a transform operation for pass instrumentation -static std::string getTransformOpName(mlir::transform::TransformOpInterface transformOp) +static std::string getTransformOpName(transform::TransformOpInterface transformOp) { std::string baseName = transformOp->getName().getStringRef().str(); - if (auto applyPassOp = - dyn_cast(transformOp.getOperation())) { + if (auto applyPassOp = dyn_cast(transformOp.getOperation())) { if (auto passName = applyPassOp.getPassName(); !passName.empty()) { return "transform_" + passName.str(); } @@ -54,13 +53,13 @@ static std::string getTransformOpName(mlir::transform::TransformOpInterface tran /// pass instrumentation. class TransformOpSubPass : public OperationPass<> { private: - mlir::transform::TransformOpInterface transformOp; + transform::TransformOpInterface transformOp; std::string opNameStr; public: MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TransformOpSubPass) - TransformOpSubPass(mlir::transform::TransformOpInterface op) + TransformOpSubPass(transform::TransformOpInterface op) : OperationPass(TypeID::get()), transformOp(op), opNameStr(getTransformOpName(op)) { @@ -80,7 +79,7 @@ class TransformOpSubPass : public OperationPass<> { return std::make_unique(transformOp); } - mlir::transform::TransformOpInterface getTransformOp() const { return transformOp; } + transform::TransformOpInterface getTransformOp() const { return transformOp; } }; /// Apply transforms with individual subpass tracking by executing each transform operation @@ -90,7 +89,7 @@ class TransformOpSubPass : public OperationPass<> { /// https://github.com/llvm/llvm-project/blob/334e9bf2dd01fbbfe785624c0de477b725cde6f2/mlir/lib/ /// Dialect/Transform/IR/TransformOps.cpp#L2378 LogicalResult applyTransformsWithSubpassTracking(Operation *payload, - mlir::transform::NamedSequenceOp namedSequence, + transform::NamedSequenceOp namedSequence, PassInstrumentor *passInstrumentor) { // TODO: We currently only expect to have a single block in the sequence. It may change in the @@ -103,22 +102,21 @@ LogicalResult applyTransformsWithSubpassTracking(Operation *payload, return success(); } - mlir::transform::TransformState state = mlir::transform::detail::makeTransformStateForTesting( - namedSequence->getParentRegion(), payload); + transform::TransformState state = + transform::detail::makeTransformStateForTesting(namedSequence->getParentRegion(), payload); // Map the entry block argument to the list of operations. // Note: this is the same implementation as PossibleTopLevelTransformOp but // without attaching the interface / trait since that is tailored to a // dangling top-level op that does not get "called". auto scope = state.make_region_scope(namedSequence.getBody()); - if (failed(mlir::transform::detail::mapPossibleTopLevelTransformOpBlockArguments( + if (failed(transform::detail::mapPossibleTopLevelTransformOpBlockArguments( state, namedSequence, namedSequence.getBody()))) { return failure(); } for (Operation &transformOp : sequenceBlock.without_terminator()) { - if (auto transformInterface = - dyn_cast(transformOp)) { + if (auto transformInterface = dyn_cast(transformOp)) { auto subPass = std::make_unique(transformInterface); // hook before pass @@ -193,7 +191,7 @@ struct ApplyTransformSequencePass if (PassInstrumentor *passInstrumentor = getAnalysisManager().getPassInstrumentor()) { // Manually execute the transform sequence with individual subpass tracking if (auto namedSequence = - dyn_cast(transformer_main_sequence)) { + dyn_cast(transformer_main_sequence)) { if (failed(applyTransformsWithSubpassTracking(payload, namedSequence, passInstrumentor))) { return signalPassFailure(); @@ -201,9 +199,9 @@ struct ApplyTransformSequencePass } } else { - if (failed(mlir::transform::applyTransforms( - payload, cast(transformer_main_sequence), - {}, mlir::transform::TransformOptions(), false))) { + if (failed(transform::applyTransforms( + payload, cast(transformer_main_sequence), {}, + transform::TransformOptions(), false))) { return signalPassFailure(); } }