Skip to content

Commit b8fc25e

Browse files
Initial work on selective Sol/Helios compilation
Disambiguate helios and sol during rebasing, rename N2PhasedX -> TwinPhasedX Correct descriptions after the reintroduction of the rz gate Format + rust test fixups Rebase + document QSystemCodegenExtension::new Rename python testing of unimplemented sol features and change from pytest.raises to xfail Ruff format Remove redundant variable setting in xfail test Add unimplemented two-qubit operations for sol gateset (#1377) [decompositions.py](https://github.com/user-attachments/files/24907896/decompositions.py) Constructions should be as in attached python. --------- Co-authored-by: Jake Arkinstall <65358059+jake-arkinstall@users.noreply.github.com> Add missing maximally entangling XXPhase Update ZZPhase and ZZMax Correct output wire indexing for 2q sol gates, correct some typos in gate rebasing, add QFT test Correct add_phased_xx Apply requested changes, add addition test
1 parent 042ba1d commit b8fc25e

125 files changed

Lines changed: 43848 additions & 279 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

qis-compiler/python/tests/generate_hugrs.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from guppylang import guppy
1212
from guppylang.std.builtins import array, exit, panic, result
13+
from guppylang.std.angles import pi
1314
from guppylang.std.qsystem.random import RNG
1415
from guppylang.std.qsystem.utils import get_current_shot
1516
from guppylang.std.quantum import (
@@ -24,6 +25,7 @@
2425
tdg,
2526
x,
2627
z,
28+
crz,
2729
)
2830

2931
resources_dir = Path(__file__).parent / "resources"
@@ -218,6 +220,20 @@ def main() -> None:
218220

219221
return main.compile().to_bytes()
220222

223+
def qft_32() -> bytes:
224+
@guppy
225+
def main() -> None:
226+
qs = array(qubit() for _ in range(32))
227+
for i in range(32):
228+
h(qs[i])
229+
angle = pi / 2
230+
for j in range(31 - i):
231+
crz(qs[i], qs[i + j + 1], angle)
232+
angle /= 2
233+
result("cs", measure_array(qs))
234+
235+
return main.compile().to_bytes()
236+
221237

222238
def entry_args() -> bytes:
223239
@guppy
@@ -241,6 +257,7 @@ def foo(a: int) -> None:
241257
postselect_panic,
242258
rus,
243259
print_current_shot,
260+
qft_32,
244261
rng,
245262
entry_args,
246263
]:
55.5 KB
Binary file not shown.
18 KB
Binary file not shown.

qis-compiler/python/tests/snapshots/test_qsystem_platforms/test_llvm_multiplatform/helios-aarch64-apple-darwin-addition_3_11/addition_3_11_aarch64-apple-darwin_helios

Lines changed: 2294 additions & 0 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,295 @@
1+
; ModuleID = 'hugr'
2+
source_filename = "hugr"
3+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
4+
target triple = "aarch64-apple-darwin"
5+
6+
@"e_Array alre.5A300C2A.0" = private constant [57 x i8] c"8EXIT:INT:Array already contains an element at this index"
7+
@"e_Array elem.E746B1A3.0" = private constant [43 x i8] c"*EXIT:INT:Array element is already borrowed"
8+
@"e_Array cont.EFA5AC45.0" = private constant [70 x i8] c"EEXIT:INT:Array contains non-borrowed elements and cannot be discarded"
9+
@"e_No more qu.3B2EEBF0.0" = private constant [47 x i8] c".EXIT:INT:No more qubits available to allocate."
10+
11+
declare ptr @heap_alloc(i64) local_unnamed_addr
12+
13+
; Function Attrs: noreturn
14+
declare void @panic(i32, ptr) local_unnamed_addr #0
15+
16+
declare void @___qfree(i64) local_unnamed_addr
17+
18+
declare void @heap_free(ptr) local_unnamed_addr
19+
20+
declare i64 @___qalloc() local_unnamed_addr
21+
22+
declare void @___reset(i64) local_unnamed_addr
23+
24+
define i64 @qmain(i64 %0) local_unnamed_addr {
25+
entry:
26+
tail call void @setup(i64 %0)
27+
%1 = tail call ptr @heap_alloc(i64 80)
28+
%2 = tail call ptr @heap_alloc(i64 8)
29+
store i64 -1, ptr %2, align 1
30+
%qalloc.i.i = tail call i64 @___qalloc()
31+
%not_max.not.not.i.i = icmp eq i64 %qalloc.i.i, -1
32+
br i1 %not_max.not.not.i.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.i
33+
34+
cond_213_case_0.i.i: ; preds = %cond_exit_20.8.i, %cond_exit_20.7.i, %cond_exit_20.6.i, %cond_exit_20.5.i, %cond_exit_20.4.i, %cond_exit_20.3.i, %cond_exit_20.2.i, %cond_exit_20.1.i, %cond_exit_20.i, %entry
35+
tail call void @panic(i32 1001, ptr nonnull @"e_No more qu.3B2EEBF0.0")
36+
unreachable
37+
38+
__hugr__.__tk2_qalloc.218.exit.i: ; preds = %entry
39+
tail call void @___reset(i64 %qalloc.i.i)
40+
%3 = load i64, ptr %2, align 4
41+
%4 = trunc i64 %3 to i1
42+
br i1 %4, label %cond_exit_20.i, label %panic.i.i
43+
44+
panic.i.i: ; preds = %__barray_check_bounds.exit.9.i, %__hugr__.__tk2_qalloc.218.exit.8.i, %__hugr__.__tk2_qalloc.218.exit.7.i, %__hugr__.__tk2_qalloc.218.exit.6.i, %__hugr__.__tk2_qalloc.218.exit.5.i, %__hugr__.__tk2_qalloc.218.exit.4.i, %__hugr__.__tk2_qalloc.218.exit.3.i, %__hugr__.__tk2_qalloc.218.exit.2.i, %__hugr__.__tk2_qalloc.218.exit.1.i, %__hugr__.__tk2_qalloc.218.exit.i
45+
tail call void @panic(i32 1002, ptr nonnull @"e_Array alre.5A300C2A.0")
46+
unreachable
47+
48+
cond_exit_20.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.i
49+
%5 = and i64 %3, -2
50+
store i64 %5, ptr %2, align 4
51+
store i64 %qalloc.i.i, ptr %1, align 4
52+
%qalloc.i.1.i = tail call i64 @___qalloc()
53+
%not_max.not.not.i.1.i = icmp eq i64 %qalloc.i.1.i, -1
54+
br i1 %not_max.not.not.i.1.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.1.i
55+
56+
__hugr__.__tk2_qalloc.218.exit.1.i: ; preds = %cond_exit_20.i
57+
tail call void @___reset(i64 %qalloc.i.1.i)
58+
%6 = load i64, ptr %2, align 4
59+
%7 = and i64 %6, 2
60+
%.not.i = icmp eq i64 %7, 0
61+
br i1 %.not.i, label %panic.i.i, label %cond_exit_20.1.i
62+
63+
cond_exit_20.1.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.1.i
64+
%8 = and i64 %6, -3
65+
store i64 %8, ptr %2, align 4
66+
%9 = getelementptr inbounds nuw i8, ptr %1, i64 8
67+
store i64 %qalloc.i.1.i, ptr %9, align 4
68+
%qalloc.i.2.i = tail call i64 @___qalloc()
69+
%not_max.not.not.i.2.i = icmp eq i64 %qalloc.i.2.i, -1
70+
br i1 %not_max.not.not.i.2.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.2.i
71+
72+
__hugr__.__tk2_qalloc.218.exit.2.i: ; preds = %cond_exit_20.1.i
73+
tail call void @___reset(i64 %qalloc.i.2.i)
74+
%10 = load i64, ptr %2, align 4
75+
%11 = and i64 %10, 4
76+
%.not106.i = icmp eq i64 %11, 0
77+
br i1 %.not106.i, label %panic.i.i, label %cond_exit_20.2.i
78+
79+
cond_exit_20.2.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.2.i
80+
%12 = and i64 %10, -5
81+
store i64 %12, ptr %2, align 4
82+
%13 = getelementptr inbounds nuw i8, ptr %1, i64 16
83+
store i64 %qalloc.i.2.i, ptr %13, align 4
84+
%qalloc.i.3.i = tail call i64 @___qalloc()
85+
%not_max.not.not.i.3.i = icmp eq i64 %qalloc.i.3.i, -1
86+
br i1 %not_max.not.not.i.3.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.3.i
87+
88+
__hugr__.__tk2_qalloc.218.exit.3.i: ; preds = %cond_exit_20.2.i
89+
tail call void @___reset(i64 %qalloc.i.3.i)
90+
%14 = load i64, ptr %2, align 4
91+
%15 = and i64 %14, 8
92+
%.not107.i = icmp eq i64 %15, 0
93+
br i1 %.not107.i, label %panic.i.i, label %cond_exit_20.3.i
94+
95+
cond_exit_20.3.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.3.i
96+
%16 = and i64 %14, -9
97+
store i64 %16, ptr %2, align 4
98+
%17 = getelementptr inbounds nuw i8, ptr %1, i64 24
99+
store i64 %qalloc.i.3.i, ptr %17, align 4
100+
%qalloc.i.4.i = tail call i64 @___qalloc()
101+
%not_max.not.not.i.4.i = icmp eq i64 %qalloc.i.4.i, -1
102+
br i1 %not_max.not.not.i.4.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.4.i
103+
104+
__hugr__.__tk2_qalloc.218.exit.4.i: ; preds = %cond_exit_20.3.i
105+
tail call void @___reset(i64 %qalloc.i.4.i)
106+
%18 = load i64, ptr %2, align 4
107+
%19 = and i64 %18, 16
108+
%.not108.i = icmp eq i64 %19, 0
109+
br i1 %.not108.i, label %panic.i.i, label %cond_exit_20.4.i
110+
111+
cond_exit_20.4.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.4.i
112+
%20 = and i64 %18, -17
113+
store i64 %20, ptr %2, align 4
114+
%21 = getelementptr inbounds nuw i8, ptr %1, i64 32
115+
store i64 %qalloc.i.4.i, ptr %21, align 4
116+
%qalloc.i.5.i = tail call i64 @___qalloc()
117+
%not_max.not.not.i.5.i = icmp eq i64 %qalloc.i.5.i, -1
118+
br i1 %not_max.not.not.i.5.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.5.i
119+
120+
__hugr__.__tk2_qalloc.218.exit.5.i: ; preds = %cond_exit_20.4.i
121+
tail call void @___reset(i64 %qalloc.i.5.i)
122+
%22 = load i64, ptr %2, align 4
123+
%23 = and i64 %22, 32
124+
%.not109.i = icmp eq i64 %23, 0
125+
br i1 %.not109.i, label %panic.i.i, label %cond_exit_20.5.i
126+
127+
cond_exit_20.5.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.5.i
128+
%24 = and i64 %22, -33
129+
store i64 %24, ptr %2, align 4
130+
%25 = getelementptr inbounds nuw i8, ptr %1, i64 40
131+
store i64 %qalloc.i.5.i, ptr %25, align 4
132+
%qalloc.i.6.i = tail call i64 @___qalloc()
133+
%not_max.not.not.i.6.i = icmp eq i64 %qalloc.i.6.i, -1
134+
br i1 %not_max.not.not.i.6.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.6.i
135+
136+
__hugr__.__tk2_qalloc.218.exit.6.i: ; preds = %cond_exit_20.5.i
137+
tail call void @___reset(i64 %qalloc.i.6.i)
138+
%26 = load i64, ptr %2, align 4
139+
%27 = and i64 %26, 64
140+
%.not110.i = icmp eq i64 %27, 0
141+
br i1 %.not110.i, label %panic.i.i, label %cond_exit_20.6.i
142+
143+
cond_exit_20.6.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.6.i
144+
%28 = and i64 %26, -65
145+
store i64 %28, ptr %2, align 4
146+
%29 = getelementptr inbounds nuw i8, ptr %1, i64 48
147+
store i64 %qalloc.i.6.i, ptr %29, align 4
148+
%qalloc.i.7.i = tail call i64 @___qalloc()
149+
%not_max.not.not.i.7.i = icmp eq i64 %qalloc.i.7.i, -1
150+
br i1 %not_max.not.not.i.7.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.7.i
151+
152+
__hugr__.__tk2_qalloc.218.exit.7.i: ; preds = %cond_exit_20.6.i
153+
tail call void @___reset(i64 %qalloc.i.7.i)
154+
%30 = load i64, ptr %2, align 4
155+
%31 = and i64 %30, 128
156+
%.not111.i = icmp eq i64 %31, 0
157+
br i1 %.not111.i, label %panic.i.i, label %cond_exit_20.7.i
158+
159+
cond_exit_20.7.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.7.i
160+
%32 = and i64 %30, -129
161+
store i64 %32, ptr %2, align 4
162+
%33 = getelementptr inbounds nuw i8, ptr %1, i64 56
163+
store i64 %qalloc.i.7.i, ptr %33, align 4
164+
%qalloc.i.8.i = tail call i64 @___qalloc()
165+
%not_max.not.not.i.8.i = icmp eq i64 %qalloc.i.8.i, -1
166+
br i1 %not_max.not.not.i.8.i, label %cond_213_case_0.i.i, label %__hugr__.__tk2_qalloc.218.exit.8.i
167+
168+
__hugr__.__tk2_qalloc.218.exit.8.i: ; preds = %cond_exit_20.7.i
169+
tail call void @___reset(i64 %qalloc.i.8.i)
170+
%34 = load i64, ptr %2, align 4
171+
%35 = and i64 %34, 256
172+
%.not112.i = icmp eq i64 %35, 0
173+
br i1 %.not112.i, label %panic.i.i, label %cond_exit_20.8.i
174+
175+
cond_exit_20.8.i: ; preds = %__hugr__.__tk2_qalloc.218.exit.8.i
176+
%36 = and i64 %34, -257
177+
store i64 %36, ptr %2, align 4
178+
%37 = getelementptr inbounds nuw i8, ptr %1, i64 64
179+
store i64 %qalloc.i.8.i, ptr %37, align 4
180+
%qalloc.i.9.i = tail call i64 @___qalloc()
181+
%not_max.not.not.i.9.i = icmp eq i64 %qalloc.i.9.i, -1
182+
br i1 %not_max.not.not.i.9.i, label %cond_213_case_0.i.i, label %__barray_check_bounds.exit.9.i
183+
184+
__barray_check_bounds.exit.9.i: ; preds = %cond_exit_20.8.i
185+
tail call void @___reset(i64 %qalloc.i.9.i)
186+
%38 = load i64, ptr %2, align 4
187+
%39 = and i64 %38, 512
188+
%.not113.i = icmp eq i64 %39, 0
189+
br i1 %.not113.i, label %panic.i.i, label %cond_exit_20.9.i
190+
191+
cond_exit_20.9.i: ; preds = %__barray_check_bounds.exit.9.i
192+
%40 = and i64 %38, -513
193+
store i64 %40, ptr %2, align 4
194+
%41 = getelementptr inbounds nuw i8, ptr %1, i64 72
195+
store i64 %qalloc.i.9.i, ptr %41, align 4
196+
%"116.fca.0.insert.i" = insertvalue { ptr, ptr, i64 } poison, ptr %1, 0
197+
%"116.fca.1.insert.i" = insertvalue { ptr, ptr, i64 } %"116.fca.0.insert.i", ptr %2, 1
198+
%"116.fca.2.insert.i" = insertvalue { ptr, ptr, i64 } %"116.fca.1.insert.i", i64 0, 2
199+
%42 = insertvalue { { ptr, ptr, i64 }, i64 } poison, { ptr, ptr, i64 } %"116.fca.2.insert.i", 0
200+
br label %__barray_check_bounds.exit.i.i.i
201+
202+
43: ; preds = %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i"
203+
%44 = lshr i64 %.fca.1.0.0.2.extract.i.i.i, 6
204+
%45 = getelementptr i64, ptr %.fca.1.0.0.1.extract.i.i.i, i64 %44
205+
%46 = load i64, ptr %45, align 4
206+
%47 = and i64 %.fca.1.0.0.2.extract.i.i.i, 63
207+
%48 = sub nuw nsw i64 64, %47
208+
%49 = lshr i64 -1, %48
209+
%50 = icmp eq i64 %47, 0
210+
%51 = select i1 %50, i64 0, i64 %49
211+
%52 = or i64 %46, %51
212+
store i64 %52, ptr %45, align 4
213+
%last_valid.i.i.i.i = add i64 %.fca.1.0.0.2.extract.i.i.i, 9
214+
%53 = lshr i64 %last_valid.i.i.i.i, 6
215+
%54 = getelementptr inbounds nuw i64, ptr %.fca.1.0.0.1.extract.i.i.i, i64 %53
216+
%55 = load i64, ptr %54, align 4
217+
%56 = and i64 %last_valid.i.i.i.i, 63
218+
%57 = shl nsw i64 -2, %56
219+
%58 = icmp eq i64 %56, 63
220+
%59 = select i1 %58, i64 0, i64 %57
221+
%60 = or i64 %55, %59
222+
store i64 %60, ptr %54, align 4
223+
%reass.sub.i.i.i.i = sub nsw i64 %53, %44
224+
%.not.i.i.i.i = icmp eq i64 %reass.sub.i.i.i.i, -1
225+
br i1 %.not.i.i.i.i, label %__hugr__.main.1.exit, label %mask_block_ok.i.i.i.i
226+
227+
61: ; preds = %mask_block_ok.i.i.i.i
228+
%62 = add nuw i64 %.02.i.i.i.i, 1
229+
%exitcond.not.i.i.i.i = icmp eq i64 %.02.i.i.i.i, %reass.sub.i.i.i.i
230+
br i1 %exitcond.not.i.i.i.i, label %__hugr__.main.1.exit, label %mask_block_ok.i.i.i.i
231+
232+
mask_block_ok.i.i.i.i: ; preds = %43, %61
233+
%.02.i.i.i.i = phi i64 [ %62, %61 ], [ 0, %43 ]
234+
%gep.i.i.i.i = getelementptr i64, ptr %45, i64 %.02.i.i.i.i
235+
%63 = load i64, ptr %gep.i.i.i.i, align 4
236+
%64 = icmp eq i64 %63, -1
237+
br i1 %64, label %61, label %mask_block_err.i.i.i.i
238+
239+
mask_block_err.i.i.i.i: ; preds = %mask_block_ok.i.i.i.i
240+
tail call void @panic(i32 1002, ptr nonnull @"e_Array cont.EFA5AC45.0")
241+
unreachable
242+
243+
__barray_check_bounds.exit.i.i.i: ; preds = %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i", %cond_exit_20.9.i
244+
%.fca.2.extract82.i185.i.i = phi i64 [ 0, %cond_exit_20.9.i ], [ %.fca.1.0.0.2.extract.i.i.i, %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i" ]
245+
%.fca.1.extract81.i184.i.i = phi ptr [ %2, %cond_exit_20.9.i ], [ %.fca.1.0.0.1.extract.i.i.i, %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i" ]
246+
%.fca.0.extract80.i183.i.i = phi ptr [ %1, %cond_exit_20.9.i ], [ %.fca.1.0.0.0.extract.i.i.i, %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i" ]
247+
%"294_0.0182.i.i" = phi i64 [ 0, %cond_exit_20.9.i ], [ %72, %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i" ]
248+
%.pn181.i.i = phi { { ptr, ptr, i64 }, i64 } [ %42, %cond_exit_20.9.i ], [ %80, %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i" ]
249+
%65 = add i64 %"294_0.0182.i.i", %.fca.2.extract82.i185.i.i
250+
%66 = lshr i64 %65, 6
251+
%67 = getelementptr inbounds nuw i64, ptr %.fca.1.extract81.i184.i.i, i64 %66
252+
%68 = load i64, ptr %67, align 4
253+
%69 = and i64 %65, 63
254+
%70 = lshr i64 %68, %69
255+
%71 = trunc i64 %70 to i1
256+
br i1 %71, label %panic.i.i.i.i, label %"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i"
257+
258+
panic.i.i.i.i: ; preds = %__barray_check_bounds.exit.i.i.i
259+
tail call void @panic(i32 1002, ptr nonnull @"e_Array elem.E746B1A3.0")
260+
unreachable
261+
262+
"__hugr__.$ArrayIter.__next__$$t(qubit)$n(10).302.exit.thread.i.i": ; preds = %__barray_check_bounds.exit.i.i.i
263+
%72 = add nuw nsw i64 %"294_0.0182.i.i", 1
264+
%73 = shl nuw i64 1, %69
265+
%74 = xor i64 %73, %68
266+
store i64 %74, ptr %67, align 4
267+
%75 = getelementptr inbounds i64, ptr %.fca.0.extract80.i183.i.i, i64 %65
268+
%76 = load i64, ptr %75, align 4
269+
%.fca.1.0.0.0.extract.i.i.i = extractvalue { { ptr, ptr, i64 }, i64 } %.pn181.i.i, 0, 0
270+
%.fca.1.0.0.1.extract.i.i.i = extractvalue { { ptr, ptr, i64 }, i64 } %.pn181.i.i, 0, 1
271+
%.fca.1.0.0.2.extract.i.i.i = extractvalue { { ptr, ptr, i64 }, i64 } %.pn181.i.i, 0, 2
272+
%77 = insertvalue { { ptr, ptr, i64 }, i64 } %.pn181.i.i, i64 %72, 1
273+
%78 = insertvalue { { ptr, ptr, i64 }, i64 } %77, ptr %.fca.1.0.0.0.extract.i.i.i, 0, 0
274+
%79 = insertvalue { { ptr, ptr, i64 }, i64 } %78, ptr %.fca.1.0.0.1.extract.i.i.i, 0, 1
275+
%80 = insertvalue { { ptr, ptr, i64 }, i64 } %79, i64 %.fca.1.0.0.2.extract.i.i.i, 0, 2
276+
tail call void @___qfree(i64 %76)
277+
%.not.i.i = icmp eq i64 %"294_0.0182.i.i", 9
278+
br i1 %.not.i.i, label %43, label %__barray_check_bounds.exit.i.i.i
279+
280+
__hugr__.main.1.exit: ; preds = %61, %43
281+
tail call void @heap_free(ptr %.fca.1.0.0.0.extract.i.i.i)
282+
tail call void @heap_free(ptr nonnull %.fca.1.0.0.1.extract.i.i.i)
283+
%81 = tail call i64 @teardown()
284+
ret i64 %81
285+
}
286+
287+
declare void @setup(i64) local_unnamed_addr
288+
289+
declare i64 @teardown() local_unnamed_addr
290+
291+
attributes #0 = { noreturn }
292+
293+
!name = !{!0}
294+
295+
!0 = !{!"mainlib"}

0 commit comments

Comments
 (0)