Skip to content

✨ Add QC to QIR Adaptive Profile Conversion#1710

Merged
burgholzer merged 42 commits into
munich-quantum-toolkit:mainfrom
li-mingbao:qir-adaptive-profile
Jun 12, 2026
Merged

✨ Add QC to QIR Adaptive Profile Conversion#1710
burgholzer merged 42 commits into
munich-quantum-toolkit:mainfrom
li-mingbao:qir-adaptive-profile

Conversation

@li-mingbao

Copy link
Copy Markdown
Contributor

Description

This PR adds the conversion of QC to the Adaptive Profile of QIR including the conversion of scf operations.
The original conversion from QC to QIR is split up into two different conversion passes, separating the Base and the Adaptive Profile.
The Base QIR conversion now only supports operation that are available in the Base Profile. Any dynamic alllocation operations are converted into equivalent static qubit and result pointers during the conversion.
The QIRProgramBuilder is also updated to handle the Base and the Adaptive Profile.

Checklist

  • The pull request only contains commits that are focused and relevant to this change.
  • I have added appropriate tests that cover the new/changed functionality.
  • I have updated the documentation to reflect these changes.
  • I have added entries to the changelog for any noteworthy additions, changes, fixes, or removals.
  • I have added migration instructions to the upgrade guide (if needed).
  • The changes follow the project's style guidelines and introduce no new warnings.
  • The changes are fully tested and pass the CI checks.
  • I have reviewed my own code changes.

If PR contains AI-assisted content:

  • I have disclosed the use of AI tools in the PR description as per our AI Usage Guidelines.
  • AI-assisted commits include an Assisted-by: [Model Name] via [Tool Name] footer.
  • I confirm that I have personally reviewed and understood all AI-generated content, and accept full responsibility for it.

@codecov

codecov Bot commented May 15, 2026

Copy link
Copy Markdown

@denialhaag denialhaag added enhancement Improvement of existing feature MLIR Anything related to MLIR labels May 18, 2026
@denialhaag denialhaag added this to the MLIR Support milestone May 18, 2026
@li-mingbao li-mingbao marked this pull request as ready for review May 19, 2026 08:58
@li-mingbao

Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Full review triggered.

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR splits QC→QIR lowering into Base and Adaptive profiles with separate passes, adds shared lowering infrastructure, extends QIRProgramBuilder for profile-aware APIs and SCF builders, reorganizes build/tests, and updates pipeline/CLI to select profiles.

Changes

QIR Profile-Based Lowering and Builder Extensions

Layer / File(s) Summary
Configuration and Pipeline Integration
mlir/include/mlir/Compiler/CompilerPipeline.h, mlir/lib/Compiler/CompilerPipeline.cpp, mlir/tools/mqt-cc/mqt-cc.cpp
Compiler config replaces single convertToQIR flag with convertToQIRBase and convertToQIRAdaptive boolean options. CLI updates from --emit-qir to --emit-qir-base and --emit-qir-adaptive. Pipeline enforces mutual exclusion and selectively adds createQCToQIRBase() or createQCToQIRAdaptive() passes.
Common QIR Lowering Infrastructure
mlir/include/mlir/Conversion/QCToQIR/Common/CommonQIR.h, mlir/lib/Conversion/QCToQIR/Common/CommonQIR.cpp, mlir/lib/Conversion/QCToQIR/Common/CMakeLists.txt
Introduces AllocationMode enum (Unset/Static/Dynamic), LoweringState struct (caching qubits/results/controls), QCToQIRTypeConverter for QC qubit↔LLVM pointer mapping, and StatefulOpConversionPattern template for shared state access. Common conversion patterns for qc.static, qc.gphase, qc.barrier, qc.ctrl, qc.yield and runtime wiring via addInitialize, populateQCToQIRPatterns, addOutputRecording.
QC→QIR Base Profile Pass
mlir/include/mlir/Conversion/QCToQIR/QIRBase/CMakeLists.txt, mlir/include/mlir/Conversion/QCToQIR/QIRBase/QCToQIRBase.h, mlir/include/mlir/Conversion/QCToQIR/QIRBase/QCToQIRBase.td, mlir/lib/Conversion/QCToQIR/QIRBase/CMakeLists.txt, mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp
Base profile converts memref.load to static int-to-ptr, qc.alloc to cached static qubits, and qc.measure to static result pointers in entry/measurement/output blocks. ensureBlocks restructures single-block LLVM function into 4-block QIR Base layout with constant hoisting.
QC→QIR Adaptive Profile Pass
mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/CMakeLists.txt, mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.h, mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.td, mlir/lib/Conversion/QCToQIR/QIRAdaptive/CMakeLists.txt, mlir/lib/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.cpp
Adaptive profile converts memref.alloc/dealloc to QIR dynamic array ops, memref.load to GEP+load, qc.alloc/dealloc to dynamic allocation/release calls, and qc.measure with conditional result array management and read_result calls. ensureBlocks creates entry/output structure; pre-scans loops for backward-branching metadata.
QIRProgramBuilder API Extensions
mlir/include/mlir/Dialect/QIR/Builder/QIRProgramBuilder.h, mlir/lib/Dialect/QIR/Builder/QIRProgramBuilder.cpp
Adds Profile enum (Base/Adaptive) with selective allocation strategy: Adaptive performs dynamic allocation and tracks qubits/results, Base uses static qubits. Introduces QubitRegister struct (backing Value + per-qubit SmallVector). Adds load(reg, index) API and SCF control-flow builders (scfFor, scfIf, scfWhile). Changes measure(Value, const Bit&) return from QIRProgramBuilder& to Value, and extends build(...) with optional Profile parameter (default Adaptive).
QIR Metadata and Runtime Utilities
mlir/include/mlir/Dialect/QIR/Utils/QIRMetadata.h, mlir/include/mlir/Dialect/QIR/Utils/QIRUtils.h, mlir/lib/Dialect/QIR/Utils/QIRUtils.cpp
QIRMetadata adds useArrays, backwardsBranching, and useAdaptive tracking fields. setQIRAttributes now emits qir_profiles (adaptive vs base) as passthrough attribute and places version/dynamic-management flags in llvm::ModuleFlagsOp. Adds QIR_READ_RESULT runtime function constant.
Build System Reorganization
mlir/include/mlir/Conversion/QCToQIR/CMakeLists.txt, mlir/lib/Conversion/QCToQIR/CMakeLists.txt, mlir/lib/Compiler/CMakeLists.txt
Parent CMakeLists delegates to Common, QIRBase, QIRAdaptive subdirectories. Compiler pipeline links MLIRQCToQIRAdaptive and MLIRQCToQIRBase instead of monolithic MLIRQCToQIR.
Test Infrastructure
mlir/unittests/Conversion/QCToQIR/CMakeLists.txt, mlir/unittests/Conversion/QCToQIR/QCToQIRAdaptive/*, mlir/unittests/Conversion/QCToQIR/QCToQIRBase/*, mlir/unittests/Compiler/test_compiler_pipeline.cpp, mlir/unittests/Dialect/QIR/IR/test_qir_ir.cpp, mlir/unittests/programs/qir_programs.*
Splits monolithic QC-to-QIR tests into separate Adaptive and Base test suites with parameterized equivalence tests covering gates, measurements, qubit management, and SCF control flow. Adds QIRProgramBuilder test helpers (simpleIf, ifElse, nested loops/control flow). Updates existing tests to explicitly pass Profile::Adaptive.

Sequence Diagrams

sequenceDiagram
  participant Pipeline as CompilerPipeline
  participant PassMgr as PassManager
  participant QCToQIRBase as QCToQIRBase
  participant QCToQIRAdaptive as QCToQIRAdaptive
  participant Common as CommonLowering
  Pipeline->>PassMgr: determine profile (convertToQIRBase / convertToQIRAdaptive)
  PassMgr->>QCToQIRBase: createQCToQIRBase() (if Base)
  PassMgr->>QCToQIRAdaptive: createQCToQIRAdaptive() (if Adaptive)
  QCToQIRBase->>Common: use LoweringState (static allocation)
  QCToQIRAdaptive->>Common: use LoweringState (dynamic allocation)
  Common->>PassMgr: register patterns via populateQCToQIRPatterns()
  QCToQIRBase->>PassMgr: emit QIR init / measurement routing
  QCToQIRAdaptive->>PassMgr: emit dynamic allocs, read_result, releases
Loading
sequenceDiagram
  participant Client as QIRProgramBuilder::build
  participant Builder as QIRProgramBuilder
  participant Alloc as allocQubit / allocQubitRegister
  participant SCF as scfFor / scfIf / scfWhile
  participant Finalize as finalize

  Client->>Builder: build(..., Profile::Adaptive)
  Builder->>Builder: set profile = Adaptive
  Builder->>Alloc: allocQubit() -> dynamic allocation (Adaptive)
  Builder->>Alloc: allocQubitRegister() -> dynamic array (Adaptive)
  Builder->>SCF: scfFor / scfIf / scfWhile -> construct blocks
  Builder->>Finalize: finalize() -> emit release and output recording (profile-dependent)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • burgholzer
  • denialhaag

"🐰 I hop through code and gates so wide,
Base keeps order, Adaptive takes the tide.
I stash qubits, weave SCF delight,
Two profiles now dance in QIR's light. ✨"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.92% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description provides a solid summary of changes (Adaptive Profile conversion, Base/Adaptive separation, QIRProgramBuilder updates) but the checklist items are all unchecked, indicating incomplete documentation, tests, changelog, and style verification. Complete the checklist items: mark tests as added, confirm documentation updates, add changelog entries, verify style compliance, and confirm CI pass status.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title succinctly summarizes the main change: adding QC to QIR Adaptive Profile conversion, which is the primary objective of this substantial refactoring.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/include/mlir/Dialect/QIR/Builder/QIRProgramBuilder.h`:
- Around line 1076-1077: The DenseMap named loadedQubits (DenseMap<Value,
DenseSet<Value>>) is ambiguous because its key is a register Value while the
DenseSet stores index Values (integer indices); update the declaration of
loadedQubits to include a brief clarifying comment that the map keys are
register Values and the DenseSet contains index Value objects (i.e., integer
indices that have been loaded), referencing the symbol loadedQubits in
QIRProgramBuilder to make intent clear to future readers.

In `@mlir/include/mlir/Dialect/QIR/Utils/QIRMetadata.h`:
- Around line 34-39: Replace the magic-number int field backwardsBranching in
QIRMetadata with a scoped enum (e.g., enum class BackwardsBranching { None = 0,
For = 1, While = 2, Both = 3 }) and change the member to BackwardsBranching
backwardsBranching{BackwardsBranching::None}; then update all sites that read or
write this member (e.g., scfFor, scfWhile and any comparisons/assignments) to
use the enum values (BackwardsBranching::For, ::While, ::Both) instead of
integer literals; if you cannot change the type, at minimum add a clear comment
above the int declaration documenting the encoding (0=none,1=for,2=while,3=both)
and prefer named constants to replace literal uses.

In `@mlir/lib/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.cpp`:
- Around line 523-540: The code only rewires the terminator of lastBlock so
other blocks that can return will bypass state.outputBlock; iterate over all
blocks in the main region (e.g., using main.getBlocks()) and for each block
(except the new entryBlock and finalBlock) examine its terminator (terminatorOp)
and replace any direct-return/exit terminators with a branch to finalBlock (or
move those terminators into finalBlock) so all exits route through
state.outputBlock; update uses of LLVM::BrOp::create, terminatorOp->moveBefore,
and the builder insertion points accordingly so every return-like terminator is
handled rather than only main.back().

In `@mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp`:
- Around line 331-334: The code currently aborts the compiler via
llvm::reportFatalInternalError when detecting unsupported input (e.g.,
main.getBlocks().size() > 1); change these checks (the one using
llvm::reportFatalInternalError around main and the similar one at 445-446) to
emit a proper MLIR error on the module op (use main.emitOpError("Modules with
multiple blocks are not supported in the Base Profile") or
emitError(main.getLoc()) with the same message) and then fail the pass
gracefully by signaling failure (call signalPassFailure() or return failure from
the pass entry point) so the pipeline reports a normal pass failure instead of
aborting.
- Around line 241-250: The allocation branch currently uses resultPtrs.size()
when op.getRegisterIndex() exists but the index key is missing, breaking stable
mapping; change the allocation to use the explicit register index
(static_cast<int64_t>(op.getRegisterIndex().value())) when calling
createPointerFromIndex and when emplacing into resultPtrs (replace
resultPtrs.size() key with the requested index), and update state.numResults to
account for sparse/high indices (e.g., set state.numResults =
std::max(state.numResults, requestedIndex + 1) or otherwise ensure the count
covers the allocated index). Ensure this logic is applied where result is
created (createPointerFromIndex) and where resultPtrs.try_emplace is invoked so
the requested register_index is preserved.
- Around line 109-113: The code currently defaults non-constant memref.load
indices to 0 by using getConstantIntValue(indexValue).value_or(0), which can
silently miscompile; replace that behavior by checking the Optional returned by
getConstantIntValue(indexValue) and explicitly failing the pattern when it has
no value (e.g., return failure() or emit a match/diagnostic) instead of falling
back to 0. Locate the indexValue handling (including the
UnrealizedConversionCastOp unwrap) and change the code to test
getConstantIntValue(indexValue).has_value() and handle the non-constant case by
rejecting the match with an explicit failure/diagnostic so unsupported dynamic
indices are not rewritten into qubit 0.

In `@mlir/lib/Dialect/QIR/Builder/QIRProgramBuilder.cpp`:
- Around line 244-259: The duplicate-check using
loadedQubits[reg].contains(index) only compares SSA Value identity and misses
semantically-equal constant indices; update QIRProgramBuilder::load to perform a
stronger check: if index is a constant integer (detect via the LLVM constant/int
op/attribute for the Value), extract its integer value and check a per-register
set keyed by that integer, otherwise fall back to the existing SSA-Value check
(or add a comment documenting the limitation). Modify the storage used by
loadedQubits (or add an auxiliary map) to record both SSA Values and concrete
integer indices so load(), the contains check, and the insertion
(loadedQubits[reg].insert(...)) handle constant-index comparisons correctly
while preserving current behavior for dynamic indices.
- Around line 763-821: scfIf builds an i1 constant when cond is a bool but
always calls QIR_READ_RESULT with that value, causing a type mismatch because
QIR_READ_RESULT expects a pointer (measurement result), not an i1; change scfIf
so that when cond holds a bool you skip the
getOrCreateFunctionDeclaration/getOrCreateFunctionDeclaration + LLVM::CallOp
(the QIR_READ_RESULT/readOp calls) and use the constant i1 value directly for
the branch, while when cond is a Value (pointer) you preserve the existing path
that calls getOrCreateFunctionDeclaration(module, QIR_READ_RESULT, ...) and
LLVM::CallOp::create(...) to obtain the i1 to pass into LLVM::CondBrOp; update
references in this function (condition, readOp, QIR_READ_RESULT, LLVM::CallOp,
LLVM::CondBrOp) accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: c69551f5-cb87-4f0f-964c-1e2183044af9

📥 Commits

Reviewing files that changed from the base of the PR and between 9141dac and 0f453bb.

📒 Files selected for processing (35)
  • mlir/include/mlir/Compiler/CompilerPipeline.h
  • mlir/include/mlir/Conversion/QCToQIR/CMakeLists.txt
  • mlir/include/mlir/Conversion/QCToQIR/Common/CommonQIR.h
  • mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/CMakeLists.txt
  • mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.h
  • mlir/include/mlir/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.td
  • mlir/include/mlir/Conversion/QCToQIR/QIRBase/CMakeLists.txt
  • mlir/include/mlir/Conversion/QCToQIR/QIRBase/QCToQIRBase.h
  • mlir/include/mlir/Conversion/QCToQIR/QIRBase/QCToQIRBase.td
  • mlir/include/mlir/Dialect/QIR/Builder/QIRProgramBuilder.h
  • mlir/include/mlir/Dialect/QIR/Utils/QIRMetadata.h
  • mlir/include/mlir/Dialect/QIR/Utils/QIRUtils.h
  • mlir/lib/Compiler/CMakeLists.txt
  • mlir/lib/Compiler/CompilerPipeline.cpp
  • mlir/lib/Conversion/QCToQIR/CMakeLists.txt
  • mlir/lib/Conversion/QCToQIR/Common/CMakeLists.txt
  • mlir/lib/Conversion/QCToQIR/Common/CommonQIR.cpp
  • mlir/lib/Conversion/QCToQIR/QCToQIR.cpp
  • mlir/lib/Conversion/QCToQIR/QIRAdaptive/CMakeLists.txt
  • mlir/lib/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.cpp
  • mlir/lib/Conversion/QCToQIR/QIRBase/CMakeLists.txt
  • mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp
  • mlir/lib/Dialect/QIR/Builder/QIRProgramBuilder.cpp
  • mlir/lib/Dialect/QIR/Utils/QIRUtils.cpp
  • mlir/tools/mqt-cc/mqt-cc.cpp
  • mlir/unittests/Compiler/test_compiler_pipeline.cpp
  • mlir/unittests/Conversion/QCToQIR/CMakeLists.txt
  • mlir/unittests/Conversion/QCToQIR/QCToQIRAdaptive/CMakeLists.txt
  • mlir/unittests/Conversion/QCToQIR/QCToQIRAdaptive/test_qc_to_qir_adaptive.cpp
  • mlir/unittests/Conversion/QCToQIR/QCToQIRBase/CMakeLists.txt
  • mlir/unittests/Conversion/QCToQIR/QCToQIRBase/test_qc_to_qir_base.cpp
  • mlir/unittests/Conversion/QCToQIR/test_qc_to_qir.cpp
  • mlir/unittests/Dialect/QIR/IR/test_qir_ir.cpp
  • mlir/unittests/programs/qir_programs.cpp
  • mlir/unittests/programs/qir_programs.h
💤 Files with no reviewable changes (2)
  • mlir/lib/Conversion/QCToQIR/QCToQIR.cpp
  • mlir/unittests/Conversion/QCToQIR/test_qc_to_qir.cpp

Comment thread mlir/include/mlir/Dialect/QIR/Builder/QIRProgramBuilder.h
Comment thread mlir/include/mlir/Dialect/QIR/Utils/QIRMetadata.h
Comment thread mlir/lib/Conversion/QCToQIR/QIRAdaptive/QCToQIRAdaptive.cpp
Comment thread mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp Outdated
Comment thread mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp Outdated
Comment thread mlir/lib/Conversion/QCToQIR/QIRBase/QCToQIRBase.cpp
Comment thread mlir/lib/Dialect/QIR/Builder/QIRProgramBuilder.cpp
Comment thread mlir/lib/Dialect/QIR/Builder/QIRProgramBuilder.cpp
@li-mingbao

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@li-mingbao

Copy link
Copy Markdown
Contributor Author

Hey @denialhaag,

Besides the issues that you mentioned I can mainly think of the conversion of the classical register informations of measure operations but that should be covered by #1726.

Maybe something unrelated but a verifier for Base/Adaptive Profile that you mentioned yesterday in the meeting would be an interesting follow-up to properly verify QIR compliance.

@denialhaag denialhaag left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing all my comments! 🙂

I just noticed one more thing. Once this is resolved, we can mark this PR as closing #1619. I hope this is not too much of a headache now. Otherwise, I'd also be okay with postponing this to the follow-ups. We can discuss below.

That said, I'll already tag @burgholzer for his review.

Comment thread mlir/lib/Conversion/QCToQIR/QIRCommon/QIRCommon.cpp
@denialhaag denialhaag requested a review from burgholzer May 22, 2026 13:41
@denialhaag denialhaag linked an issue May 22, 2026 that may be closed by this pull request
@denialhaag

Copy link
Copy Markdown
Member

I have created #1734 to collect follow-ups. Feel free to comment or edit if something else comes to mind.

I have also added a bullet point to #1726, even though the implementation should naturally improve with the change.

@mergify mergify Bot removed the conflict label Jun 6, 2026
@mergify mergify Bot removed the conflict label Jun 11, 2026
Li-ming Bao and others added 5 commits June 11, 2026 10:50
Signed-off-by: burgholzer <burgholzer@me.com>
Signed-off-by: burgholzer <burgholzer@me.com>
Signed-off-by: burgholzer <burgholzer@me.com>
Signed-off-by: burgholzer <burgholzer@me.com>

@burgholzer burgholzer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @li-mingbao and @denialhaag 👋🏼
Finally found some time to dig through this.
Really nice work! While I did not check every single line for correctness, this seems to be doing what it should for now and feels like a great improvement for our QIR support.
Let's wait for CI to clear and then merge! 🚀

@burgholzer burgholzer dismissed denialhaag’s stale review June 12, 2026 17:05

Dismissing as outdated.

@burgholzer burgholzer merged commit 61ae17f into munich-quantum-toolkit:main Jun 12, 2026
29 of 32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement Improvement of existing feature MLIR Anything related to MLIR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🎨 Clean up QIR support

3 participants