From e49614ead55df78a55b4b15a3bcbd1abab60be3c Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Mon, 1 Dec 2025 08:51:35 -0500 Subject: [PATCH 1/3] adding loop body analysis results --- src/bloqade/analysis/address/impls.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bloqade/analysis/address/impls.py b/src/bloqade/analysis/address/impls.py index d7932986..a88f8787 100644 --- a/src/bloqade/analysis/address/impls.py +++ b/src/bloqade/analysis/address/impls.py @@ -366,16 +366,22 @@ def for_loop( if iter_type is None: return interp_.eval_fallback(frame, stmt) + body_values = {} for value in iterable: with interp_.new_frame(stmt, has_parent_access=True) as body_frame: loop_vars = interp_.frame_call_region( body_frame, stmt, stmt.body, value, *loop_vars ) + for ssa, val in body_frame.entries.items(): + body_values[ssa] = body_values.setdefault(ssa, val).join(val) + if loop_vars is None: loop_vars = () elif isinstance(loop_vars, interp.ReturnValue): + frame.set_values(body_frame.entries.keys(), body_frame.entries.values()) return loop_vars + frame.set_values(body_values.keys(), body_values.values()) return loop_vars From c29694ab02d6452695af73f7ee438679ff5d6b44 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Mon, 1 Dec 2025 09:04:15 -0500 Subject: [PATCH 2/3] adding test --- test/analysis/address/test_qubit_analysis.py | 33 +++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/test/analysis/address/test_qubit_analysis.py b/test/analysis/address/test_qubit_analysis.py index dddf825a..99815483 100644 --- a/test/analysis/address/test_qubit_analysis.py +++ b/test/analysis/address/test_qubit_analysis.py @@ -1,7 +1,7 @@ import pytest from util import collect_address_types from kirin.analysis import const -from kirin.dialects import ilist +from kirin.dialects import scf, ilist from bloqade import qubit, squin from bloqade.analysis import address @@ -265,3 +265,34 @@ def main(): assert ret == address.AddressReg(data=tuple(range(20))) assert analysis.qubit_count == 20 + + +def test_for_loop_body_values(): + @squin.kernel + def main(): + q = squin.qalloc(4) + for i in range(1, len(q)): + squin.cx(q[0], q[i]) + + address_analysis = address.AddressAnalysis(main.dialects) + frame, result = address_analysis.run(main) + main.print(analysis=frame.entries) + + (for_stmt,) = tuple( + stmt for stmt in main.callable_region.walk() if isinstance(stmt, scf.For) + ) + + for_analysis = [ + value + for stmt in for_stmt.body.walk() + for value in frame.get_values(stmt.results) + ] + + assert address.AddressQubit(data=0) in for_analysis + assert address.ConstResult(const.Value(0)) in for_analysis + assert address.ConstResult(const.Value(None)) in for_analysis + assert address.Unknown() in for_analysis + + +if __name__ == "__main__": + test_for_loop_body_values() From 394f2405c9f2eaf9113e2f2581bd9b06776d25e8 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Mon, 1 Dec 2025 09:07:45 -0500 Subject: [PATCH 3/3] removing script --- test/analysis/address/test_qubit_analysis.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/analysis/address/test_qubit_analysis.py b/test/analysis/address/test_qubit_analysis.py index 99815483..52bdbd92 100644 --- a/test/analysis/address/test_qubit_analysis.py +++ b/test/analysis/address/test_qubit_analysis.py @@ -292,7 +292,3 @@ def main(): assert address.ConstResult(const.Value(0)) in for_analysis assert address.ConstResult(const.Value(None)) in for_analysis assert address.Unknown() in for_analysis - - -if __name__ == "__main__": - test_for_loop_body_values()