diff --git a/qis-compiler/python/tests/generate_hugrs.py b/qis-compiler/python/tests/generate_hugrs.py index 6b87b16af..cc9c9c020 100644 --- a/qis-compiler/python/tests/generate_hugrs.py +++ b/qis-compiler/python/tests/generate_hugrs.py @@ -219,6 +219,22 @@ def main() -> None: return main.compile().to_bytes() +def modifiers() -> bytes: + from guppylang import enable_experimental_features + enable_experimental_features() + @guppy + def main() -> None: + q1 = qubit() + q2 = qubit() + h(q1) + with control(q1): + x(q2) + result("q1", measure(q1)) + result("q2", measure(q2)) + + return main.compile().to_bytes() + + def entry_args() -> bytes: @guppy def foo(a: int) -> None: @@ -243,6 +259,7 @@ def foo(a: int) -> None: print_current_shot, rng, entry_args, + modifiers, ]: envelope = func() (resources_dir / f"{func.__name__}.hugr").write_bytes(envelope) diff --git a/qis-compiler/python/tests/resources/modifiers.hugr b/qis-compiler/python/tests/resources/modifiers.hugr new file mode 100644 index 000000000..0c840fbb9 Binary files /dev/null and b/qis-compiler/python/tests/resources/modifiers.hugr differ diff --git a/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/aarch64-apple-darwin-modifiers/modifiers_aarch64-apple-darwin b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/aarch64-apple-darwin-modifiers/modifiers_aarch64-apple-darwin new file mode 100644 index 000000000..2c695d33f --- /dev/null +++ b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/aarch64-apple-darwin-modifiers/modifiers_aarch64-apple-darwin @@ -0,0 +1,133 @@ +; ModuleID = 'hugr' +source_filename = "hugr" +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-apple-darwin" + +@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed" +@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1" +@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2" +@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate." + +declare i8* @heap_alloc(i64) local_unnamed_addr + +; Function Attrs: noreturn +declare void @panic(i32, i8*) local_unnamed_addr #0 + +declare i64 @___lazy_measure(i64) local_unnamed_addr + +declare void @___qfree(i64) local_unnamed_addr + +declare i1 @___read_future_bool(i64) local_unnamed_addr + +declare void @___dec_future_refcount(i64) local_unnamed_addr + +declare void @print_bool(i8*, i64, i1) local_unnamed_addr + +declare i64 @___qalloc() local_unnamed_addr + +declare void @___reset(i64) local_unnamed_addr + +declare void @___rxy(i64, double, double) local_unnamed_addr + +declare void @___rz(i64, double) local_unnamed_addr + +declare void @___rzz(i64, i64, double) local_unnamed_addr + +define i64 @qmain(i64 %0) local_unnamed_addr { +entry: + tail call void @setup(i64 %0) + %qalloc.i.i = tail call i64 @___qalloc() + %not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1 + br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i + +reset_bb.i.i: ; preds = %entry + tail call void @___reset(i64 %qalloc.i.i) + br label %id_bb.i.i + +id_bb.i.i: ; preds = %reset_bb.i.i, %entry + %1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1 + %2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1 + %.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0 + br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i + +cond_57_case_0.i.i: ; preds = %id_bb.i.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i + %.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1 + tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18) + %3 = tail call i8* @heap_alloc(i64 8) + %4 = bitcast i8* %3 to i64* + %5 = tail call i8* @heap_alloc(i64 8) + %6 = bitcast i8* %5 to i64* + store i64 0, i64* %6, align 1 + store i64 %.fca.1.extract.i.i, i64* %4, align 4 + %7 = load i64, i64* %6, align 4 + %8 = and i64 %7, 1 + store i64 %8, i64* %6, align 4 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i + +mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0)) + unreachable + +__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + %qalloc.i69.i = tail call i64 @___qalloc() + %not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1 + br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i + +reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i + tail call void @___reset(i64 %qalloc.i69.i) + br label %id_bb.i73.i + +id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i + %10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1 + %11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10 + %.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0 + br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i + +cond_71_case_0.i.i: ; preds = %id_bb.i73.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.main.1.exit: ; preds = %id_bb.i73.i + %.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1 + %12 = load i64, i64* %4, align 4 + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18) + tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18) + tail call void @___rz(i64 %12, double 0xBFF921FB54442D18) + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18) + %13 = tail call i8* @heap_alloc(i64 8) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + %15 = tail call i8* @heap_alloc(i64 8) + %16 = bitcast i8* %15 to i64* + store i64 0, i64* %16, align 1 + %17 = load i64, i64* %14, align 4 + %lazy_measure.i = tail call i64 @___lazy_measure(i64 %17) + tail call void @___qfree(i64 %17) + %read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i) + tail call void @___dec_future_refcount(i64 %lazy_measure.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i) + %lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i) + tail call void @___qfree(i64 %.fca.1.extract.i74.i) + %read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i) + tail call void @___dec_future_refcount(i64 %lazy_measure33.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i) + %18 = tail call i64 @teardown() + ret i64 %18 +} + +declare void @setup(i64) local_unnamed_addr + +declare i64 @teardown() local_unnamed_addr + +attributes #0 = { noreturn } + +!name = !{!0} + +!0 = !{!"mainlib"} diff --git a/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-apple-darwin-modifiers/modifiers_x86_64-apple-darwin b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-apple-darwin-modifiers/modifiers_x86_64-apple-darwin new file mode 100644 index 000000000..90c16783c --- /dev/null +++ b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-apple-darwin-modifiers/modifiers_x86_64-apple-darwin @@ -0,0 +1,133 @@ +; ModuleID = 'hugr' +source_filename = "hugr" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" + +@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed" +@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1" +@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2" +@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate." + +declare i8* @heap_alloc(i64) local_unnamed_addr + +; Function Attrs: noreturn +declare void @panic(i32, i8*) local_unnamed_addr #0 + +declare i64 @___lazy_measure(i64) local_unnamed_addr + +declare void @___qfree(i64) local_unnamed_addr + +declare i1 @___read_future_bool(i64) local_unnamed_addr + +declare void @___dec_future_refcount(i64) local_unnamed_addr + +declare void @print_bool(i8*, i64, i1) local_unnamed_addr + +declare i64 @___qalloc() local_unnamed_addr + +declare void @___reset(i64) local_unnamed_addr + +declare void @___rxy(i64, double, double) local_unnamed_addr + +declare void @___rz(i64, double) local_unnamed_addr + +declare void @___rzz(i64, i64, double) local_unnamed_addr + +define i64 @qmain(i64 %0) local_unnamed_addr { +entry: + tail call void @setup(i64 %0) + %qalloc.i.i = tail call i64 @___qalloc() + %not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1 + br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i + +reset_bb.i.i: ; preds = %entry + tail call void @___reset(i64 %qalloc.i.i) + br label %id_bb.i.i + +id_bb.i.i: ; preds = %reset_bb.i.i, %entry + %1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1 + %2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1 + %.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0 + br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i + +cond_57_case_0.i.i: ; preds = %id_bb.i.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i + %.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1 + tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18) + %3 = tail call i8* @heap_alloc(i64 8) + %4 = bitcast i8* %3 to i64* + %5 = tail call i8* @heap_alloc(i64 8) + %6 = bitcast i8* %5 to i64* + store i64 0, i64* %6, align 1 + store i64 %.fca.1.extract.i.i, i64* %4, align 4 + %7 = load i64, i64* %6, align 4 + %8 = and i64 %7, 1 + store i64 %8, i64* %6, align 4 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i + +mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0)) + unreachable + +__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + %qalloc.i69.i = tail call i64 @___qalloc() + %not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1 + br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i + +reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i + tail call void @___reset(i64 %qalloc.i69.i) + br label %id_bb.i73.i + +id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i + %10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1 + %11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10 + %.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0 + br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i + +cond_71_case_0.i.i: ; preds = %id_bb.i73.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.main.1.exit: ; preds = %id_bb.i73.i + %.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1 + %12 = load i64, i64* %4, align 4 + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18) + tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18) + tail call void @___rz(i64 %12, double 0xBFF921FB54442D18) + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18) + %13 = tail call i8* @heap_alloc(i64 8) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + %15 = tail call i8* @heap_alloc(i64 8) + %16 = bitcast i8* %15 to i64* + store i64 0, i64* %16, align 1 + %17 = load i64, i64* %14, align 4 + %lazy_measure.i = tail call i64 @___lazy_measure(i64 %17) + tail call void @___qfree(i64 %17) + %read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i) + tail call void @___dec_future_refcount(i64 %lazy_measure.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i) + %lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i) + tail call void @___qfree(i64 %.fca.1.extract.i74.i) + %read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i) + tail call void @___dec_future_refcount(i64 %lazy_measure33.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i) + %18 = tail call i64 @teardown() + ret i64 %18 +} + +declare void @setup(i64) local_unnamed_addr + +declare i64 @teardown() local_unnamed_addr + +attributes #0 = { noreturn } + +!name = !{!0} + +!0 = !{!"mainlib"} diff --git a/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-unknown-linux-gnu-modifiers/modifiers_x86_64-unknown-linux-gnu b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-unknown-linux-gnu-modifiers/modifiers_x86_64-unknown-linux-gnu new file mode 100644 index 000000000..4b50afede --- /dev/null +++ b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-unknown-linux-gnu-modifiers/modifiers_x86_64-unknown-linux-gnu @@ -0,0 +1,133 @@ +; ModuleID = 'hugr' +source_filename = "hugr" +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed" +@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1" +@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2" +@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate." + +declare i8* @heap_alloc(i64) local_unnamed_addr + +; Function Attrs: noreturn +declare void @panic(i32, i8*) local_unnamed_addr #0 + +declare i64 @___lazy_measure(i64) local_unnamed_addr + +declare void @___qfree(i64) local_unnamed_addr + +declare i1 @___read_future_bool(i64) local_unnamed_addr + +declare void @___dec_future_refcount(i64) local_unnamed_addr + +declare void @print_bool(i8*, i64, i1) local_unnamed_addr + +declare i64 @___qalloc() local_unnamed_addr + +declare void @___reset(i64) local_unnamed_addr + +declare void @___rxy(i64, double, double) local_unnamed_addr + +declare void @___rz(i64, double) local_unnamed_addr + +declare void @___rzz(i64, i64, double) local_unnamed_addr + +define i64 @qmain(i64 %0) local_unnamed_addr { +entry: + tail call void @setup(i64 %0) + %qalloc.i.i = tail call i64 @___qalloc() + %not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1 + br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i + +reset_bb.i.i: ; preds = %entry + tail call void @___reset(i64 %qalloc.i.i) + br label %id_bb.i.i + +id_bb.i.i: ; preds = %reset_bb.i.i, %entry + %1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1 + %2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1 + %.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0 + br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i + +cond_57_case_0.i.i: ; preds = %id_bb.i.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i + %.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1 + tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18) + %3 = tail call i8* @heap_alloc(i64 8) + %4 = bitcast i8* %3 to i64* + %5 = tail call i8* @heap_alloc(i64 8) + %6 = bitcast i8* %5 to i64* + store i64 0, i64* %6, align 1 + store i64 %.fca.1.extract.i.i, i64* %4, align 4 + %7 = load i64, i64* %6, align 4 + %8 = and i64 %7, 1 + store i64 %8, i64* %6, align 4 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i + +mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0)) + unreachable + +__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + %qalloc.i69.i = tail call i64 @___qalloc() + %not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1 + br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i + +reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i + tail call void @___reset(i64 %qalloc.i69.i) + br label %id_bb.i73.i + +id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i + %10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1 + %11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10 + %.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0 + br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i + +cond_71_case_0.i.i: ; preds = %id_bb.i73.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.main.1.exit: ; preds = %id_bb.i73.i + %.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1 + %12 = load i64, i64* %4, align 4 + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18) + tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18) + tail call void @___rz(i64 %12, double 0xBFF921FB54442D18) + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18) + %13 = tail call i8* @heap_alloc(i64 8) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + %15 = tail call i8* @heap_alloc(i64 8) + %16 = bitcast i8* %15 to i64* + store i64 0, i64* %16, align 1 + %17 = load i64, i64* %14, align 4 + %lazy_measure.i = tail call i64 @___lazy_measure(i64 %17) + tail call void @___qfree(i64 %17) + %read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i) + tail call void @___dec_future_refcount(i64 %lazy_measure.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i) + %lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i) + tail call void @___qfree(i64 %.fca.1.extract.i74.i) + %read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i) + tail call void @___dec_future_refcount(i64 %lazy_measure33.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i) + %18 = tail call i64 @teardown() + ret i64 %18 +} + +declare void @setup(i64) local_unnamed_addr + +declare i64 @teardown() local_unnamed_addr + +attributes #0 = { noreturn } + +!name = !{!0} + +!0 = !{!"mainlib"} diff --git a/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-windows-msvc-modifiers/modifiers_x86_64-windows-msvc b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-windows-msvc-modifiers/modifiers_x86_64-windows-msvc new file mode 100644 index 000000000..fbdf5b7b2 --- /dev/null +++ b/qis-compiler/python/tests/snapshots/test_basic_generation/test_llvm/x86_64-windows-msvc-modifiers/modifiers_x86_64-windows-msvc @@ -0,0 +1,133 @@ +; ModuleID = 'hugr' +source_filename = "hugr" +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-windows-msvc" + +@"e_Some array.A77EF32E.0" = private constant [48 x i8] c"/EXIT:INT:Some array elements have been borrowed" +@res_q1.18BA0F1C.0 = private constant [13 x i8] c"\0CUSER:BOOL:q1" +@res_q2.2A5B30FD.0 = private constant [13 x i8] c"\0CUSER:BOOL:q2" +@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate." + +declare i8* @heap_alloc(i64) local_unnamed_addr + +; Function Attrs: noreturn +declare void @panic(i32, i8*) local_unnamed_addr #0 + +declare i64 @___lazy_measure(i64) local_unnamed_addr + +declare void @___qfree(i64) local_unnamed_addr + +declare i1 @___read_future_bool(i64) local_unnamed_addr + +declare void @___dec_future_refcount(i64) local_unnamed_addr + +declare void @print_bool(i8*, i64, i1) local_unnamed_addr + +declare i64 @___qalloc() local_unnamed_addr + +declare void @___reset(i64) local_unnamed_addr + +declare void @___rxy(i64, double, double) local_unnamed_addr + +declare void @___rz(i64, double) local_unnamed_addr + +declare void @___rzz(i64, i64, double) local_unnamed_addr + +define i64 @qmain(i64 %0) local_unnamed_addr { +entry: + tail call void @setup(i64 %0) + %qalloc.i.i = tail call i64 @___qalloc() + %not_max.not.i.i = icmp eq i64 %qalloc.i.i, -1 + br i1 %not_max.not.i.i, label %id_bb.i.i, label %reset_bb.i.i + +reset_bb.i.i: ; preds = %entry + tail call void @___reset(i64 %qalloc.i.i) + br label %id_bb.i.i + +id_bb.i.i: ; preds = %reset_bb.i.i, %entry + %1 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i.i, 1 + %2 = select i1 %not_max.not.i.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %1 + %.fca.0.extract.i.i = extractvalue { i1, i64 } %2, 0 + br i1 %.fca.0.extract.i.i, label %__hugr__.__tk2_qalloc.13.exit.i, label %cond_57_case_0.i.i + +cond_57_case_0.i.i: ; preds = %id_bb.i.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.__tk2_qalloc.13.exit.i: ; preds = %id_bb.i.i + %.fca.1.extract.i.i = extractvalue { i1, i64 } %2, 1 + tail call void @___rxy(i64 %.fca.1.extract.i.i, double 0x3FF921FB54442D18, double 0xBFF921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i.i, double 0x400921FB54442D18) + %3 = tail call i8* @heap_alloc(i64 8) + %4 = bitcast i8* %3 to i64* + %5 = tail call i8* @heap_alloc(i64 8) + %6 = bitcast i8* %5 to i64* + store i64 0, i64* %6, align 1 + store i64 %.fca.1.extract.i.i, i64* %4, align 4 + %7 = load i64, i64* %6, align 4 + %8 = and i64 %7, 1 + store i64 %8, i64* %6, align 4 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %__barray_check_none_borrowed.exit.i, label %mask_block_err.i.i + +mask_block_err.i.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + tail call void @panic(i32 1002, i8* getelementptr inbounds ([48 x i8], [48 x i8]* @"e_Some array.A77EF32E.0", i64 0, i64 0)) + unreachable + +__barray_check_none_borrowed.exit.i: ; preds = %__hugr__.__tk2_qalloc.13.exit.i + %qalloc.i69.i = tail call i64 @___qalloc() + %not_max.not.i70.i = icmp eq i64 %qalloc.i69.i, -1 + br i1 %not_max.not.i70.i, label %id_bb.i73.i, label %reset_bb.i71.i + +reset_bb.i71.i: ; preds = %__barray_check_none_borrowed.exit.i + tail call void @___reset(i64 %qalloc.i69.i) + br label %id_bb.i73.i + +id_bb.i73.i: ; preds = %reset_bb.i71.i, %__barray_check_none_borrowed.exit.i + %10 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %qalloc.i69.i, 1 + %11 = select i1 %not_max.not.i70.i, { i1, i64 } { i1 false, i64 poison }, { i1, i64 } %10 + %.fca.0.extract.i72.i = extractvalue { i1, i64 } %11, 0 + br i1 %.fca.0.extract.i72.i, label %__hugr__.main.1.exit, label %cond_71_case_0.i.i + +cond_71_case_0.i.i: ; preds = %id_bb.i73.i + tail call void @panic(i32 1001, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @"e_No more qu.3B2EEBF0.0", i64 0, i64 0)) + unreachable + +__hugr__.main.1.exit: ; preds = %id_bb.i73.i + %.fca.1.extract.i74.i = extractvalue { i1, i64 } %11, 1 + %12 = load i64, i64* %4, align 4 + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18, double 0x3FF921FB54442D18) + tail call void @___rzz(i64 %12, i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18) + tail call void @___rz(i64 %12, double 0xBFF921FB54442D18) + tail call void @___rxy(i64 %.fca.1.extract.i74.i, double 0x3FF921FB54442D18, double 0x400921FB54442D18) + tail call void @___rz(i64 %.fca.1.extract.i74.i, double 0xBFF921FB54442D18) + %13 = tail call i8* @heap_alloc(i64 8) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + %15 = tail call i8* @heap_alloc(i64 8) + %16 = bitcast i8* %15 to i64* + store i64 0, i64* %16, align 1 + %17 = load i64, i64* %14, align 4 + %lazy_measure.i = tail call i64 @___lazy_measure(i64 %17) + tail call void @___qfree(i64 %17) + %read_bool.i = tail call i1 @___read_future_bool(i64 %lazy_measure.i) + tail call void @___dec_future_refcount(i64 %lazy_measure.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q1.18BA0F1C.0, i64 0, i64 0), i64 12, i1 %read_bool.i) + %lazy_measure33.i = tail call i64 @___lazy_measure(i64 %.fca.1.extract.i74.i) + tail call void @___qfree(i64 %.fca.1.extract.i74.i) + %read_bool46.i = tail call i1 @___read_future_bool(i64 %lazy_measure33.i) + tail call void @___dec_future_refcount(i64 %lazy_measure33.i) + tail call void @print_bool(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @res_q2.2A5B30FD.0, i64 0, i64 0), i64 12, i1 %read_bool46.i) + %18 = tail call i64 @teardown() + ret i64 %18 +} + +declare void @setup(i64) local_unnamed_addr + +declare i64 @teardown() local_unnamed_addr + +attributes #0 = { noreturn } + +!name = !{!0} + +!0 = !{!"mainlib"} diff --git a/qis-compiler/python/tests/test_basic_generation.py b/qis-compiler/python/tests/test_basic_generation.py index 0988671ed..e24b2f573 100644 --- a/qis-compiler/python/tests/test_basic_generation.py +++ b/qis-compiler/python/tests/test_basic_generation.py @@ -66,6 +66,7 @@ def test_unsupported_pytket_ops() -> None: "rus", "print_current_shot", "rng", + "modifiers", ], ) @pytest.mark.parametrize("target_triple", triples) diff --git a/qis-compiler/rust/lib.rs b/qis-compiler/rust/lib.rs index bf6742f5e..dfa3604d2 100644 --- a/qis-compiler/rust/lib.rs +++ b/qis-compiler/rust/lib.rs @@ -36,7 +36,9 @@ use tket::hugr::std_extensions::{collections, logic, ptr}; use tket::hugr::{self, llvm::inkwell}; use tket::hugr::{Hugr, HugrView, Node}; use tket::llvm::rotation::RotationCodegenExtension; +use tket::modifier::ModifierResolverPass; use tket_qsystem::QSystemPass; +use hugr::algorithms::ComposablePass; use tket_qsystem::extension::{futures as qsystem_futures, qsystem, result as qsystem_result}; use tket_qsystem::llvm::array_utils::ArrayLowering; pub use tket_qsystem::llvm::futures::FuturesCodegenExtension; @@ -142,6 +144,7 @@ fn get_hugr_llvm_module<'c, 'hugr, 'a: 'c>( } fn process_hugr(hugr: &mut Hugr) -> Result<()> { + ModifierResolverPass::default().run(hugr)?; QSystemPass::default().run(hugr)?; Ok(()) }