From 59e007a81f658887fe6d268efcaae3ef97d7dbcc Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Wed, 21 Jan 2026 13:09:56 +0100 Subject: [PATCH 1/9] :sparkles: Implement getInputQubits()/getOutputQubits() --- mlir/include/mlir/Dialect/QCO/IR/QCODialect.h | 10 ++++++++++ .../include/mlir/Dialect/QCO/IR/QCOInterfaces.td | 10 ++++++++++ mlir/include/mlir/Dialect/QCO/IR/QCOOps.td | 4 ++++ mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 16 ++++++++++++++++ .../IR/Operations/StandardGates/BarrierOp.cpp | 4 ++++ 5 files changed, 44 insertions(+) diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h index 67fd0c12a2..73f1cf5938 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h +++ b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h @@ -80,6 +80,11 @@ template class TargetAndParameterArityTrait { } return this->getOperation()->getOperand(i); } + ValueRange getInputQubits() { + auto&& operands = this->getOperation()->getOperands(); + assert(T < operands.size()); + return operands.take_front(T); + } Value getOutputQubit(size_t i) { if constexpr (T == 0) { llvm::reportFatalUsageError("Operation does not have qubits"); @@ -89,6 +94,11 @@ template class TargetAndParameterArityTrait { } return this->getOperation()->getResult(i); } + ValueRange getOutputQubits() { + auto&& results = this->getOperation()->getResults(); + assert(T == results.size()); + return ValueRange{results}; + } Value getInputTarget(const size_t i) { return getInputQubit(i); } Value getOutputTarget(const size_t i) { return getOutputQubit(i); } diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td index b7e08461fb..c98add205b 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td @@ -102,10 +102,18 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { "Returns the i-th input qubit (targets + controls combined).", "Value", "getInputQubit", (ins "size_t":$i) >, + InterfaceMethod< + "Returns a range of all input qubits (targets + controls combined).", + "ValueRange", "getInputQubits", (ins) + >, InterfaceMethod< "Returns the i-th output qubit (targets + controls combined).", "Value", "getOutputQubit", (ins "size_t":$i) >, + InterfaceMethod< + "Returns a range of all output qubits (targets + controls combined).", + "ValueRange", "getOutputQubits", (ins) + >, InterfaceMethod< "Returns the i-th target input qubit.", "Value", "getInputTarget", (ins "size_t":$i) @@ -163,6 +171,8 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { "Returns the base symbol/mnemonic of the operation.", "StringRef", "getBaseSymbol", (ins) >, + + // Unitary matrix helpers InterfaceMethod< "Populates the given 1x1 unitary matrix if possible.", "bool", "getUnitaryMatrix1x1", diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td index 1ccf16320c..12807075b4 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td @@ -1023,7 +1023,9 @@ def BarrierOp : QCOOp<"barrier", traits = [UnitaryOpInterface]> { size_t getNumTargets(); static size_t getNumControls(); Value getInputQubit(size_t i); + ValueRange getInputQubits(); Value getOutputQubit(size_t i); + ValueRange getOutputQubits(); Value getInputTarget(size_t i); Value getOutputTarget(size_t i); static Value getInputControl(size_t i); @@ -1113,7 +1115,9 @@ def CtrlOp : QCOOp<"ctrl", traits = size_t getNumTargets(); size_t getNumControls(); Value getInputQubit(size_t i); + ValueRange getInputQubits(); Value getOutputQubit(size_t i); + ValueRange getOutputQubits(); Value getInputTarget(size_t i); Value getOutputTarget(size_t i); Value getInputControl(size_t i); diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index caa07a6e7c..856697e3ac 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -165,6 +165,14 @@ Value CtrlOp::getInputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } +ValueRange CtrlOp::getInputQubits() { + // TODO: needs to materialize into internal storage; I wasn't able to find a + // way to convert concat_range -> ValueRange; however: operations cannot + // define new data members + return llvm::concat(getBodyUnitary().getInputQubits(), + ValueRange{getControlsIn()}); +} + Value CtrlOp::getOutputQubit(const size_t i) { const auto numControls = getNumControls(); if (i < numControls) { @@ -176,6 +184,14 @@ Value CtrlOp::getOutputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } +ValueRange CtrlOp::getOutputQubits() { + // TODO: needs to materialize into internal storage; I wasn't able to find a + // way to convert concat_range -> ValueRange; however: operations cannot + // define new data members + return llvm::concat(getBodyUnitary().getOutputQubits(), + ValueRange{getControlsOut()}); +} + Value CtrlOp::getInputTarget(const size_t i) { if (i >= getNumTargets()) { llvm::reportFatalUsageError("Target index out of bounds"); diff --git a/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp b/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp index 16da64cbe1..d9bc5b6d87 100644 --- a/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp @@ -84,8 +84,12 @@ size_t BarrierOp::getNumControls() { return 0; } Value BarrierOp::getInputQubit(const size_t i) { return getInputTarget(i); } +ValueRange BarrierOp::getInputQubits() { return getQubitsIn(); } + Value BarrierOp::getOutputQubit(const size_t i) { return getOutputTarget(i); } +ValueRange BarrierOp::getOutputQubits() { return getQubitsOut(); } + Value BarrierOp::getInputTarget(const size_t i) { if (i < getNumTargets()) { return getQubitsIn()[i]; From 46101037bdd87dfbb66580de17bb03aa8b091e5e Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 22 Jan 2026 19:19:26 +0100 Subject: [PATCH 2/9] use concat range as return type for interface --- .../mlir/Dialect/QCO/IR/QCOInterfaces.td | 20 +++++++++++++++++-- mlir/include/mlir/Dialect/QCO/IR/QCOOps.td | 4 ++-- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 8 ++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td index c98add205b..6b45b79dc3 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td @@ -104,7 +104,15 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { >, InterfaceMethod< "Returns a range of all input qubits (targets + controls combined).", - "ValueRange", "getInputQubits", (ins) + "std::invoke_result_t), ValueRange, ValueRange>", + "getInputQubits", (ins), + [{ + if constexpr (std::is_same_v) { + return llvm::concat($_op.getInputQubits(), ValueRange{}); + } else { + return $_op.getInputQubits(); + } + }] >, InterfaceMethod< "Returns the i-th output qubit (targets + controls combined).", @@ -112,7 +120,15 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { >, InterfaceMethod< "Returns a range of all output qubits (targets + controls combined).", - "ValueRange", "getOutputQubits", (ins) + "std::invoke_result_t), ValueRange, ValueRange>", + "getOutputQubits", (ins), + [{ + if constexpr (std::is_same_v) { + return llvm::concat($_op.getOutputQubits(), ValueRange{}); + } else { + return $_op.getOutputQubits(); + } + }] >, InterfaceMethod< "Returns the i-th target input qubit.", diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td index 12807075b4..0433e6a97b 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td @@ -1115,9 +1115,9 @@ def CtrlOp : QCOOp<"ctrl", traits = size_t getNumTargets(); size_t getNumControls(); Value getInputQubit(size_t i); - ValueRange getInputQubits(); + [[nodiscard]] std::invoke_result_t), ValueRange, ValueRange> getInputQubits(); Value getOutputQubit(size_t i); - ValueRange getOutputQubits(); + [[nodiscard]] std::invoke_result_t), ValueRange, ValueRange> getOutputQubits(); Value getInputTarget(size_t i); Value getOutputTarget(size_t i); Value getInputControl(size_t i); diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index 856697e3ac..406315f158 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -165,7 +165,9 @@ Value CtrlOp::getInputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } -ValueRange CtrlOp::getInputQubits() { +std::invoke_result_t), + ValueRange, ValueRange> +CtrlOp::getInputQubits() { // TODO: needs to materialize into internal storage; I wasn't able to find a // way to convert concat_range -> ValueRange; however: operations cannot // define new data members @@ -184,7 +186,9 @@ Value CtrlOp::getOutputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } -ValueRange CtrlOp::getOutputQubits() { +std::invoke_result_t), + ValueRange, ValueRange> +CtrlOp::getOutputQubits() { // TODO: needs to materialize into internal storage; I wasn't able to find a // way to convert concat_range -> ValueRange; however: operations cannot // define new data members From c18d1d6d863993dfa387bfd6338c34357ce50e95 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 22 Jan 2026 19:19:45 +0100 Subject: [PATCH 3/9] fix qubit getters --- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index 406315f158..ea56361a25 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -160,7 +160,7 @@ Value CtrlOp::getInputQubit(const size_t i) { return getControlsIn()[i]; } if (numControls <= i && i < getNumQubits()) { - return getBodyUnitary().getInputQubit(i - numControls); + return getTargetsIn()[i - numControls]; } llvm::reportFatalUsageError("Invalid qubit index"); } @@ -171,7 +171,7 @@ CtrlOp::getInputQubits() { // TODO: needs to materialize into internal storage; I wasn't able to find a // way to convert concat_range -> ValueRange; however: operations cannot // define new data members - return llvm::concat(getBodyUnitary().getInputQubits(), + return llvm::concat(ValueRange{getTargetsIn()}, ValueRange{getControlsIn()}); } @@ -181,7 +181,7 @@ Value CtrlOp::getOutputQubit(const size_t i) { return getControlsOut()[i]; } if (numControls <= i && i < getNumQubits()) { - return getBodyUnitary().getOutputQubit(i - numControls); + return getTargetsOut()[i - numControls]; } llvm::reportFatalUsageError("Invalid qubit index"); } @@ -192,7 +192,7 @@ CtrlOp::getOutputQubits() { // TODO: needs to materialize into internal storage; I wasn't able to find a // way to convert concat_range -> ValueRange; however: operations cannot // define new data members - return llvm::concat(getBodyUnitary().getOutputQubits(), + return llvm::concat(ValueRange{getTargetsOut()}, ValueRange{getControlsOut()}); } From e75d87e606e7165e29a6d8551161793d2202a764 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Sat, 24 Jan 2026 18:35:38 +0100 Subject: [PATCH 4/9] fix include cleaner issue --- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index ea56361a25..c491f32f07 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -27,6 +27,7 @@ #include #include #include +#include using namespace mlir; using namespace mlir::qco; From b32b54a8349ab95fc7d4fd70fa0bd3ae9498c89c Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Sat, 24 Jan 2026 18:55:56 +0100 Subject: [PATCH 5/9] fix coderabbit issues --- mlir/include/mlir/Dialect/QCO/IR/QCODialect.h | 2 +- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h index 73f1cf5938..47a59e9c7b 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h +++ b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h @@ -82,7 +82,7 @@ template class TargetAndParameterArityTrait { } ValueRange getInputQubits() { auto&& operands = this->getOperation()->getOperands(); - assert(T < operands.size()); + assert(T <= operands.size()); return operands.take_front(T); } Value getOutputQubit(size_t i) { diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index c491f32f07..e5378e301e 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -169,11 +169,8 @@ Value CtrlOp::getInputQubit(const size_t i) { std::invoke_result_t), ValueRange, ValueRange> CtrlOp::getInputQubits() { - // TODO: needs to materialize into internal storage; I wasn't able to find a - // way to convert concat_range -> ValueRange; however: operations cannot - // define new data members - return llvm::concat(ValueRange{getTargetsIn()}, - ValueRange{getControlsIn()}); + return llvm::concat(ValueRange{getControlsIn()}, + ValueRange{getTargetsIn()}); } Value CtrlOp::getOutputQubit(const size_t i) { @@ -190,11 +187,8 @@ Value CtrlOp::getOutputQubit(const size_t i) { std::invoke_result_t), ValueRange, ValueRange> CtrlOp::getOutputQubits() { - // TODO: needs to materialize into internal storage; I wasn't able to find a - // way to convert concat_range -> ValueRange; however: operations cannot - // define new data members - return llvm::concat(ValueRange{getTargetsOut()}, - ValueRange{getControlsOut()}); + return llvm::concat(ValueRange{getControlsOut()}, + ValueRange{getTargetsOut()}); } Value CtrlOp::getInputTarget(const size_t i) { From 8baf49c44b843e013c181ed0eb1d0e5ea413669f Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Tue, 27 Jan 2026 23:01:57 +0100 Subject: [PATCH 6/9] :recycle: Add assert to CtrlOp::getBodyUnitary() This change will hopefully shorten debug times for optimization patterns that introduce new gates. Especially when inserting gates with constant parameters, caution is advised when working with circuits containing controlled gates because the pattern will also be applied to the operation inside the control body - potentially leading to undesired operations in the control body. This assertion should make this easier to spot and debug. --- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index e5378e301e..713008f259 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -146,7 +146,9 @@ struct CtrlInlineId final : OpRewritePattern { } // namespace UnitaryOpInterface CtrlOp::getBodyUnitary() { - return llvm::dyn_cast(&getBody()->front()); + auto bodyUnitary = llvm::dyn_cast(&getBody()->front()); + assert(bodyUnitary); + return bodyUnitary; } size_t CtrlOp::getNumQubits() { return getNumTargets() + getNumControls(); } From 1330259e82e7ef5e2f640e16141fd16304f8a13f Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 2 Feb 2026 16:25:58 +0100 Subject: [PATCH 7/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Considerably=20simplif?= =?UTF-8?q?y=20implementation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- mlir/include/mlir/Dialect/QCO/IR/QCODialect.h | 12 +++------- .../mlir/Dialect/QCO/IR/QCOInterfaces.td | 22 ++++--------------- mlir/include/mlir/Dialect/QCO/IR/QCOOps.td | 8 +++---- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 18 +++------------ .../IR/Operations/StandardGates/BarrierOp.cpp | 4 ++-- 5 files changed, 16 insertions(+), 48 deletions(-) diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h index 47a59e9c7b..a713c669b7 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h +++ b/mlir/include/mlir/Dialect/QCO/IR/QCODialect.h @@ -80,10 +80,8 @@ template class TargetAndParameterArityTrait { } return this->getOperation()->getOperand(i); } - ValueRange getInputQubits() { - auto&& operands = this->getOperation()->getOperands(); - assert(T <= operands.size()); - return operands.take_front(T); + OperandRange getInputQubits() { + return this->getOperation()->getOperands().slice(0, T); } Value getOutputQubit(size_t i) { if constexpr (T == 0) { @@ -94,11 +92,7 @@ template class TargetAndParameterArityTrait { } return this->getOperation()->getResult(i); } - ValueRange getOutputQubits() { - auto&& results = this->getOperation()->getResults(); - assert(T == results.size()); - return ValueRange{results}; - } + ResultRange getOutputQubits() { return this->getOperation()->getResults(); } Value getInputTarget(const size_t i) { return getInputQubit(i); } Value getOutputTarget(const size_t i) { return getOutputQubit(i); } diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td index 6b45b79dc3..8bf0025f96 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOInterfaces.td @@ -104,15 +104,8 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { >, InterfaceMethod< "Returns a range of all input qubits (targets + controls combined).", - "std::invoke_result_t), ValueRange, ValueRange>", - "getInputQubits", (ins), - [{ - if constexpr (std::is_same_v) { - return llvm::concat($_op.getInputQubits(), ValueRange{}); - } else { - return $_op.getInputQubits(); - } - }] + "OperandRange", + "getInputQubits", (ins) >, InterfaceMethod< "Returns the i-th output qubit (targets + controls combined).", @@ -120,15 +113,8 @@ def UnitaryOpInterface : OpInterface<"UnitaryOpInterface"> { >, InterfaceMethod< "Returns a range of all output qubits (targets + controls combined).", - "std::invoke_result_t), ValueRange, ValueRange>", - "getOutputQubits", (ins), - [{ - if constexpr (std::is_same_v) { - return llvm::concat($_op.getOutputQubits(), ValueRange{}); - } else { - return $_op.getOutputQubits(); - } - }] + "ResultRange", + "getOutputQubits", (ins) >, InterfaceMethod< "Returns the i-th target input qubit.", diff --git a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td index 0433e6a97b..f5241f3800 100644 --- a/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td +++ b/mlir/include/mlir/Dialect/QCO/IR/QCOOps.td @@ -1023,9 +1023,9 @@ def BarrierOp : QCOOp<"barrier", traits = [UnitaryOpInterface]> { size_t getNumTargets(); static size_t getNumControls(); Value getInputQubit(size_t i); - ValueRange getInputQubits(); + OperandRange getInputQubits(); Value getOutputQubit(size_t i); - ValueRange getOutputQubits(); + ResultRange getOutputQubits(); Value getInputTarget(size_t i); Value getOutputTarget(size_t i); static Value getInputControl(size_t i); @@ -1115,9 +1115,9 @@ def CtrlOp : QCOOp<"ctrl", traits = size_t getNumTargets(); size_t getNumControls(); Value getInputQubit(size_t i); - [[nodiscard]] std::invoke_result_t), ValueRange, ValueRange> getInputQubits(); + OperandRange getInputQubits(); Value getOutputQubit(size_t i); - [[nodiscard]] std::invoke_result_t), ValueRange, ValueRange> getOutputQubits(); + ResultRange getOutputQubits(); Value getInputTarget(size_t i); Value getOutputTarget(size_t i); Value getInputControl(size_t i); diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index 713008f259..2987d9878c 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -146,9 +146,7 @@ struct CtrlInlineId final : OpRewritePattern { } // namespace UnitaryOpInterface CtrlOp::getBodyUnitary() { - auto bodyUnitary = llvm::dyn_cast(&getBody()->front()); - assert(bodyUnitary); - return bodyUnitary; + return llvm::dyn_cast(&getBody()->front()); } size_t CtrlOp::getNumQubits() { return getNumTargets() + getNumControls(); } @@ -168,12 +166,7 @@ Value CtrlOp::getInputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } -std::invoke_result_t), - ValueRange, ValueRange> -CtrlOp::getInputQubits() { - return llvm::concat(ValueRange{getControlsIn()}, - ValueRange{getTargetsIn()}); -} +OperandRange CtrlOp::getInputQubits() { return this->getOperands(); } Value CtrlOp::getOutputQubit(const size_t i) { const auto numControls = getNumControls(); @@ -186,12 +179,7 @@ Value CtrlOp::getOutputQubit(const size_t i) { llvm::reportFatalUsageError("Invalid qubit index"); } -std::invoke_result_t), - ValueRange, ValueRange> -CtrlOp::getOutputQubits() { - return llvm::concat(ValueRange{getControlsOut()}, - ValueRange{getTargetsOut()}); -} +ResultRange CtrlOp::getOutputQubits() { return this->getResults(); } Value CtrlOp::getInputTarget(const size_t i) { if (i >= getNumTargets()) { diff --git a/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp b/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp index d9bc5b6d87..0d0f90e078 100644 --- a/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Operations/StandardGates/BarrierOp.cpp @@ -84,11 +84,11 @@ size_t BarrierOp::getNumControls() { return 0; } Value BarrierOp::getInputQubit(const size_t i) { return getInputTarget(i); } -ValueRange BarrierOp::getInputQubits() { return getQubitsIn(); } +OperandRange BarrierOp::getInputQubits() { return getQubitsIn(); } Value BarrierOp::getOutputQubit(const size_t i) { return getOutputTarget(i); } -ValueRange BarrierOp::getOutputQubits() { return getQubitsOut(); } +ResultRange BarrierOp::getOutputQubits() { return getQubitsOut(); } Value BarrierOp::getInputTarget(const size_t i) { if (i < getNumTargets()) { From 848eabf4fa2aada02bc9821da7ada3d6e685e87f Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Mon, 2 Feb 2026 16:44:51 +0100 Subject: [PATCH 8/9] :coffin: Fix include-cleaner issues --- mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp index 2987d9878c..4028fc9efe 100644 --- a/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp +++ b/mlir/lib/Dialect/QCO/IR/Modifiers/CtrlOp.cpp @@ -27,7 +27,6 @@ #include #include #include -#include using namespace mlir; using namespace mlir::qco; From 7565ba1437cc7526f13d2ef1fdc1a5ef660bd0a6 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Mon, 2 Feb 2026 17:08:23 +0100 Subject: [PATCH 9/9] :memo: Add PR to CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca4b9033a2..3683596181 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ This project adheres to [Semantic Versioning], with the exception that minor rel ### Added -- ✨ Add initial infrastructure for new QC and QCO MLIR dialects ([#1264], [#1402], [#1428], [#1430], [#1436], [#1443], [#1446], [#1464], [#1465], [#1470], [#1471], [#1472], [#1475]) ([**@burgholzer**], [**@denialhaag**], [**@taminob**], [**@DRovara**], [**@li-mingbao**]) +- ✨ Add initial infrastructure for new QC and QCO MLIR dialects ([#1264], [#1402], [#1428], [#1430], [#1436], [#1443], [#1446], [#1464], [#1465], [#1470], [#1471], [#1472], [#1474], [#1475]) ([**@burgholzer**], [**@denialhaag**], [**@taminob**], [**@DRovara**], [**@li-mingbao**]) ### Changed @@ -327,6 +327,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool [#1481]: https://github.com/munich-quantum-toolkit/core/pull/1481 [#1475]: https://github.com/munich-quantum-toolkit/core/pull/1475 +[#1474]: https://github.com/munich-quantum-toolkit/core/pull/1474 [#1472]: https://github.com/munich-quantum-toolkit/core/pull/1472 [#1471]: https://github.com/munich-quantum-toolkit/core/pull/1471 [#1470]: https://github.com/munich-quantum-toolkit/core/pull/1470