Skip to content

fix: preserve gate labels through transpilation#16475

Open
elkadylojain-ops wants to merge 2 commits into
Qiskit:mainfrom
elkadylojain-ops:fix/gate-label-preservation-after-transpile
Open

fix: preserve gate labels through transpilation#16475
elkadylojain-ops wants to merge 2 commits into
Qiskit:mainfrom
elkadylojain-ops:fix/gate-label-preservation-after-transpile

Conversation

@elkadylojain-ops

Copy link
Copy Markdown

Gate labels were silently dropped or only partially propagated when a labeled gate was decomposed into multiple gates during transpilation.

Before this fix:

circuit = QuantumCircuit(2)
circuit.cx(0, 1, label='hello')
w = transpile(circuit, basis_gates=['cz', 'rx', 'rz'])
for inst in w.data:
    print(inst.operation.name, inst.operation.label)
# rz   None
# rx   None
# cz   hello
# rx   hello
# rz   hello

After this fix:

# rz   hello
# rx   hello
# cz   hello
# rx   hello
# rz   hello

Four separate places were dropping the label when emitting new instructions to replace a labeled run/block:

  • BasisTranslator: the label was only forwarded in the branch handling gates without parameters, not in the branch handling parameterized gates.
  • ConsolidateBlocks: labels were dropped when consolidating a block or a 1Q run into a UnitaryGate.
  • CommutativeCancellation and Optimize1qGatesDecomposition: both call DAGCircuit::insert_1q_on_incoming_qubit, which unconditionally set label: None. Added insert_1q_on_incoming_qubit_with_label so callers can propagate the original label.
  • TwoQubitPeepholeOptimization: same issue when re-emitting a synthesized 2Q gate sequence.

Fixes #15168

AI/LLM disclosure

  • I didn't use LLM tooling, or only used it privately.
  • [ x] I used the following tool to help write this PR description: Claude (Anthropic)
  • I used the following tool to generate or modify code:

Gate labels were silently dropped or only partially propagated when a
labeled gate was decomposed into multiple gates during transpilation.

Before this fix:

    circuit = QuantumCircuit(2)
    circuit.cx(0, 1, label='hello')
    w = transpile(circuit, basis_gates=['cz', 'rx', 'rz'])
    for inst in w.data:
        print(inst.operation.name, inst.operation.label)
    # rz   None
    # rx   None
    # cz   hello
    # rx   hello
    # rz   hello

After this fix:

    # rz   hello
    # rx   hello
    # cz   hello
    # rx   hello
    # rz   hello

Four separate places were dropping the label when emitting new
instructions to replace a labeled run/block:

- BasisTranslator: the label was only forwarded in the branch handling
  gates without parameters, not in the branch handling parameterized
  gates.
- ConsolidateBlocks: labels were dropped when consolidating a block or
  a 1Q run into a UnitaryGate.
- CommutativeCancellation and Optimize1qGatesDecomposition: both call
  DAGCircuit::insert_1q_on_incoming_qubit, which unconditionally set
  label: None. Added insert_1q_on_incoming_qubit_with_label so callers
  can propagate the original label.
- TwoQubitPeepholeOptimization: same issue when re-emitting a
  synthesized 2Q gate sequence.

Fixes Qiskit#15168
@elkadylojain-ops elkadylojain-ops requested a review from a team as a code owner June 23, 2026 10:09
@qiskit-bot qiskit-bot added the Community PR PRs from contributors that are not 'members' of the Qiskit repo label Jun 23, 2026
@qiskit-bot

Copy link
Copy Markdown
Collaborator

Thank you for opening a new pull request.

Before your PR can be merged it will first need to pass continuous integration tests and be reviewed. Sometimes the review process can be slow, so please be patient.

While you're waiting, please feel free to review other open PRs. While only a subset of people are authorized to approve pull requests for merging, everyone is encouraged to review open pull requests. Doing reviews helps reduce the burden on the core team and helps make the project's code better for everyone.

One or more of the following people are relevant to this code:

  • @Qiskit/terra-core

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Community PR PRs from contributors that are not 'members' of the Qiskit repo

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

Gate labels are translated odd by transpiler

2 participants