microsoft/qdk

Public

mirrored fromhttps://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.0.33

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

compiler/qsc_codegen/src/qir_base/tests.rs

1000lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#![allow(clippy::too_many_lines)]
5#![allow(clippy::needless_raw_string_hashes)]
6
7use std::sync::Arc;
8
9use expect_test::{expect, Expect};
10use indoc::indoc;
11use qsc_frontend::compile::{self, compile, PackageStore, RuntimeCapabilityFlags, SourceMap};
12use qsc_passes::{run_core_passes, run_default_passes, PackageType};
13
14use crate::qir_base::generate_qir;
15
16fn check(program: &str, expr: Option<&str>, expect: &Expect) {
17 let mut core = compile::core();
18 assert!(run_core_passes(&mut core).is_empty());
19 let mut store = PackageStore::new(core);
20 let mut std = compile::std(&store, RuntimeCapabilityFlags::empty());
21 assert!(run_default_passes(
22 store.core(),
23 &mut std,
24 PackageType::Lib,
25 RuntimeCapabilityFlags::empty()
26 )
27 .is_empty());
28 let std = store.insert(std);
29
30 let expr_as_arc: Option<Arc<str>> = expr.map(|s| Arc::from(s.to_string()));
31 let sources = SourceMap::new([("test".into(), program.into())], expr_as_arc);
32
33 let mut unit = compile(&store, &[std], sources, RuntimeCapabilityFlags::empty());
34 assert!(unit.errors.is_empty(), "{:?}", unit.errors);
35 assert!(run_default_passes(
36 store.core(),
37 &mut unit,
38 PackageType::Exe,
39 RuntimeCapabilityFlags::empty()
40 )
41 .is_empty());
42 let package = store.insert(unit);
43
44 let qir = generate_qir(&store, package);
45 match qir {
46 Ok(qir) => expect.assert_eq(&qir),
47 Err((err, _)) => expect.assert_debug_eq(&err),
48 }
49}
50
51#[test]
52fn simple_entry_program_is_valid() {
53 check(
54 indoc! {r#"
55 namespace Sample {
56 @EntryPoint()
57 operation Entry() : Result
58 {
59 use q = Qubit();
60 H(q);
61 M(q)
62 }
63 }
64 "#},
65 None,
66 &expect![[r#"
67 %Result = type opaque
68 %Qubit = type opaque
69
70 define void @ENTRYPOINT__main() #0 {
71 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
72 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
73 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
74 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
75 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
76 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
77 ret void
78 }
79
80 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
81 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
82 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
83 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
84 declare void @__quantum__qis__rx__body(double, %Qubit*)
85 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
86 declare void @__quantum__qis__ry__body(double, %Qubit*)
87 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
88 declare void @__quantum__qis__rz__body(double, %Qubit*)
89 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
90 declare void @__quantum__qis__h__body(%Qubit*)
91 declare void @__quantum__qis__s__body(%Qubit*)
92 declare void @__quantum__qis__s__adj(%Qubit*)
93 declare void @__quantum__qis__t__body(%Qubit*)
94 declare void @__quantum__qis__t__adj(%Qubit*)
95 declare void @__quantum__qis__x__body(%Qubit*)
96 declare void @__quantum__qis__y__body(%Qubit*)
97 declare void @__quantum__qis__z__body(%Qubit*)
98 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
99 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
100 declare void @__quantum__rt__result_record_output(%Result*, i8*)
101 declare void @__quantum__rt__array_record_output(i64, i8*)
102 declare void @__quantum__rt__tuple_record_output(i64, i8*)
103
104 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="2" "required_num_results"="1" }
105 attributes #1 = { "irreversible" }
106
107 ; module flags
108
109 !llvm.module.flags = !{!0, !1, !2, !3}
110
111 !0 = !{i32 1, !"qir_major_version", i32 1}
112 !1 = !{i32 7, !"qir_minor_version", i32 0}
113 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
114 !3 = !{i32 1, !"dynamic_result_management", i1 false}
115 "#]],
116 );
117}
118
119#[test]
120fn simple_program_is_valid() {
121 check(
122 "",
123 Some(indoc! {r#"
124 {
125 use q = Qubit();
126 H(q);
127 M(q)
128 }
129 "#}),
130 &expect![[r#"
131 %Result = type opaque
132 %Qubit = type opaque
133
134 define void @ENTRYPOINT__main() #0 {
135 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
136 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
137 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
138 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
139 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
140 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
141 ret void
142 }
143
144 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
145 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
146 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
147 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
148 declare void @__quantum__qis__rx__body(double, %Qubit*)
149 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
150 declare void @__quantum__qis__ry__body(double, %Qubit*)
151 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
152 declare void @__quantum__qis__rz__body(double, %Qubit*)
153 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
154 declare void @__quantum__qis__h__body(%Qubit*)
155 declare void @__quantum__qis__s__body(%Qubit*)
156 declare void @__quantum__qis__s__adj(%Qubit*)
157 declare void @__quantum__qis__t__body(%Qubit*)
158 declare void @__quantum__qis__t__adj(%Qubit*)
159 declare void @__quantum__qis__x__body(%Qubit*)
160 declare void @__quantum__qis__y__body(%Qubit*)
161 declare void @__quantum__qis__z__body(%Qubit*)
162 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
163 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
164 declare void @__quantum__rt__result_record_output(%Result*, i8*)
165 declare void @__quantum__rt__array_record_output(i64, i8*)
166 declare void @__quantum__rt__tuple_record_output(i64, i8*)
167
168 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="2" "required_num_results"="1" }
169 attributes #1 = { "irreversible" }
170
171 ; module flags
172
173 !llvm.module.flags = !{!0, !1, !2, !3}
174
175 !0 = !{i32 1, !"qir_major_version", i32 1}
176 !1 = !{i32 7, !"qir_minor_version", i32 0}
177 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
178 !3 = !{i32 1, !"dynamic_result_management", i1 false}
179 "#]],
180 );
181}
182
183#[test]
184fn output_recording_array() {
185 check(
186 "",
187 Some(indoc! {"{use q = Qubit(); [M(q), M(q)]}"}),
188 &expect![[r#"
189 %Result = type opaque
190 %Qubit = type opaque
191
192 define void @ENTRYPOINT__main() #0 {
193 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
194 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
195 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
196 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
197 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
198 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
199 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
200 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
201 call void @__quantum__rt__array_record_output(i64 2, i8* null)
202 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
203 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
204 ret void
205 }
206
207 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
208 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
209 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
210 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
211 declare void @__quantum__qis__rx__body(double, %Qubit*)
212 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
213 declare void @__quantum__qis__ry__body(double, %Qubit*)
214 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
215 declare void @__quantum__qis__rz__body(double, %Qubit*)
216 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
217 declare void @__quantum__qis__h__body(%Qubit*)
218 declare void @__quantum__qis__s__body(%Qubit*)
219 declare void @__quantum__qis__s__adj(%Qubit*)
220 declare void @__quantum__qis__t__body(%Qubit*)
221 declare void @__quantum__qis__t__adj(%Qubit*)
222 declare void @__quantum__qis__x__body(%Qubit*)
223 declare void @__quantum__qis__y__body(%Qubit*)
224 declare void @__quantum__qis__z__body(%Qubit*)
225 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
226 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
227 declare void @__quantum__rt__result_record_output(%Result*, i8*)
228 declare void @__quantum__rt__array_record_output(i64, i8*)
229 declare void @__quantum__rt__tuple_record_output(i64, i8*)
230
231 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="3" "required_num_results"="2" }
232 attributes #1 = { "irreversible" }
233
234 ; module flags
235
236 !llvm.module.flags = !{!0, !1, !2, !3}
237
238 !0 = !{i32 1, !"qir_major_version", i32 1}
239 !1 = !{i32 7, !"qir_minor_version", i32 0}
240 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
241 !3 = !{i32 1, !"dynamic_result_management", i1 false}
242 "#]],
243 );
244}
245
246#[test]
247fn output_recording_tuple() {
248 check(
249 "",
250 Some(indoc! {"{use q = Qubit(); (M(q), M(q))}"}),
251 &expect![[r#"
252 %Result = type opaque
253 %Qubit = type opaque
254
255 define void @ENTRYPOINT__main() #0 {
256 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
257 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
258 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
259 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
260 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
261 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
262 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
263 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
264 call void @__quantum__rt__tuple_record_output(i64 2, i8* null)
265 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
266 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
267 ret void
268 }
269
270 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
271 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
272 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
273 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
274 declare void @__quantum__qis__rx__body(double, %Qubit*)
275 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
276 declare void @__quantum__qis__ry__body(double, %Qubit*)
277 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
278 declare void @__quantum__qis__rz__body(double, %Qubit*)
279 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
280 declare void @__quantum__qis__h__body(%Qubit*)
281 declare void @__quantum__qis__s__body(%Qubit*)
282 declare void @__quantum__qis__s__adj(%Qubit*)
283 declare void @__quantum__qis__t__body(%Qubit*)
284 declare void @__quantum__qis__t__adj(%Qubit*)
285 declare void @__quantum__qis__x__body(%Qubit*)
286 declare void @__quantum__qis__y__body(%Qubit*)
287 declare void @__quantum__qis__z__body(%Qubit*)
288 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
289 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
290 declare void @__quantum__rt__result_record_output(%Result*, i8*)
291 declare void @__quantum__rt__array_record_output(i64, i8*)
292 declare void @__quantum__rt__tuple_record_output(i64, i8*)
293
294 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="3" "required_num_results"="2" }
295 attributes #1 = { "irreversible" }
296
297 ; module flags
298
299 !llvm.module.flags = !{!0, !1, !2, !3}
300
301 !0 = !{i32 1, !"qir_major_version", i32 1}
302 !1 = !{i32 7, !"qir_minor_version", i32 0}
303 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
304 !3 = !{i32 1, !"dynamic_result_management", i1 false}
305 "#]],
306 );
307}
308
309#[test]
310fn reset_allocates_new_qubit_id() {
311 check(
312 "",
313 Some(indoc! {"{use q = Qubit(); H(q); Reset(q); H(q); M(q)}"}),
314 &expect![[r#"
315 %Result = type opaque
316 %Qubit = type opaque
317
318 define void @ENTRYPOINT__main() #0 {
319 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
320 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
321 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
322 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
323 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
324 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
325 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
326 ret void
327 }
328
329 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
330 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
331 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
332 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
333 declare void @__quantum__qis__rx__body(double, %Qubit*)
334 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
335 declare void @__quantum__qis__ry__body(double, %Qubit*)
336 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
337 declare void @__quantum__qis__rz__body(double, %Qubit*)
338 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
339 declare void @__quantum__qis__h__body(%Qubit*)
340 declare void @__quantum__qis__s__body(%Qubit*)
341 declare void @__quantum__qis__s__adj(%Qubit*)
342 declare void @__quantum__qis__t__body(%Qubit*)
343 declare void @__quantum__qis__t__adj(%Qubit*)
344 declare void @__quantum__qis__x__body(%Qubit*)
345 declare void @__quantum__qis__y__body(%Qubit*)
346 declare void @__quantum__qis__z__body(%Qubit*)
347 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
348 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
349 declare void @__quantum__rt__result_record_output(%Result*, i8*)
350 declare void @__quantum__rt__array_record_output(i64, i8*)
351 declare void @__quantum__rt__tuple_record_output(i64, i8*)
352
353 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="3" "required_num_results"="1" }
354 attributes #1 = { "irreversible" }
355
356 ; module flags
357
358 !llvm.module.flags = !{!0, !1, !2, !3}
359
360 !0 = !{i32 1, !"qir_major_version", i32 1}
361 !1 = !{i32 7, !"qir_minor_version", i32 0}
362 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
363 !3 = !{i32 1, !"dynamic_result_management", i1 false}
364 "#]],
365 );
366}
367
368#[test]
369fn reuse_after_measurement_uses_fresh_aux_qubit_id() {
370 check(
371 "",
372 Some(indoc! {"{use q = Qubit(); H(q); M(q); H(q); M(q)}"}),
373 &expect![[r#"
374 %Result = type opaque
375 %Qubit = type opaque
376
377 define void @ENTRYPOINT__main() #0 {
378 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
379 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
380 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
381 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*))
382 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
383 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
384 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
385 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
386 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
387 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
388 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
389 ret void
390 }
391
392 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
393 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
394 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
395 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
396 declare void @__quantum__qis__rx__body(double, %Qubit*)
397 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
398 declare void @__quantum__qis__ry__body(double, %Qubit*)
399 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
400 declare void @__quantum__qis__rz__body(double, %Qubit*)
401 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
402 declare void @__quantum__qis__h__body(%Qubit*)
403 declare void @__quantum__qis__s__body(%Qubit*)
404 declare void @__quantum__qis__s__adj(%Qubit*)
405 declare void @__quantum__qis__t__body(%Qubit*)
406 declare void @__quantum__qis__t__adj(%Qubit*)
407 declare void @__quantum__qis__x__body(%Qubit*)
408 declare void @__quantum__qis__y__body(%Qubit*)
409 declare void @__quantum__qis__z__body(%Qubit*)
410 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
411 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
412 declare void @__quantum__rt__result_record_output(%Result*, i8*)
413 declare void @__quantum__rt__array_record_output(i64, i8*)
414 declare void @__quantum__rt__tuple_record_output(i64, i8*)
415
416 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="3" "required_num_results"="2" }
417 attributes #1 = { "irreversible" }
418
419 ; module flags
420
421 !llvm.module.flags = !{!0, !1, !2, !3}
422
423 !0 = !{i32 1, !"qir_major_version", i32 1}
424 !1 = !{i32 7, !"qir_minor_version", i32 0}
425 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
426 !3 = !{i32 1, !"dynamic_result_management", i1 false}
427 "#]],
428 );
429}
430
431#[test]
432fn qubit_allocation_allows_reuse_of_unmeasured_qubits() {
433 check(
434 "",
435 Some(indoc! {"{
436 open Microsoft.Quantum.Measurement;
437 { use (c, q) = (Qubit(), Qubit()); CNOT(c, q); MResetZ(q); }
438 { use (c, q) = (Qubit(), Qubit()); CNOT(c, q); MResetZ(q) }
439 }"}),
440 &expect![[r#"
441 %Result = type opaque
442 %Qubit = type opaque
443
444 define void @ENTRYPOINT__main() #0 {
445 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
446 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
447 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
448 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
449 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
450 ret void
451 }
452
453 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
454 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
455 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
456 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
457 declare void @__quantum__qis__rx__body(double, %Qubit*)
458 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
459 declare void @__quantum__qis__ry__body(double, %Qubit*)
460 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
461 declare void @__quantum__qis__rz__body(double, %Qubit*)
462 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
463 declare void @__quantum__qis__h__body(%Qubit*)
464 declare void @__quantum__qis__s__body(%Qubit*)
465 declare void @__quantum__qis__s__adj(%Qubit*)
466 declare void @__quantum__qis__t__body(%Qubit*)
467 declare void @__quantum__qis__t__adj(%Qubit*)
468 declare void @__quantum__qis__x__body(%Qubit*)
469 declare void @__quantum__qis__y__body(%Qubit*)
470 declare void @__quantum__qis__z__body(%Qubit*)
471 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
472 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
473 declare void @__quantum__rt__result_record_output(%Result*, i8*)
474 declare void @__quantum__rt__array_record_output(i64, i8*)
475 declare void @__quantum__rt__tuple_record_output(i64, i8*)
476
477 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="3" "required_num_results"="2" }
478 attributes #1 = { "irreversible" }
479
480 ; module flags
481
482 !llvm.module.flags = !{!0, !1, !2, !3}
483
484 !0 = !{i32 1, !"qir_major_version", i32 1}
485 !1 = !{i32 7, !"qir_minor_version", i32 0}
486 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
487 !3 = !{i32 1, !"dynamic_result_management", i1 false}
488 "#]],
489 );
490}
491
492#[test]
493fn verify_all_intrinsics() {
494 check(
495 "",
496 Some(indoc! {"{
497 use (q1, q2, q3) = (Qubit(), Qubit(), Qubit());
498 CCNOT(q1, q2, q3);
499 CX(q1, q2);
500 CY(q1, q2);
501 CZ(q1, q2);
502 Rx(0.0, q1);
503 Rxx(0.0, q1, q2);
504 Ry(0.0, q1);
505 Ryy(0.0, q1, q2);
506 Rz(0.0, q1);
507 Rzz(0.0, q1, q2);
508 H(q1);
509 S(q1);
510 Adjoint S(q1);
511 T(q1);
512 Adjoint T(q1);
513 X(q1);
514 Y(q1);
515 Z(q1);
516 SWAP(q1, q2);
517 Reset(q1);
518 (M(q1),
519 Microsoft.Quantum.Measurement.MResetZ(q1))
520 }"}),
521 &expect![[r#"
522 %Result = type opaque
523 %Qubit = type opaque
524
525 define void @ENTRYPOINT__main() #0 {
526 call void @__quantum__qis__ccx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
527 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
528 call void @__quantum__qis__cy__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
529 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
530 call void @__quantum__qis__rx__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*))
531 call void @__quantum__qis__rxx__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
532 call void @__quantum__qis__ry__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*))
533 call void @__quantum__qis__ryy__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
534 call void @__quantum__qis__rz__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*))
535 call void @__quantum__qis__rzz__body(double 0.0, %Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
536 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
537 call void @__quantum__qis__s__body(%Qubit* inttoptr (i64 0 to %Qubit*))
538 call void @__quantum__qis__s__adj(%Qubit* inttoptr (i64 0 to %Qubit*))
539 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 0 to %Qubit*))
540 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 0 to %Qubit*))
541 call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 0 to %Qubit*))
542 call void @__quantum__qis__y__body(%Qubit* inttoptr (i64 0 to %Qubit*))
543 call void @__quantum__qis__z__body(%Qubit* inttoptr (i64 0 to %Qubit*))
544 call void @__quantum__qis__swap__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
545 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
546 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
547 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
548 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
549 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
550 call void @__quantum__rt__tuple_record_output(i64 2, i8* null)
551 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
552 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
553 ret void
554 }
555
556 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
557 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
558 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
559 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
560 declare void @__quantum__qis__rx__body(double, %Qubit*)
561 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
562 declare void @__quantum__qis__ry__body(double, %Qubit*)
563 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
564 declare void @__quantum__qis__rz__body(double, %Qubit*)
565 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
566 declare void @__quantum__qis__h__body(%Qubit*)
567 declare void @__quantum__qis__s__body(%Qubit*)
568 declare void @__quantum__qis__s__adj(%Qubit*)
569 declare void @__quantum__qis__t__body(%Qubit*)
570 declare void @__quantum__qis__t__adj(%Qubit*)
571 declare void @__quantum__qis__x__body(%Qubit*)
572 declare void @__quantum__qis__y__body(%Qubit*)
573 declare void @__quantum__qis__z__body(%Qubit*)
574 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
575 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
576 declare void @__quantum__rt__result_record_output(%Result*, i8*)
577 declare void @__quantum__rt__array_record_output(i64, i8*)
578 declare void @__quantum__rt__tuple_record_output(i64, i8*)
579
580 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="5" "required_num_results"="2" }
581 attributes #1 = { "irreversible" }
582
583 ; module flags
584
585 !llvm.module.flags = !{!0, !1, !2, !3}
586
587 !0 = !{i32 1, !"qir_major_version", i32 1}
588 !1 = !{i32 7, !"qir_minor_version", i32 0}
589 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
590 !3 = !{i32 1, !"dynamic_result_management", i1 false}
591 "#]],
592 );
593}
594
595#[test]
596fn complex_program_is_valid() {
597 check(
598 "",
599 Some(indoc! {"{
600 open Microsoft.Quantum.Measurement;
601 open Microsoft.Quantum.Math;
602
603 operation SWAPfromExp(q1 : Qubit, q2 : Qubit) : Unit is Ctl + Adj {
604 let theta = PI() / 4.0;
605 Exp([PauliX, PauliX], theta, [q1, q2]);
606 Exp([PauliY, PauliY], theta, [q1, q2]);
607 Exp([PauliZ, PauliZ], theta, [q1, q2]);
608 }
609
610 use (aux, ctls, qs) = (Qubit(), Qubit[3], Qubit[2]);
611 within {
612 H(aux);
613 ApplyToEachA(CNOT(aux, _), ctls + qs);
614 }
615 apply {
616 Controlled SWAPfromExp(ctls, (qs[0], qs[1]));
617
618 Controlled Adjoint SWAP(ctls, (qs[0], qs[1]));
619 }
620
621 MResetEachZ([aux] + ctls + qs)
622 }"}),
623 &expect![[r#"
624 %Result = type opaque
625 %Qubit = type opaque
626
627 define void @ENTRYPOINT__main() #0 {
628 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
629 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
630 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
631 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
632 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
633 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
634 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
635 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
636 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
637 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
638 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 1 to %Qubit*))
639 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
640 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
641 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
642 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
643 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
644 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
645 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
646 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
647 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
648 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
649 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 3 to %Qubit*))
650 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 7 to %Qubit*))
651 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
652 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
653 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
654 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
655 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
656 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
657 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
658 call void @__quantum__qis__rz__body(double -0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
659 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
660 call void @__quantum__qis__rz__body(double 0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
661 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
662 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
663 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
664 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
665 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
666 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
667 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
668 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
669 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 7 to %Qubit*))
670 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 3 to %Qubit*))
671 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
672 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
673 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
674 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
675 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
676 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
677 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
678 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
679 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
680 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
681 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 1 to %Qubit*))
682 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
683 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
684 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
685 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
686 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
687 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
688 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
689 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
690 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 1 to %Qubit*))
691 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
692 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
693 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
694 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
695 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
696 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
697 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
698 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
699 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
700 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
701 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 3 to %Qubit*))
702 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 7 to %Qubit*))
703 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
704 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
705 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
706 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
707 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
708 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
709 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
710 call void @__quantum__qis__s__body(%Qubit* inttoptr (i64 4 to %Qubit*))
711 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
712 call void @__quantum__qis__rz__body(double -0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
713 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
714 call void @__quantum__qis__rz__body(double 0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
715 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
716 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
717 call void @__quantum__qis__s__adj(%Qubit* inttoptr (i64 4 to %Qubit*))
718 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 4 to %Qubit*))
719 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
720 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
721 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
722 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
723 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
724 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
725 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 7 to %Qubit*))
726 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 3 to %Qubit*))
727 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
728 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
729 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
730 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
731 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
732 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
733 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
734 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
735 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
736 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
737 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 1 to %Qubit*))
738 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
739 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
740 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
741 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
742 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
743 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
744 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
745 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
746 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 1 to %Qubit*))
747 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
748 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
749 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
750 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
751 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
752 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
753 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
754 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
755 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
756 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
757 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 3 to %Qubit*))
758 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 7 to %Qubit*))
759 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
760 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
761 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
762 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
763 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
764 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
765 call void @__quantum__qis__rz__body(double -0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
766 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
767 call void @__quantum__qis__rz__body(double 0.7853981633974483, %Qubit* inttoptr (i64 4 to %Qubit*))
768 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
769 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
770 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
771 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
772 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
773 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
774 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
775 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 7 to %Qubit*))
776 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 3 to %Qubit*))
777 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
778 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*))
779 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
780 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
781 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
782 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
783 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
784 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
785 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
786 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
787 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 1 to %Qubit*))
788 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
789 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
790 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
791 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
792 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
793 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
794 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
795 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
796 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
797 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 1 to %Qubit*))
798 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 6 to %Qubit*))
799 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
800 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
801 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
802 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
803 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
804 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
805 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
806 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
807 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 5 to %Qubit*))
808 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 3 to %Qubit*))
809 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 7 to %Qubit*))
810 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
811 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
812 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 5 to %Qubit*))
813 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
814 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
815 call void @__quantum__qis__ccx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
816 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
817 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
818 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 5 to %Qubit*))
819 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
820 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
821 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 7 to %Qubit*))
822 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 3 to %Qubit*))
823 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 5 to %Qubit*))
824 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
825 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
826 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
827 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
828 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
829 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 2 to %Qubit*))
830 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
831 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
832 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 6 to %Qubit*))
833 call void @__quantum__qis__t__body(%Qubit* inttoptr (i64 1 to %Qubit*))
834 call void @__quantum__qis__t__adj(%Qubit* inttoptr (i64 2 to %Qubit*))
835 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
836 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
837 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
838 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
839 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
840 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
841 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 3 to %Qubit*))
842 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*))
843 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
844 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*))
845 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
846 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
847 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 2 to %Result*)) #1
848 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 3 to %Result*)) #1
849 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 4 to %Result*)) #1
850 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 5 to %Qubit*), %Result* inttoptr (i64 5 to %Result*)) #1
851 call void @__quantum__rt__array_record_output(i64 6, i8* null)
852 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
853 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
854 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 2 to %Result*), i8* null)
855 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 3 to %Result*), i8* null)
856 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 4 to %Result*), i8* null)
857 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 5 to %Result*), i8* null)
858 ret void
859 }
860
861 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
862 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
863 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
864 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
865 declare void @__quantum__qis__rx__body(double, %Qubit*)
866 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
867 declare void @__quantum__qis__ry__body(double, %Qubit*)
868 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
869 declare void @__quantum__qis__rz__body(double, %Qubit*)
870 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
871 declare void @__quantum__qis__h__body(%Qubit*)
872 declare void @__quantum__qis__s__body(%Qubit*)
873 declare void @__quantum__qis__s__adj(%Qubit*)
874 declare void @__quantum__qis__t__body(%Qubit*)
875 declare void @__quantum__qis__t__adj(%Qubit*)
876 declare void @__quantum__qis__x__body(%Qubit*)
877 declare void @__quantum__qis__y__body(%Qubit*)
878 declare void @__quantum__qis__z__body(%Qubit*)
879 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
880 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
881 declare void @__quantum__rt__result_record_output(%Result*, i8*)
882 declare void @__quantum__rt__array_record_output(i64, i8*)
883 declare void @__quantum__rt__tuple_record_output(i64, i8*)
884
885 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="8" "required_num_results"="6" }
886 attributes #1 = { "irreversible" }
887
888 ; module flags
889
890 !llvm.module.flags = !{!0, !1, !2, !3}
891
892 !0 = !{i32 1, !"qir_major_version", i32 1}
893 !1 = !{i32 7, !"qir_minor_version", i32 0}
894 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
895 !3 = !{i32 1, !"dynamic_result_management", i1 false}
896 "#]],
897 );
898}
899
900#[test]
901fn qubit_ids_properly_reused() {
902 check(
903 indoc! {"
904 namespace Test {
905
906 open Microsoft.Quantum.Intrinsic;
907 open Microsoft.Quantum.Measurement;
908
909 // Verifies the use of the CNOT quantum gate from Q#'s Microsoft.Quantum.Intrinsic namespace.
910 // Expected simulation output: ([0, 0], [1, 1]).
911 @EntryPoint()
912 operation IntrinsicCNOT() : (Result[], Result[]) {
913 use registerA = Qubit[2]; // |00⟩
914 CNOT(registerA[0], registerA[1]); // |00⟩
915 let resultsA = MeasureEachZ(registerA);
916 ResetAll(registerA);
917
918 use registerB = Qubit[2]; // |00⟩
919 X(registerB[0]); // |10⟩
920 CNOT(registerB[0], registerB[1]); // |11⟩
921 let resultsB = MeasureEachZ(registerB);
922 ResetAll(registerB);
923
924 return (resultsA, resultsB);
925 }
926 }
927 "},
928 Some("Test.IntrinsicCNOT()"),
929 &expect![[r#"
930 %Result = type opaque
931 %Qubit = type opaque
932
933 define void @ENTRYPOINT__main() #0 {
934 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
935 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
936 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 0 to %Qubit*))
937 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*))
938 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
939 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*))
940 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 3 to %Qubit*))
941 call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 4 to %Qubit*))
942 call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
943 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
944 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*))
945 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 6 to %Qubit*))
946 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
947 call void @__quantum__qis__cz__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Qubit* inttoptr (i64 5 to %Qubit*))
948 call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 7 to %Qubit*))
949 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) #1
950 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) #1
951 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 6 to %Qubit*), %Result* inttoptr (i64 2 to %Result*)) #1
952 call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 7 to %Qubit*), %Result* inttoptr (i64 3 to %Result*)) #1
953 call void @__quantum__rt__tuple_record_output(i64 2, i8* null)
954 call void @__quantum__rt__array_record_output(i64 2, i8* null)
955 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* null)
956 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* null)
957 call void @__quantum__rt__array_record_output(i64 2, i8* null)
958 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 2 to %Result*), i8* null)
959 call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 3 to %Result*), i8* null)
960 ret void
961 }
962
963 declare void @__quantum__qis__ccx__body(%Qubit*, %Qubit*, %Qubit*)
964 declare void @__quantum__qis__cx__body(%Qubit*, %Qubit*)
965 declare void @__quantum__qis__cy__body(%Qubit*, %Qubit*)
966 declare void @__quantum__qis__cz__body(%Qubit*, %Qubit*)
967 declare void @__quantum__qis__rx__body(double, %Qubit*)
968 declare void @__quantum__qis__rxx__body(double, %Qubit*, %Qubit*)
969 declare void @__quantum__qis__ry__body(double, %Qubit*)
970 declare void @__quantum__qis__ryy__body(double, %Qubit*, %Qubit*)
971 declare void @__quantum__qis__rz__body(double, %Qubit*)
972 declare void @__quantum__qis__rzz__body(double, %Qubit*, %Qubit*)
973 declare void @__quantum__qis__h__body(%Qubit*)
974 declare void @__quantum__qis__s__body(%Qubit*)
975 declare void @__quantum__qis__s__adj(%Qubit*)
976 declare void @__quantum__qis__t__body(%Qubit*)
977 declare void @__quantum__qis__t__adj(%Qubit*)
978 declare void @__quantum__qis__x__body(%Qubit*)
979 declare void @__quantum__qis__y__body(%Qubit*)
980 declare void @__quantum__qis__z__body(%Qubit*)
981 declare void @__quantum__qis__swap__body(%Qubit*, %Qubit*)
982 declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1
983 declare void @__quantum__rt__result_record_output(%Result*, i8*)
984 declare void @__quantum__rt__array_record_output(i64, i8*)
985 declare void @__quantum__rt__tuple_record_output(i64, i8*)
986
987 attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="base_profile" "required_num_qubits"="8" "required_num_results"="4" }
988 attributes #1 = { "irreversible" }
989
990 ; module flags
991
992 !llvm.module.flags = !{!0, !1, !2, !3}
993
994 !0 = !{i32 1, !"qir_major_version", i32 1}
995 !1 = !{i32 7, !"qir_minor_version", i32 0}
996 !2 = !{i32 1, !"dynamic_qubit_management", i1 false}
997 !3 = !{i32 1, !"dynamic_result_management", i1 false}
998 "#]],
999 );
1000}
1001