; type definitions %Result = type opaque %Qubit = type opaque ; global constants (labels for output recording) @0 = internal constant [5 x i8] c"0_t0\00" @1 = internal constant [5 x i8] c"0_t1\00" ; entry point definition define i64 @TeleportChain() local_unnamed_addr #0 { entry: ; calls to initialize the execution environment call void @__quantum__rt__initialize(i8* null) br label %body body: ; preds = %entry tail call void @__quantum__qis__h__body(%Qubit* null) tail call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* nonnull inttoptr (i64 1 to %Qubit*)) tail call void @__quantum__qis__h__body(%Qubit* nonnull inttoptr (i64 2 to %Qubit*)) tail call void @__quantum__qis__cnot__body(%Qubit* nonnull inttoptr (i64 2 to %Qubit*), %Qubit* nonnull inttoptr (i64 4 to %Qubit*)) tail call void @__quantum__qis__h__body(%Qubit* nonnull inttoptr (i64 3 to %Qubit*)) tail call void @__quantum__qis__cnot__body(%Qubit* nonnull inttoptr (i64 3 to %Qubit*), %Qubit* nonnull inttoptr (i64 5 to %Qubit*)) tail call void @__quantum__qis__cnot__body(%Qubit* nonnull inttoptr (i64 1 to %Qubit*), %Qubit* nonnull inttoptr (i64 2 to %Qubit*)) tail call void @__quantum__qis__h__body(%Qubit* nonnull inttoptr (i64 1 to %Qubit*)) ; Conditionally terminating loop br label %loop loop: ; preds = %loop, %body call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__mz__body(%Qubit* null, %Result* writeonly null) call void @__quantum__qis__reset__body(%Qubit* null) %c0 = call i1 @__quantum__rt__read_result(%Result* readonly null) br i1 %c0, label %cont, label %loop cont: ; preds = %loop tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 1 to %Qubit*), %Result* writeonly null) tail call void @__quantum__qis__reset__body(%Qubit* nonnull inttoptr (i64 1 to %Qubit*)) %0 = tail call i1 @__quantum__rt__read_result(%Result* readonly null) br i1 %0, label %then__1, label %continue__1 ; conditional quantum gate (only one in this block, but many can appear and the full quantum instruction set should be usable) then__1: ; preds = %cont tail call void @__quantum__qis__z__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*)) br label %continue__1 continue__1: ; preds = %then__1, %cont tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 2 to %Qubit*), %Result* writeonly nonnull inttoptr (i64 1 to %Result*)) tail call void @__quantum__qis__reset__body(%Qubit* nonnull inttoptr (i64 2 to %Qubit*)) %1 = tail call i1 @__quantum__rt__read_result(%Result* readonly nonnull inttoptr (i64 1 to %Result*)) br i1 %1, label %then__2, label %continue__2 then__2: ; preds = %continue__1 tail call void @__quantum__qis__x__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*)) br label %continue__2 continue__2: ; preds = %then__2, %continue__1 tail call void @__quantum__qis__cnot__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*), %Qubit* nonnull inttoptr (i64 3 to %Qubit*)) tail call void @__quantum__qis__h__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*)) tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*), %Result* writeonly nonnull inttoptr (i64 2 to %Result*)) tail call void @__quantum__qis__reset__body(%Qubit* nonnull inttoptr (i64 4 to %Qubit*)) %2 = tail call i1 @__quantum__rt__read_result(%Result* readonly nonnull inttoptr (i64 2 to %Result*)) br i1 %2, label %then__3, label %continue__3 then__3: ; preds = %continue__2 tail call void @__quantum__qis__z__body(%Qubit* nonnull inttoptr (i64 5 to %Qubit*)) br label %continue__3 continue__3: ; preds = %then__3, %continue__2 tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 3 to %Qubit*), %Result* writeonly nonnull inttoptr (i64 3 to %Result*)) tail call void @__quantum__qis__reset__body(%Qubit* nonnull inttoptr (i64 3 to %Qubit*)) %3 = tail call i1 @__quantum__rt__read_result(%Result* readonly nonnull inttoptr (i64 3 to %Result*)) br i1 %3, label %then__4, label %continue__4 then__4: ; preds = %continue__3 tail call void @__quantum__qis__x__body(%Qubit* nonnull inttoptr (i64 5 to %Qubit*)) br label %continue__4 continue__4: ; preds = %continue__3, %then__4 tail call void @__quantum__qis__mz__body(%Qubit* null, %Result* writeonly nonnull inttoptr (i64 4 to %Result*)) tail call void @__quantum__qis__reset__body(%Qubit* null) tail call void @__quantum__qis__mz__body(%Qubit* nonnull inttoptr (i64 5 to %Qubit*), %Result* writeonly nonnull inttoptr (i64 5 to %Result*)) tail call void @__quantum__qis__reset__body(%Qubit* nonnull inttoptr (i64 5 to %Qubit*)) br label %exit exit: call void @__quantum__rt__result_record_output(%Result* nonnull inttoptr (i64 4 to %Result*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__result_record_output(%Result* nonnull inttoptr (i64 5 to %Result*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @1, i32 0, i32 0)) ret i64 0 } ; declarations of QIS functions declare void @__quantum__qis__cnot__body(%Qubit*, %Qubit*) local_unnamed_addr declare void @__quantum__qis__h__body(%Qubit*) local_unnamed_addr declare void @__quantum__qis__x__body(%Qubit*) local_unnamed_addr declare void @__quantum__qis__z__body(%Qubit*) local_unnamed_addr declare void @__quantum__qis__reset__body(%Qubit*) local_unnamed_addr declare void @__quantum__qis__mz__body(%Qubit*, %Result* writeonly) #1 ; declarations of runtime functions declare void @__quantum__rt__initialize(i8*) declare i1 @__quantum__rt__read_result(%Result* readonly) declare void @__quantum__rt__result_record_output(%Result*, i8*) ; attributes attributes #0 = { "entry_point" "qir_profiles"="adaptive_profile" "output_labeling_schema"="schema_id" "required_num_qubits"="6" "required_num_results"="6" } attributes #1 = { "irreversible" } ; module flags !llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9} !0 = !{i32 1, !"qir_major_version", i32 1} !1 = !{i32 7, !"qir_minor_version", i32 0} !2 = !{i32 1, !"dynamic_qubit_management", i1 false} !3 = !{i32 1, !"dynamic_result_management", i1 false} !4 = !{i32 5, !"int_computations", !10} !5 = !{i32 5, !"float_computations", !11} !6 = !{i32 1, !"ir_functions", i1 false} !7 = !{i32 1, !"backwards_branching", i2 0} !8 = !{i32 1, !"multiple_target_branching", i1 false} !9 = !{i32 1, !"multiple_return_points", i1 false} !10 = !{!"i32", !"i64"} !11 = !{!"float", !"double"}