From a52fcc1644bd4e3423c128cd690f1ed74fc8012d Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 4 Feb 2021 18:02:45 -0800 Subject: [PATCH 1/9] Added sqrt implementation and tests. --- src/QirRuntime/lib/QIR/bridge-qis.ll | 12 ++++++++++++ src/QirRuntime/test/QIR-static/qir-driver.cpp | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/QirRuntime/lib/QIR/bridge-qis.ll b/src/QirRuntime/lib/QIR/bridge-qis.ll index 9a011f112a4..ce45a58d8cb 100644 --- a/src/QirRuntime/lib/QIR/bridge-qis.ll +++ b/src/QirRuntime/lib/QIR/bridge-qis.ll @@ -281,3 +281,15 @@ define void @__quantum__qis__z__ctl(%Array* %.ctls, %Qubit* %.q) { } +;=============================================================================== +; quantum.qis math functions +; + +; LLVM intrinsics: +; https://llvm.org/docs/LangRef.html +declare double @llvm.sqrt.f64(double %.val) + +define double @__quantum__qis__sqrt__body(double %.val) { + %value = call double @llvm.sqrt.f64(double %.val) + ret double %value +} diff --git a/src/QirRuntime/test/QIR-static/qir-driver.cpp b/src/QirRuntime/test/QIR-static/qir-driver.cpp index bac6bc26414..9f8e4398c92 100644 --- a/src/QirRuntime/test/QIR-static/qir-driver.cpp +++ b/src/QirRuntime/test/QIR-static/qir-driver.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "CoreTypes.hpp" #include "QuantumApi_I.hpp" @@ -319,3 +320,19 @@ TEST_CASE("QIR: application of nested controlled functor", "[qir]") g_ctrqapi = nullptr; } + + + + +extern "C" double __quantum__qis__sqrt__body(double); // NOLINT + +TEST_CASE("QIR: math", "[qir.math][qir.math.sqrt]") +{ + REQUIRE(2.0 == __quantum__qis__sqrt__body((double)4.0)); + REQUIRE(3.0 == __quantum__qis__sqrt__body((double)9.0)); + REQUIRE(10.0 == __quantum__qis__sqrt__body((double)100.0)); + + REQUIRE( isnan(__quantum__qis__sqrt__body((double)-5.0)) ); // (double)NAN == sqrt((double)-5.0) + REQUIRE( isnan(__quantum__qis__sqrt__body(nan(""))) ); // (double)NAN == sqrt((double)) + REQUIRE( isinf(__quantum__qis__sqrt__body((double)INFINITY)) ); // +-infinity == sqrt((double) +infinity) +} From af50dfe44816a400f62fd3bf303a769ef3b8b6ed Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 4 Feb 2021 18:37:09 -0800 Subject: [PATCH 2/9] Restructured the files. --- src/QirRuntime/test/QIR-static/CMakeLists.txt | 3 ++- src/QirRuntime/test/QIR-static/qir-driver.cpp | 17 ----------------- .../test/QIR-static/qir-test-math.cpp | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 src/QirRuntime/test/QIR-static/qir-test-math.cpp diff --git a/src/QirRuntime/test/QIR-static/CMakeLists.txt b/src/QirRuntime/test/QIR-static/CMakeLists.txt index 7a7e99eb1fb..84f18e774c0 100644 --- a/src/QirRuntime/test/QIR-static/CMakeLists.txt +++ b/src/QirRuntime/test/QIR-static/CMakeLists.txt @@ -20,7 +20,8 @@ add_custom_target(qir_static_test_lib DEPENDS ${QIR_TESTS_LIBS}) # The executable target for QIR tests triggers the custom actions to compile ll files # add_executable(qir-static-tests - qir-driver.cpp) + qir-driver.cpp + qir-test-math.cpp) target_link_libraries(qir-static-tests PUBLIC ${QIR_TESTS_LIBS} diff --git a/src/QirRuntime/test/QIR-static/qir-driver.cpp b/src/QirRuntime/test/QIR-static/qir-driver.cpp index 9f8e4398c92..bac6bc26414 100644 --- a/src/QirRuntime/test/QIR-static/qir-driver.cpp +++ b/src/QirRuntime/test/QIR-static/qir-driver.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include "CoreTypes.hpp" #include "QuantumApi_I.hpp" @@ -320,19 +319,3 @@ TEST_CASE("QIR: application of nested controlled functor", "[qir]") g_ctrqapi = nullptr; } - - - - -extern "C" double __quantum__qis__sqrt__body(double); // NOLINT - -TEST_CASE("QIR: math", "[qir.math][qir.math.sqrt]") -{ - REQUIRE(2.0 == __quantum__qis__sqrt__body((double)4.0)); - REQUIRE(3.0 == __quantum__qis__sqrt__body((double)9.0)); - REQUIRE(10.0 == __quantum__qis__sqrt__body((double)100.0)); - - REQUIRE( isnan(__quantum__qis__sqrt__body((double)-5.0)) ); // (double)NAN == sqrt((double)-5.0) - REQUIRE( isnan(__quantum__qis__sqrt__body(nan(""))) ); // (double)NAN == sqrt((double)) - REQUIRE( isinf(__quantum__qis__sqrt__body((double)INFINITY)) ); // +-infinity == sqrt((double) +infinity) -} diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.cpp b/src/QirRuntime/test/QIR-static/qir-test-math.cpp new file mode 100644 index 00000000000..929c6cfded8 --- /dev/null +++ b/src/QirRuntime/test/QIR-static/qir-test-math.cpp @@ -0,0 +1,16 @@ +#include + +#include "catch.hpp" + +extern "C" double __quantum__qis__sqrt__body(double); // NOLINT + +TEST_CASE("QIR: math.sqrt", "[qir.math][qir.math.sqrt]") +{ + REQUIRE(2.0 == __quantum__qis__sqrt__body((double)4.0)); + REQUIRE(3.0 == __quantum__qis__sqrt__body((double)9.0)); + REQUIRE(10.0 == __quantum__qis__sqrt__body((double)100.0)); + + REQUIRE( isnan(__quantum__qis__sqrt__body((double)-5.0)) ); // (double)NAN == sqrt((double)-5.0) + REQUIRE( isnan(__quantum__qis__sqrt__body(nan(""))) ); // (double)NAN == sqrt((double)) + REQUIRE( isinf(__quantum__qis__sqrt__body((double)INFINITY)) ); // +-infinity == sqrt((double) +infinity) +} From debfa49f45cf9c006ce56097dec0a317e4297022 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Fri, 5 Feb 2021 18:53:01 -0800 Subject: [PATCH 3/9] Restructured sqrt. --- src/QirRuntime/lib/QIR/CMakeLists.txt | 1 + src/QirRuntime/lib/QIR/bridge-qis.ll | 45 +- src/QirRuntime/lib/QIR/intrinsicsMath.cpp | 30 ++ .../test/QIR-dynamic/CMakeLists.txt | 1 + .../test/QIR-static/compiler/QirTarget.qs | 20 + src/QirRuntime/test/QIR-static/qir-driver.cpp | 12 +- .../test/QIR-static/qir-test-arrays.qs | 6 +- .../test/QIR-static/qir-test-math.cpp | 12 +- .../test/QIR-static/qir-test-math.qs | 24 + .../test/QIR-static/qir-test-qsharp.ll | 508 +++++++++++++----- .../QIR-static/qir-test-qubits-results.qs | 1 + 11 files changed, 493 insertions(+), 167 deletions(-) create mode 100644 src/QirRuntime/lib/QIR/intrinsicsMath.cpp create mode 100644 src/QirRuntime/test/QIR-static/qir-test-math.qs diff --git a/src/QirRuntime/lib/QIR/CMakeLists.txt b/src/QirRuntime/lib/QIR/CMakeLists.txt index 58701c2d2da..37455ba9634 100644 --- a/src/QirRuntime/lib/QIR/CMakeLists.txt +++ b/src/QirRuntime/lib/QIR/CMakeLists.txt @@ -70,6 +70,7 @@ add_dependencies(qir-rt ${bridge_rt_target}) # set(qis_sup_source_files "intrinsics.cpp" + "intrinsicsMath.cpp" ) add_library(qir-qis-support ${qis_sup_source_files}) diff --git a/src/QirRuntime/lib/QIR/bridge-qis.ll b/src/QirRuntime/lib/QIR/bridge-qis.ll index ce45a58d8cb..7d1c969d65a 100644 --- a/src/QirRuntime/lib/QIR/bridge-qis.ll +++ b/src/QirRuntime/lib/QIR/bridge-qis.ll @@ -285,11 +285,44 @@ define void @__quantum__qis__z__ctl(%Array* %.ctls, %Qubit* %.q) { ; quantum.qis math functions ; -; LLVM intrinsics: -; https://llvm.org/docs/LangRef.html -declare double @llvm.sqrt.f64(double %.val) +; LLVM intrinsics (https://llvm.org/docs/LangRef.html): +declare double @llvm.sqrt.f64(double %.val) +;declare double @llvm.ceil.f64(double %Val) + +; Native implementations: +declare i1 @quantum__qis__isnan__body(double %d) +declare double @quantum__qis__infinity__body() +declare i1 @quantum__qis__isinf__body(double %d) + +; API for the user code: +define double @__quantum__qis__nan__body() { ; http://www.cplusplus.com/reference/cmath/nan-function/ + %result = call double @llvm.sqrt.f64(double -1.0) ; sqrt() -> NaN + ret double %result +} + +define i1 @__quantum__qis__isnan__body(double %d) { ; http://www.cplusplus.com/reference/cmath/isnan/ + %result = call i1 @quantum__qis__isnan__body(double %d) + ret i1 %result +} + +define double @__quantum__qis__infinity__body() { ; https://en.cppreference.com/w/c/numeric/math/INFINITY + %result = call double @quantum__qis__infinity__body() + ret double %result +} -define double @__quantum__qis__sqrt__body(double %.val) { - %value = call double @llvm.sqrt.f64(double %.val) - ret double %value +define i1 @__quantum__qis__isinf__body(double %d) { ; https://en.cppreference.com/w/cpp/numeric/math/isinf + %result = call i1 @quantum__qis__isinf__body(double %d) + ret i1 %result } + +define double @__quantum__qis__sqrt__body(double %d) { ; https://en.cppreference.com/w/cpp/numeric/math/sqrt + %result = call double @llvm.sqrt.f64(double %d) + ret double %result +} + +;define i64 @__quantum__qis__ceiling__body(double %d) { +; %doubleResult = call double @llvm.ceil.f64(double %d) +; %result = call i64 @quantum__qis__doubleasint__body(double $doubleResult) ; Should be the same as DoubleAsInt in https://github.com/microsoft/qsharp-runtime/pull/497/files +; ret i64 %result +;} + diff --git a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp new file mode 100644 index 00000000000..7ee895ac322 --- /dev/null +++ b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include + +extern "C" +{ + +// Declarations: +bool quantum__qis__isnan__body(double d); +double quantum__qis__inf__body(); +bool quantum__qis__isinf__body(double d); + +// Implementations: +bool quantum__qis__isnan__body(double d) +{ + return isnan(d); // https://en.cppreference.com/w/cpp/numeric/math/isnan +} + +double quantum__qis__infinity__body() +{ + return INFINITY; // https://en.cppreference.com/w/c/numeric/math/INFINITY +} + +bool quantum__qis__isinf__body(double d) +{ + return isinf(d); // https://en.cppreference.com/w/cpp/numeric/math/isinf +} + +} // extern "C" diff --git a/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt b/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt index 2f0ebd7d3f8..2f4eee47e00 100644 --- a/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt +++ b/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(qir-dynamic-tests target_link_libraries(qir-dynamic-tests PUBLIC ${QIR_TESTS_LIBS} qdk + qir-qis-support ) target_include_directories(qir-dynamic-tests PUBLIC diff --git a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs index 9b8a7833579..b66a8ff40d2 100644 --- a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs +++ b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs @@ -5,6 +5,26 @@ namespace Microsoft.Quantum.Intrinsic { open Microsoft.Quantum.Targeting; + function NAN() : Double { + body intrinsic; + } + + function IsNan(d: Double) : Bool { + body intrinsic; + } + + function INFINITY() : Double { + body intrinsic; + } + + function IsInf(d: Double) : Bool { + body intrinsic; + } + + function Sqrt(d : Double) : Double { + body intrinsic; + } + operation X(qb : Qubit) : Unit is Adj + Ctl { body intrinsic; diff --git a/src/QirRuntime/test/QIR-static/qir-driver.cpp b/src/QirRuntime/test/QIR-static/qir-driver.cpp index bac6bc26414..c844896884f 100644 --- a/src/QirRuntime/test/QIR-static/qir-driver.cpp +++ b/src/QirRuntime/test/QIR-static/qir-driver.cpp @@ -58,7 +58,7 @@ extern "C" int64_t Microsoft__Quantum__Testing__QIR__Test_Arrays( // NOLINT int64_t index, int64_t val, bool dummy); -TEST_CASE("QIR: Using 1D arrays", "[qir]") +TEST_CASE("QIR: Using 1D arrays", "[qir][qir.arr1d]") { // re-enable tracking when https://github.com/microsoft/qsharp-compiler/issues/844 is fixed QirContextScope qirctx(nullptr, false /*trackAllocatedObjects*/); @@ -152,7 +152,7 @@ struct QubitsResultsTestSimulator : public Microsoft::Quantum::SimulatorStub return reinterpret_cast(1); } }; -TEST_CASE("QIR: allocating and releasing qubits and results", "[qir]") +TEST_CASE("QIR: allocating and releasing qubits and results", "[qir][qir.qubit][qir.result]") { unique_ptr sim = make_unique(); QirContextScope qirctx(sim.get(), true /*trackAllocatedObjects*/); @@ -182,7 +182,7 @@ TEST_CASE("QIR: allocating and releasing qubits and results", "[qir]") // that is written to the original array at [1,1,1] and then retrieved from [1,1]. // Thus, all three dimensions must be at least 2. extern "C" int64_t TestMultidimArrays(char value, int64_t dim0, int64_t dim1, int64_t dim2); -TEST_CASE("QIR: multidimensional arrays", "[qir]") +TEST_CASE("QIR: multidimensional arrays", "[qir][qir.arrMultid]") { QirContextScope qirctx(nullptr, true /*trackAllocatedObjects*/); @@ -195,7 +195,7 @@ TEST_CASE("QIR: multidimensional arrays", "[qir]") // Manually authored QIR to test dumping range [0..2..6] into string and then raising a failure with it extern "C" void TestFailWithRangeString(int64_t start, int64_t step, int64_t end); -TEST_CASE("QIR: Report range in a failure message", "[qir]") +TEST_CASE("QIR: Report range in a failure message", "[qir][qir.range]") { QirContextScope qirctx(nullptr, true /*trackAllocatedObjects*/); @@ -215,7 +215,7 @@ TEST_CASE("QIR: Report range in a failure message", "[qir]") #if 0 // TODO: Q# compiler crashes generating QIR for TestPartials // TestPartials subtracts the second argument from the first and returns the result. extern "C" int64_t Microsoft__Quantum__Testing__QIR__TestPartials__body(int64_t, int64_t); // NOLINT -TEST_CASE("QIR: Partial application of a callable", "[qir]") +TEST_CASE("QIR: Partial application of a callable", "[qir][qir.partCallable]") { QirContextScope qirctx(nullptr, true /*trackAllocatedObjects*/); @@ -309,7 +309,7 @@ extern "C" void __quantum__qis__k__ctl(QirArray* controls, Qubit q) // NOLINT { g_ctrqapi->ControlledX(controls->count, reinterpret_cast(controls->buffer), q); } -TEST_CASE("QIR: application of nested controlled functor", "[qir]") +TEST_CASE("QIR: application of nested controlled functor", "[qir][qir.functor]") { unique_ptr qapi = make_unique(); QirContextScope qirctx(qapi.get(), true /*trackAllocatedObjects*/); diff --git a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs index 9752c047d00..635a474b96e 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs @@ -3,6 +3,8 @@ namespace Microsoft.Quantum.Testing.QIR { + open Microsoft.Quantum.Testing.QIR.Math; + @EntryPoint() operation Test_Arrays(array : Int[], index : Int, val : Int, dummy : Bool) : Int { @@ -33,9 +35,9 @@ namespace Microsoft.Quantum.Testing.QIR if (dummy) { let res1 = TestControlled(); - //Q# compiler crashes if both TestControlled and TestPartials are enabled - //let res2 = TestPartials(17, 42); + let res2 = TestPartials(17, 42); let res3 = Test_Qubit_Result_Management(); + let res4 = TestSqrt(); } return sum; diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.cpp b/src/QirRuntime/test/QIR-static/qir-test-math.cpp index 929c6cfded8..9a46c9a6dd5 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-math.cpp @@ -1,16 +1,10 @@ -#include +#include #include "catch.hpp" -extern "C" double __quantum__qis__sqrt__body(double); // NOLINT +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body(); // NOLINT TEST_CASE("QIR: math.sqrt", "[qir.math][qir.math.sqrt]") { - REQUIRE(2.0 == __quantum__qis__sqrt__body((double)4.0)); - REQUIRE(3.0 == __quantum__qis__sqrt__body((double)9.0)); - REQUIRE(10.0 == __quantum__qis__sqrt__body((double)100.0)); - - REQUIRE( isnan(__quantum__qis__sqrt__body((double)-5.0)) ); // (double)NAN == sqrt((double)-5.0) - REQUIRE( isnan(__quantum__qis__sqrt__body(nan(""))) ); // (double)NAN == sqrt((double)) - REQUIRE( isinf(__quantum__qis__sqrt__body((double)INFINITY)) ); // +-infinity == sqrt((double) +infinity) + REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body()); } diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.qs b/src/QirRuntime/test/QIR-static/qir-test-math.qs new file mode 100644 index 00000000000..e5205c68a25 --- /dev/null +++ b/src/QirRuntime/test/QIR-static/qir-test-math.qs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.Quantum.Testing.QIR.Math +{ + open Microsoft.Quantum.Intrinsic; + + function TestSqrt() : Int + { + mutable testResult = 0; + + if( 2.0 != Sqrt( 4.0) ) { set testResult = 1; } + else { if( 3.0 != Sqrt( 9.0) ) { set testResult = 2; } + else { if( 10.0 != Sqrt(100.0) ) { set testResult = 3; } + + else { if( not IsNan(Sqrt(-5.0))) { set testResult = 4; } + else { if( not IsNan(Sqrt(NAN()))) { set testResult = 5; } + else { if( not IsInf(Sqrt(INFINITY()))) { set testResult = 6; } + }}}}} + + return testResult; + } +} + diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index 774cf5774ac..f50968df3ba 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -2,8 +2,8 @@ %Result = type opaque %Range = type { i64, i64, i64 } %Tuple = type opaque -%Qubit = type opaque %Array = type opaque +%Qubit = type opaque %Callable = type opaque @ResultZero = external global %Result* @@ -16,59 +16,74 @@ @Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] @PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctladj__wrapper] @MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] +@Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) + +define double @Microsoft__Quantum__Intrinsic__NAN__body() { entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void + %0 = call double @__quantum__qis__nan__body() + ret double %0 } -declare void @__quantum__qis__k__body(%Qubit*) +declare double @__quantum__qis__nan__body() -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 } -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 } -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) +declare double @__quantum__qis__sqrt__body(double) -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 +} -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +declare i1 @__quantum__qis__isinf__body(double) + +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void + %0 = call double @__quantum__qis__infinity__body() + ret double %0 } +declare double @__quantum__qis__infinity__body() + define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { entry: - %bases__inline__1 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases__inline__1, i64 0) + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) %1 = bitcast i8* %0 to i2* %2 = load i2, i2* @PauliZ store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases__inline__1, i64 1) - %qubits__inline__1 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits__inline__1, i64 0) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) %4 = bitcast i8* %3 to %Qubit** store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits__inline__1, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases__inline__1, %Array* %qubits__inline__1) - call void @__quantum__rt__array_update_alias_count(%Array* %bases__inline__1, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits__inline__1, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases__inline__1, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits__inline__1, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) ret %Result* %5 } @@ -76,20 +91,8 @@ declare %Array* @__quantum__rt__array_create_1d(i32, i64) declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) - declare void @__quantum__rt__array_update_reference_count(%Array*, i64) -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 -} - define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { entry: call void @__quantum__qis__x__body(%Qubit* %qb) @@ -122,6 +125,103 @@ entry: ret void } +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +declare void @__quantum__qis__k__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isnan__body(double) + +define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { +entry: + %0 = sub i64 %from, %what + ret i64 %0 +} + +define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { +entry: + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1 + call void @__quantum__qis__x__body(%Qubit* %qb) + %q = call %Qubit* @__quantum__rt__qubit_allocate() + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %3 = bitcast i8* %2 to %Qubit** + %4 = load %Qubit*, %Qubit** %3 + %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) + %6 = load %Result*, %Result** @ResultOne + %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) + br i1 %7, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__x__body(%Qubit* %q) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %9 = bitcast i8* %8 to %Qubit** + %10 = load %Qubit*, %Qubit** %9 + %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) + %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) + %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) + %14 = xor i1 %13, true + call void @__quantum__rt__qubit_release(%Qubit* %q) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) + ret i1 %14 +} + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare void @__quantum__rt__qubit_release(%Qubit*) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) + define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { entry: %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) @@ -627,21 +727,170 @@ declare void @__quantum__rt__callable_make_adjoint(%Callable*) declare void @__quantum__rt__callable_make_controlled(%Callable*) -declare %Qubit* @__quantum__rt__qubit_allocate() +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) -declare %Array* @__quantum__rt__qubit_allocate_array(i64) +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) +define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %continue__1 -declare void @__quantum__rt__qubit_release(%Qubit*) +then0__1: ; preds = %entry + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) +continue__1: ; preds = %then0__1, %entry + ret void +} -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) +define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %continue__1 -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) +then0__1: ; preds = %entry + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { +entry: + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* + %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 + %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + store %Callable* %4, %Callable** %2 + store i64 %x, i64* %3 + %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 1) + %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) + %6 = bitcast %Tuple* %5 to { i64 }* + %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 + store i64 %y, i64* %7 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %subtractor, %Tuple* %5, %Tuple* %8) + %9 = bitcast %Tuple* %8 to { i64 }* + %10 = getelementptr { i64 }, { i64 }* %9, i64 0, i32 0 + %11 = load i64, i64* %10 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %subtractor, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + ret i64 %11 +} + +define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* + %1 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 1 + %3 = load i64, i64* %1 + %4 = load i64, i64* %2 + %5 = call i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %3, i64 %4) + %6 = bitcast %Tuple* %result-tuple to { i64 }* + %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 + store i64 %5, i64* %7 + ret void +} + +define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 + %2 = load i64, i64* %1 + %3 = bitcast %Tuple* %arg-tuple to { i64 }* + %4 = getelementptr { i64 }, { i64 }* %3, i64 0, i32 0 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) + %7 = bitcast %Tuple* %6 to { i64, i64 }* + %8 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 1 + store i64 %2, i64* %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + ret void +} + +define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { entry: @@ -703,7 +952,9 @@ exit__1: ; preds = %header__1 then0__1: ; preds = %exit__1 %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() + %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() + %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body() br label %continue__1 continue__1: ; preds = %then0__1, %exit__1 @@ -730,119 +981,88 @@ declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) -define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { +define i64 @Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body() { entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %1 = bitcast i8* %0 to %Qubit** - %qb__inline__1 = load %Qubit*, %Qubit** %1 - call void @__quantum__qis__x__body(%Qubit* %qb__inline__1) - %q = call %Qubit* @__quantum__rt__qubit_allocate() - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %3 = bitcast i8* %2 to %Qubit** - %4 = load %Qubit*, %Qubit** %3 - %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) - %6 = load %Result*, %Result** @ResultOne - %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) - br i1 %7, label %then0__1, label %continue__1 + %testResult = alloca i64 + store i64 0, i64* %testResult + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %else__1 then0__1: ; preds = %entry - call void @__quantum__qis__x__body(%Qubit* %q) + store i64 1, i64* %testResult br label %continue__1 -continue__1: ; preds = %then0__1, %entry - %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %9 = bitcast i8* %8 to %Qubit** - %10 = load %Qubit*, %Qubit** %9 - %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) - %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) - %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) - %14 = xor i1 %13, true - call void @__quantum__rt__qubit_release(%Qubit* %q) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) - ret i1 %14 -} +else__1: ; preds = %entry + %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) + %3 = fcmp one double 3.000000e+00, %2 + br i1 %3, label %then0__2, label %else__2 -define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { -entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %continue__1 +then0__2: ; preds = %else__1 + store i64 2, i64* %testResult + br label %continue__2 -then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 +else__2: ; preds = %else__1 + %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) + %5 = fcmp one double 1.000000e+01, %4 + br i1 %5, label %then0__3, label %else__3 -continue__1: ; preds = %then0__1, %entry - ret void -} +then0__3: ; preds = %else__2 + store i64 3, i64* %testResult + br label %continue__3 -define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { -entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %continue__1 +else__3: ; preds = %else__2 + %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) + %6 = call i1 @__quantum__qis__isnan__body(double %d__4) + %7 = xor i1 %6, true + br i1 %7, label %then0__4, label %else__4 -then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 +then0__4: ; preds = %else__3 + store i64 4, i64* %testResult + br label %continue__4 -continue__1: ; preds = %then0__1, %entry - ret void -} +else__4: ; preds = %else__3 + %d__5 = call double @__quantum__qis__nan__body() + %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) + %8 = call i1 @__quantum__qis__isnan__body(double %d__6) + %9 = xor i1 %8, true + br i1 %9, label %then0__5, label %else__5 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 +then0__5: ; preds = %else__4 + store i64 5, i64* %testResult + br label %continue__5 -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - br label %continue__1 +else__5: ; preds = %else__4 + %d__7 = call double @__quantum__qis__infinity__body() + %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) + %10 = call i1 @__quantum__qis__isinf__body(double %d__8) + %11 = xor i1 %10, true + br i1 %11, label %then0__6, label %continue__6 -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - ret void -} +then0__6: ; preds = %else__5 + store i64 6, i64* %testResult + br label %continue__6 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 +continue__6: ; preds = %then0__6, %else__5 + br label %continue__5 -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) +continue__5: ; preds = %continue__6, %then0__5 + br label %continue__4 + +continue__4: ; preds = %continue__5, %then0__4 + br label %continue__3 + +continue__3: ; preds = %continue__4, %then0__3 + br label %continue__2 + +continue__2: ; preds = %continue__3, %then0__2 br label %continue__1 -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void +continue__1: ; preds = %continue__2, %then0__1 + %12 = load i64, i64* %testResult + ret i64 %12 } -declare void @__quantum__rt__qubit_release_array(%Array*) - define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { entry: %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %array__count) diff --git a/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs b/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs index 600ecb7379b..038e99b5fb0 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs @@ -1,3 +1,4 @@ +// namespace Microsoft.Quantum.Testing.QIR { open Microsoft.Quantum.Intrinsic; From dc623c19d08658ca4385769bc032abda1733b5b9 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Sat, 6 Feb 2021 14:24:18 -0800 Subject: [PATCH 4/9] CR changes --- src/QirRuntime/lib/QIR/bridge-qis.ll | 8 - src/QirRuntime/lib/QIR/intrinsicsMath.cpp | 8 +- src/QirRuntime/lib/QIR/quantum__qis.hpp | 5 + .../test/QIR-dynamic/CMakeLists.txt | 1 - src/QirRuntime/test/QIR-static/CMakeLists.txt | 3 +- .../test/QIR-static/compiler/QirTarget.qs | 5 + .../test/QIR-static/qir-test-arrays.qs | 2 +- .../test/QIR-static/qir-test-math.cpp | 6 +- .../test/QIR-static/qir-test-math.qs | 22 +- .../test/QIR-static/qir-test-qsharp.ll | 1024 ++++++++--------- .../QIR-static/qir-test-qubits-results.qs | 3 +- 11 files changed, 530 insertions(+), 557 deletions(-) diff --git a/src/QirRuntime/lib/QIR/bridge-qis.ll b/src/QirRuntime/lib/QIR/bridge-qis.ll index 7d1c969d65a..c252d8e7553 100644 --- a/src/QirRuntime/lib/QIR/bridge-qis.ll +++ b/src/QirRuntime/lib/QIR/bridge-qis.ll @@ -287,7 +287,6 @@ define void @__quantum__qis__z__ctl(%Array* %.ctls, %Qubit* %.q) { ; LLVM intrinsics (https://llvm.org/docs/LangRef.html): declare double @llvm.sqrt.f64(double %.val) -;declare double @llvm.ceil.f64(double %Val) ; Native implementations: declare i1 @quantum__qis__isnan__body(double %d) @@ -319,10 +318,3 @@ define double @__quantum__qis__sqrt__body(double %d) { ; https://en.cpprefe %result = call double @llvm.sqrt.f64(double %d) ret double %result } - -;define i64 @__quantum__qis__ceiling__body(double %d) { -; %doubleResult = call double @llvm.ceil.f64(double %d) -; %result = call i64 @quantum__qis__doubleasint__body(double $doubleResult) ; Should be the same as DoubleAsInt in https://github.com/microsoft/qsharp-runtime/pull/497/files -; ret i64 %result -;} - diff --git a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp index 7ee895ac322..ec1275505ca 100644 --- a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp +++ b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp @@ -1,16 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. #include +#include "quantum__qis.hpp" extern "C" { -// Declarations: -bool quantum__qis__isnan__body(double d); -double quantum__qis__inf__body(); -bool quantum__qis__isinf__body(double d); - // Implementations: bool quantum__qis__isnan__body(double d) { diff --git a/src/QirRuntime/lib/QIR/quantum__qis.hpp b/src/QirRuntime/lib/QIR/quantum__qis.hpp index 8f90770c9c2..caf1289e567 100644 --- a/src/QirRuntime/lib/QIR/quantum__qis.hpp +++ b/src/QirRuntime/lib/QIR/quantum__qis.hpp @@ -59,4 +59,9 @@ extern "C" QIR_SHARED_API void quantum__qis__y__ctl(QirArray*, QUBIT*); // NOLINT QIR_SHARED_API void quantum__qis__z__body(QUBIT*); // NOLINT QIR_SHARED_API void quantum__qis__z__ctl(QirArray*, QUBIT*); // NOLINT + + QIR_SHARED_API bool quantum__qis__isnan__body(double d); // NOLINT + QIR_SHARED_API double quantum__qis__infinity__body(); // NOLINT + QIR_SHARED_API bool quantum__qis__isinf__body(double d); // NOLINT + } \ No newline at end of file diff --git a/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt b/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt index 2f4eee47e00..2f0ebd7d3f8 100644 --- a/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt +++ b/src/QirRuntime/test/QIR-dynamic/CMakeLists.txt @@ -36,7 +36,6 @@ add_executable(qir-dynamic-tests target_link_libraries(qir-dynamic-tests PUBLIC ${QIR_TESTS_LIBS} qdk - qir-qis-support ) target_include_directories(qir-dynamic-tests PUBLIC diff --git a/src/QirRuntime/test/QIR-static/CMakeLists.txt b/src/QirRuntime/test/QIR-static/CMakeLists.txt index 84f18e774c0..32bbe05842b 100644 --- a/src/QirRuntime/test/QIR-static/CMakeLists.txt +++ b/src/QirRuntime/test/QIR-static/CMakeLists.txt @@ -21,7 +21,8 @@ add_custom_target(qir_static_test_lib DEPENDS ${QIR_TESTS_LIBS}) # add_executable(qir-static-tests qir-driver.cpp - qir-test-math.cpp) + qir-test-math.cpp +) target_link_libraries(qir-static-tests PUBLIC ${QIR_TESTS_LIBS} diff --git a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs index b66a8ff40d2..3812400b2e1 100644 --- a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs +++ b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs @@ -5,22 +5,27 @@ namespace Microsoft.Quantum.Intrinsic { open Microsoft.Quantum.Targeting; + @Inline() function NAN() : Double { body intrinsic; } + @Inline() function IsNan(d: Double) : Bool { body intrinsic; } + @Inline() function INFINITY() : Double { body intrinsic; } + @Inline() function IsInf(d: Double) : Bool { body intrinsic; } + @Inline() function Sqrt(d : Double) : Double { body intrinsic; } diff --git a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs index 635a474b96e..dbf5f5f0a25 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs @@ -37,7 +37,7 @@ namespace Microsoft.Quantum.Testing.QIR let res1 = TestControlled(); let res2 = TestPartials(17, 42); let res3 = Test_Qubit_Result_Management(); - let res4 = TestSqrt(); + let res4 = SqrtTest(); } return sum; diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.cpp b/src/QirRuntime/test/QIR-static/qir-test-math.cpp index 9a46c9a6dd5..bdf0a381cc7 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-math.cpp @@ -1,10 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. #include #include "catch.hpp" -extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body(); // NOLINT +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body(); // NOLINT TEST_CASE("QIR: math.sqrt", "[qir.math][qir.math.sqrt]") { - REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body()); + REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body()); } diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.qs b/src/QirRuntime/test/QIR-static/qir-test-math.qs index e5205c68a25..212b18628d3 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-math.qs @@ -1,24 +1,20 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. namespace Microsoft.Quantum.Testing.QIR.Math { open Microsoft.Quantum.Intrinsic; - function TestSqrt() : Int - { - mutable testResult = 0; - - if( 2.0 != Sqrt( 4.0) ) { set testResult = 1; } - else { if( 3.0 != Sqrt( 9.0) ) { set testResult = 2; } - else { if( 10.0 != Sqrt(100.0) ) { set testResult = 3; } + function SqrtTest() : Int { + if( 2.0 != Sqrt( 4.0) ) { return 1; } + if( 3.0 != Sqrt( 9.0) ) { return 2; } + if(10.0 != Sqrt(100.0) ) { return 3; } - else { if( not IsNan(Sqrt(-5.0))) { set testResult = 4; } - else { if( not IsNan(Sqrt(NAN()))) { set testResult = 5; } - else { if( not IsInf(Sqrt(INFINITY()))) { set testResult = 6; } - }}}}} + if( not IsNan(Sqrt(-5.0))) { return 4; } + if( not IsNan(Sqrt(NAN()))) { return 5; } + if( not IsInf(Sqrt(INFINITY()))) { return 6; } - return testResult; + return 0; } } diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index f50968df3ba..3cd4332eb7c 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -3,8 +3,8 @@ %Range = type { i64, i64, i64 } %Tuple = type opaque %Array = type opaque -%Qubit = type opaque %Callable = type opaque +%Qubit = type opaque @ResultZero = external global %Result* @ResultOne = external global %Result* @@ -20,298 +20,197 @@ @PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) - -define double @Microsoft__Quantum__Intrinsic__NAN__body() { +define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { entry: - %0 = call double @__quantum__qis__nan__body() - ret double %0 + %0 = sub i64 %from, %what + ret i64 %0 } -declare double @__quantum__qis__nan__body() - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 -} + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + %local = alloca %Array* + store %Array* %array, %Array** %local + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) + %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) + %2 = bitcast i8* %1 to i64* + store i64 %val, i64* %2 + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) + store %Array* %0, %Array** %local + %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) + %3 = sub i64 %n, 1 + %4 = load %Range, %Range* @EmptyRange + %5 = insertvalue %Range %4, i64 %index, 0 + %6 = insertvalue %Range %5, i64 1, 1 + %7 = insertvalue %Range %6, i64 %3, 2 + %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) + %8 = load %Range, %Range* @EmptyRange + %9 = insertvalue %Range %8, i64 %index, 0 + %10 = insertvalue %Range %9, i64 -2, 1 + %11 = insertvalue %Range %10, i64 0, 2 + %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) + %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) + %sum = alloca i64 + store i64 0, i64* %sum + %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) + %13 = sub i64 %12, 1 + br label %header__1 -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] + %14 = icmp sle i64 %i, %13 + br i1 %14, label %body__1, label %exit__1 -define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { -entry: - %0 = call double @__quantum__qis__sqrt__body(double %d) - ret double %0 -} +body__1: ; preds = %header__1 + %15 = load i64, i64* %sum + %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) + %17 = bitcast i8* %16 to i64* + %18 = load i64, i64* %17 + %19 = add i64 %15, %18 + store i64 %19, i64* %sum + br label %exiting__1 -declare double @__quantum__qis__sqrt__body(double) +exiting__1: ; preds = %body__1 + %20 = add i64 %i, 1 + br label %header__1 -define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isinf__body(double %d) - ret i1 %0 -} +exit__1: ; preds = %header__1 + br i1 %dummy, label %then0__1, label %continue__1 -declare i1 @__quantum__qis__isinf__body(double) +then0__1: ; preds = %exit__1 + %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() + %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) + %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() + %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() + br label %continue__1 -define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { -entry: - %0 = call double @__quantum__qis__infinity__body() - ret double %0 +continue__1: ; preds = %then0__1, %exit__1 + %21 = load i64, i64* %sum + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + ret i64 %21 } -declare double @__quantum__qis__infinity__body() +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { -entry: - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %1 = bitcast i8* %0 to i2* - %2 = load i2, i2* @PauliZ - store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %4 = bitcast i8* %3 to %Qubit** - store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) - ret %Result* %5 -} +declare void @__quantum__rt__array_update_reference_count(%Array*, i64) -declare %Array* @__quantum__rt__array_create_1d(i32, i64) +declare %Array* @__quantum__rt__array_copy(%Array*, i1) declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) -declare void @__quantum__rt__array_update_reference_count(%Array*, i64) +declare i64 @__quantum__rt__array_get_size_1d(%Array*) -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} +declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) -declare void @__quantum__qis__x__body(%Qubit*) +declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* + %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 + %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + store %Callable* %4, %Callable** %2 + store i64 1, i64* %3 + %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) + %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 1) + %ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 1) + %adj_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %adj_ctl_qop) + call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 1) + %ctl_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 1) + %error_code = alloca i64 + store i64 0, i64* %error_code + %q1 = call %Qubit* @__quantum__rt__qubit_allocate() + %q2 = call %Qubit* @__quantum__rt__qubit_allocate() + %q3 = call %Qubit* @__quantum__rt__qubit_allocate() + %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %6 = bitcast %Tuple* %5 to { %Qubit* }* + %7 = getelementptr { %Qubit* }, { %Qubit* }* %6, i64 0, i32 0 + store %Qubit* %q1, %Qubit** %7 + call void @__quantum__rt__callable_invoke(%Callable* %qop, %Tuple* %5, %Tuple* null) + %8 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q1) + %9 = load %Result*, %Result** @ResultOne + %10 = call i1 @__quantum__rt__result_equal(%Result* %8, %Result* %9) + %11 = xor i1 %10, true + br i1 %11, label %then0__1, label %else__1 -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__1: ; preds = %entry + store i64 1, i64* %error_code + br label %continue__1 -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) +else__1: ; preds = %entry + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %13 = bitcast %Tuple* %12 to { %Qubit* }* + %14 = getelementptr { %Qubit* }, { %Qubit* }* %13, i64 0, i32 0 + store %Qubit* %q2, %Qubit** %14 + call void @__quantum__rt__callable_invoke(%Callable* %adj_qop, %Tuple* %12, %Tuple* null) + %15 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q2) + %16 = load %Result*, %Result** @ResultOne + %17 = call i1 @__quantum__rt__result_equal(%Result* %15, %Result* %16) + %18 = xor i1 %17, true + br i1 %18, label %then0__2, label %else__2 -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__2: ; preds = %else__1 + store i64 2, i64* %error_code + br label %continue__2 -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +else__2: ; preds = %else__1 + %19 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %20 = bitcast %Tuple* %19 to { %Array*, %Qubit* }* + %21 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 0 + %22 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 1 + %23 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %23, i64 0) + %25 = bitcast i8* %24 to %Qubit** + store %Qubit* %q1, %Qubit** %25 + store %Array* %23, %Array** %21 + store %Qubit* %q3, %Qubit** %22 + call void @__quantum__rt__callable_invoke(%Callable* %ctl_qop, %Tuple* %19, %Tuple* null) + %26 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %27 = load %Result*, %Result** @ResultOne + %28 = call i1 @__quantum__rt__result_equal(%Result* %26, %Result* %27) + %29 = xor i1 %28, true + br i1 %29, label %then0__3, label %else__3 -declare void @__quantum__qis__k__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnan__body(double %d) - ret i1 %0 -} - -declare i1 @__quantum__qis__isnan__body(double) - -define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { -entry: - %0 = sub i64 %from, %what - ret i64 %0 -} - -define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { -entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %1 = bitcast i8* %0 to %Qubit** - %qb = load %Qubit*, %Qubit** %1 - call void @__quantum__qis__x__body(%Qubit* %qb) - %q = call %Qubit* @__quantum__rt__qubit_allocate() - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %3 = bitcast i8* %2 to %Qubit** - %4 = load %Qubit*, %Qubit** %3 - %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) - %6 = load %Result*, %Result** @ResultOne - %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) - br i1 %7, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__x__body(%Qubit* %q) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %9 = bitcast i8* %8 to %Qubit** - %10 = load %Qubit*, %Qubit** %9 - %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) - %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) - %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) - %14 = xor i1 %13, true - call void @__quantum__rt__qubit_release(%Qubit* %q) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) - ret i1 %14 -} - -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) - -declare void @__quantum__rt__qubit_release(%Qubit*) - -declare void @__quantum__rt__qubit_release_array(%Array*) - -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) - -define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { -entry: - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* - %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 - %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 - %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) - store %Callable* %4, %Callable** %2 - store i64 1, i64* %3 - %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) - %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 1) - %ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 1) - %adj_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %adj_ctl_qop) - call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 1) - %ctl_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 1) - %error_code = alloca i64 - store i64 0, i64* %error_code - %q1 = call %Qubit* @__quantum__rt__qubit_allocate() - %q2 = call %Qubit* @__quantum__rt__qubit_allocate() - %q3 = call %Qubit* @__quantum__rt__qubit_allocate() - %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %6 = bitcast %Tuple* %5 to { %Qubit* }* - %7 = getelementptr { %Qubit* }, { %Qubit* }* %6, i64 0, i32 0 - store %Qubit* %q1, %Qubit** %7 - call void @__quantum__rt__callable_invoke(%Callable* %qop, %Tuple* %5, %Tuple* null) - %8 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q1) - %9 = load %Result*, %Result** @ResultOne - %10 = call i1 @__quantum__rt__result_equal(%Result* %8, %Result* %9) - %11 = xor i1 %10, true - br i1 %11, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - store i64 1, i64* %error_code - br label %continue__1 - -else__1: ; preds = %entry - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %13 = bitcast %Tuple* %12 to { %Qubit* }* - %14 = getelementptr { %Qubit* }, { %Qubit* }* %13, i64 0, i32 0 - store %Qubit* %q2, %Qubit** %14 - call void @__quantum__rt__callable_invoke(%Callable* %adj_qop, %Tuple* %12, %Tuple* null) - %15 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q2) - %16 = load %Result*, %Result** @ResultOne - %17 = call i1 @__quantum__rt__result_equal(%Result* %15, %Result* %16) - %18 = xor i1 %17, true - br i1 %18, label %then0__2, label %else__2 - -then0__2: ; preds = %else__1 - store i64 2, i64* %error_code - br label %continue__2 - -else__2: ; preds = %else__1 - %19 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %20 = bitcast %Tuple* %19 to { %Array*, %Qubit* }* - %21 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 0 - %22 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 1 - %23 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %23, i64 0) - %25 = bitcast i8* %24 to %Qubit** - store %Qubit* %q1, %Qubit** %25 - store %Array* %23, %Array** %21 - store %Qubit* %q3, %Qubit** %22 - call void @__quantum__rt__callable_invoke(%Callable* %ctl_qop, %Tuple* %19, %Tuple* null) - %26 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %27 = load %Result*, %Result** @ResultOne - %28 = call i1 @__quantum__rt__result_equal(%Result* %26, %Result* %27) - %29 = xor i1 %28, true - br i1 %29, label %then0__3, label %else__3 - -then0__3: ; preds = %else__2 - store i64 3, i64* %error_code - br label %continue__3 +then0__3: ; preds = %else__2 + store i64 3, i64* %error_code + br label %continue__3 else__3: ; preds = %else__2 %30 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) @@ -529,47 +428,174 @@ continue__1: ; preds = %continue__2, %then0 ret i64 %103 } -declare %Tuple* @__quantum__rt__tuple_create(i64) - -define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) - ret void + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* + %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 + %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + store %Callable* %4, %Callable** %2 + store i64 %x, i64* %3 + %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 1) + %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) + %6 = bitcast %Tuple* %5 to { i64 }* + %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 + store i64 %y, i64* %7 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %subtractor, %Tuple* %5, %Tuple* %8) + %9 = bitcast %Tuple* %8 to { i64 }* + %10 = getelementptr { i64 }, { i64 }* %9, i64 0, i32 0 + %11 = load i64, i64* %10 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %subtractor, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %subtractor, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + ret i64 %11 } -define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) - ret void -} + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1 + call void @__quantum__qis__x__body(%Qubit* %qb) + %q = call %Qubit* @__quantum__rt__qubit_allocate() + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %3 = bitcast i8* %2 to %Qubit** + %4 = load %Qubit*, %Qubit** %3 + %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) + %6 = load %Result*, %Result** @ResultOne + %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) + br i1 %7, label %then0__1, label %continue__1 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} +then0__1: ; preds = %entry + call void @__quantum__qis__x__body(%Qubit* %q) + br label %continue__1 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 +continue__1: ; preds = %then0__1, %entry + %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %9 = bitcast i8* %8 to %Qubit** + %10 = load %Qubit*, %Qubit** %9 + %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) + %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) + %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) + %14 = xor i1 %13, true + call void @__quantum__rt__qubit_release(%Qubit* %q) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) + ret i1 %14 +} + +define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { +entry: + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + ret i64 1 + +continue__1: ; preds = %entry + %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) + %3 = fcmp one double 3.000000e+00, %2 + br i1 %3, label %then0__2, label %continue__2 + +then0__2: ; preds = %continue__1 + ret i64 2 + +continue__2: ; preds = %continue__1 + %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) + %5 = fcmp one double 1.000000e+01, %4 + br i1 %5, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + ret i64 3 + +continue__3: ; preds = %continue__2 + %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) + %6 = call i1 @__quantum__qis__isnan__body(double %d__4) + %7 = xor i1 %6, true + br i1 %7, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %d__5 = call double @__quantum__qis__nan__body() + %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) + %8 = call i1 @__quantum__qis__isnan__body(double %d__6) + %9 = xor i1 %8, true + br i1 %9, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__7 = call double @__quantum__qis__infinity__body() + %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) + %10 = call i1 @__quantum__qis__isinf__body(double %d__8) + %11 = xor i1 %10, true + br i1 %11, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 +} + +declare %Tuple* @__quantum__rt__tuple_create(i64) + +define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) ret void @@ -727,12 +753,102 @@ declare void @__quantum__rt__callable_make_adjoint(%Callable*) declare void @__quantum__rt__callable_make_controlled(%Callable*) +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %1 = bitcast i8* %0 to i2* + %2 = load i2, i2* @PauliZ + store i2 %2, i2* %1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %4 = bitcast i8* %3 to %Qubit** + store %Qubit* %qb, %Qubit** %4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) + ret %Result* %5 +} + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare void @__quantum__rt__qubit_release(%Qubit*) + declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) + +define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* + %1 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 1 + %3 = load i64, i64* %1 + %4 = load i64, i64* %2 + %5 = call i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %3, i64 %4) + %6 = bitcast %Tuple* %result-tuple to { i64 }* + %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 + store i64 %5, i64* %7 + ret void +} + +define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 + %2 = load i64, i64* %1 + %3 = bitcast %Tuple* %arg-tuple to { i64 }* + %4 = getelementptr { i64 }, { i64 }* %3, i64 0, i32 0 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) + %7 = bitcast %Tuple* %6 to { i64, i64 }* + %8 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 1 + store i64 %2, i64* %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + ret void +} + +define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { entry: %0 = srem i64 %n, 2 @@ -747,6 +863,8 @@ continue__1: ; preds = %then0__1, %entry ret void } +declare void @__quantum__qis__k__body(%Qubit*) + define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { entry: %0 = srem i64 %n, 2 @@ -783,6 +901,8 @@ continue__1: ; preds = %then0__1, %entry ret void } +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) + define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { entry: call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) @@ -805,264 +925,120 @@ continue__1: ; preds = %then0__1, %entry ret void } -define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { +declare void @__quantum__qis__x__body(%Qubit*) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { entry: - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* - %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 - %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 - %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) - store %Callable* %4, %Callable** %2 - store i64 %x, i64* %3 - %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 1) - %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) - %6 = bitcast %Tuple* %5 to { i64 }* - %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 - store i64 %y, i64* %7 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %subtractor, %Tuple* %5, %Tuple* %8) - %9 = bitcast %Tuple* %8 to { i64 }* - %10 = getelementptr { i64 }, { i64 }* %9, i64 0, i32 0 - %11 = load i64, i64* %10 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %subtractor, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %subtractor, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - ret i64 %11 + %0 = call double @__quantum__qis__infinity__body() + ret double %0 } -define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +declare double @__quantum__qis__infinity__body() + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { entry: - %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* - %1 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 1 - %3 = load i64, i64* %1 - %4 = load i64, i64* %2 - %5 = call i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %3, i64 %4) - %6 = bitcast %Tuple* %result-tuple to { i64 }* - %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 - store i64 %5, i64* %7 + call void @__quantum__qis__x__body(%Qubit* %qb) ret void } -define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 - %2 = load i64, i64* %1 - %3 = bitcast %Tuple* %arg-tuple to { i64 }* - %4 = getelementptr { i64 }, { i64 }* %3, i64 0, i32 0 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) - %7 = bitcast %Tuple* %6 to { i64, i64 }* - %8 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 1 - store i64 %2, i64* %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + call void @__quantum__qis__x__body(%Qubit* %qb) ret void } -define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) ret void } -define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) ret void } -define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { +define double @Microsoft__Quantum__Intrinsic__NAN__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - %local = alloca %Array* - store %Array* %array, %Array** %local - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) - %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) - %2 = bitcast i8* %1 to i64* - store i64 %val, i64* %2 - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) - store %Array* %0, %Array** %local - %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) - %3 = sub i64 %n, 1 - %4 = load %Range, %Range* @EmptyRange - %5 = insertvalue %Range %4, i64 %index, 0 - %6 = insertvalue %Range %5, i64 1, 1 - %7 = insertvalue %Range %6, i64 %3, 2 - %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) - %8 = load %Range, %Range* @EmptyRange - %9 = insertvalue %Range %8, i64 %index, 0 - %10 = insertvalue %Range %9, i64 -2, 1 - %11 = insertvalue %Range %10, i64 0, 2 - %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) - %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) - %sum = alloca i64 - store i64 0, i64* %sum - %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) - %13 = sub i64 %12, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] - %14 = icmp sle i64 %i, %13 - br i1 %14, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %15 = load i64, i64* %sum - %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) - %17 = bitcast i8* %16 to i64* - %18 = load i64, i64* %17 - %19 = add i64 %15, %18 - store i64 %19, i64* %sum - br label %exiting__1 - -exiting__1: ; preds = %body__1 - %20 = add i64 %i, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - br i1 %dummy, label %then0__1, label %continue__1 - -then0__1: ; preds = %exit__1 - %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() - %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) - %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() - %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body() - br label %continue__1 - -continue__1: ; preds = %then0__1, %exit__1 - %21 = load i64, i64* %sum - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - ret i64 %21 + %0 = call double @__quantum__qis__nan__body() + ret double %0 } -declare %Array* @__quantum__rt__array_copy(%Array*, i1) - -declare i64 @__quantum__rt__array_get_size_1d(%Array*) - -declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) - -declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) +declare double @__quantum__qis__nan__body() -define i64 @Microsoft__Quantum__Testing__QIR__Math__TestSqrt__body() { +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { entry: - %testResult = alloca i64 - store i64 0, i64* %testResult - %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) - %1 = fcmp one double 2.000000e+00, %0 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - store i64 1, i64* %testResult - br label %continue__1 - -else__1: ; preds = %entry - %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) - %3 = fcmp one double 3.000000e+00, %2 - br i1 %3, label %then0__2, label %else__2 - -then0__2: ; preds = %else__1 - store i64 2, i64* %testResult - br label %continue__2 - -else__2: ; preds = %else__1 - %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) - %5 = fcmp one double 1.000000e+01, %4 - br i1 %5, label %then0__3, label %else__3 - -then0__3: ; preds = %else__2 - store i64 3, i64* %testResult - br label %continue__3 - -else__3: ; preds = %else__2 - %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) - %6 = call i1 @__quantum__qis__isnan__body(double %d__4) - %7 = xor i1 %6, true - br i1 %7, label %then0__4, label %else__4 - -then0__4: ; preds = %else__3 - store i64 4, i64* %testResult - br label %continue__4 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 +} -else__4: ; preds = %else__3 - %d__5 = call double @__quantum__qis__nan__body() - %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) - %8 = call i1 @__quantum__qis__isnan__body(double %d__6) - %9 = xor i1 %8, true - br i1 %9, label %then0__5, label %else__5 +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) -then0__5: ; preds = %else__4 - store i64 5, i64* %testResult - br label %continue__5 +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} -else__5: ; preds = %else__4 - %d__7 = call double @__quantum__qis__infinity__body() - %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) - %10 = call i1 @__quantum__qis__isinf__body(double %d__8) - %11 = xor i1 %10, true - br i1 %11, label %then0__6, label %continue__6 +declare i1 @__quantum__qis__isnan__body(double) -then0__6: ; preds = %else__5 - store i64 6, i64* %testResult - br label %continue__6 +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 +} -continue__6: ; preds = %then0__6, %else__5 - br label %continue__5 +declare i1 @__quantum__qis__isinf__body(double) -continue__5: ; preds = %continue__6, %then0__5 - br label %continue__4 +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -continue__4: ; preds = %continue__5, %then0__4 - br label %continue__3 +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -continue__3: ; preds = %continue__4, %then0__3 - br label %continue__2 +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__2: ; preds = %continue__3, %then0__2 - br label %continue__1 +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__1: ; preds = %continue__2, %then0__1 - %12 = load i64, i64* %testResult - ret i64 %12 +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +entry: + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 } +declare double @__quantum__qis__sqrt__body(double) + define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { entry: %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %array__count) diff --git a/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs b/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs index 038e99b5fb0..9c4f2e5493f 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-qubits-results.qs @@ -1,4 +1,5 @@ -// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. namespace Microsoft.Quantum.Testing.QIR { open Microsoft.Quantum.Intrinsic; From a9e9b70674b078c2cb539216e215ff883303576e Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Sat, 6 Feb 2021 15:03:41 -0800 Subject: [PATCH 5/9] Fixed the Linux build break. --- src/QirRuntime/lib/QIR/intrinsicsMath.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp index ec1275505ca..f9c697fc04e 100644 --- a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp +++ b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp @@ -10,7 +10,7 @@ extern "C" // Implementations: bool quantum__qis__isnan__body(double d) { - return isnan(d); // https://en.cppreference.com/w/cpp/numeric/math/isnan + return std::isnan(d); // https://en.cppreference.com/w/cpp/numeric/math/isnan } double quantum__qis__infinity__body() @@ -20,7 +20,7 @@ double quantum__qis__infinity__body() bool quantum__qis__isinf__body(double d) { - return isinf(d); // https://en.cppreference.com/w/cpp/numeric/math/isinf + return std::isinf(d); // https://en.cppreference.com/w/cpp/numeric/math/isinf } } // extern "C" From 2763869173ee8115b8253d68a37e2fdc9ad7625c Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 8 Feb 2021 11:22:29 -0800 Subject: [PATCH 6/9] Added Log() and ArcTan2(). --- src/QirRuntime/lib/QIR/bridge-qis.ll | 24 +- src/QirRuntime/lib/QIR/intrinsicsMath.cpp | 5 + src/QirRuntime/lib/QIR/quantum__qis.hpp | 1 + .../test/QIR-static/compiler/Constants.qs | 37 + .../test/QIR-static/compiler/QirTarget.qs | 16 + src/QirRuntime/test/QIR-static/generate.py | 2 +- .../test/QIR-static/qir-test-arrays.qs | 4 + .../test/QIR-static/qir-test-math.cpp | 17 +- .../test/QIR-static/qir-test-math.qs | 46 +- .../test/QIR-static/qir-test-qsharp.ll | 933 +++++++++++------- 10 files changed, 725 insertions(+), 360 deletions(-) create mode 100644 src/QirRuntime/test/QIR-static/compiler/Constants.qs diff --git a/src/QirRuntime/lib/QIR/bridge-qis.ll b/src/QirRuntime/lib/QIR/bridge-qis.ll index c252d8e7553..dad43e9f61f 100644 --- a/src/QirRuntime/lib/QIR/bridge-qis.ll +++ b/src/QirRuntime/lib/QIR/bridge-qis.ll @@ -287,15 +287,17 @@ define void @__quantum__qis__z__ctl(%Array* %.ctls, %Qubit* %.q) { ; LLVM intrinsics (https://llvm.org/docs/LangRef.html): declare double @llvm.sqrt.f64(double %.val) +declare double @llvm.log.f64(double %Val) ; Native implementations: declare i1 @quantum__qis__isnan__body(double %d) declare double @quantum__qis__infinity__body() declare i1 @quantum__qis__isinf__body(double %d) +declare double @quantum__qis__arctan2__body(double %y, double %x) ; API for the user code: -define double @__quantum__qis__nan__body() { ; http://www.cplusplus.com/reference/cmath/nan-function/ - %result = call double @llvm.sqrt.f64(double -1.0) ; sqrt() -> NaN +define double @__quantum__qis__nan__body() { ; Q#: function NAN() : Double http://www.cplusplus.com/reference/cmath/nan-function/ + %result = call double @llvm.sqrt.f64(double -1.0) ; sqrt() -> NaN ret double %result } @@ -318,3 +320,21 @@ define double @__quantum__qis__sqrt__body(double %d) { ; https://en.cpprefe %result = call double @llvm.sqrt.f64(double %d) ret double %result } + +define double @__quantum__qis__log__body(double %d) { ; https://en.cppreference.com/w/cpp/numeric/math/log + %result = call double @llvm.log.f64(double %d) + ret double %result +} + +define i1 @__quantum__qis__isnegativeinfinity__body(double %d) { ; Q#: function IsNegativeInfinity(d : Double) : Bool + ; https://en.cppreference.com/w/cpp/numeric/math/log https://llvm.org/docs/LangRef.html#llvm-log-intrinsic + %negInf = call double @llvm.log.f64(double 0.0) ; ln(0) -> (-infinity) + %result = fcmp oeq double %negInf, %d ; %result = (%negInf == %d) + ret i1 %result +} + +define double @__quantum__qis__arctan2__body(double %y, double %x) { ; Q#: function ArcTan2 (y : Double, x : Double) : Double + ; https://en.cppreference.com/w/cpp/numeric/math/atan2 + %result = call double @quantum__qis__arctan2__body(double %y, double %x) + ret double %result +} diff --git a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp index f9c697fc04e..a3b97e420e9 100644 --- a/src/QirRuntime/lib/QIR/intrinsicsMath.cpp +++ b/src/QirRuntime/lib/QIR/intrinsicsMath.cpp @@ -23,4 +23,9 @@ bool quantum__qis__isinf__body(double d) return std::isinf(d); // https://en.cppreference.com/w/cpp/numeric/math/isinf } +double quantum__qis__arctan2__body(double y, double x) +{ + return std::atan2(y, x); // https://en.cppreference.com/w/cpp/numeric/math/atan2 +} + } // extern "C" diff --git a/src/QirRuntime/lib/QIR/quantum__qis.hpp b/src/QirRuntime/lib/QIR/quantum__qis.hpp index caf1289e567..50e8c249016 100644 --- a/src/QirRuntime/lib/QIR/quantum__qis.hpp +++ b/src/QirRuntime/lib/QIR/quantum__qis.hpp @@ -63,5 +63,6 @@ extern "C" QIR_SHARED_API bool quantum__qis__isnan__body(double d); // NOLINT QIR_SHARED_API double quantum__qis__infinity__body(); // NOLINT QIR_SHARED_API bool quantum__qis__isinf__body(double d); // NOLINT + QIR_SHARED_API double quantum__qis__arctan2__body(double y, double x); // NOLINT } \ No newline at end of file diff --git a/src/QirRuntime/test/QIR-static/compiler/Constants.qs b/src/QirRuntime/test/QIR-static/compiler/Constants.qs new file mode 100644 index 00000000000..1192459dbb2 --- /dev/null +++ b/src/QirRuntime/test/QIR-static/compiler/Constants.qs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// these are all the static methods and const fields form System.Math class of .NET CLR +// that are not exposed as language operators and are relevant within type System. +// If there are two versions of the function for Int and Double types, the corresponding +// functions have suffix I or D. ExpD also has a suffix to avoid name clash with Primitives.Exp. + +namespace Microsoft.Quantum.Math { + + /// # Summary + /// Returns the natural logarithmic base to double-precision. + /// + /// # Output + /// A double-precision approximation of the natural logarithic base, + /// $e \approx 2.7182818284590452354$. + /// + /// # See Also + /// - Microsoft.Quantum.Math.PI + function E() : Double { + return 2.7182818284590452354; + } + + /// # Summary + /// Represents the ratio of the circumference of a circle to its diameter. + /// + /// # Ouptut + /// A double-precision approximation of the the circumference of a circle + /// to its diameter, $\pi \approx 3.14159265358979323846$. + /// + /// # See Also + /// - Microsoft.Quantum.Math.E + function PI() : Double { + return 3.14159265358979323846; + } + +} diff --git a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs index 3812400b2e1..c117bdd0667 100644 --- a/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs +++ b/src/QirRuntime/test/QIR-static/compiler/QirTarget.qs @@ -25,11 +25,27 @@ namespace Microsoft.Quantum.Intrinsic { body intrinsic; } + @Inline() + function IsNegativeInfinity(d : Double) : Bool { + body intrinsic; + } + @Inline() function Sqrt(d : Double) : Double { body intrinsic; } + @Inline() + function Log(d : Double) : Double { + body intrinsic; + } + + @Inline() + function ArcTan2(y : Double, x : Double) : Double { + body intrinsic; + } + + operation X(qb : Qubit) : Unit is Adj + Ctl { body intrinsic; diff --git a/src/QirRuntime/test/QIR-static/generate.py b/src/QirRuntime/test/QIR-static/generate.py index af6daa37c5e..99242f689b4 100644 --- a/src/QirRuntime/test/QIR-static/generate.py +++ b/src/QirRuntime/test/QIR-static/generate.py @@ -39,7 +39,7 @@ def log(message): output_file = file_name command = (qsc + " build --qir s --build-exe --input " + files_to_process + - " compiler\\qircore.qs compiler\\qirtarget.qs --proj " + output_file) + " compiler\\qircore.qs compiler\\qirtarget.qs compiler\\Constants.qs --proj " + output_file) log("Executing: " + command) subprocess.run(command, shell = True) diff --git a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs index dbf5f5f0a25..41f80ec0f71 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs @@ -37,7 +37,11 @@ namespace Microsoft.Quantum.Testing.QIR let res1 = TestControlled(); let res2 = TestPartials(17, 42); let res3 = Test_Qubit_Result_Management(); + + // Math tests: let res4 = SqrtTest(); + let res5 = LogTest(); + let res6 = ArcTan2Test(); } return sum; diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.cpp b/src/QirRuntime/test/QIR-static/qir-test-math.cpp index bdf0a381cc7..27ccea024f0 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-math.cpp @@ -4,9 +4,22 @@ #include "catch.hpp" -extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body(); // NOLINT +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body(); // NOLINT +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__LogTest__body(); // NOLINT +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body(); // NOLINT -TEST_CASE("QIR: math.sqrt", "[qir.math][qir.math.sqrt]") +TEST_CASE("QIR: Math.Sqrt", "[qir.math][qir.Math.Sqrt]") { REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body()); } + +TEST_CASE("QIR: Math.Log", "[qir.math][qir.Math.Log]") +{ + REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__LogTest__body()); +} + +TEST_CASE("QIR: Math.ArcTan2", "[qir.math][qir.Math.ArcTan2]") +{ + REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body()); +} + diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.qs b/src/QirRuntime/test/QIR-static/qir-test-math.qs index 212b18628d3..77cac768b04 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-math.qs @@ -4,17 +4,61 @@ namespace Microsoft.Quantum.Testing.QIR.Math { open Microsoft.Quantum.Intrinsic; + open Microsoft.Quantum.Math; // E() function SqrtTest() : Int { if( 2.0 != Sqrt( 4.0) ) { return 1; } if( 3.0 != Sqrt( 9.0) ) { return 2; } if(10.0 != Sqrt(100.0) ) { return 3; } - + if( not IsNan(Sqrt(-5.0))) { return 4; } if( not IsNan(Sqrt(NAN()))) { return 5; } if( not IsInf(Sqrt(INFINITY()))) { return 6; } return 0; } + + function LogTest() : Int { + if( 1.0 != Log(E()) ) { return 1; } // ln(e) -> 1 + if( 2.0 != Log(E() * E()) ) { return 2; } // ln(e^2) -> 2 + + if( not IsNegativeInfinity(Log(0.0))) { return 3; } // ln(0) -> (-nfinity) + if( not IsNan(Log(-5.0))) { return 4; } // ln() -> NaN + if( not IsNan(Log(NAN()))) { return 5; } // ln(NaN) -> NaN + if( not IsInf(Log(INFINITY()))) { return 6; } // ln(+infinity) -> +infinity + + return 0; + } + + function ArcTan2Test() : Int { + + // function ArcTan2(y : Double, x : Double) : Double + + if( 0.0 != ArcTan2( 0.0, 1.0 ) ) { return 1; } + if( PI() != ArcTan2( 0.0, -1.0 ) ) { return 2; } + if( PI()/2.0 != ArcTan2( 1.0, 0.0 ) ) { return 3; } + if( -PI()/2.0 != ArcTan2(-1.0, 0.0 ) ) { return 4; } + + if( PI()/4.0 != ArcTan2( 1.0, 1.0 ) ) { return 5; } + if( PI()*3.0/4.0 != ArcTan2( 1.0, -1.0 ) ) { return 6; } + if( -PI()*3.0/4.0 != ArcTan2(-1.0, -1.0 ) ) { return 7; } + if( -PI()/4.0 != ArcTan2(-1.0, 1.0 ) ) { return 8; } + + if( 0.0 != ArcTan2( 0.0, 0.0 ) ) { return 9; } + + // Fails because of lack of precision: + // if( PI()/6.0 != ArcTan2( 1.0, Sqrt(3.0) ) ) { return 10; } // tg(Pi/6) = sin(Pi/6) / cos(Pi/6) = (1/2) / (Sqrt(3)/2) = 1/Sqrt(3) = y/x. ArcTan2(1.0, Sqrt(3)) -> Pi/6 + + if( not IsNan(ArcTan2( NAN(), 0.0) )) { return 11; } + if( not IsNan(ArcTan2( 0.0, NAN()) )) { return 12; } + if( not IsNan(ArcTan2( NAN(), NAN()) )) { return 13; } + + // The infinity cases show discrepancy between + // https://docs.microsoft.com/en-us/dotnet/api/system.math.atan2?view=net-5.0 + // and https://en.cppreference.com/w/cpp/numeric/math/atan2 . + + return 0; + } + } diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index 3cd4332eb7c..6fbd6ec3aeb 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -2,9 +2,9 @@ %Result = type opaque %Range = type { i64, i64, i64 } %Tuple = type opaque +%Qubit = type opaque %Array = type opaque %Callable = type opaque -%Qubit = type opaque @ResultZero = external global %Result* @ResultOne = external global %Result* @@ -13,19 +13,233 @@ @PauliY = constant i2 -1 @PauliZ = constant i2 -2 @EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] -@PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctladj__wrapper] -@MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] @Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] +@Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] +@PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__ctladj__wrapper] @MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] -define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { entry: - %0 = sub i64 %from, %what - ret i64 %0 + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 +} + +declare double @__quantum__qis__sqrt__body(double) + +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isinf__body(double) + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %1 = bitcast i8* %0 to i2* + %2 = load i2, i2* @PauliZ + store i2 %2, i2* %1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %4 = bitcast i8* %3 to %Qubit** + store %Qubit* %qb, %Qubit** %4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) + ret %Result* %5 +} + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) + +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i64) + +define double @Microsoft__Quantum__Intrinsic__NAN__body() { +entry: + %0 = call double @__quantum__qis__nan__body() + ret double %0 +} + +declare double @__quantum__qis__nan__body() + +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +declare void @__quantum__qis__k__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isnegativeinfinity__body(double) + +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { +entry: + %0 = call double @__quantum__qis__infinity__body() + ret double %0 +} + +declare double @__quantum__qis__infinity__body() + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +declare void @__quantum__qis__x__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void } +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 +} + +define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { +entry: + %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) + ret double %0 +} + +declare double @__quantum__qis__arctan2__body(double, double) + +define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { +entry: + %0 = call double @__quantum__qis__log__body(double %d) + ret double %0 +} + +declare double @__quantum__qis__log__body(double) + +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isnan__body(double) + +define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { +entry: + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1 + call void @__quantum__qis__x__body(%Qubit* %qb) + %q = call %Qubit* @__quantum__rt__qubit_allocate() + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %3 = bitcast i8* %2 to %Qubit** + %4 = load %Qubit*, %Qubit** %3 + %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) + %6 = load %Result*, %Result** @ResultOne + %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) + br i1 %7, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__x__body(%Qubit* %q) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %9 = bitcast i8* %8 to %Qubit** + %10 = load %Qubit*, %Qubit** %9 + %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) + %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) + %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) + %14 = xor i1 %13, true + call void @__quantum__rt__qubit_release(%Qubit* %q) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) + ret i1 %14 +} + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare void @__quantum__rt__qubit_release(%Qubit*) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) + define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { entry: call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) @@ -89,6 +303,8 @@ then0__1: ; preds = %exit__1 %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() + %res5 = call i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() + %res6 = call i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() br label %continue__1 continue__1: ; preds = %then0__1, %exit__1 @@ -107,14 +323,8 @@ continue__1: ; preds = %then0__1, %exit__1 ret i64 %21 } -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) - -declare void @__quantum__rt__array_update_reference_count(%Array*, i64) - declare %Array* @__quantum__rt__array_copy(%Array*, i1) -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) - declare i64 @__quantum__rt__array_get_size_1d(%Array*) declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) @@ -130,7 +340,7 @@ entry: %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) store %Callable* %4, %Callable** %2 store i64 1, i64* %3 - %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) + %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) @@ -437,7 +647,7 @@ entry: %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) store %Callable* %4, %Callable** %2 store i64 %x, i64* %3 - %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) + %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 1) call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 1) %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) @@ -458,53 +668,14 @@ entry: ret i64 %11 } -define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { +define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %1 = bitcast i8* %0 to %Qubit** - %qb = load %Qubit*, %Qubit** %1 - call void @__quantum__qis__x__body(%Qubit* %qb) - %q = call %Qubit* @__quantum__rt__qubit_allocate() - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %3 = bitcast i8* %2 to %Qubit** - %4 = load %Qubit*, %Qubit** %3 - %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) - %6 = load %Result*, %Result** @ResultOne - %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) - br i1 %7, label %then0__1, label %continue__1 + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 then0__1: ; preds = %entry - call void @__quantum__qis__x__body(%Qubit* %q) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %9 = bitcast i8* %8 to %Qubit** - %10 = load %Qubit*, %Qubit** %9 - %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) - %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) - %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) - %14 = xor i1 %13, true - call void @__quantum__rt__qubit_release(%Qubit* %q) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) - ret i1 %14 -} - -define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { -entry: - %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) - %1 = fcmp one double 2.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - ret i64 1 + ret i64 1 continue__1: ; preds = %entry %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) @@ -555,8 +726,344 @@ continue__6: ; preds = %continue__5 ret i64 0 } +define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { +entry: + %d = call double @Microsoft__Quantum__Math__E__body() + %0 = call double @__quantum__qis__log__body(double %d) + %1 = fcmp one double 1.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + ret i64 1 + +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__E__body() + %3 = call double @Microsoft__Quantum__Math__E__body() + %d__1 = fmul double %2, %3 + %4 = call double @__quantum__qis__log__body(double %d__1) + %5 = fcmp one double 2.000000e+00, %4 + br i1 %5, label %then0__2, label %continue__2 + +then0__2: ; preds = %continue__1 + ret i64 2 + +continue__2: ; preds = %continue__1 + %d__3 = call double @__quantum__qis__log__body(double 0.000000e+00) + %6 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d__3) + %7 = xor i1 %6, true + br i1 %7, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + ret i64 3 + +continue__3: ; preds = %continue__2 + %d__5 = call double @__quantum__qis__log__body(double -5.000000e+00) + %8 = call i1 @__quantum__qis__isnan__body(double %d__5) + %9 = xor i1 %8, true + br i1 %9, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %d__6 = call double @__quantum__qis__nan__body() + %d__7 = call double @__quantum__qis__log__body(double %d__6) + %10 = call i1 @__quantum__qis__isnan__body(double %d__7) + %11 = xor i1 %10, true + br i1 %11, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__8 = call double @__quantum__qis__infinity__body() + %d__9 = call double @__quantum__qis__log__body(double %d__8) + %12 = call i1 @__quantum__qis__isinf__body(double %d__9) + %13 = xor i1 %12, true + br i1 %13, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 +} + +define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { +entry: + %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) + %1 = fcmp one double 0.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + ret i64 1 + +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__PI__body() + %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) + %4 = fcmp one double %2, %3 + br i1 %4, label %then0__2, label %continue__2 + +then0__2: ; preds = %continue__1 + ret i64 2 + +continue__2: ; preds = %continue__1 + %5 = call double @Microsoft__Quantum__Math__PI__body() + %6 = fdiv double %5, 2.000000e+00 + %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) + %8 = fcmp one double %6, %7 + br i1 %8, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + ret i64 3 + +continue__3: ; preds = %continue__2 + %9 = call double @Microsoft__Quantum__Math__PI__body() + %10 = fneg double %9 + %11 = fdiv double %10, 2.000000e+00 + %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) + %13 = fcmp one double %11, %12 + br i1 %13, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %14 = call double @Microsoft__Quantum__Math__PI__body() + %15 = fdiv double %14, 4.000000e+00 + %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) + %17 = fcmp one double %15, %16 + br i1 %17, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %18 = call double @Microsoft__Quantum__Math__PI__body() + %19 = fmul double %18, 3.000000e+00 + %20 = fdiv double %19, 4.000000e+00 + %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) + %22 = fcmp one double %20, %21 + br i1 %22, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + %23 = call double @Microsoft__Quantum__Math__PI__body() + %24 = fneg double %23 + %25 = fmul double %24, 3.000000e+00 + %26 = fdiv double %25, 4.000000e+00 + %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) + %28 = fcmp one double %26, %27 + br i1 %28, label %then0__7, label %continue__7 + +then0__7: ; preds = %continue__6 + ret i64 7 + +continue__7: ; preds = %continue__6 + %29 = call double @Microsoft__Quantum__Math__PI__body() + %30 = fneg double %29 + %31 = fdiv double %30, 4.000000e+00 + %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) + %33 = fcmp one double %31, %32 + br i1 %33, label %then0__8, label %continue__8 + +then0__8: ; preds = %continue__7 + ret i64 8 + +continue__8: ; preds = %continue__7 + %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) + %35 = fcmp one double 0.000000e+00, %34 + br i1 %35, label %then0__9, label %continue__9 + +then0__9: ; preds = %continue__8 + ret i64 9 + +continue__9: ; preds = %continue__8 + %y__9 = call double @__quantum__qis__nan__body() + %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) + %36 = call i1 @__quantum__qis__isnan__body(double %d) + %37 = xor i1 %36, true + br i1 %37, label %then0__10, label %continue__10 + +then0__10: ; preds = %continue__9 + ret i64 11 + +continue__10: ; preds = %continue__9 + %x__10 = call double @__quantum__qis__nan__body() + %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) + %38 = call i1 @__quantum__qis__isnan__body(double %d__1) + %39 = xor i1 %38, true + br i1 %39, label %then0__11, label %continue__11 + +then0__11: ; preds = %continue__10 + ret i64 12 + +continue__11: ; preds = %continue__10 + %y__11 = call double @__quantum__qis__nan__body() + %x__11 = call double @__quantum__qis__nan__body() + %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) + %40 = call i1 @__quantum__qis__isnan__body(double %d__2) + %41 = xor i1 %40, true + br i1 %41, label %then0__12, label %continue__12 + +then0__12: ; preds = %continue__11 + ret i64 13 + +continue__12: ; preds = %continue__11 + ret i64 0 +} + +define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { +entry: + %0 = sub i64 %from, %what + ret i64 %0 +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + br label %continue__1 + +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + declare %Tuple* @__quantum__rt__tuple_create(i64) +define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* + %1 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 1 + %3 = load i64, i64* %1 + %4 = load i64, i64* %2 + %5 = call i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %3, i64 %4) + %6 = bitcast %Tuple* %result-tuple to { i64 }* + %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 + store i64 %5, i64* %7 + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) + +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 + %2 = load i64, i64* %1 + %3 = bitcast %Tuple* %arg-tuple to { i64 }* + %4 = getelementptr { i64 }, { i64 }* %3, i64 0, i32 0 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) + %7 = bitcast %Tuple* %6 to { i64, i64 }* + %8 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 1 + store i64 %2, i64* %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + ret void +} + +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) + define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* @@ -601,9 +1108,7 @@ entry: ret void } -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) - -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 @@ -624,7 +1129,7 @@ entry: ret void } -define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Lifted__PartialApplication__2__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 @@ -650,7 +1155,7 @@ entry: ret void } -define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Lifted__PartialApplication__2__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 @@ -685,7 +1190,7 @@ entry: ret void } -define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Lifted__PartialApplication__2__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 @@ -721,7 +1226,7 @@ entry: ret void } -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { entry: %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 @@ -732,7 +1237,7 @@ entry: ret void } -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { entry: %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 @@ -743,302 +1248,22 @@ entry: ret void } -declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) - declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) declare void @__quantum__rt__callable_make_adjoint(%Callable*) declare void @__quantum__rt__callable_make_controlled(%Callable*) -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) +define double @Microsoft__Quantum__Math__E__body() { +entry: + ret double 0x4005BF0A8B145769 +} -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +define double @Microsoft__Quantum__Math__PI__body() { entry: - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %1 = bitcast i8* %0 to i2* - %2 = load i2, i2* @PauliZ - store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %4 = bitcast i8* %3 to %Qubit** - store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) - ret %Result* %5 -} - -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) - -declare %Array* @__quantum__rt__array_create_1d(i32, i64) - -declare void @__quantum__rt__qubit_release(%Qubit*) - -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) - -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) - -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) - -define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* - %1 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { i64, i64 }, { i64, i64 }* %0, i64 0, i32 1 - %3 = load i64, i64* %1 - %4 = load i64, i64* %2 - %5 = call i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %3, i64 %4) - %6 = bitcast %Tuple* %result-tuple to { i64 }* - %7 = getelementptr { i64 }, { i64 }* %6, i64 0, i32 0 - store i64 %5, i64* %7 - ret void -} - -define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 - %2 = load i64, i64* %1 - %3 = bitcast %Tuple* %arg-tuple to { i64 }* - %4 = getelementptr { i64 }, { i64 }* %3, i64 0, i32 0 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) - %7 = bitcast %Tuple* %6 to { i64, i64 }* - %8 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { i64, i64 }, { i64, i64 }* %7, i64 0, i32 1 - store i64 %2, i64* %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - ret void -} - -define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { -entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - ret void -} - -declare void @__quantum__qis__k__body(%Qubit*) - -define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { -entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - ret void + ret double 0x400921FB54442D18 } -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - br label %continue__1 - -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -declare void @__quantum__qis__x__body(%Qubit*) - -declare void @__quantum__rt__qubit_release_array(%Array*) - -define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { -entry: - %0 = call double @__quantum__qis__infinity__body() - ret double %0 -} - -declare double @__quantum__qis__infinity__body() - -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -define double @Microsoft__Quantum__Intrinsic__NAN__body() { -entry: - %0 = call double @__quantum__qis__nan__body() - ret double %0 -} - -declare double @__quantum__qis__nan__body() - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 -} - -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) - -define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnan__body(double %d) - ret i1 %0 -} - -declare i1 @__quantum__qis__isnan__body(double) - -define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isinf__body(double %d) - ret i1 %0 -} - -declare i1 @__quantum__qis__isinf__body(double) - -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} - -define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { -entry: - %0 = call double @__quantum__qis__sqrt__body(double %d) - ret double %0 -} - -declare double @__quantum__qis__sqrt__body(double) - define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { entry: %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %array__count) From 6e16e4ab8decdc0e6d64cf602f169bab9876693d Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 8 Feb 2021 17:02:04 -0800 Subject: [PATCH 7/9] Added pauli_to_string --- src/QirRuntime/lib/QIR/bridge-qis.ll | 46 +- src/QirRuntime/lib/QIR/bridge-rt.ll | 16 +- src/QirRuntime/lib/QIR/strings.cpp | 3 + src/QirRuntime/public/CoreTypes.hpp | 4 +- src/QirRuntime/test/QIR-static/CMakeLists.txt | 1 + .../test/QIR-static/qir-test-arrays.qs | 2 + .../test/QIR-static/qir-test-math.qs | 54 +- .../test/QIR-static/qir-test-qsharp.ll | 1531 +++++++++-------- .../test/QIR-static/qir-test-strings.cpp | 15 + .../test/QIR-static/qir-test-strings.qs | 30 + 10 files changed, 943 insertions(+), 759 deletions(-) create mode 100644 src/QirRuntime/test/QIR-static/qir-test-strings.cpp create mode 100644 src/QirRuntime/test/QIR-static/qir-test-strings.qs diff --git a/src/QirRuntime/lib/QIR/bridge-qis.ll b/src/QirRuntime/lib/QIR/bridge-qis.ll index dad43e9f61f..1c93d58f0fe 100644 --- a/src/QirRuntime/lib/QIR/bridge-qis.ll +++ b/src/QirRuntime/lib/QIR/bridge-qis.ll @@ -13,7 +13,7 @@ %Range = type { i64, i64, i64 } %Result = type opaque %String = type opaque -%Pauli = type {i2} +%Pauli = type i2 ;======================================================================================================================= ; Native types @@ -29,9 +29,7 @@ %struct.QirCallable = type opaque %struct.QirRange = type { i64, i64, i64 } %struct.QirString = type opaque - -; Assumptions: -; %PauliId = type {i32} +%PauliId = type i32 ;=============================================================================== ; declarations of the native methods this bridge delegates to @@ -139,53 +137,53 @@ define %Result* @__quantum__qis__measure__body(%Array* %.paulis, %Array* %.qubit ret %Result* %.r } -define void @__quantum__qis__r__body(i2 %.pauli, double %theta, %Qubit* %.q) { +define void @__quantum__qis__r__body(%Pauli %.pauli, double %theta, %Qubit* %.q) { %q = bitcast %Qubit* %.q to %class.QUBIT* - %pauli = zext i2 %.pauli to i32 - call void @quantum__qis__r__body(i32 %pauli, double %theta, %class.QUBIT* %q) + %pauli = zext %Pauli %.pauli to %PauliId + call void @quantum__qis__r__body(%PauliId %pauli, double %theta, %class.QUBIT* %q) ret void } -define void @__quantum__qis__r__adj(i2 %.pauli, double %theta, %Qubit* %.q) { +define void @__quantum__qis__r__adj(%Pauli %.pauli, double %theta, %Qubit* %.q) { %q = bitcast %Qubit* %.q to %class.QUBIT* - %pauli = zext i2 %.pauli to i32 - call void @quantum__qis__r__adj(i32 %pauli, double %theta, %class.QUBIT* %q) + %pauli = zext %Pauli %.pauli to %PauliId + call void @quantum__qis__r__adj(%PauliId %pauli, double %theta, %class.QUBIT* %q) ret void } -define void @__quantum__qis__r__ctl(%Array* %.ctls, {i2, double, %Qubit*}* %.args) { +define void @__quantum__qis__r__ctl(%Array* %.ctls, {%Pauli, double, %Qubit*}* %.args) { %ctls = bitcast %Array* %.ctls to %struct.QirArray* - %.ppauli = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 0 - %.pauli = load i2, i2* %.ppauli - %pauli = zext i2 %.pauli to i32 + %.ppauli = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 0 + %.pauli = load %Pauli, %Pauli* %.ppauli + %pauli = zext %Pauli %.pauli to %PauliId - %.ptheta = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 1 + %.ptheta = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 1 %theta = load double, double* %.ptheta - %.pq = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 2 + %.pq = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 2 %.q = load %Qubit*, %Qubit** %.pq %q = bitcast %Qubit* %.q to %class.QUBIT* - call void @quantum__qis__r__ctl(%struct.QirArray* %ctls, i32 %pauli, double %theta, %class.QUBIT* %q) + call void @quantum__qis__r__ctl(%struct.QirArray* %ctls, %PauliId %pauli, double %theta, %class.QUBIT* %q) ret void } -define void @__quantum__qis__r__ctladj(%Array* %.ctls, {i2, double, %Qubit*}* %.args) { +define void @__quantum__qis__r__ctladj(%Array* %.ctls, {%Pauli, double, %Qubit*}* %.args) { %ctls = bitcast %Array* %.ctls to %struct.QirArray* - %.ppauli = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 0 - %.pauli = load i2, i2* %.ppauli - %pauli = zext i2 %.pauli to i32 + %.ppauli = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 0 + %.pauli = load %Pauli, %Pauli* %.ppauli + %pauli = zext %Pauli %.pauli to %PauliId - %.ptheta = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 1 + %.ptheta = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 1 %theta = load double, double* %.ptheta - %.pq = getelementptr inbounds {i2, double, %Qubit*}, {i2, double, %Qubit*}* %.args, i32 0, i32 2 + %.pq = getelementptr inbounds {%Pauli, double, %Qubit*}, {%Pauli, double, %Qubit*}* %.args, i32 0, i32 2 %.q = load %Qubit*, %Qubit** %.pq %q = bitcast %Qubit* %.q to %class.QUBIT* - call void @quantum__qis__r__ctladj(%struct.QirArray* %ctls, i32 %pauli, double %theta, %class.QUBIT* %q) + call void @quantum__qis__r__ctladj(%struct.QirArray* %ctls, %PauliId %pauli, double %theta, %class.QUBIT* %q) ret void } diff --git a/src/QirRuntime/lib/QIR/bridge-rt.ll b/src/QirRuntime/lib/QIR/bridge-rt.ll index dc9ea4995e0..73a33d737a6 100644 --- a/src/QirRuntime/lib/QIR/bridge-rt.ll +++ b/src/QirRuntime/lib/QIR/bridge-rt.ll @@ -11,7 +11,7 @@ %Result = type opaque %String = type opaque %Tuple = type opaque -%Pauli = type {i2} +%Pauli = type i2 ;======================================================================================================================= ; Native types @@ -27,6 +27,7 @@ %"struct.QirCallable" = type opaque %"struct.QirRange" = type { i64, i64, i64 } %"struct.QirString" = type opaque +%PauliId = type i32 ; %Tuple* is mapped to i8* ;======================================================================================================================= @@ -97,7 +98,7 @@ declare %"struct.QirString"* @quantum__rt__int_to_string(i64) declare %"struct.QirString"* @quantum__rt__double_to_string(double) declare %"struct.QirString"* @quantum__rt__bool_to_string(i1) declare %"struct.QirString"* @quantum__rt__result_to_string(%class.RESULT*) -declare %"struct.QirString"* @quantum__rt__pauli_to_string(i32) +declare %"struct.QirString"* @quantum__rt__pauli_to_string(%PauliId) declare %"struct.QirString"* @quantum__rt__qubit_to_string(%class.QUBIT*) declare %"struct.QirString"* @quantum__rt__range_to_string(%"struct.QirRange"* dereferenceable(24) %range) @@ -378,10 +379,9 @@ define void @__quantum__rt__callable_memory_management(i32 %index, %Callable* %. ; strings bridge ; ; NYI: -;define %String* @__quantum__rt__pauli_to_string(%Pauli) ; need to check that the type is lowered correctly ;define %String* @__quantum__rt__bigint_to_string(%BigInt*) -define %String* @__quantum__rt__string_create(i8* %null_terminated_buffer) { +define %String* @__quantum__rt__string_create(i32 %ignoredStrLength, i8* %null_terminated_buffer) { %str = call %"struct.QirString"* @quantum__rt__string_create(i8* %null_terminated_buffer) %.str = bitcast %"struct.QirString"* %str to %String* ret %String* %.str @@ -435,6 +435,13 @@ define %String* @__quantum__rt__result_to_string(%Result* %.r) { ret %String* %.str } +define %String* @__quantum__rt__pauli_to_string(%Pauli %.pauli) { + %pauli = zext %Pauli %.pauli to %PauliId + %str = call %"struct.QirString"* @quantum__rt__pauli_to_string(%PauliId %pauli) + %.str = bitcast %"struct.QirString"* %str to %String* + ret %String* %.str +} + define %String* @__quantum__rt__qubit_to_string(%Qubit* %.q) { %q = bitcast %Qubit* %.q to %"class.QUBIT"* %str = call %"struct.QirString"* @quantum__rt__qubit_to_string(%"class.QUBIT"* %q) @@ -451,7 +458,6 @@ define %String* @__quantum__rt__range_to_string(%Range %.range) { ret %String* %.str } - ;------------------------------------------------------------------------------ ; bigints bridge ; diff --git a/src/QirRuntime/lib/QIR/strings.cpp b/src/QirRuntime/lib/QIR/strings.cpp index 3885bbdf3cb..0435329a1ef 100644 --- a/src/QirRuntime/lib/QIR/strings.cpp +++ b/src/QirRuntime/lib/QIR/strings.cpp @@ -135,7 +135,10 @@ extern "C" return quantum__rt__string_create("PauliY"); case PauliId_Z: return quantum__rt__string_create("PauliZ"); + default: + break; } + return quantum__rt__string_create(""); } // Returns a string representation of the range. diff --git a/src/QirRuntime/public/CoreTypes.hpp b/src/QirRuntime/public/CoreTypes.hpp index 6dd527f7f85..99319f8beaf 100644 --- a/src/QirRuntime/public/CoreTypes.hpp +++ b/src/QirRuntime/public/CoreTypes.hpp @@ -1,5 +1,7 @@ #pragma once +#include + // The core types will be exposed in the C-interfaces for interop, thus no // namespaces or scoped enums can be used to define them. @@ -27,7 +29,7 @@ enum ResultValue /*============================================================================== PauliId matrices ==============================================================================*/ -enum PauliId +enum PauliId : int32_t { PauliId_I = 0, PauliId_X = 1, diff --git a/src/QirRuntime/test/QIR-static/CMakeLists.txt b/src/QirRuntime/test/QIR-static/CMakeLists.txt index 32bbe05842b..ae056c3453b 100644 --- a/src/QirRuntime/test/QIR-static/CMakeLists.txt +++ b/src/QirRuntime/test/QIR-static/CMakeLists.txt @@ -22,6 +22,7 @@ add_custom_target(qir_static_test_lib DEPENDS ${QIR_TESTS_LIBS}) add_executable(qir-static-tests qir-driver.cpp qir-test-math.cpp + qir-test-strings.cpp ) target_link_libraries(qir-static-tests PUBLIC diff --git a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs index 41f80ec0f71..878e7248a7b 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs @@ -4,6 +4,7 @@ namespace Microsoft.Quantum.Testing.QIR { open Microsoft.Quantum.Testing.QIR.Math; + open Microsoft.Quantum.Testing.QIR.Str; @EntryPoint() operation Test_Arrays(array : Int[], index : Int, val : Int, dummy : Bool) : Int @@ -42,6 +43,7 @@ namespace Microsoft.Quantum.Testing.QIR let res4 = SqrtTest(); let res5 = LogTest(); let res6 = ArcTan2Test(); + let res7 = PauliToStringTest(); } return sum; diff --git a/src/QirRuntime/test/QIR-static/qir-test-math.qs b/src/QirRuntime/test/QIR-static/qir-test-math.qs index 77cac768b04..bdca70c30b9 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-math.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-math.qs @@ -1,31 +1,31 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -namespace Microsoft.Quantum.Testing.QIR.Math -{ +namespace Microsoft.Quantum.Testing.QIR.Math { + open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Math; // E() function SqrtTest() : Int { - if( 2.0 != Sqrt( 4.0) ) { return 1; } - if( 3.0 != Sqrt( 9.0) ) { return 2; } - if(10.0 != Sqrt(100.0) ) { return 3; } + if 2.0 != Sqrt( 4.0) { return 1; } // The return value indicates which test case has failed. + if 3.0 != Sqrt( 9.0) { return 2; } + if 10.0 != Sqrt(100.0) { return 3; } - if( not IsNan(Sqrt(-5.0))) { return 4; } - if( not IsNan(Sqrt(NAN()))) { return 5; } - if( not IsInf(Sqrt(INFINITY()))) { return 6; } + if not IsNan(Sqrt(-5.0)) { return 4; } + if not IsNan(Sqrt(NAN())) { return 5; } + if not IsInf(Sqrt(INFINITY())) { return 6; } return 0; } function LogTest() : Int { - if( 1.0 != Log(E()) ) { return 1; } // ln(e) -> 1 - if( 2.0 != Log(E() * E()) ) { return 2; } // ln(e^2) -> 2 + if 1.0 != Log(E()) { return 1; } // ln(e) -> 1 // The return value indicates which test case has failed. + if 2.0 != Log(E() * E()) { return 2; } // ln(e^2) -> 2 - if( not IsNegativeInfinity(Log(0.0))) { return 3; } // ln(0) -> (-nfinity) - if( not IsNan(Log(-5.0))) { return 4; } // ln() -> NaN - if( not IsNan(Log(NAN()))) { return 5; } // ln(NaN) -> NaN - if( not IsInf(Log(INFINITY()))) { return 6; } // ln(+infinity) -> +infinity + if not IsNegativeInfinity(Log(0.0)) { return 3; } // ln(0) -> (-nfinity) + if not IsNan(Log(-5.0)) { return 4; } // ln() -> NaN + if not IsNan(Log(NAN())) { return 5; } // ln(NaN) -> NaN + if not IsInf(Log(INFINITY())) { return 6; } // ln(+infinity) -> +infinity return 0; } @@ -34,24 +34,24 @@ namespace Microsoft.Quantum.Testing.QIR.Math // function ArcTan2(y : Double, x : Double) : Double - if( 0.0 != ArcTan2( 0.0, 1.0 ) ) { return 1; } - if( PI() != ArcTan2( 0.0, -1.0 ) ) { return 2; } - if( PI()/2.0 != ArcTan2( 1.0, 0.0 ) ) { return 3; } - if( -PI()/2.0 != ArcTan2(-1.0, 0.0 ) ) { return 4; } + if 0.0 != ArcTan2( 0.0, 1.0 ) { return 1; } // The return value indicates which test case has failed. + if PI() != ArcTan2( 0.0, -1.0 ) { return 2; } + if PI()/2.0 != ArcTan2( 1.0, 0.0 ) { return 3; } + if -PI()/2.0 != ArcTan2(-1.0, 0.0 ) { return 4; } - if( PI()/4.0 != ArcTan2( 1.0, 1.0 ) ) { return 5; } - if( PI()*3.0/4.0 != ArcTan2( 1.0, -1.0 ) ) { return 6; } - if( -PI()*3.0/4.0 != ArcTan2(-1.0, -1.0 ) ) { return 7; } - if( -PI()/4.0 != ArcTan2(-1.0, 1.0 ) ) { return 8; } + if PI()/4.0 != ArcTan2( 1.0, 1.0 ) { return 5; } + if PI()*3.0/4.0 != ArcTan2( 1.0, -1.0 ) { return 6; } + if -PI()*3.0/4.0 != ArcTan2(-1.0, -1.0 ) { return 7; } + if -PI()/4.0 != ArcTan2(-1.0, 1.0 ) { return 8; } - if( 0.0 != ArcTan2( 0.0, 0.0 ) ) { return 9; } + if 0.0 != ArcTan2( 0.0, 0.0 ) { return 9; } // Fails because of lack of precision: - // if( PI()/6.0 != ArcTan2( 1.0, Sqrt(3.0) ) ) { return 10; } // tg(Pi/6) = sin(Pi/6) / cos(Pi/6) = (1/2) / (Sqrt(3)/2) = 1/Sqrt(3) = y/x. ArcTan2(1.0, Sqrt(3)) -> Pi/6 + // if PI()/6.0 != ArcTan2( 1.0, Sqrt(3.0) ) { return 10; } // tg(Pi/6) = sin(Pi/6) / cos(Pi/6) = (1/2) / (Sqrt(3)/2) = 1/Sqrt(3) = y/x. ArcTan2(1.0, Sqrt(3)) -> Pi/6 - if( not IsNan(ArcTan2( NAN(), 0.0) )) { return 11; } - if( not IsNan(ArcTan2( 0.0, NAN()) )) { return 12; } - if( not IsNan(ArcTan2( NAN(), NAN()) )) { return 13; } + if not IsNan(ArcTan2(NAN(), 0.0) ) { return 11; } + if not IsNan(ArcTan2( 0.0, NAN()) ) { return 12; } + if not IsNan(ArcTan2(NAN(), NAN()) ) { return 13; } // The infinity cases show discrepancy between // https://docs.microsoft.com/en-us/dotnet/api/system.math.atan2?view=net-5.0 diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index 6fbd6ec3aeb..e38b36687ba 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -5,6 +5,7 @@ %Qubit = type opaque %Array = type opaque %Callable = type opaque +%String = type opaque @ResultZero = external global %Result* @ResultOne = external global %Result* @@ -13,334 +14,454 @@ @PauliY = constant i2 -1 @PauliZ = constant i2 -2 @EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] @Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] -@PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__ctladj__wrapper] +@PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctladj__wrapper] +@MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] +@Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] +@0 = internal constant [14 x i8] c"Pauli value: \00" +@1 = internal constant [20 x i8] c"Pauli value: PauliI\00" +@2 = internal constant [7 x i8] c"PauliX\00" +@3 = internal constant [7 x i8] c"PauliY\00" +@4 = internal constant [7 x i8] c"PauliZ\00" -define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { entry: - %0 = call double @__quantum__qis__sqrt__body(double %d) - ret double %0 -} + %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) + %1 = fcmp one double 0.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 -declare double @__quantum__qis__sqrt__body(double) +then0__1: ; preds = %entry + ret i64 1 -define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isinf__body(double %d) - ret i1 %0 -} +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__PI__body() + %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) + %4 = fcmp one double %2, %3 + br i1 %4, label %then0__2, label %continue__2 -declare i1 @__quantum__qis__isinf__body(double) +then0__2: ; preds = %continue__1 + ret i64 2 -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { -entry: - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %1 = bitcast i8* %0 to i2* - %2 = load i2, i2* @PauliZ - store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %4 = bitcast i8* %3 to %Qubit** - store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) - ret %Result* %5 -} +continue__2: ; preds = %continue__1 + %5 = call double @Microsoft__Quantum__Math__PI__body() + %6 = fdiv double %5, 2.000000e+00 + %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) + %8 = fcmp one double %6, %7 + br i1 %8, label %then0__3, label %continue__3 -declare %Array* @__quantum__rt__array_create_1d(i32, i64) +then0__3: ; preds = %continue__2 + ret i64 3 -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) +continue__3: ; preds = %continue__2 + %9 = call double @Microsoft__Quantum__Math__PI__body() + %10 = fneg double %9 + %11 = fdiv double %10, 2.000000e+00 + %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) + %13 = fcmp one double %11, %12 + br i1 %13, label %then0__4, label %continue__4 -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) +then0__4: ; preds = %continue__3 + ret i64 4 -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) +continue__4: ; preds = %continue__3 + %14 = call double @Microsoft__Quantum__Math__PI__body() + %15 = fdiv double %14, 4.000000e+00 + %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) + %17 = fcmp one double %15, %16 + br i1 %17, label %then0__5, label %continue__5 -declare void @__quantum__rt__array_update_reference_count(%Array*, i64) +then0__5: ; preds = %continue__4 + ret i64 5 -define double @Microsoft__Quantum__Intrinsic__NAN__body() { -entry: - %0 = call double @__quantum__qis__nan__body() - ret double %0 -} +continue__5: ; preds = %continue__4 + %18 = call double @Microsoft__Quantum__Math__PI__body() + %19 = fmul double %18, 3.000000e+00 + %20 = fdiv double %19, 4.000000e+00 + %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) + %22 = fcmp one double %20, %21 + br i1 %22, label %then0__6, label %continue__6 -declare double @__quantum__qis__nan__body() +then0__6: ; preds = %continue__5 + ret i64 6 -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +continue__6: ; preds = %continue__5 + %23 = call double @Microsoft__Quantum__Math__PI__body() + %24 = fneg double %23 + %25 = fmul double %24, 3.000000e+00 + %26 = fdiv double %25, 4.000000e+00 + %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) + %28 = fcmp one double %26, %27 + br i1 %28, label %then0__7, label %continue__7 -declare void @__quantum__qis__k__body(%Qubit*) +then0__7: ; preds = %continue__6 + ret i64 7 -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +continue__7: ; preds = %continue__6 + %29 = call double @Microsoft__Quantum__Math__PI__body() + %30 = fneg double %29 + %31 = fdiv double %30, 4.000000e+00 + %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) + %33 = fcmp one double %31, %32 + br i1 %33, label %then0__8, label %continue__8 -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__8: ; preds = %continue__7 + ret i64 8 -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) +continue__8: ; preds = %continue__7 + %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) + %35 = fcmp one double 0.000000e+00, %34 + br i1 %35, label %then0__9, label %continue__9 -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__9: ; preds = %continue__8 + ret i64 9 -define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) - ret i1 %0 -} +continue__9: ; preds = %continue__8 + %y__9 = call double @__quantum__qis__nan__body() + %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) + %36 = call i1 @__quantum__qis__isnan__body(double %d) + %37 = xor i1 %36, true + br i1 %37, label %then0__10, label %continue__10 -declare i1 @__quantum__qis__isnegativeinfinity__body(double) +then0__10: ; preds = %continue__9 + ret i64 11 -define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { -entry: - %0 = call double @__quantum__qis__infinity__body() - ret double %0 -} +continue__10: ; preds = %continue__9 + %x__10 = call double @__quantum__qis__nan__body() + %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) + %38 = call i1 @__quantum__qis__isnan__body(double %d__1) + %39 = xor i1 %38, true + br i1 %39, label %then0__11, label %continue__11 -declare double @__quantum__qis__infinity__body() +then0__11: ; preds = %continue__10 + ret i64 12 -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} +continue__11: ; preds = %continue__10 + %y__11 = call double @__quantum__qis__nan__body() + %x__11 = call double @__quantum__qis__nan__body() + %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) + %40 = call i1 @__quantum__qis__isnan__body(double %d__2) + %41 = xor i1 %40, true + br i1 %41, label %then0__12, label %continue__12 -declare void @__quantum__qis__x__body(%Qubit*) +then0__12: ; preds = %continue__11 + ret i64 13 -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void +continue__12: ; preds = %continue__11 + ret i64 0 } -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +declare double @__quantum__qis__arctan2__body(double, double) + +define double @Microsoft__Quantum__Math__PI__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void + ret double 0x400921FB54442D18 } -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) +declare double @__quantum__qis__nan__body() -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +declare i1 @__quantum__qis__isnan__body(double) -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 -} + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 -define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { -entry: - %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) - ret double %0 -} +then0__1: ; preds = %entry + ret i64 1 -declare double @__quantum__qis__arctan2__body(double, double) +continue__1: ; preds = %entry + %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) + %3 = fcmp one double 3.000000e+00, %2 + br i1 %3, label %then0__2, label %continue__2 -define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { -entry: - %0 = call double @__quantum__qis__log__body(double %d) - ret double %0 -} +then0__2: ; preds = %continue__1 + ret i64 2 -declare double @__quantum__qis__log__body(double) +continue__2: ; preds = %continue__1 + %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) + %5 = fcmp one double 1.000000e+01, %4 + br i1 %5, label %then0__3, label %continue__3 -define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnan__body(double %d) - ret i1 %0 -} +then0__3: ; preds = %continue__2 + ret i64 3 -declare i1 @__quantum__qis__isnan__body(double) +continue__3: ; preds = %continue__2 + %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) + %6 = call i1 @__quantum__qis__isnan__body(double %d__4) + %7 = xor i1 %6, true + br i1 %7, label %then0__4, label %continue__4 -define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %d__5 = call double @__quantum__qis__nan__body() + %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) + %8 = call i1 @__quantum__qis__isnan__body(double %d__6) + %9 = xor i1 %8, true + br i1 %9, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__7 = call double @__quantum__qis__infinity__body() + %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) + %10 = call i1 @__quantum__qis__isinf__body(double %d__8) + %11 = xor i1 %10, true + br i1 %11, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 +} + +declare double @__quantum__qis__sqrt__body(double) + +declare double @__quantum__qis__infinity__body() + +declare i1 @__quantum__qis__isinf__body(double) + +define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %1 = bitcast i8* %0 to %Qubit** - %qb = load %Qubit*, %Qubit** %1 - call void @__quantum__qis__x__body(%Qubit* %qb) - %q = call %Qubit* @__quantum__rt__qubit_allocate() - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %3 = bitcast i8* %2 to %Qubit** - %4 = load %Qubit*, %Qubit** %3 - %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) - %6 = load %Result*, %Result** @ResultOne - %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) - br i1 %7, label %then0__1, label %continue__1 + %d = call double @Microsoft__Quantum__Math__E__body() + %0 = call double @__quantum__qis__log__body(double %d) + %1 = fcmp one double 1.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 then0__1: ; preds = %entry - call void @__quantum__qis__x__body(%Qubit* %q) - br label %continue__1 + ret i64 1 -continue__1: ; preds = %then0__1, %entry - %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %9 = bitcast i8* %8 to %Qubit** - %10 = load %Qubit*, %Qubit** %9 - %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) - %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) - %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) - %14 = xor i1 %13, true - call void @__quantum__rt__qubit_release(%Qubit* %q) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) - ret i1 %14 -} +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__E__body() + %3 = call double @Microsoft__Quantum__Math__E__body() + %d__1 = fmul double %2, %3 + %4 = call double @__quantum__qis__log__body(double %d__1) + %5 = fcmp one double 2.000000e+00, %4 + br i1 %5, label %then0__2, label %continue__2 -declare %Qubit* @__quantum__rt__qubit_allocate() +then0__2: ; preds = %continue__1 + ret i64 2 -declare %Array* @__quantum__rt__qubit_allocate_array(i64) +continue__2: ; preds = %continue__1 + %d__3 = call double @__quantum__qis__log__body(double 0.000000e+00) + %6 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d__3) + %7 = xor i1 %6, true + br i1 %7, label %then0__3, label %continue__3 -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) +then0__3: ; preds = %continue__2 + ret i64 3 -declare void @__quantum__rt__qubit_release(%Qubit*) +continue__3: ; preds = %continue__2 + %d__5 = call double @__quantum__qis__log__body(double -5.000000e+00) + %8 = call i1 @__quantum__qis__isnan__body(double %d__5) + %9 = xor i1 %8, true + br i1 %9, label %then0__4, label %continue__4 -declare void @__quantum__rt__qubit_release_array(%Array*) +then0__4: ; preds = %continue__3 + ret i64 4 -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) +continue__4: ; preds = %continue__3 + %d__6 = call double @__quantum__qis__nan__body() + %d__7 = call double @__quantum__qis__log__body(double %d__6) + %10 = call i1 @__quantum__qis__isnan__body(double %d__7) + %11 = xor i1 %10, true + br i1 %11, label %then0__5, label %continue__5 -define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__8 = call double @__quantum__qis__infinity__body() + %d__9 = call double @__quantum__qis__log__body(double %d__8) + %12 = call i1 @__quantum__qis__isinf__body(double %d__9) + %13 = xor i1 %12, true + br i1 %13, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 +} + +define double @Microsoft__Quantum__Math__E__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - %local = alloca %Array* - store %Array* %array, %Array** %local - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) - %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) - %2 = bitcast i8* %1 to i64* - store i64 %val, i64* %2 - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) - store %Array* %0, %Array** %local - %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) - %3 = sub i64 %n, 1 - %4 = load %Range, %Range* @EmptyRange - %5 = insertvalue %Range %4, i64 %index, 0 - %6 = insertvalue %Range %5, i64 1, 1 - %7 = insertvalue %Range %6, i64 %3, 2 - %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) - %8 = load %Range, %Range* @EmptyRange - %9 = insertvalue %Range %8, i64 %index, 0 - %10 = insertvalue %Range %9, i64 -2, 1 - %11 = insertvalue %Range %10, i64 0, 2 - %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) - %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) - %sum = alloca i64 - store i64 0, i64* %sum - %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) - %13 = sub i64 %12, 1 - br label %header__1 + ret double 0x4005BF0A8B145769 +} -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] - %14 = icmp sle i64 %i, %13 - br i1 %14, label %body__1, label %exit__1 +declare double @__quantum__qis__log__body(double) -body__1: ; preds = %header__1 - %15 = load i64, i64* %sum - %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) - %17 = bitcast i8* %16 to i64* - %18 = load i64, i64* %17 - %19 = add i64 %15, %18 - store i64 %19, i64* %sum - br label %exiting__1 +declare i1 @__quantum__qis__isnegativeinfinity__body(double) -exiting__1: ; preds = %body__1 - %20 = add i64 %i, 1 - br label %header__1 +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +entry: + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 +} -exit__1: ; preds = %header__1 - br i1 %dummy, label %then0__1, label %continue__1 +define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { +entry: + %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) + ret double %0 +} -then0__1: ; preds = %exit__1 - %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() - %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) - %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() - %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() - %res5 = call i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() - %res6 = call i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() - br label %continue__1 +define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { +entry: + %0 = call double @__quantum__qis__log__body(double %d) + ret double %0 +} -continue__1: ; preds = %then0__1, %exit__1 - %21 = load i64, i64* %sum - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - ret i64 %21 +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 } -declare %Array* @__quantum__rt__array_copy(%Array*, i1) +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} -declare i64 @__quantum__rt__array_get_size_1d(%Array*) +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) +declare void @__quantum__qis__k__body(%Qubit*) -declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { entry: - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* - %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 - %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 - %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) - store %Callable* %4, %Callable** %2 + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) + +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define double @Microsoft__Quantum__Intrinsic__NAN__body() { +entry: + %0 = call double @__quantum__qis__nan__body() + ret double %0 +} + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +declare void @__quantum__qis__x__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %1 = bitcast i8* %0 to i2* + %2 = load i2, i2* @PauliZ + store i2 %2, i2* %1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %4 = bitcast i8* %3 to %Qubit** + store %Qubit* %qb, %Qubit** %4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) + ret %Result* %5 +} + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i64) + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 +} + +define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) + ret i1 %0 +} + +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { +entry: + %0 = call double @__quantum__qis__infinity__body() + ret double %0 +} + +define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { +entry: + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* + %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 + %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + store %Callable* %4, %Callable** %2 store i64 1, i64* %3 - %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) + %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) @@ -638,6 +759,312 @@ continue__1: ; preds = %continue__2, %then0 ret i64 %103 } +declare %Tuple* @__quantum__rt__tuple_create(i64) + +define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) + +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %12) + call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %18) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} + +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) + +declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) + +declare void @__quantum__rt__callable_make_adjoint(%Callable*) + +declare void @__quantum__rt__callable_make_controlled(%Callable*) + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare void @__quantum__rt__qubit_release(%Qubit*) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) + +define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + %local = alloca %Array* + store %Array* %array, %Array** %local + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) + %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) + %2 = bitcast i8* %1 to i64* + store i64 %val, i64* %2 + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) + store %Array* %0, %Array** %local + %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) + %3 = sub i64 %n, 1 + %4 = load %Range, %Range* @EmptyRange + %5 = insertvalue %Range %4, i64 %index, 0 + %6 = insertvalue %Range %5, i64 1, 1 + %7 = insertvalue %Range %6, i64 %3, 2 + %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) + %8 = load %Range, %Range* @EmptyRange + %9 = insertvalue %Range %8, i64 %index, 0 + %10 = insertvalue %Range %9, i64 -2, 1 + %11 = insertvalue %Range %10, i64 0, 2 + %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) + %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) + %sum = alloca i64 + store i64 0, i64* %sum + %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) + %13 = sub i64 %12, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] + %14 = icmp sle i64 %i, %13 + br i1 %14, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %15 = load i64, i64* %sum + %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) + %17 = bitcast i8* %16 to i64* + %18 = load i64, i64* %17 + %19 = add i64 %15, %18 + store i64 %19, i64* %sum + br label %exiting__1 + +exiting__1: ; preds = %body__1 + %20 = add i64 %i, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + br i1 %dummy, label %then0__1, label %continue__1 + +then0__1: ; preds = %exit__1 + %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() + %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) + %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() + %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() + %res5 = call i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() + %res6 = call i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() + %res7 = call i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() + br label %continue__1 + +continue__1: ; preds = %then0__1, %exit__1 + %21 = load i64, i64* %sum + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + ret i64 %21 +} + +declare %Array* @__quantum__rt__array_copy(%Array*, i1) + +declare i64 @__quantum__rt__array_get_size_1d(%Array*) + +declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) + +declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) + define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { entry: %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) @@ -647,7 +1074,7 @@ entry: %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) store %Callable* %4, %Callable** %2 store i64 %x, i64* %3 - %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) + %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %subtractor, i64 1) call void @__quantum__rt__callable_update_alias_count(%Callable* %subtractor, i64 1) %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) @@ -668,250 +1095,151 @@ entry: ret i64 %11 } -define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { -entry: - %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) - %1 = fcmp one double 2.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) - %3 = fcmp one double 3.000000e+00, %2 - br i1 %3, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - ret i64 2 - -continue__2: ; preds = %continue__1 - %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) - %5 = fcmp one double 1.000000e+01, %4 - br i1 %5, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - ret i64 3 - -continue__3: ; preds = %continue__2 - %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) - %6 = call i1 @__quantum__qis__isnan__body(double %d__4) - %7 = xor i1 %6, true - br i1 %7, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %d__5 = call double @__quantum__qis__nan__body() - %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) - %8 = call i1 @__quantum__qis__isnan__body(double %d__6) - %9 = xor i1 %8, true - br i1 %9, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 - -continue__5: ; preds = %continue__4 - %d__7 = call double @__quantum__qis__infinity__body() - %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) - %10 = call i1 @__quantum__qis__isinf__body(double %d__8) - %11 = xor i1 %10, true - br i1 %11, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - ret i64 6 - -continue__6: ; preds = %continue__5 - ret i64 0 -} - -define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { -entry: - %d = call double @Microsoft__Quantum__Math__E__body() - %0 = call double @__quantum__qis__log__body(double %d) - %1 = fcmp one double 1.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @Microsoft__Quantum__Math__E__body() - %3 = call double @Microsoft__Quantum__Math__E__body() - %d__1 = fmul double %2, %3 - %4 = call double @__quantum__qis__log__body(double %d__1) - %5 = fcmp one double 2.000000e+00, %4 - br i1 %5, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - ret i64 2 - -continue__2: ; preds = %continue__1 - %d__3 = call double @__quantum__qis__log__body(double 0.000000e+00) - %6 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d__3) - %7 = xor i1 %6, true - br i1 %7, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - ret i64 3 - -continue__3: ; preds = %continue__2 - %d__5 = call double @__quantum__qis__log__body(double -5.000000e+00) - %8 = call i1 @__quantum__qis__isnan__body(double %d__5) - %9 = xor i1 %8, true - br i1 %9, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %d__6 = call double @__quantum__qis__nan__body() - %d__7 = call double @__quantum__qis__log__body(double %d__6) - %10 = call i1 @__quantum__qis__isnan__body(double %d__7) - %11 = xor i1 %10, true - br i1 %11, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 - -continue__5: ; preds = %continue__4 - %d__8 = call double @__quantum__qis__infinity__body() - %d__9 = call double @__quantum__qis__log__body(double %d__8) - %12 = call i1 @__quantum__qis__isinf__body(double %d__9) - %13 = xor i1 %12, true - br i1 %13, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - ret i64 6 - -continue__6: ; preds = %continue__5 - ret i64 0 -} - -define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { +define i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() { entry: - %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) - %1 = fcmp one double 0.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1 + call void @__quantum__qis__x__body(%Qubit* %qb) + %q = call %Qubit* @__quantum__rt__qubit_allocate() + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %3 = bitcast i8* %2 to %Qubit** + %4 = load %Qubit*, %Qubit** %3 + %5 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %4) + %6 = load %Result*, %Result** @ResultOne + %7 = call i1 @__quantum__rt__result_equal(%Result* %5, %Result* %6) + br i1 %7, label %then0__1, label %continue__1 then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @Microsoft__Quantum__Math__PI__body() - %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) - %4 = fcmp one double %2, %3 - br i1 %4, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - ret i64 2 - -continue__2: ; preds = %continue__1 - %5 = call double @Microsoft__Quantum__Math__PI__body() - %6 = fdiv double %5, 2.000000e+00 - %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) - %8 = fcmp one double %6, %7 - br i1 %8, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - ret i64 3 - -continue__3: ; preds = %continue__2 - %9 = call double @Microsoft__Quantum__Math__PI__body() - %10 = fneg double %9 - %11 = fdiv double %10, 2.000000e+00 - %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) - %13 = fcmp one double %11, %12 - br i1 %13, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %14 = call double @Microsoft__Quantum__Math__PI__body() - %15 = fdiv double %14, 4.000000e+00 - %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) - %17 = fcmp one double %15, %16 - br i1 %17, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 - -continue__5: ; preds = %continue__4 - %18 = call double @Microsoft__Quantum__Math__PI__body() - %19 = fmul double %18, 3.000000e+00 - %20 = fdiv double %19, 4.000000e+00 - %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) - %22 = fcmp one double %20, %21 - br i1 %22, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - ret i64 6 - -continue__6: ; preds = %continue__5 - %23 = call double @Microsoft__Quantum__Math__PI__body() - %24 = fneg double %23 - %25 = fmul double %24, 3.000000e+00 - %26 = fdiv double %25, 4.000000e+00 - %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) - %28 = fcmp one double %26, %27 - br i1 %28, label %then0__7, label %continue__7 - -then0__7: ; preds = %continue__6 - ret i64 7 - -continue__7: ; preds = %continue__6 - %29 = call double @Microsoft__Quantum__Math__PI__body() - %30 = fneg double %29 - %31 = fdiv double %30, 4.000000e+00 - %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) - %33 = fcmp one double %31, %32 - br i1 %33, label %then0__8, label %continue__8 - -then0__8: ; preds = %continue__7 - ret i64 8 + call void @__quantum__qis__x__body(%Qubit* %q) + br label %continue__1 -continue__8: ; preds = %continue__7 - %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) - %35 = fcmp one double 0.000000e+00, %34 - br i1 %35, label %then0__9, label %continue__9 +continue__1: ; preds = %then0__1, %entry + %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %9 = bitcast i8* %8 to %Qubit** + %10 = load %Qubit*, %Qubit** %9 + %11 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %10) + %12 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) + %13 = call i1 @__quantum__rt__result_equal(%Result* %11, %Result* %12) + %14 = xor i1 %13, true + call void @__quantum__rt__qubit_release(%Qubit* %q) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %11, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %12, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qs, i64 -1) + ret i1 %14 +} -then0__9: ; preds = %continue__8 - ret i64 9 +define i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() { +entry: + %0 = load i2, i2* @PauliI + %pauli = alloca i2 + store i2 %0, i2* %pauli + %1 = call %String* @__quantum__rt__string_create(i32 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @0, i32 0, i32 0)) + %2 = call %String* @__quantum__rt__pauli_to_string(i2 %0) + %3 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %2) + call void @__quantum__rt__string_update_reference_count(%String* %1, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %2, i64 -1) + %str = alloca %String* + store %String* %3, %String** %str + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 1) + %4 = call %String* @__quantum__rt__string_create(i32 19, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @1, i32 0, i32 0)) + %5 = call i1 @__quantum__rt__string_equal(%String* %4, %String* %3) + %6 = xor i1 %5, true + br i1 %6, label %then0__1, label %continue__1 -continue__9: ; preds = %continue__8 - %y__9 = call double @__quantum__qis__nan__body() - %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) - %36 = call i1 @__quantum__qis__isnan__body(double %d) - %37 = xor i1 %36, true - br i1 %37, label %then0__10, label %continue__10 +then0__1: ; preds = %entry + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + ret i64 1 -then0__10: ; preds = %continue__9 - ret i64 11 +continue__1: ; preds = %entry + %7 = load i2, i2* @PauliX + store i2 %7, i2* %pauli + %8 = call %String* @__quantum__rt__pauli_to_string(i2 %7) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 1) + store %String* %8, %String** %str + %9 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @2, i32 0, i32 0)) + %10 = call i1 @__quantum__rt__string_equal(%String* %9, %String* %8) + %11 = xor i1 %10, true + br i1 %11, label %then0__2, label %continue__2 -continue__10: ; preds = %continue__9 - %x__10 = call double @__quantum__qis__nan__body() - %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) - %38 = call i1 @__quantum__qis__isnan__body(double %d__1) - %39 = xor i1 %38, true - br i1 %39, label %then0__11, label %continue__11 +then0__2: ; preds = %continue__1 + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + ret i64 2 -then0__11: ; preds = %continue__10 - ret i64 12 +continue__2: ; preds = %continue__1 + %12 = load i2, i2* @PauliY + store i2 %12, i2* %pauli + %13 = call %String* @__quantum__rt__pauli_to_string(i2 %12) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 1) + store %String* %13, %String** %str + %14 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @3, i32 0, i32 0)) + %15 = call i1 @__quantum__rt__string_equal(%String* %14, %String* %13) + %16 = xor i1 %15, true + br i1 %16, label %then0__3, label %continue__3 -continue__11: ; preds = %continue__10 - %y__11 = call double @__quantum__qis__nan__body() - %x__11 = call double @__quantum__qis__nan__body() - %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) - %40 = call i1 @__quantum__qis__isnan__body(double %d__2) - %41 = xor i1 %40, true - br i1 %41, label %then0__12, label %continue__12 +then0__3: ; preds = %continue__2 + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + ret i64 3 -then0__12: ; preds = %continue__11 - ret i64 13 +continue__3: ; preds = %continue__2 + %17 = load i2, i2* @PauliZ + store i2 %17, i2* %pauli + %18 = call %String* @__quantum__rt__pauli_to_string(i2 %17) + call void @__quantum__rt__string_update_reference_count(%String* %18, i64 1) + store %String* %18, %String** %str + %19 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @4, i32 0, i32 0)) + %20 = call i1 @__quantum__rt__string_equal(%String* %19, %String* %18) + %21 = xor i1 %20, true + br i1 %21, label %then0__4, label %continue__4 -continue__12: ; preds = %continue__11 +then0__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) + ret i64 4 + +continue__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) ret i64 0 } @@ -993,8 +1321,6 @@ continue__1: ; preds = %then0__1, %entry ret void } -declare %Tuple* @__quantum__rt__tuple_create(i64) - define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* @@ -1009,9 +1335,7 @@ entry: ret void } -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) - -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 1 @@ -1032,200 +1356,6 @@ entry: ret void } -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) - -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) - -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) - -define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} - -define void @Lifted__PartialApplication__2__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__2__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %12) - call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__2__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__2__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %18) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} - define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i64 %count-change) { entry: %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* @@ -1248,21 +1378,18 @@ entry: ret void } -declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) +declare void @__quantum__rt__qubit_release_array(%Array*) -declare void @__quantum__rt__callable_make_adjoint(%Callable*) -declare void @__quantum__rt__callable_make_controlled(%Callable*) +declare %String* @__quantum__rt__string_create(i32, i8*) -define double @Microsoft__Quantum__Math__E__body() { -entry: - ret double 0x4005BF0A8B145769 -} +declare %String* @__quantum__rt__pauli_to_string(i2) -define double @Microsoft__Quantum__Math__PI__body() { -entry: - ret double 0x400921FB54442D18 -} +declare %String* @__quantum__rt__string_concatenate(%String*, %String*) + +declare void @__quantum__rt__string_update_reference_count(%String*, i64) + +declare i1 @__quantum__rt__string_equal(%String*, %String*) define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { entry: diff --git a/src/QirRuntime/test/QIR-static/qir-test-strings.cpp b/src/QirRuntime/test/QIR-static/qir-test-strings.cpp new file mode 100644 index 00000000000..7cbe6c3592e --- /dev/null +++ b/src/QirRuntime/test/QIR-static/qir-test-strings.cpp @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#include + +#include "catch.hpp" + + +extern "C" uint64_t Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body(); // NOLINT + + +TEST_CASE("QIR: Strings", "[qir.Str][qir.Str.PauliToString]") +{ + REQUIRE(0 == Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body()); +} + diff --git a/src/QirRuntime/test/QIR-static/qir-test-strings.qs b/src/QirRuntime/test/QIR-static/qir-test-strings.qs new file mode 100644 index 00000000000..53702845e5d --- /dev/null +++ b/src/QirRuntime/test/QIR-static/qir-test-strings.qs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace Microsoft.Quantum.Testing.QIR.Str { + + open Microsoft.Quantum.Intrinsic; + + function PauliToStringTest() : Int { + + mutable pauli = PauliI; + mutable str = $"Pauli value: {pauli}"; + if "Pauli value: PauliI" != str { return 1; } // The return value indicates which test case has failed. + + set pauli = PauliX; + set str = $"{pauli}"; + if "PauliX" != str { return 2; } + + set pauli = PauliY; + set str = $"{pauli}"; + if "PauliY" != str { return 3; } + + set pauli = PauliZ; + set str = $"{pauli}"; + if "PauliZ" != str { return 4; } + + return 0; + } + +} + From 47053d5ce7065f7133e004f63c73b1e287718d87 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 8 Feb 2021 18:45:13 -0800 Subject: [PATCH 8/9] CR changes. --- .../test/QIR-static/qir-test-qsharp.ll | 1679 ++++++++--------- .../test/QIR-static/qir-test-strings.qs | 20 +- 2 files changed, 830 insertions(+), 869 deletions(-) diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index e38b36687ba..491eba38f94 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -2,10 +2,10 @@ %Result = type opaque %Range = type { i64, i64, i64 } %Tuple = type opaque -%Qubit = type opaque %Array = type opaque -%Callable = type opaque +%Qubit = type opaque %String = type opaque +%Callable = type opaque @ResultZero = external global %Result* @ResultOne = external global %Result* @@ -14,218 +14,287 @@ @PauliY = constant i2 -1 @PauliZ = constant i2 -2 @EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } +@0 = internal constant [20 x i8] c"Pauli value: PauliI\00" +@1 = internal constant [14 x i8] c"Pauli value: \00" +@2 = internal constant [7 x i8] c"PauliX\00" +@3 = internal constant [7 x i8] c"PauliY\00" +@4 = internal constant [7 x i8] c"PauliZ\00" @Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] @PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctladj__wrapper] @MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] @Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] -@0 = internal constant [14 x i8] c"Pauli value: \00" -@1 = internal constant [20 x i8] c"Pauli value: PauliI\00" -@2 = internal constant [7 x i8] c"PauliX\00" -@3 = internal constant [7 x i8] c"PauliY\00" -@4 = internal constant [7 x i8] c"PauliZ\00" -define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { +define double @Microsoft__Quantum__Math__PI__body() { entry: - %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) - %1 = fcmp one double 0.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - ret i64 1 + ret double 0x400921FB54442D18 +} -continue__1: ; preds = %entry - %2 = call double @Microsoft__Quantum__Math__PI__body() - %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) - %4 = fcmp one double %2, %3 - br i1 %4, label %then0__2, label %continue__2 +define double @Microsoft__Quantum__Math__E__body() { +entry: + ret double 0x4005BF0A8B145769 +} -then0__2: ; preds = %continue__1 - ret i64 2 +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 +} -continue__2: ; preds = %continue__1 - %5 = call double @Microsoft__Quantum__Math__PI__body() - %6 = fdiv double %5, 2.000000e+00 - %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) - %8 = fcmp one double %6, %7 - br i1 %8, label %then0__3, label %continue__3 +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) -then0__3: ; preds = %continue__2 - ret i64 3 +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) -continue__3: ; preds = %continue__2 - %9 = call double @Microsoft__Quantum__Math__PI__body() - %10 = fneg double %9 - %11 = fdiv double %10, 2.000000e+00 - %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) - %13 = fcmp one double %11, %12 - br i1 %13, label %then0__4, label %continue__4 +define double @Microsoft__Quantum__Intrinsic__NAN__body() { +entry: + %0 = call double @__quantum__qis__nan__body() + ret double %0 +} -then0__4: ; preds = %continue__3 - ret i64 4 +declare double @__quantum__qis__nan__body() -continue__4: ; preds = %continue__3 - %14 = call double @Microsoft__Quantum__Math__PI__body() - %15 = fdiv double %14, 4.000000e+00 - %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) - %17 = fcmp one double %15, %16 - br i1 %17, label %then0__5, label %continue__5 +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +entry: + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 +} -then0__5: ; preds = %continue__4 - ret i64 5 +declare double @__quantum__qis__sqrt__body(double) -continue__5: ; preds = %continue__4 - %18 = call double @Microsoft__Quantum__Math__PI__body() - %19 = fmul double %18, 3.000000e+00 - %20 = fdiv double %19, 4.000000e+00 - %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) - %22 = fcmp one double %20, %21 - br i1 %22, label %then0__6, label %continue__6 +define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { +entry: + %0 = call double @__quantum__qis__log__body(double %d) + ret double %0 +} -then0__6: ; preds = %continue__5 - ret i64 6 +declare double @__quantum__qis__log__body(double) -continue__6: ; preds = %continue__5 - %23 = call double @Microsoft__Quantum__Math__PI__body() - %24 = fneg double %23 - %25 = fmul double %24, 3.000000e+00 - %26 = fdiv double %25, 4.000000e+00 - %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) - %28 = fcmp one double %26, %27 - br i1 %28, label %then0__7, label %continue__7 +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} -then0__7: ; preds = %continue__6 - ret i64 7 +declare i1 @__quantum__qis__isnan__body(double) -continue__7: ; preds = %continue__6 - %29 = call double @Microsoft__Quantum__Math__PI__body() - %30 = fneg double %29 - %31 = fdiv double %30, 4.000000e+00 - %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) - %33 = fcmp one double %31, %32 - br i1 %33, label %then0__8, label %continue__8 +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -then0__8: ; preds = %continue__7 - ret i64 8 +declare void @__quantum__qis__k__body(%Qubit*) -continue__8: ; preds = %continue__7 - %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) - %35 = fcmp one double 0.000000e+00, %34 - br i1 %35, label %then0__9, label %continue__9 +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} -then0__9: ; preds = %continue__8 - ret i64 9 +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__9: ; preds = %continue__8 - %y__9 = call double @__quantum__qis__nan__body() - %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) - %36 = call i1 @__quantum__qis__isnan__body(double %d) - %37 = xor i1 %36, true - br i1 %37, label %then0__10, label %continue__10 +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) -then0__10: ; preds = %continue__9 - ret i64 11 +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__10: ; preds = %continue__9 - %x__10 = call double @__quantum__qis__nan__body() - %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) - %38 = call i1 @__quantum__qis__isnan__body(double %d__1) - %39 = xor i1 %38, true - br i1 %39, label %then0__11, label %continue__11 +define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) + ret i1 %0 +} -then0__11: ; preds = %continue__10 - ret i64 12 +declare i1 @__quantum__qis__isnegativeinfinity__body(double) -continue__11: ; preds = %continue__10 - %y__11 = call double @__quantum__qis__nan__body() - %x__11 = call double @__quantum__qis__nan__body() - %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) - %40 = call i1 @__quantum__qis__isnan__body(double %d__2) - %41 = xor i1 %40, true - br i1 %41, label %then0__12, label %continue__12 +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { +entry: + %0 = call double @__quantum__qis__infinity__body() + ret double %0 +} -then0__12: ; preds = %continue__11 - ret i64 13 +declare double @__quantum__qis__infinity__body() -continue__12: ; preds = %continue__11 - ret i64 0 +define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { +entry: + %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) + ret double %0 } declare double @__quantum__qis__arctan2__body(double, double) -define double @Microsoft__Quantum__Math__PI__body() { +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { entry: - ret double 0x400921FB54442D18 + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 } -declare double @__quantum__qis__nan__body() - -declare i1 @__quantum__qis__isnan__body(double) +declare i1 @__quantum__qis__isinf__body(double) -define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { entry: - %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) - %1 = fcmp one double 2.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) - %3 = fcmp one double 3.000000e+00, %2 - br i1 %3, label %then0__2, label %continue__2 + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} -then0__2: ; preds = %continue__1 - ret i64 2 +declare void @__quantum__qis__x__body(%Qubit*) -continue__2: ; preds = %continue__1 - %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) - %5 = fcmp one double 1.000000e+01, %4 - br i1 %5, label %then0__3, label %continue__3 +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} -then0__3: ; preds = %continue__2 - ret i64 3 +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__3: ; preds = %continue__2 - %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) - %6 = call i1 @__quantum__qis__isnan__body(double %d__4) - %7 = xor i1 %6, true - br i1 %7, label %then0__4, label %continue__4 +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) -then0__4: ; preds = %continue__3 - ret i64 4 +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} -continue__4: ; preds = %continue__3 - %d__5 = call double @__quantum__qis__nan__body() - %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) - %8 = call i1 @__quantum__qis__isnan__body(double %d__6) - %9 = xor i1 %8, true - br i1 %9, label %then0__5, label %continue__5 +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %1 = bitcast i8* %0 to i2* + %2 = load i2, i2* @PauliZ + store i2 %2, i2* %1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %4 = bitcast i8* %3 to %Qubit** + store %Qubit* %qb, %Qubit** %4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) + ret %Result* %5 +} -then0__5: ; preds = %continue__4 - ret i64 5 +declare %Array* @__quantum__rt__array_create_1d(i32, i64) -continue__5: ; preds = %continue__4 - %d__7 = call double @__quantum__qis__infinity__body() - %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) - %10 = call i1 @__quantum__qis__isinf__body(double %d__8) +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i64) + +define i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() { +entry: + %0 = call %String* @__quantum__rt__string_create(i32 19, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @0, i32 0, i32 0)) + %1 = call %String* @__quantum__rt__string_create(i32 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @1, i32 0, i32 0)) + %2 = load i2, i2* @PauliI + %3 = call %String* @__quantum__rt__pauli_to_string(i2 %2) + %4 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %3) + call void @__quantum__rt__string_update_reference_count(%String* %1, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + %5 = call i1 @__quantum__rt__string_equal(%String* %0, %String* %4) + %6 = xor i1 %5, true + br i1 %6, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + ret i64 1 + +continue__1: ; preds = %entry + %7 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @2, i32 0, i32 0)) + %8 = load i2, i2* @PauliX + %9 = call %String* @__quantum__rt__pauli_to_string(i2 %8) + %10 = call i1 @__quantum__rt__string_equal(%String* %7, %String* %9) %11 = xor i1 %10, true - br i1 %11, label %then0__6, label %continue__6 + br i1 %11, label %then0__2, label %continue__2 -then0__6: ; preds = %continue__5 - ret i64 6 +then0__2: ; preds = %continue__1 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + ret i64 2 -continue__6: ; preds = %continue__5 +continue__2: ; preds = %continue__1 + %12 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @3, i32 0, i32 0)) + %13 = load i2, i2* @PauliY + %14 = call %String* @__quantum__rt__pauli_to_string(i2 %13) + %15 = call i1 @__quantum__rt__string_equal(%String* %12, %String* %14) + %16 = xor i1 %15, true + br i1 %16, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + ret i64 3 + +continue__3: ; preds = %continue__2 + %17 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @4, i32 0, i32 0)) + %18 = load i2, i2* @PauliZ + %19 = call %String* @__quantum__rt__pauli_to_string(i2 %18) + %20 = call i1 @__quantum__rt__string_equal(%String* %17, %String* %19) + %21 = xor i1 %20, true + br i1 %21, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) + ret i64 4 + +continue__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) ret i64 0 } -declare double @__quantum__qis__sqrt__body(double) +declare %String* @__quantum__rt__string_create(i32, i8*) -declare double @__quantum__qis__infinity__body() +declare %String* @__quantum__rt__pauli_to_string(i2) -declare i1 @__quantum__qis__isinf__body(double) +declare %String* @__quantum__rt__string_concatenate(%String*, %String*) + +declare void @__quantum__rt__string_update_reference_count(%String*, i64) + +declare i1 @__quantum__rt__string_equal(%String*, %String*) define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { entry: @@ -290,168 +359,288 @@ continue__6: ; preds = %continue__5 ret i64 0 } -define double @Microsoft__Quantum__Math__E__body() { +define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { entry: - ret double 0x4005BF0A8B145769 -} + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 -declare double @__quantum__qis__log__body(double) +then0__1: ; preds = %entry + ret i64 1 -declare i1 @__quantum__qis__isnegativeinfinity__body(double) +continue__1: ; preds = %entry + %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) + %3 = fcmp one double 3.000000e+00, %2 + br i1 %3, label %then0__2, label %continue__2 -define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { -entry: - %0 = call double @__quantum__qis__sqrt__body(double %d) - ret double %0 -} +then0__2: ; preds = %continue__1 + ret i64 2 -define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { -entry: - %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) - ret double %0 -} +continue__2: ; preds = %continue__1 + %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) + %5 = fcmp one double 1.000000e+01, %4 + br i1 %5, label %then0__3, label %continue__3 -define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { -entry: - %0 = call double @__quantum__qis__log__body(double %d) - ret double %0 -} +then0__3: ; preds = %continue__2 + ret i64 3 -define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isinf__body(double %d) - ret i1 %0 -} +continue__3: ; preds = %continue__2 + %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) + %6 = call i1 @__quantum__qis__isnan__body(double %d__4) + %7 = xor i1 %6, true + br i1 %7, label %then0__4, label %continue__4 -define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnan__body(double %d) - ret i1 %0 -} +then0__4: ; preds = %continue__3 + ret i64 4 -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +continue__4: ; preds = %continue__3 + %d__5 = call double @__quantum__qis__nan__body() + %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) + %8 = call i1 @__quantum__qis__isnan__body(double %d__6) + %9 = xor i1 %8, true + br i1 %9, label %then0__5, label %continue__5 -declare void @__quantum__qis__k__body(%Qubit*) +then0__5: ; preds = %continue__4 + ret i64 5 -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void +continue__5: ; preds = %continue__4 + %d__7 = call double @__quantum__qis__infinity__body() + %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) + %10 = call i1 @__quantum__qis__isinf__body(double %d__8) + %11 = xor i1 %10, true + br i1 %11, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 } -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} + %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) + %1 = fcmp one double 0.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) +then0__1: ; preds = %entry + ret i64 1 -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__PI__body() + %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) + %4 = fcmp one double %2, %3 + br i1 %4, label %then0__2, label %continue__2 -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__2: ; preds = %continue__1 + ret i64 2 -define double @Microsoft__Quantum__Intrinsic__NAN__body() { -entry: - %0 = call double @__quantum__qis__nan__body() - ret double %0 -} +continue__2: ; preds = %continue__1 + %5 = call double @Microsoft__Quantum__Math__PI__body() + %6 = fdiv double %5, 2.000000e+00 + %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) + %8 = fcmp one double %6, %7 + br i1 %8, label %then0__3, label %continue__3 -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} +then0__3: ; preds = %continue__2 + ret i64 3 -declare void @__quantum__qis__x__body(%Qubit*) +continue__3: ; preds = %continue__2 + %9 = call double @Microsoft__Quantum__Math__PI__body() + %10 = fneg double %9 + %11 = fdiv double %10, 2.000000e+00 + %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) + %13 = fcmp one double %11, %12 + br i1 %13, label %then0__4, label %continue__4 -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qb) - ret void -} +then0__4: ; preds = %continue__3 + ret i64 4 -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +continue__4: ; preds = %continue__3 + %14 = call double @Microsoft__Quantum__Math__PI__body() + %15 = fdiv double %14, 4.000000e+00 + %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) + %17 = fcmp one double %15, %16 + br i1 %17, label %then0__5, label %continue__5 -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) +then0__5: ; preds = %continue__4 + ret i64 5 -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +continue__5: ; preds = %continue__4 + %18 = call double @Microsoft__Quantum__Math__PI__body() + %19 = fmul double %18, 3.000000e+00 + %20 = fdiv double %19, 4.000000e+00 + %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) + %22 = fcmp one double %20, %21 + br i1 %22, label %then0__6, label %continue__6 -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { -entry: - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %1 = bitcast i8* %0 to i2* - %2 = load i2, i2* @PauliZ - store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %4 = bitcast i8* %3 to %Qubit** - store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) - ret %Result* %5 -} +then0__6: ; preds = %continue__5 + ret i64 6 -declare %Array* @__quantum__rt__array_create_1d(i32, i64) +continue__6: ; preds = %continue__5 + %23 = call double @Microsoft__Quantum__Math__PI__body() + %24 = fneg double %23 + %25 = fmul double %24, 3.000000e+00 + %26 = fdiv double %25, 4.000000e+00 + %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) + %28 = fcmp one double %26, %27 + br i1 %28, label %then0__7, label %continue__7 -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) +then0__7: ; preds = %continue__6 + ret i64 7 -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) +continue__7: ; preds = %continue__6 + %29 = call double @Microsoft__Quantum__Math__PI__body() + %30 = fneg double %29 + %31 = fdiv double %30, 4.000000e+00 + %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) + %33 = fcmp one double %31, %32 + br i1 %33, label %then0__8, label %continue__8 -declare void @__quantum__rt__array_update_reference_count(%Array*, i64) +then0__8: ; preds = %continue__7 + ret i64 8 -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 +continue__8: ; preds = %continue__7 + %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) + %35 = fcmp one double 0.000000e+00, %34 + br i1 %35, label %then0__9, label %continue__9 + +then0__9: ; preds = %continue__8 + ret i64 9 + +continue__9: ; preds = %continue__8 + %y__9 = call double @__quantum__qis__nan__body() + %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) + %36 = call i1 @__quantum__qis__isnan__body(double %d) + %37 = xor i1 %36, true + br i1 %37, label %then0__10, label %continue__10 + +then0__10: ; preds = %continue__9 + ret i64 11 + +continue__10: ; preds = %continue__9 + %x__10 = call double @__quantum__qis__nan__body() + %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) + %38 = call i1 @__quantum__qis__isnan__body(double %d__1) + %39 = xor i1 %38, true + br i1 %39, label %then0__11, label %continue__11 + +then0__11: ; preds = %continue__10 + ret i64 12 + +continue__11: ; preds = %continue__10 + %y__11 = call double @__quantum__qis__nan__body() + %x__11 = call double @__quantum__qis__nan__body() + %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) + %40 = call i1 @__quantum__qis__isnan__body(double %d__2) + %41 = xor i1 %40, true + br i1 %41, label %then0__12, label %continue__12 + +then0__12: ; preds = %continue__11 + ret i64 13 + +continue__12: ; preds = %continue__11 + ret i64 0 } -define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { +define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { entry: - %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) - ret i1 %0 + %0 = sub i64 %from, %what + ret i64 %0 } -define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { +define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { entry: - %0 = call double @__quantum__qis__infinity__body() - ret double %0 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + %local = alloca %Array* + store %Array* %array, %Array** %local + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) + %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) + %2 = bitcast i8* %1 to i64* + store i64 %val, i64* %2 + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) + store %Array* %0, %Array** %local + %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) + %3 = sub i64 %n, 1 + %4 = load %Range, %Range* @EmptyRange + %5 = insertvalue %Range %4, i64 %index, 0 + %6 = insertvalue %Range %5, i64 1, 1 + %7 = insertvalue %Range %6, i64 %3, 2 + %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) + %8 = load %Range, %Range* @EmptyRange + %9 = insertvalue %Range %8, i64 %index, 0 + %10 = insertvalue %Range %9, i64 -2, 1 + %11 = insertvalue %Range %10, i64 0, 2 + %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) + %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) + %sum = alloca i64 + store i64 0, i64* %sum + %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) + %13 = sub i64 %12, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] + %14 = icmp sle i64 %i, %13 + br i1 %14, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %15 = load i64, i64* %sum + %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) + %17 = bitcast i8* %16 to i64* + %18 = load i64, i64* %17 + %19 = add i64 %15, %18 + store i64 %19, i64* %sum + br label %exiting__1 + +exiting__1: ; preds = %body__1 + %20 = add i64 %i, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + br i1 %dummy, label %then0__1, label %continue__1 + +then0__1: ; preds = %exit__1 + %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() + %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) + %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() + %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() + %res5 = call i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() + %res6 = call i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() + %res7 = call i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() + br label %continue__1 + +continue__1: ; preds = %then0__1, %exit__1 + %21 = load i64, i64* %sum + call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) + ret i64 %21 } +declare %Array* @__quantum__rt__array_copy(%Array*, i1) + +declare i64 @__quantum__rt__array_get_size_1d(%Array*) + +declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) + +declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) + define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { entry: %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) @@ -603,468 +792,162 @@ else__5: ; preds = %else__4 call void @__quantum__rt__callable_make_controlled(%Callable* %59) %60 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) %61 = bitcast %Tuple* %60 to { %Array*, %Qubit* }* - %62 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 0 - %63 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 1 - %64 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) - %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 0) - %66 = bitcast i8* %65 to %Qubit** - %67 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 1) - %68 = bitcast i8* %67 to %Qubit** - store %Qubit* %q1, %Qubit** %66 - store %Qubit* %q2, %Qubit** %68 - store %Array* %64, %Array** %62 - store %Qubit* %q3, %Qubit** %63 - call void @__quantum__rt__callable_invoke(%Callable* %59, %Tuple* %60, %Tuple* null) - %69 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %70 = load %Result*, %Result** @ResultZero - %71 = call i1 @__quantum__rt__result_equal(%Result* %69, %Result* %70) - %72 = xor i1 %71, true - br i1 %72, label %then0__6, label %else__6 - -then0__6: ; preds = %else__5 - store i64 6, i64* %error_code - br label %continue__6 - -else__6: ; preds = %else__5 - %q4 = call %Qubit* @__quantum__rt__qubit_allocate() - %73 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %73) - %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %75 = bitcast %Tuple* %74 to { %Qubit* }* - %76 = getelementptr { %Qubit* }, { %Qubit* }* %75, i64 0, i32 0 - store %Qubit* %q3, %Qubit** %76 - call void @__quantum__rt__callable_invoke(%Callable* %73, %Tuple* %74, %Tuple* null) - %77 = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_ctl_qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %77) - call void @__quantum__rt__callable_make_adjoint(%Callable* %77) - %78 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %79 = bitcast %Tuple* %78 to { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* - %80 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 0 - %81 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 1 - %82 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %82, i64 0) - %84 = bitcast i8* %83 to %Qubit** - store %Qubit* %q1, %Qubit** %84 - %85 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %86 = bitcast %Tuple* %85 to { %Array*, { %Array*, %Qubit* }* }* - %87 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 0 - %88 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 1 - %89 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %89, i64 0) - %91 = bitcast i8* %90 to %Qubit** - store %Qubit* %q2, %Qubit** %91 - %92 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %93 = bitcast %Tuple* %92 to { %Array*, %Qubit* }* - %94 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 0 - %95 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 1 - %96 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %96, i64 0) - %98 = bitcast i8* %97 to %Qubit** - store %Qubit* %q3, %Qubit** %98 - store %Array* %96, %Array** %94 - store %Qubit* %q4, %Qubit** %95 - store %Array* %89, %Array** %87 - store { %Array*, %Qubit* }* %93, { %Array*, %Qubit* }** %88 - store %Array* %82, %Array** %80 - store { %Array*, { %Array*, %Qubit* }* }* %86, { %Array*, { %Array*, %Qubit* }* }** %81 - call void @__quantum__rt__callable_invoke(%Callable* %77, %Tuple* %78, %Tuple* null) - %99 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q4) - %100 = load %Result*, %Result** @ResultOne - %101 = call i1 @__quantum__rt__result_equal(%Result* %99, %Result* %100) - %102 = xor i1 %101, true - br i1 %102, label %then0__7, label %continue__7 - -then0__7: ; preds = %else__6 - store i64 7, i64* %error_code - br label %continue__7 - -continue__7: ; preds = %then0__7, %else__6 - call void @__quantum__rt__qubit_release(%Qubit* %q4) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %73, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %77, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %82, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %89, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %96, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %92, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %85, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %78, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %99, i64 -1) - br label %continue__6 - -continue__6: ; preds = %continue__7, %then0__6 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %59, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %64, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %60, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %69, i64 -1) - br label %continue__5 - -continue__5: ; preds = %continue__6, %then0__5 - call void @__quantum__rt__array_update_reference_count(%Array* %45, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %52, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %48, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %41, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %55, i64 -1) - br label %continue__4 - -continue__4: ; preds = %continue__5, %then0__4 - call void @__quantum__rt__array_update_reference_count(%Array* %34, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %30, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %37, i64 -1) - br label %continue__3 - -continue__3: ; preds = %continue__4, %then0__3 - call void @__quantum__rt__array_update_reference_count(%Array* %23, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %19, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %26, i64 -1) - br label %continue__2 - -continue__2: ; preds = %continue__3, %then0__2 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %15, i64 -1) - br label %continue__1 - -continue__1: ; preds = %continue__2, %then0__1 - call void @__quantum__rt__qubit_release(%Qubit* %q1) - call void @__quantum__rt__qubit_release(%Qubit* %q2) - call void @__quantum__rt__qubit_release(%Qubit* %q3) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %8, i64 -1) - %103 = load i64, i64* %error_code - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_ctl_qop, i64 -1) - ret i64 %103 -} - -declare %Tuple* @__quantum__rt__tuple_create(i64) - -define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} - -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) - -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %12) - call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} - -define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %18) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} - -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} - -declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) - -declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) - -declare void @__quantum__rt__callable_make_adjoint(%Callable*) - -declare void @__quantum__rt__callable_make_controlled(%Callable*) - -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) - -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) - -declare void @__quantum__rt__qubit_release(%Qubit*) + %62 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 0 + %63 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 1 + %64 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) + %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 0) + %66 = bitcast i8* %65 to %Qubit** + %67 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 1) + %68 = bitcast i8* %67 to %Qubit** + store %Qubit* %q1, %Qubit** %66 + store %Qubit* %q2, %Qubit** %68 + store %Array* %64, %Array** %62 + store %Qubit* %q3, %Qubit** %63 + call void @__quantum__rt__callable_invoke(%Callable* %59, %Tuple* %60, %Tuple* null) + %69 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %70 = load %Result*, %Result** @ResultZero + %71 = call i1 @__quantum__rt__result_equal(%Result* %69, %Result* %70) + %72 = xor i1 %71, true + br i1 %72, label %then0__6, label %else__6 -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) +then0__6: ; preds = %else__5 + store i64 6, i64* %error_code + br label %continue__6 -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) +else__6: ; preds = %else__5 + %q4 = call %Qubit* @__quantum__rt__qubit_allocate() + %73 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %73) + %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %75 = bitcast %Tuple* %74 to { %Qubit* }* + %76 = getelementptr { %Qubit* }, { %Qubit* }* %75, i64 0, i32 0 + store %Qubit* %q3, %Qubit** %76 + call void @__quantum__rt__callable_invoke(%Callable* %73, %Tuple* %74, %Tuple* null) + %77 = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_ctl_qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %77) + call void @__quantum__rt__callable_make_adjoint(%Callable* %77) + %78 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %79 = bitcast %Tuple* %78 to { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* + %80 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 0 + %81 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 1 + %82 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %82, i64 0) + %84 = bitcast i8* %83 to %Qubit** + store %Qubit* %q1, %Qubit** %84 + %85 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %86 = bitcast %Tuple* %85 to { %Array*, { %Array*, %Qubit* }* }* + %87 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 0 + %88 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 1 + %89 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %89, i64 0) + %91 = bitcast i8* %90 to %Qubit** + store %Qubit* %q2, %Qubit** %91 + %92 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %93 = bitcast %Tuple* %92 to { %Array*, %Qubit* }* + %94 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 0 + %95 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 1 + %96 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %96, i64 0) + %98 = bitcast i8* %97 to %Qubit** + store %Qubit* %q3, %Qubit** %98 + store %Array* %96, %Array** %94 + store %Qubit* %q4, %Qubit** %95 + store %Array* %89, %Array** %87 + store { %Array*, %Qubit* }* %93, { %Array*, %Qubit* }** %88 + store %Array* %82, %Array** %80 + store { %Array*, { %Array*, %Qubit* }* }* %86, { %Array*, { %Array*, %Qubit* }* }** %81 + call void @__quantum__rt__callable_invoke(%Callable* %77, %Tuple* %78, %Tuple* null) + %99 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q4) + %100 = load %Result*, %Result** @ResultOne + %101 = call i1 @__quantum__rt__result_equal(%Result* %99, %Result* %100) + %102 = xor i1 %101, true + br i1 %102, label %then0__7, label %continue__7 -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) +then0__7: ; preds = %else__6 + store i64 7, i64* %error_code + br label %continue__7 -define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - %local = alloca %Array* - store %Array* %array, %Array** %local - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - %0 = call %Array* @__quantum__rt__array_copy(%Array* %array, i1 false) - %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %index) - %2 = bitcast i8* %1 to i64* - store i64 %val, i64* %2 - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 1) - store %Array* %0, %Array** %local - %n = call i64 @__quantum__rt__array_get_size_1d(%Array* %0) - %3 = sub i64 %n, 1 - %4 = load %Range, %Range* @EmptyRange - %5 = insertvalue %Range %4, i64 %index, 0 - %6 = insertvalue %Range %5, i64 1, 1 - %7 = insertvalue %Range %6, i64 %3, 2 - %slice1 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %7, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 1) - %8 = load %Range, %Range* @EmptyRange - %9 = insertvalue %Range %8, i64 %index, 0 - %10 = insertvalue %Range %9, i64 -2, 1 - %11 = insertvalue %Range %10, i64 0, 2 - %slice2 = call %Array* @__quantum__rt__array_slice_1d(%Array* %0, %Range %11, i1 false) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 1) - %result = call %Array* @__quantum__rt__array_concatenate(%Array* %slice2, %Array* %slice1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 1) - %sum = alloca i64 - store i64 0, i64* %sum - %12 = call i64 @__quantum__rt__array_get_size_1d(%Array* %result) - %13 = sub i64 %12, 1 - br label %header__1 +continue__7: ; preds = %then0__7, %else__6 + call void @__quantum__rt__qubit_release(%Qubit* %q4) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %73, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %77, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %82, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %89, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %96, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %92, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %85, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %78, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %99, i64 -1) + br label %continue__6 -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 0, %entry ], [ %20, %exiting__1 ] - %14 = icmp sle i64 %i, %13 - br i1 %14, label %body__1, label %exit__1 +continue__6: ; preds = %continue__7, %then0__6 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %59, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %64, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %60, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %69, i64 -1) + br label %continue__5 -body__1: ; preds = %header__1 - %15 = load i64, i64* %sum - %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %result, i64 %i) - %17 = bitcast i8* %16 to i64* - %18 = load i64, i64* %17 - %19 = add i64 %15, %18 - store i64 %19, i64* %sum - br label %exiting__1 +continue__5: ; preds = %continue__6, %then0__5 + call void @__quantum__rt__array_update_reference_count(%Array* %45, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %52, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %48, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %41, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %55, i64 -1) + br label %continue__4 -exiting__1: ; preds = %body__1 - %20 = add i64 %i, 1 - br label %header__1 +continue__4: ; preds = %continue__5, %then0__4 + call void @__quantum__rt__array_update_reference_count(%Array* %34, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %30, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %37, i64 -1) + br label %continue__3 -exit__1: ; preds = %header__1 - br i1 %dummy, label %then0__1, label %continue__1 +continue__3: ; preds = %continue__4, %then0__3 + call void @__quantum__rt__array_update_reference_count(%Array* %23, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %19, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %26, i64 -1) + br label %continue__2 -then0__1: ; preds = %exit__1 - %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() - %res2 = call i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 17, i64 42) - %res3 = call i1 @Microsoft__Quantum__Testing__QIR__Test_Qubit_Result_Management__body() - %res4 = call i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() - %res5 = call i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() - %res6 = call i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() - %res7 = call i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() +continue__2: ; preds = %continue__3, %then0__2 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %15, i64 -1) br label %continue__1 -continue__1: ; preds = %then0__1, %exit__1 - %21 = load i64, i64* %sum - call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %array, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice1, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %slice2, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %result, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %0, i64 -1) - ret i64 %21 +continue__1: ; preds = %continue__2, %then0__1 + call void @__quantum__rt__qubit_release(%Qubit* %q1) + call void @__quantum__rt__qubit_release(%Qubit* %q2) + call void @__quantum__rt__qubit_release(%Qubit* %q3) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %8, i64 -1) + %103 = load i64, i64* %error_code + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_ctl_qop, i64 -1) + ret i64 %103 } -declare %Array* @__quantum__rt__array_copy(%Array*, i1) - -declare i64 @__quantum__rt__array_get_size_1d(%Array*) - -declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) - -declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) - define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { entry: %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) @@ -1134,120 +1017,17 @@ continue__1: ; preds = %then0__1, %entry ret i1 %14 } -define i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() { -entry: - %0 = load i2, i2* @PauliI - %pauli = alloca i2 - store i2 %0, i2* %pauli - %1 = call %String* @__quantum__rt__string_create(i32 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @0, i32 0, i32 0)) - %2 = call %String* @__quantum__rt__pauli_to_string(i2 %0) - %3 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %2) - call void @__quantum__rt__string_update_reference_count(%String* %1, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %2, i64 -1) - %str = alloca %String* - store %String* %3, %String** %str - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 1) - %4 = call %String* @__quantum__rt__string_create(i32 19, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @1, i32 0, i32 0)) - %5 = call i1 @__quantum__rt__string_equal(%String* %4, %String* %3) - %6 = xor i1 %5, true - br i1 %6, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - ret i64 1 - -continue__1: ; preds = %entry - %7 = load i2, i2* @PauliX - store i2 %7, i2* %pauli - %8 = call %String* @__quantum__rt__pauli_to_string(i2 %7) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 1) - store %String* %8, %String** %str - %9 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @2, i32 0, i32 0)) - %10 = call i1 @__quantum__rt__string_equal(%String* %9, %String* %8) - %11 = xor i1 %10, true - br i1 %11, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - ret i64 2 - -continue__2: ; preds = %continue__1 - %12 = load i2, i2* @PauliY - store i2 %12, i2* %pauli - %13 = call %String* @__quantum__rt__pauli_to_string(i2 %12) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 1) - store %String* %13, %String** %str - %14 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @3, i32 0, i32 0)) - %15 = call i1 @__quantum__rt__string_equal(%String* %14, %String* %13) - %16 = xor i1 %15, true - br i1 %16, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - ret i64 3 +declare %Qubit* @__quantum__rt__qubit_allocate() -continue__3: ; preds = %continue__2 - %17 = load i2, i2* @PauliZ - store i2 %17, i2* %pauli - %18 = call %String* @__quantum__rt__pauli_to_string(i2 %17) - call void @__quantum__rt__string_update_reference_count(%String* %18, i64 1) - store %String* %18, %String** %str - %19 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @4, i32 0, i32 0)) - %20 = call i1 @__quantum__rt__string_equal(%String* %19, %String* %18) - %21 = xor i1 %20, true - br i1 %21, label %then0__4, label %continue__4 +declare %Array* @__quantum__rt__qubit_allocate_array(i64) -then0__4: ; preds = %continue__3 - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) - ret i64 4 +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) -continue__4: ; preds = %continue__3 - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i64 -1) - ret i64 0 -} +declare void @__quantum__rt__qubit_release(%Qubit*) -define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { -entry: - %0 = sub i64 %from, %what - ret i64 %0 -} +declare void @__quantum__rt__qubit_release_array(%Array*) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { entry: @@ -1321,6 +1101,210 @@ continue__1: ; preds = %then0__1, %entry ret void } +declare %Tuple* @__quantum__rt__tuple_create(i64) + +define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) + +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %12) + call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} + +define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %18) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} + +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} + +declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) + +declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) + +declare void @__quantum__rt__callable_make_adjoint(%Callable*) + +declare void @__quantum__rt__callable_make_controlled(%Callable*) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) + define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: %0 = bitcast %Tuple* %arg-tuple to { i64, i64 }* @@ -1378,19 +1362,6 @@ entry: ret void } -declare void @__quantum__rt__qubit_release_array(%Array*) - - -declare %String* @__quantum__rt__string_create(i32, i8*) - -declare %String* @__quantum__rt__pauli_to_string(i2) - -declare %String* @__quantum__rt__string_concatenate(%String*, %String*) - -declare void @__quantum__rt__string_update_reference_count(%String*, i64) - -declare i1 @__quantum__rt__string_equal(%String*, %String*) - define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { entry: %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %array__count) diff --git a/src/QirRuntime/test/QIR-static/qir-test-strings.qs b/src/QirRuntime/test/QIR-static/qir-test-strings.qs index 53702845e5d..6046ce6ab0d 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-strings.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-strings.qs @@ -7,21 +7,11 @@ namespace Microsoft.Quantum.Testing.QIR.Str { function PauliToStringTest() : Int { - mutable pauli = PauliI; - mutable str = $"Pauli value: {pauli}"; - if "Pauli value: PauliI" != str { return 1; } // The return value indicates which test case has failed. - - set pauli = PauliX; - set str = $"{pauli}"; - if "PauliX" != str { return 2; } - - set pauli = PauliY; - set str = $"{pauli}"; - if "PauliY" != str { return 3; } - - set pauli = PauliZ; - set str = $"{pauli}"; - if "PauliZ" != str { return 4; } + if "Pauli value: PauliI" != + $"Pauli value: {PauliI}" { return 1; } // The return value indicates which test case has failed. + if "PauliX" != $"{PauliX}" { return 2; } + if "PauliY" != $"{PauliY}" { return 3; } + if "PauliZ" != $"{PauliZ}" { return 4; } return 0; } From 2d91081ed88964909d00308c419da469ac3b930d Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 8 Feb 2021 18:54:52 -0800 Subject: [PATCH 9/9] CR changes. --- src/QirRuntime/test/QIR-static/qir-driver.cpp | 2 +- .../test/QIR-static/qir-test-arrays.qs | 4 +- .../test/QIR-static/qir-test-qsharp.ll | 2006 ++++++++--------- 3 files changed, 1006 insertions(+), 1006 deletions(-) diff --git a/src/QirRuntime/test/QIR-static/qir-driver.cpp b/src/QirRuntime/test/QIR-static/qir-driver.cpp index c844896884f..c6059c93a8e 100644 --- a/src/QirRuntime/test/QIR-static/qir-driver.cpp +++ b/src/QirRuntime/test/QIR-static/qir-driver.cpp @@ -57,7 +57,7 @@ extern "C" int64_t Microsoft__Quantum__Testing__QIR__Test_Arrays( // NOLINT int64_t* array, int64_t index, int64_t val, - bool dummy); + bool compilerDecoy); TEST_CASE("QIR: Using 1D arrays", "[qir][qir.arr1d]") { // re-enable tracking when https://github.com/microsoft/qsharp-compiler/issues/844 is fixed diff --git a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs index 878e7248a7b..65d05ca8ef2 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-arrays.qs +++ b/src/QirRuntime/test/QIR-static/qir-test-arrays.qs @@ -7,7 +7,7 @@ namespace Microsoft.Quantum.Testing.QIR open Microsoft.Quantum.Testing.QIR.Str; @EntryPoint() - operation Test_Arrays(array : Int[], index : Int, val : Int, dummy : Bool) : Int + operation Test_Arrays(array : Int[], index : Int, val : Int, compilerDecoy : Bool) : Int { // exercise __quantum__rt__array_copy mutable local = array; @@ -33,7 +33,7 @@ namespace Microsoft.Quantum.Testing.QIR } // The purpose of this block is to keep the Q# compiler from optimizing away other tests when generating QIR - if (dummy) + if (compilerDecoy) { let res1 = TestControlled(); let res2 = TestPartials(17, 42); diff --git a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll index 491eba38f94..a619a2a6218 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll +++ b/src/QirRuntime/test/QIR-static/qir-test-qsharp.ll @@ -2,10 +2,10 @@ %Result = type opaque %Range = type { i64, i64, i64 } %Tuple = type opaque -%Array = type opaque +%Callable = type opaque %Qubit = type opaque +%Array = type opaque %String = type opaque -%Callable = type opaque @ResultZero = external global %Result* @ResultOne = external global %Result* @@ -14,542 +14,651 @@ @PauliY = constant i2 -1 @PauliZ = constant i2 -2 @EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@0 = internal constant [20 x i8] c"Pauli value: PauliI\00" -@1 = internal constant [14 x i8] c"Pauli value: \00" -@2 = internal constant [7 x i8] c"PauliX\00" -@3 = internal constant [7 x i8] c"PauliY\00" -@4 = internal constant [7 x i8] c"PauliZ\00" @Microsoft__Quantum__Testing__QIR__Qop = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper] @PartialApplication__1 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__1__ctladj__wrapper] @MemoryManagement__1 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__1__RefCount, void (%Tuple*, i64)* @MemoryManagement__1__AliasCount] @Microsoft__Quantum__Testing__QIR__Subtract = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @PartialApplication__2 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__2__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] @MemoryManagement__2 = constant [2 x void (%Tuple*, i64)*] [void (%Tuple*, i64)* @MemoryManagement__2__RefCount, void (%Tuple*, i64)* @MemoryManagement__2__AliasCount] +@0 = internal constant [20 x i8] c"Pauli value: PauliI\00" +@1 = internal constant [14 x i8] c"Pauli value: \00" +@2 = internal constant [7 x i8] c"PauliX\00" +@3 = internal constant [7 x i8] c"PauliY\00" +@4 = internal constant [7 x i8] c"PauliZ\00" -define double @Microsoft__Quantum__Math__PI__body() { -entry: - ret double 0x400921FB54442D18 -} - -define double @Microsoft__Quantum__Math__E__body() { -entry: - ret double 0x4005BF0A8B145769 -} - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - ret %Result* %0 -} - -declare void @__quantum__rt__array_update_alias_count(%Array*, i64) - -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) - -define double @Microsoft__Quantum__Intrinsic__NAN__body() { -entry: - %0 = call double @__quantum__qis__nan__body() - ret double %0 -} - -declare double @__quantum__qis__nan__body() - -define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { entry: - %0 = call double @__quantum__qis__sqrt__body(double %d) - ret double %0 -} - -declare double @__quantum__qis__sqrt__body(double) + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* + %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 + %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + store %Callable* %4, %Callable** %2 + store i64 1, i64* %3 + %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) + %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 1) + %ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 1) + %adj_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %adj_ctl_qop) + call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 1) + %ctl_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_ctl_qop) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 1) + %error_code = alloca i64 + store i64 0, i64* %error_code + %q1 = call %Qubit* @__quantum__rt__qubit_allocate() + %q2 = call %Qubit* @__quantum__rt__qubit_allocate() + %q3 = call %Qubit* @__quantum__rt__qubit_allocate() + %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %6 = bitcast %Tuple* %5 to { %Qubit* }* + %7 = getelementptr { %Qubit* }, { %Qubit* }* %6, i64 0, i32 0 + store %Qubit* %q1, %Qubit** %7 + call void @__quantum__rt__callable_invoke(%Callable* %qop, %Tuple* %5, %Tuple* null) + %8 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q1) + %9 = load %Result*, %Result** @ResultOne + %10 = call i1 @__quantum__rt__result_equal(%Result* %8, %Result* %9) + %11 = xor i1 %10, true + br i1 %11, label %then0__1, label %else__1 -define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { -entry: - %0 = call double @__quantum__qis__log__body(double %d) - ret double %0 -} +then0__1: ; preds = %entry + store i64 1, i64* %error_code + br label %continue__1 -declare double @__quantum__qis__log__body(double) +else__1: ; preds = %entry + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %13 = bitcast %Tuple* %12 to { %Qubit* }* + %14 = getelementptr { %Qubit* }, { %Qubit* }* %13, i64 0, i32 0 + store %Qubit* %q2, %Qubit** %14 + call void @__quantum__rt__callable_invoke(%Callable* %adj_qop, %Tuple* %12, %Tuple* null) + %15 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q2) + %16 = load %Result*, %Result** @ResultOne + %17 = call i1 @__quantum__rt__result_equal(%Result* %15, %Result* %16) + %18 = xor i1 %17, true + br i1 %18, label %then0__2, label %else__2 -define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnan__body(double %d) - ret i1 %0 -} +then0__2: ; preds = %else__1 + store i64 2, i64* %error_code + br label %continue__2 -declare i1 @__quantum__qis__isnan__body(double) +else__2: ; preds = %else__1 + %19 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %20 = bitcast %Tuple* %19 to { %Array*, %Qubit* }* + %21 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 0 + %22 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 1 + %23 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %23, i64 0) + %25 = bitcast i8* %24 to %Qubit** + store %Qubit* %q1, %Qubit** %25 + store %Array* %23, %Array** %21 + store %Qubit* %q3, %Qubit** %22 + call void @__quantum__rt__callable_invoke(%Callable* %ctl_qop, %Tuple* %19, %Tuple* null) + %26 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %27 = load %Result*, %Result** @ResultOne + %28 = call i1 @__quantum__rt__result_equal(%Result* %26, %Result* %27) + %29 = xor i1 %28, true + br i1 %29, label %then0__3, label %else__3 -define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +then0__3: ; preds = %else__2 + store i64 3, i64* %error_code + br label %continue__3 -declare void @__quantum__qis__k__body(%Qubit*) +else__3: ; preds = %else__2 + %30 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %31 = bitcast %Tuple* %30 to { %Array*, %Qubit* }* + %32 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %31, i64 0, i32 0 + %33 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %31, i64 0, i32 1 + %34 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %34, i64 0) + %36 = bitcast i8* %35 to %Qubit** + store %Qubit* %q2, %Qubit** %36 + store %Array* %34, %Array** %32 + store %Qubit* %q3, %Qubit** %33 + call void @__quantum__rt__callable_invoke(%Callable* %adj_ctl_qop, %Tuple* %30, %Tuple* null) + %37 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %38 = load %Result*, %Result** @ResultZero + %39 = call i1 @__quantum__rt__result_equal(%Result* %37, %Result* %38) + %40 = xor i1 %39, true + br i1 %40, label %then0__4, label %else__4 -define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { -entry: - call void @__quantum__qis__k__body(%Qubit* %q) - ret void -} +then0__4: ; preds = %else__3 + store i64 4, i64* %error_code + br label %continue__4 -define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +else__4: ; preds = %else__3 + %41 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %42 = bitcast %Tuple* %41 to { %Array*, { %Array*, %Qubit* }* }* + %43 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %42, i64 0, i32 0 + %44 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %42, i64 0, i32 1 + %45 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %45, i64 0) + %47 = bitcast i8* %46 to %Qubit** + store %Qubit* %q1, %Qubit** %47 + %48 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %49 = bitcast %Tuple* %48 to { %Array*, %Qubit* }* + %50 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %49, i64 0, i32 0 + %51 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %49, i64 0, i32 1 + %52 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %52, i64 0) + %54 = bitcast i8* %53 to %Qubit** + store %Qubit* %q2, %Qubit** %54 + store %Array* %52, %Array** %50 + store %Qubit* %q3, %Qubit** %51 + store %Array* %45, %Array** %43 + store { %Array*, %Qubit* }* %49, { %Array*, %Qubit* }** %44 + call void @__quantum__rt__callable_invoke(%Callable* %ctl_ctl_qop, %Tuple* %41, %Tuple* null) + %55 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %56 = load %Result*, %Result** @ResultOne + %57 = call i1 @__quantum__rt__result_equal(%Result* %55, %Result* %56) + %58 = xor i1 %57, true + br i1 %58, label %then0__5, label %else__5 -declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) +then0__5: ; preds = %else__4 + store i64 5, i64* %error_code + br label %continue__5 -define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +else__5: ; preds = %else__4 + %59 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %59) + %60 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %61 = bitcast %Tuple* %60 to { %Array*, %Qubit* }* + %62 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 0 + %63 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 1 + %64 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) + %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 0) + %66 = bitcast i8* %65 to %Qubit** + %67 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 1) + %68 = bitcast i8* %67 to %Qubit** + store %Qubit* %q1, %Qubit** %66 + store %Qubit* %q2, %Qubit** %68 + store %Array* %64, %Array** %62 + store %Qubit* %q3, %Qubit** %63 + call void @__quantum__rt__callable_invoke(%Callable* %59, %Tuple* %60, %Tuple* null) + %69 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) + %70 = load %Result*, %Result** @ResultZero + %71 = call i1 @__quantum__rt__result_equal(%Result* %69, %Result* %70) + %72 = xor i1 %71, true + br i1 %72, label %then0__6, label %else__6 -define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) - ret i1 %0 -} +then0__6: ; preds = %else__5 + store i64 6, i64* %error_code + br label %continue__6 -declare i1 @__quantum__qis__isnegativeinfinity__body(double) +else__6: ; preds = %else__5 + %q4 = call %Qubit* @__quantum__rt__qubit_allocate() + %73 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %73) + %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %75 = bitcast %Tuple* %74 to { %Qubit* }* + %76 = getelementptr { %Qubit* }, { %Qubit* }* %75, i64 0, i32 0 + store %Qubit* %q3, %Qubit** %76 + call void @__quantum__rt__callable_invoke(%Callable* %73, %Tuple* %74, %Tuple* null) + %77 = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_ctl_qop, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %77) + call void @__quantum__rt__callable_make_adjoint(%Callable* %77) + %78 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %79 = bitcast %Tuple* %78 to { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* + %80 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 0 + %81 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 1 + %82 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %82, i64 0) + %84 = bitcast i8* %83 to %Qubit** + store %Qubit* %q1, %Qubit** %84 + %85 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %86 = bitcast %Tuple* %85 to { %Array*, { %Array*, %Qubit* }* }* + %87 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 0 + %88 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 1 + %89 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %89, i64 0) + %91 = bitcast i8* %90 to %Qubit** + store %Qubit* %q2, %Qubit** %91 + %92 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %93 = bitcast %Tuple* %92 to { %Array*, %Qubit* }* + %94 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 0 + %95 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 1 + %96 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %96, i64 0) + %98 = bitcast i8* %97 to %Qubit** + store %Qubit* %q3, %Qubit** %98 + store %Array* %96, %Array** %94 + store %Qubit* %q4, %Qubit** %95 + store %Array* %89, %Array** %87 + store { %Array*, %Qubit* }* %93, { %Array*, %Qubit* }** %88 + store %Array* %82, %Array** %80 + store { %Array*, { %Array*, %Qubit* }* }* %86, { %Array*, { %Array*, %Qubit* }* }** %81 + call void @__quantum__rt__callable_invoke(%Callable* %77, %Tuple* %78, %Tuple* null) + %99 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q4) + %100 = load %Result*, %Result** @ResultOne + %101 = call i1 @__quantum__rt__result_equal(%Result* %99, %Result* %100) + %102 = xor i1 %101, true + br i1 %102, label %then0__7, label %continue__7 -define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { -entry: - %0 = call double @__quantum__qis__infinity__body() - ret double %0 -} +then0__7: ; preds = %else__6 + store i64 7, i64* %error_code + br label %continue__7 -declare double @__quantum__qis__infinity__body() +continue__7: ; preds = %then0__7, %else__6 + call void @__quantum__rt__qubit_release(%Qubit* %q4) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %73, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %77, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %82, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %89, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %96, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %92, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %85, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %78, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %99, i64 -1) + br label %continue__6 -define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { -entry: - %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) - ret double %0 -} +continue__6: ; preds = %continue__7, %then0__6 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %59, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %64, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %60, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %69, i64 -1) + br label %continue__5 -declare double @__quantum__qis__arctan2__body(double, double) +continue__5: ; preds = %continue__6, %then0__5 + call void @__quantum__rt__array_update_reference_count(%Array* %45, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %52, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %48, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %41, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %55, i64 -1) + br label %continue__4 -define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { -entry: - %0 = call i1 @__quantum__qis__isinf__body(double %d) - ret i1 %0 +continue__4: ; preds = %continue__5, %then0__4 + call void @__quantum__rt__array_update_reference_count(%Array* %34, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %30, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %37, i64 -1) + br label %continue__3 + +continue__3: ; preds = %continue__4, %then0__3 + call void @__quantum__rt__array_update_reference_count(%Array* %23, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %19, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %26, i64 -1) + br label %continue__2 + +continue__2: ; preds = %continue__3, %then0__2 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %15, i64 -1) + br label %continue__1 + +continue__1: ; preds = %continue__2, %then0__1 + call void @__quantum__rt__qubit_release(%Qubit* %q1) + call void @__quantum__rt__qubit_release(%Qubit* %q2) + call void @__quantum__rt__qubit_release(%Qubit* %q3) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %8, i64 -1) + %103 = load i64, i64* %error_code + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_ctl_qop, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_ctl_qop, i64 -1) + ret i64 %103 } -declare i1 @__quantum__qis__isinf__body(double) +declare %Tuple* @__quantum__rt__tuple_create(i64) -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { +define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - call void @__quantum__qis__x__body(%Qubit* %qb) + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) ret void } -declare void @__quantum__qis__x__body(%Qubit*) +define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %3 = load %Qubit*, %Qubit** %1 + %4 = load i64, i64* %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) + ret void +} -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - call void @__quantum__qis__x__body(%Qubit* %qb) + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) ret void } -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* + %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 + call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) ret void } -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) ret void } -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %1 = bitcast i8* %0 to i2* - %2 = load i2, i2* @PauliZ - store i2 %2, i2* %1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) - %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %4 = bitcast i8* %3 to %Qubit** - store %Qubit* %qb, %Qubit** %4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) - ret %Result* %5 + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 + %2 = load %Qubit*, %Qubit** %1 + %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 + %5 = load i64, i64* %4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* + %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 + %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 + store %Qubit* %2, %Qubit** %8 + store i64 %5, i64* %9 + %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 + %11 = load %Callable*, %Callable** %10 + %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %12) + call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) + ret void } -declare %Array* @__quantum__rt__array_create_1d(i32, i64) - -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) - -declare void @__quantum__rt__array_update_reference_count(%Array*, i64) - -define i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() { +define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: - %0 = call %String* @__quantum__rt__string_create(i32 19, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @0, i32 0, i32 0)) - %1 = call %String* @__quantum__rt__string_create(i32 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @1, i32 0, i32 0)) - %2 = load i2, i2* @PauliI - %3 = call %String* @__quantum__rt__pauli_to_string(i2 %2) - %4 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %3) - call void @__quantum__rt__string_update_reference_count(%String* %1, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) - %5 = call i1 @__quantum__rt__string_equal(%String* %0, %String* %4) - %6 = xor i1 %5, true - br i1 %6, label %then0__1, label %continue__1 + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} -then0__1: ; preds = %entry - call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - ret i64 1 +define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 + %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 + %3 = load %Array*, %Array** %1 + %4 = load %Qubit*, %Qubit** %2 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 + %7 = load i64, i64* %6 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* + %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 + %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 + store %Qubit* %4, %Qubit** %10 + store i64 %7, i64* %11 + %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* + %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 + %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 + store %Array* %3, %Array** %14 + store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 + %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 + %17 = load %Callable*, %Callable** %16 + %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %18) + call void @__quantum__rt__callable_make_controlled(%Callable* %18) + call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) + ret void +} -continue__1: ; preds = %entry - %7 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @2, i32 0, i32 0)) - %8 = load i2, i2* @PauliX - %9 = call %String* @__quantum__rt__pauli_to_string(i2 %8) - %10 = call i1 @__quantum__rt__string_equal(%String* %7, %String* %9) - %11 = xor i1 %10, true - br i1 %11, label %then0__2, label %continue__2 +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} -then0__2: ; preds = %continue__1 - call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - ret i64 2 +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* + %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 + %2 = load %Callable*, %Callable** %1 + call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) + ret void +} -continue__2: ; preds = %continue__1 - %12 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @3, i32 0, i32 0)) - %13 = load i2, i2* @PauliY - %14 = call %String* @__quantum__rt__pauli_to_string(i2 %13) - %15 = call i1 @__quantum__rt__string_equal(%String* %12, %String* %14) - %16 = xor i1 %15, true - br i1 %16, label %then0__3, label %continue__3 +declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) -then0__3: ; preds = %continue__2 - call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - ret i64 3 +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) -continue__3: ; preds = %continue__2 - %17 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @4, i32 0, i32 0)) - %18 = load i2, i2* @PauliZ - %19 = call %String* @__quantum__rt__pauli_to_string(i2 %18) - %20 = call i1 @__quantum__rt__string_equal(%String* %17, %String* %19) - %21 = xor i1 %20, true - br i1 %21, label %then0__4, label %continue__4 +declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) -then0__4: ; preds = %continue__3 - call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) - ret i64 4 +declare void @__quantum__rt__callable_make_adjoint(%Callable*) -continue__4: ; preds = %continue__3 - call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) - ret i64 0 +declare void @__quantum__rt__callable_make_controlled(%Callable*) + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %1 = bitcast i8* %0 to i2* + %2 = load i2, i2* @PauliZ + store i2 %2, i2* %1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + %qubits = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %3 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %4 = bitcast i8* %3 to %Qubit** + store %Qubit* %qb, %Qubit** %4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i64 -1) + ret %Result* %5 } -declare %String* @__quantum__rt__string_create(i32, i8*) +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) -declare %String* @__quantum__rt__pauli_to_string(i2) +declare %Array* @__quantum__rt__array_create_1d(i32, i64) -declare %String* @__quantum__rt__string_concatenate(%String*, %String*) +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) -declare void @__quantum__rt__string_update_reference_count(%String*, i64) +declare void @__quantum__rt__qubit_release(%Qubit*) -declare i1 @__quantum__rt__string_equal(%String*, %String*) +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) -define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i64) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i64) + +define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { entry: - %d = call double @Microsoft__Quantum__Math__E__body() - %0 = call double @__quantum__qis__log__body(double %d) - %1 = fcmp one double 1.000000e+00, %0 + %0 = sub i64 %from, %what + ret i64 %0 +} + +define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 br i1 %1, label %then0__1, label %continue__1 then0__1: ; preds = %entry - ret i64 1 + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 -continue__1: ; preds = %entry - %2 = call double @Microsoft__Quantum__Math__E__body() - %3 = call double @Microsoft__Quantum__Math__E__body() - %d__1 = fmul double %2, %3 - %4 = call double @__quantum__qis__log__body(double %d__1) - %5 = fcmp one double 2.000000e+00, %4 - br i1 %5, label %then0__2, label %continue__2 +continue__1: ; preds = %then0__1, %entry + ret void +} -then0__2: ; preds = %continue__1 - ret i64 2 +declare void @__quantum__qis__k__body(%Qubit*) -continue__2: ; preds = %continue__1 - %d__3 = call double @__quantum__qis__log__body(double 0.000000e+00) - %6 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d__3) - %7 = xor i1 %6, true - br i1 %7, label %then0__3, label %continue__3 +define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { +entry: + %0 = srem i64 %n, 2 + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %continue__1 -then0__3: ; preds = %continue__2 - ret i64 3 +then0__1: ; preds = %entry + call void @__quantum__qis__k__body(%Qubit* %q) + br label %continue__1 -continue__3: ; preds = %continue__2 - %d__5 = call double @__quantum__qis__log__body(double -5.000000e+00) - %8 = call i1 @__quantum__qis__isnan__body(double %d__5) - %9 = xor i1 %8, true - br i1 %9, label %then0__4, label %continue__4 +continue__1: ; preds = %then0__1, %entry + ret void +} -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %d__6 = call double @__quantum__qis__nan__body() - %d__7 = call double @__quantum__qis__log__body(double %d__6) - %10 = call i1 @__quantum__qis__isnan__body(double %d__7) - %11 = xor i1 %10, true - br i1 %11, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 - -continue__5: ; preds = %continue__4 - %d__8 = call double @__quantum__qis__infinity__body() - %d__9 = call double @__quantum__qis__log__body(double %d__8) - %12 = call i1 @__quantum__qis__isinf__body(double %d__9) - %13 = xor i1 %12, true - br i1 %13, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - ret i64 6 - -continue__6: ; preds = %continue__5 - ret i64 0 -} - -define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { +define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { entry: - %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) - %1 = fcmp one double 2.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) - %3 = fcmp one double 3.000000e+00, %2 - br i1 %3, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - ret i64 2 - -continue__2: ; preds = %continue__1 - %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) - %5 = fcmp one double 1.000000e+01, %4 - br i1 %5, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - ret i64 3 - -continue__3: ; preds = %continue__2 - %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) - %6 = call i1 @__quantum__qis__isnan__body(double %d__4) - %7 = xor i1 %6, true - br i1 %7, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %d__5 = call double @__quantum__qis__nan__body() - %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) - %8 = call i1 @__quantum__qis__isnan__body(double %d__6) - %9 = xor i1 %8, true - br i1 %9, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) + call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + br label %continue__1 -continue__5: ; preds = %continue__4 - %d__7 = call double @__quantum__qis__infinity__body() - %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) - %10 = call i1 @__quantum__qis__isinf__body(double %d__8) - %11 = xor i1 %10, true - br i1 %11, label %then0__6, label %continue__6 +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) + ret void +} -then0__6: ; preds = %continue__5 - ret i64 6 +declare void @__quantum__rt__array_update_alias_count(%Array*, i64) -continue__6: ; preds = %continue__5 - ret i64 0 -} +declare void @__quantum__qis__k__ctl(%Array*, %Qubit*) -define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { +define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { entry: - %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) - %1 = fcmp one double 0.000000e+00, %0 - br i1 %1, label %then0__1, label %continue__1 + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 + %q = load %Qubit*, %Qubit** %1 + %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 + %n = load i64, i64* %2 + %3 = srem i64 %n, 2 + %4 = icmp eq i64 %3, 1 + br i1 %4, label %then0__1, label %continue__1 then0__1: ; preds = %entry - ret i64 1 - -continue__1: ; preds = %entry - %2 = call double @Microsoft__Quantum__Math__PI__body() - %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) - %4 = fcmp one double %2, %3 - br i1 %4, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - ret i64 2 - -continue__2: ; preds = %continue__1 - %5 = call double @Microsoft__Quantum__Math__PI__body() - %6 = fdiv double %5, 2.000000e+00 - %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) - %8 = fcmp one double %6, %7 - br i1 %8, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - ret i64 3 - -continue__3: ; preds = %continue__2 - %9 = call double @Microsoft__Quantum__Math__PI__body() - %10 = fneg double %9 - %11 = fdiv double %10, 2.000000e+00 - %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) - %13 = fcmp one double %11, %12 - br i1 %13, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - ret i64 4 - -continue__4: ; preds = %continue__3 - %14 = call double @Microsoft__Quantum__Math__PI__body() - %15 = fdiv double %14, 4.000000e+00 - %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) - %17 = fcmp one double %15, %16 - br i1 %17, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - ret i64 5 - -continue__5: ; preds = %continue__4 - %18 = call double @Microsoft__Quantum__Math__PI__body() - %19 = fmul double %18, 3.000000e+00 - %20 = fdiv double %19, 4.000000e+00 - %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) - %22 = fcmp one double %20, %21 - br i1 %22, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - ret i64 6 - -continue__6: ; preds = %continue__5 - %23 = call double @Microsoft__Quantum__Math__PI__body() - %24 = fneg double %23 - %25 = fmul double %24, 3.000000e+00 - %26 = fdiv double %25, 4.000000e+00 - %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) - %28 = fcmp one double %26, %27 - br i1 %28, label %then0__7, label %continue__7 - -then0__7: ; preds = %continue__6 - ret i64 7 - -continue__7: ; preds = %continue__6 - %29 = call double @Microsoft__Quantum__Math__PI__body() - %30 = fneg double %29 - %31 = fdiv double %30, 4.000000e+00 - %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) - %33 = fcmp one double %31, %32 - br i1 %33, label %then0__8, label %continue__8 - -then0__8: ; preds = %continue__7 - ret i64 8 - -continue__8: ; preds = %continue__7 - %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) - %35 = fcmp one double 0.000000e+00, %34 - br i1 %35, label %then0__9, label %continue__9 - -then0__9: ; preds = %continue__8 - ret i64 9 - -continue__9: ; preds = %continue__8 - %y__9 = call double @__quantum__qis__nan__body() - %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) - %36 = call i1 @__quantum__qis__isnan__body(double %d) - %37 = xor i1 %36, true - br i1 %37, label %then0__10, label %continue__10 - -then0__10: ; preds = %continue__9 - ret i64 11 - -continue__10: ; preds = %continue__9 - %x__10 = call double @__quantum__qis__nan__body() - %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) - %38 = call i1 @__quantum__qis__isnan__body(double %d__1) - %39 = xor i1 %38, true - br i1 %39, label %then0__11, label %continue__11 - -then0__11: ; preds = %continue__10 - ret i64 12 - -continue__11: ; preds = %continue__10 - %y__11 = call double @__quantum__qis__nan__body() - %x__11 = call double @__quantum__qis__nan__body() - %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) - %40 = call i1 @__quantum__qis__isnan__body(double %d__2) - %41 = xor i1 %40, true - br i1 %41, label %then0__12, label %continue__12 - -then0__12: ; preds = %continue__11 - ret i64 13 - -continue__12: ; preds = %continue__11 - ret i64 0 -} + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + br label %continue__1 -define i64 @Microsoft__Quantum__Testing__QIR__Subtract__body(i64 %from, i64 %what) { -entry: - %0 = sub i64 %from, %what - ret i64 %0 +continue__1: ; preds = %then0__1, %entry + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void } -define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %dummy) { +define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %array, i64 %index, i64 %val, i1 %compilerDecoy) { entry: call void @__quantum__rt__array_update_alias_count(%Array* %array, i64 1) %local = alloca %Array* @@ -605,7 +714,7 @@ exiting__1: ; preds = %body__1 br label %header__1 exit__1: ; preds = %header__1 - br i1 %dummy, label %then0__1, label %continue__1 + br i1 %compilerDecoy, label %then0__1, label %continue__1 then0__1: ; preds = %exit__1 %res1 = call i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() @@ -641,320 +750,13 @@ declare %Array* @__quantum__rt__array_slice_1d(%Array*, %Range, i1) declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) -define i64 @Microsoft__Quantum__Testing__QIR__TestControlled__body() { +define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { entry: %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 - %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Qop, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) - store %Callable* %4, %Callable** %2 - store i64 1, i64* %3 - %qop = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i64)*]* @MemoryManagement__1, %Tuple* %0) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 1) - %adj_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 1) - %ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 1) - %adj_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %adj_ctl_qop) - call void @__quantum__rt__callable_make_adjoint(%Callable* %adj_ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 1) - %ctl_ctl_qop = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %ctl_ctl_qop) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 1) - %error_code = alloca i64 - store i64 0, i64* %error_code - %q1 = call %Qubit* @__quantum__rt__qubit_allocate() - %q2 = call %Qubit* @__quantum__rt__qubit_allocate() - %q3 = call %Qubit* @__quantum__rt__qubit_allocate() - %5 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %6 = bitcast %Tuple* %5 to { %Qubit* }* - %7 = getelementptr { %Qubit* }, { %Qubit* }* %6, i64 0, i32 0 - store %Qubit* %q1, %Qubit** %7 - call void @__quantum__rt__callable_invoke(%Callable* %qop, %Tuple* %5, %Tuple* null) - %8 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q1) - %9 = load %Result*, %Result** @ResultOne - %10 = call i1 @__quantum__rt__result_equal(%Result* %8, %Result* %9) - %11 = xor i1 %10, true - br i1 %11, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - store i64 1, i64* %error_code - br label %continue__1 - -else__1: ; preds = %entry - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %13 = bitcast %Tuple* %12 to { %Qubit* }* - %14 = getelementptr { %Qubit* }, { %Qubit* }* %13, i64 0, i32 0 - store %Qubit* %q2, %Qubit** %14 - call void @__quantum__rt__callable_invoke(%Callable* %adj_qop, %Tuple* %12, %Tuple* null) - %15 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q2) - %16 = load %Result*, %Result** @ResultOne - %17 = call i1 @__quantum__rt__result_equal(%Result* %15, %Result* %16) - %18 = xor i1 %17, true - br i1 %18, label %then0__2, label %else__2 - -then0__2: ; preds = %else__1 - store i64 2, i64* %error_code - br label %continue__2 - -else__2: ; preds = %else__1 - %19 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %20 = bitcast %Tuple* %19 to { %Array*, %Qubit* }* - %21 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 0 - %22 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %20, i64 0, i32 1 - %23 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %23, i64 0) - %25 = bitcast i8* %24 to %Qubit** - store %Qubit* %q1, %Qubit** %25 - store %Array* %23, %Array** %21 - store %Qubit* %q3, %Qubit** %22 - call void @__quantum__rt__callable_invoke(%Callable* %ctl_qop, %Tuple* %19, %Tuple* null) - %26 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %27 = load %Result*, %Result** @ResultOne - %28 = call i1 @__quantum__rt__result_equal(%Result* %26, %Result* %27) - %29 = xor i1 %28, true - br i1 %29, label %then0__3, label %else__3 - -then0__3: ; preds = %else__2 - store i64 3, i64* %error_code - br label %continue__3 - -else__3: ; preds = %else__2 - %30 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %31 = bitcast %Tuple* %30 to { %Array*, %Qubit* }* - %32 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %31, i64 0, i32 0 - %33 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %31, i64 0, i32 1 - %34 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %34, i64 0) - %36 = bitcast i8* %35 to %Qubit** - store %Qubit* %q2, %Qubit** %36 - store %Array* %34, %Array** %32 - store %Qubit* %q3, %Qubit** %33 - call void @__quantum__rt__callable_invoke(%Callable* %adj_ctl_qop, %Tuple* %30, %Tuple* null) - %37 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %38 = load %Result*, %Result** @ResultZero - %39 = call i1 @__quantum__rt__result_equal(%Result* %37, %Result* %38) - %40 = xor i1 %39, true - br i1 %40, label %then0__4, label %else__4 - -then0__4: ; preds = %else__3 - store i64 4, i64* %error_code - br label %continue__4 - -else__4: ; preds = %else__3 - %41 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %42 = bitcast %Tuple* %41 to { %Array*, { %Array*, %Qubit* }* }* - %43 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %42, i64 0, i32 0 - %44 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %42, i64 0, i32 1 - %45 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %45, i64 0) - %47 = bitcast i8* %46 to %Qubit** - store %Qubit* %q1, %Qubit** %47 - %48 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %49 = bitcast %Tuple* %48 to { %Array*, %Qubit* }* - %50 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %49, i64 0, i32 0 - %51 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %49, i64 0, i32 1 - %52 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %52, i64 0) - %54 = bitcast i8* %53 to %Qubit** - store %Qubit* %q2, %Qubit** %54 - store %Array* %52, %Array** %50 - store %Qubit* %q3, %Qubit** %51 - store %Array* %45, %Array** %43 - store { %Array*, %Qubit* }* %49, { %Array*, %Qubit* }** %44 - call void @__quantum__rt__callable_invoke(%Callable* %ctl_ctl_qop, %Tuple* %41, %Tuple* null) - %55 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %56 = load %Result*, %Result** @ResultOne - %57 = call i1 @__quantum__rt__result_equal(%Result* %55, %Result* %56) - %58 = xor i1 %57, true - br i1 %58, label %then0__5, label %else__5 - -then0__5: ; preds = %else__4 - store i64 5, i64* %error_code - br label %continue__5 - -else__5: ; preds = %else__4 - %59 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %59) - %60 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %61 = bitcast %Tuple* %60 to { %Array*, %Qubit* }* - %62 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 0 - %63 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %61, i64 0, i32 1 - %64 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) - %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 0) - %66 = bitcast i8* %65 to %Qubit** - %67 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %64, i64 1) - %68 = bitcast i8* %67 to %Qubit** - store %Qubit* %q1, %Qubit** %66 - store %Qubit* %q2, %Qubit** %68 - store %Array* %64, %Array** %62 - store %Qubit* %q3, %Qubit** %63 - call void @__quantum__rt__callable_invoke(%Callable* %59, %Tuple* %60, %Tuple* null) - %69 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q3) - %70 = load %Result*, %Result** @ResultZero - %71 = call i1 @__quantum__rt__result_equal(%Result* %69, %Result* %70) - %72 = xor i1 %71, true - br i1 %72, label %then0__6, label %else__6 - -then0__6: ; preds = %else__5 - store i64 6, i64* %error_code - br label %continue__6 - -else__6: ; preds = %else__5 - %q4 = call %Qubit* @__quantum__rt__qubit_allocate() - %73 = call %Callable* @__quantum__rt__callable_copy(%Callable* %qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %73) - %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %75 = bitcast %Tuple* %74 to { %Qubit* }* - %76 = getelementptr { %Qubit* }, { %Qubit* }* %75, i64 0, i32 0 - store %Qubit* %q3, %Qubit** %76 - call void @__quantum__rt__callable_invoke(%Callable* %73, %Tuple* %74, %Tuple* null) - %77 = call %Callable* @__quantum__rt__callable_copy(%Callable* %ctl_ctl_qop, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %77) - call void @__quantum__rt__callable_make_adjoint(%Callable* %77) - %78 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %79 = bitcast %Tuple* %78 to { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* - %80 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 0 - %81 = getelementptr { %Array*, { %Array*, { %Array*, %Qubit* }* }* }, { %Array*, { %Array*, { %Array*, %Qubit* }* }* }* %79, i64 0, i32 1 - %82 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %82, i64 0) - %84 = bitcast i8* %83 to %Qubit** - store %Qubit* %q1, %Qubit** %84 - %85 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %86 = bitcast %Tuple* %85 to { %Array*, { %Array*, %Qubit* }* }* - %87 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 0 - %88 = getelementptr { %Array*, { %Array*, %Qubit* }* }, { %Array*, { %Array*, %Qubit* }* }* %86, i64 0, i32 1 - %89 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %89, i64 0) - %91 = bitcast i8* %90 to %Qubit** - store %Qubit* %q2, %Qubit** %91 - %92 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %93 = bitcast %Tuple* %92 to { %Array*, %Qubit* }* - %94 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 0 - %95 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %93, i64 0, i32 1 - %96 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %96, i64 0) - %98 = bitcast i8* %97 to %Qubit** - store %Qubit* %q3, %Qubit** %98 - store %Array* %96, %Array** %94 - store %Qubit* %q4, %Qubit** %95 - store %Array* %89, %Array** %87 - store { %Array*, %Qubit* }* %93, { %Array*, %Qubit* }** %88 - store %Array* %82, %Array** %80 - store { %Array*, { %Array*, %Qubit* }* }* %86, { %Array*, { %Array*, %Qubit* }* }** %81 - call void @__quantum__rt__callable_invoke(%Callable* %77, %Tuple* %78, %Tuple* null) - %99 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q4) - %100 = load %Result*, %Result** @ResultOne - %101 = call i1 @__quantum__rt__result_equal(%Result* %99, %Result* %100) - %102 = xor i1 %101, true - br i1 %102, label %then0__7, label %continue__7 - -then0__7: ; preds = %else__6 - store i64 7, i64* %error_code - br label %continue__7 - -continue__7: ; preds = %then0__7, %else__6 - call void @__quantum__rt__qubit_release(%Qubit* %q4) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %73, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %73, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %77, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %77, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %82, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %89, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %96, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %92, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %85, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %78, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %99, i64 -1) - br label %continue__6 - -continue__6: ; preds = %continue__7, %then0__6 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %59, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %59, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %64, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %60, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %69, i64 -1) - br label %continue__5 - -continue__5: ; preds = %continue__6, %then0__5 - call void @__quantum__rt__array_update_reference_count(%Array* %45, i64 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %52, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %48, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %41, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %55, i64 -1) - br label %continue__4 - -continue__4: ; preds = %continue__5, %then0__4 - call void @__quantum__rt__array_update_reference_count(%Array* %34, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %30, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %37, i64 -1) - br label %continue__3 - -continue__3: ; preds = %continue__4, %then0__3 - call void @__quantum__rt__array_update_reference_count(%Array* %23, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %19, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %26, i64 -1) - br label %continue__2 - -continue__2: ; preds = %continue__3, %then0__2 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %15, i64 -1) - br label %continue__1 - -continue__1: ; preds = %continue__2, %then0__1 - call void @__quantum__rt__qubit_release(%Qubit* %q1) - call void @__quantum__rt__qubit_release(%Qubit* %q2) - call void @__quantum__rt__qubit_release(%Qubit* %q3) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %5, i64 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %8, i64 -1) - %103 = load i64, i64* %error_code - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %adj_ctl_qop, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %ctl_ctl_qop, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %ctl_ctl_qop, i64 -1) - ret i64 %103 -} - -define i64 @Microsoft__Quantum__Testing__QIR__TestPartials__body(i64 %x, i64 %y) { -entry: - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i64 }* getelementptr ({ %Callable*, i64 }, { %Callable*, i64 }* null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Callable*, i64 }* - %2 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 0 - %3 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %1, i64 0, i32 1 - %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) + %4 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__QIR__Subtract, [2 x void (%Tuple*, i64)*]* null, %Tuple* null) store %Callable* %4, %Callable** %2 store i64 %x, i64* %3 %subtractor = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i64)*]* @MemoryManagement__2, %Tuple* %0) @@ -1017,293 +819,333 @@ continue__1: ; preds = %then0__1, %entry ret i1 %14 } -declare %Qubit* @__quantum__rt__qubit_allocate() +define i64 @Microsoft__Quantum__Testing__QIR__Math__SqrtTest__body() { +entry: + %0 = call double @__quantum__qis__sqrt__body(double 4.000000e+00) + %1 = fcmp one double 2.000000e+00, %0 + br i1 %1, label %then0__1, label %continue__1 -declare %Array* @__quantum__rt__qubit_allocate_array(i64) +then0__1: ; preds = %entry + ret i64 1 -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) +continue__1: ; preds = %entry + %2 = call double @__quantum__qis__sqrt__body(double 9.000000e+00) + %3 = fcmp one double 3.000000e+00, %2 + br i1 %3, label %then0__2, label %continue__2 -declare void @__quantum__rt__qubit_release(%Qubit*) +then0__2: ; preds = %continue__1 + ret i64 2 -declare void @__quantum__rt__qubit_release_array(%Array*) +continue__2: ; preds = %continue__1 + %4 = call double @__quantum__qis__sqrt__body(double 1.000000e+02) + %5 = fcmp one double 1.000000e+01, %4 + br i1 %5, label %then0__3, label %continue__3 -declare void @__quantum__rt__result_update_reference_count(%Result*, i64) +then0__3: ; preds = %continue__2 + ret i64 3 -define void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %q, i64 %n) { +continue__3: ; preds = %continue__2 + %d__4 = call double @__quantum__qis__sqrt__body(double -5.000000e+00) + %6 = call i1 @__quantum__qis__isnan__body(double %d__4) + %7 = xor i1 %6, true + br i1 %7, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %d__5 = call double @__quantum__qis__nan__body() + %d__6 = call double @__quantum__qis__sqrt__body(double %d__5) + %8 = call i1 @__quantum__qis__isnan__body(double %d__6) + %9 = xor i1 %8, true + br i1 %9, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__7 = call double @__quantum__qis__infinity__body() + %d__8 = call double @__quantum__qis__sqrt__body(double %d__7) + %10 = call i1 @__quantum__qis__isinf__body(double %d__8) + %11 = xor i1 %10, true + br i1 %11, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 +} + +define i64 @Microsoft__Quantum__Testing__QIR__Math__LogTest__body() { entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 + %d = call double @Microsoft__Quantum__Math__E__body() + %0 = call double @__quantum__qis__log__body(double %d) + %1 = fcmp one double 1.000000e+00, %0 br i1 %1, label %then0__1, label %continue__1 then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 + ret i64 1 -continue__1: ; preds = %then0__1, %entry - ret void +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__E__body() + %3 = call double @Microsoft__Quantum__Math__E__body() + %d__1 = fmul double %2, %3 + %4 = call double @__quantum__qis__log__body(double %d__1) + %5 = fcmp one double 2.000000e+00, %4 + br i1 %5, label %then0__2, label %continue__2 + +then0__2: ; preds = %continue__1 + ret i64 2 + +continue__2: ; preds = %continue__1 + %d__3 = call double @__quantum__qis__log__body(double 0.000000e+00) + %6 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d__3) + %7 = xor i1 %6, true + br i1 %7, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + ret i64 3 + +continue__3: ; preds = %continue__2 + %d__5 = call double @__quantum__qis__log__body(double -5.000000e+00) + %8 = call i1 @__quantum__qis__isnan__body(double %d__5) + %9 = xor i1 %8, true + br i1 %9, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + ret i64 4 + +continue__4: ; preds = %continue__3 + %d__6 = call double @__quantum__qis__nan__body() + %d__7 = call double @__quantum__qis__log__body(double %d__6) + %10 = call i1 @__quantum__qis__isnan__body(double %d__7) + %11 = xor i1 %10, true + br i1 %11, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + ret i64 5 + +continue__5: ; preds = %continue__4 + %d__8 = call double @__quantum__qis__infinity__body() + %d__9 = call double @__quantum__qis__log__body(double %d__8) + %12 = call i1 @__quantum__qis__isinf__body(double %d__9) + %13 = xor i1 %12, true + br i1 %13, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + ret i64 6 + +continue__6: ; preds = %continue__5 + ret i64 0 } -define void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %q, i64 %n) { +define i64 @Microsoft__Quantum__Testing__QIR__Math__ArcTan2Test__body() { entry: - %0 = srem i64 %n, 2 - %1 = icmp eq i64 %0, 1 + %0 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 1.000000e+00) + %1 = fcmp one double 0.000000e+00, %0 br i1 %1, label %then0__1, label %continue__1 then0__1: ; preds = %entry - call void @__quantum__qis__k__body(%Qubit* %q) - br label %continue__1 + ret i64 1 -continue__1: ; preds = %then0__1, %entry - ret void -} +continue__1: ; preds = %entry + %2 = call double @Microsoft__Quantum__Math__PI__body() + %3 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double -1.000000e+00) + %4 = fcmp one double %2, %3 + br i1 %4, label %then0__2, label %continue__2 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %ctrls, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 +then0__2: ; preds = %continue__1 + ret i64 2 + +continue__2: ; preds = %continue__1 + %5 = call double @Microsoft__Quantum__Math__PI__body() + %6 = fdiv double %5, 2.000000e+00 + %7 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 0.000000e+00) + %8 = fcmp one double %6, %7 + br i1 %8, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + ret i64 3 + +continue__3: ; preds = %continue__2 + %9 = call double @Microsoft__Quantum__Math__PI__body() + %10 = fneg double %9 + %11 = fdiv double %10, 2.000000e+00 + %12 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 0.000000e+00) + %13 = fcmp one double %11, %12 + br i1 %13, label %then0__4, label %continue__4 -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 1) - call void @__quantum__qis__k__ctl(%Array* %ctrls, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - br label %continue__1 +then0__4: ; preds = %continue__3 + ret i64 4 -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %ctrls, i64 -1) - ret void -} +continue__4: ; preds = %continue__3 + %14 = call double @Microsoft__Quantum__Math__PI__body() + %15 = fdiv double %14, 4.000000e+00 + %16 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double 1.000000e+00) + %17 = fcmp one double %15, %16 + br i1 %17, label %then0__5, label %continue__5 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %__controlQubits__, { %Qubit*, i64 }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %q = load %Qubit*, %Qubit** %1 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %n = load i64, i64* %2 - %3 = srem i64 %n, 2 - %4 = icmp eq i64 %3, 1 - br i1 %4, label %then0__1, label %continue__1 +then0__5: ; preds = %continue__4 + ret i64 5 -then0__1: ; preds = %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) - call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - br label %continue__1 +continue__5: ; preds = %continue__4 + %18 = call double @Microsoft__Quantum__Math__PI__body() + %19 = fmul double %18, 3.000000e+00 + %20 = fdiv double %19, 4.000000e+00 + %21 = call double @__quantum__qis__arctan2__body(double 1.000000e+00, double -1.000000e+00) + %22 = fcmp one double %20, %21 + br i1 %22, label %then0__6, label %continue__6 -continue__1: ; preds = %then0__1, %entry - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) - ret void -} +then0__6: ; preds = %continue__5 + ret i64 6 -declare %Tuple* @__quantum__rt__tuple_create(i64) +continue__6: ; preds = %continue__5 + %23 = call double @Microsoft__Quantum__Math__PI__body() + %24 = fneg double %23 + %25 = fmul double %24, 3.000000e+00 + %26 = fdiv double %25, 4.000000e+00 + %27 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double -1.000000e+00) + %28 = fcmp one double %26, %27 + br i1 %28, label %then0__7, label %continue__7 -define void @Microsoft__Quantum__Testing__QIR__Qop__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__body(%Qubit* %3, i64 %4) - ret void -} +then0__7: ; preds = %continue__6 + ret i64 7 -define void @Microsoft__Quantum__Testing__QIR__Qop__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit*, i64 }* - %1 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 0 - %2 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %0, i64 0, i32 1 - %3 = load %Qubit*, %Qubit** %1 - %4 = load i64, i64* %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__adj(%Qubit* %3, i64 %4) - ret void -} +continue__7: ; preds = %continue__6 + %29 = call double @Microsoft__Quantum__Math__PI__body() + %30 = fneg double %29 + %31 = fdiv double %30, 4.000000e+00 + %32 = call double @__quantum__qis__arctan2__body(double -1.000000e+00, double 1.000000e+00) + %33 = fcmp one double %31, %32 + br i1 %33, label %then0__8, label %continue__8 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctl(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} +then0__8: ; preds = %continue__7 + ret i64 8 -define void @Microsoft__Quantum__Testing__QIR__Qop__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { %Qubit*, i64 }* }* - %1 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load { %Qubit*, i64 }*, { %Qubit*, i64 }** %2 - call void @Microsoft__Quantum__Testing__QIR__Qop__ctladj(%Array* %3, { %Qubit*, i64 }* %4) - ret void -} +continue__8: ; preds = %continue__7 + %34 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double 0.000000e+00) + %35 = fcmp one double 0.000000e+00, %34 + br i1 %35, label %then0__9, label %continue__9 -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i64)*]*, %Tuple*) +then0__9: ; preds = %continue__8 + ret i64 9 -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - call void @__quantum__rt__callable_invoke(%Callable* %11, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - ret void -} +continue__9: ; preds = %continue__8 + %y__9 = call double @__quantum__qis__nan__body() + %d = call double @__quantum__qis__arctan2__body(double %y__9, double 0.000000e+00) + %36 = call i1 @__quantum__qis__isnan__body(double %d) + %37 = xor i1 %36, true + br i1 %37, label %then0__10, label %continue__10 -define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr { %Qubit* }, { %Qubit* }* %0, i64 0, i32 0 - %2 = load %Qubit*, %Qubit** %1 - %3 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %4 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 1 - %5 = load i64, i64* %4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Qubit*, i64 }* - %8 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 0 - %9 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %7, i64 0, i32 1 - store %Qubit* %2, %Qubit** %8 - store i64 %5, i64* %9 - %10 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %3, i64 0, i32 0 - %11 = load %Callable*, %Callable** %10 - %12 = call %Callable* @__quantum__rt__callable_copy(%Callable* %11, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %12) - call void @__quantum__rt__callable_invoke(%Callable* %12, %Tuple* %6, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %12, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %12, i64 -1) - ret void -} +then0__10: ; preds = %continue__9 + ret i64 11 -define void @Lifted__PartialApplication__1__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} +continue__10: ; preds = %continue__9 + %x__10 = call double @__quantum__qis__nan__body() + %d__1 = call double @__quantum__qis__arctan2__body(double 0.000000e+00, double %x__10) + %38 = call i1 @__quantum__qis__isnan__body(double %d__1) + %39 = xor i1 %38, true + br i1 %39, label %then0__11, label %continue__11 -define void @Lifted__PartialApplication__1__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 0 - %2 = getelementptr { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i64 0, i32 1 - %3 = load %Array*, %Array** %1 - %4 = load %Qubit*, %Qubit** %2 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %6 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 1 - %7 = load i64, i64* %6 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Qubit*, i64 }* getelementptr ({ %Qubit*, i64 }, { %Qubit*, i64 }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { %Qubit*, i64 }* - %10 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 0 - %11 = getelementptr { %Qubit*, i64 }, { %Qubit*, i64 }* %9, i64 0, i32 1 - store %Qubit* %4, %Qubit** %10 - store i64 %7, i64* %11 - %12 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %13 = bitcast %Tuple* %12 to { %Array*, { %Qubit*, i64 }* }* - %14 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 0 - %15 = getelementptr { %Array*, { %Qubit*, i64 }* }, { %Array*, { %Qubit*, i64 }* }* %13, i64 0, i32 1 - store %Array* %3, %Array** %14 - store { %Qubit*, i64 }* %9, { %Qubit*, i64 }** %15 - %16 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %5, i64 0, i32 0 - %17 = load %Callable*, %Callable** %16 - %18 = call %Callable* @__quantum__rt__callable_copy(%Callable* %17, i1 false) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %18) - call void @__quantum__rt__callable_make_controlled(%Callable* %18) - call void @__quantum__rt__callable_invoke(%Callable* %18, %Tuple* %12, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i64 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %12, i64 -1) - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %18, i64 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %18, i64 -1) - ret void -} +then0__11: ; preds = %continue__10 + ret i64 12 -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i64 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 0, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i64 %count-change) - ret void +continue__11: ; preds = %continue__10 + %y__11 = call double @__quantum__qis__nan__body() + %x__11 = call double @__quantum__qis__nan__body() + %d__2 = call double @__quantum__qis__arctan2__body(double %y__11, double %x__11) + %40 = call i1 @__quantum__qis__isnan__body(double %d__2) + %41 = xor i1 %40, true + br i1 %41, label %then0__12, label %continue__12 + +then0__12: ; preds = %continue__11 + ret i64 13 + +continue__12: ; preds = %continue__11 + ret i64 0 } -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i64 %count-change) { +define i64 @Microsoft__Quantum__Testing__QIR__Str__PauliToStringTest__body() { entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i64 }* - %1 = getelementptr { %Callable*, i64 }, { %Callable*, i64 }* %0, i64 0, i32 0 - %2 = load %Callable*, %Callable** %1 - call void @__quantum__rt__callable_memory_management(i32 1, %Callable* %2, i64 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i64 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i64 %count-change) - ret void -} + %0 = call %String* @__quantum__rt__string_create(i32 19, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @0, i32 0, i32 0)) + %1 = call %String* @__quantum__rt__string_create(i32 13, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @1, i32 0, i32 0)) + %2 = load i2, i2* @PauliI + %3 = call %String* @__quantum__rt__pauli_to_string(i2 %2) + %4 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %3) + call void @__quantum__rt__string_update_reference_count(%String* %1, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i64 -1) + %5 = call i1 @__quantum__rt__string_equal(%String* %0, %String* %4) + %6 = xor i1 %5, true + br i1 %6, label %then0__1, label %continue__1 -declare void @__quantum__rt__callable_memory_management(i32, %Callable*, i64) +then0__1: ; preds = %entry + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + ret i64 1 -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i64) +continue__1: ; preds = %entry + %7 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @2, i32 0, i32 0)) + %8 = load i2, i2* @PauliX + %9 = call %String* @__quantum__rt__pauli_to_string(i2 %8) + %10 = call i1 @__quantum__rt__string_equal(%String* %7, %String* %9) + %11 = xor i1 %10, true + br i1 %11, label %then0__2, label %continue__2 -declare %Callable* @__quantum__rt__callable_copy(%Callable*, i1) +then0__2: ; preds = %continue__1 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + ret i64 2 -declare void @__quantum__rt__callable_make_adjoint(%Callable*) +continue__2: ; preds = %continue__1 + %12 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @3, i32 0, i32 0)) + %13 = load i2, i2* @PauliY + %14 = call %String* @__quantum__rt__pauli_to_string(i2 %13) + %15 = call i1 @__quantum__rt__string_equal(%String* %12, %String* %14) + %16 = xor i1 %15, true + br i1 %16, label %then0__3, label %continue__3 -declare void @__quantum__rt__callable_make_controlled(%Callable*) +then0__3: ; preds = %continue__2 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + ret i64 3 -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) +continue__3: ; preds = %continue__2 + %17 = call %String* @__quantum__rt__string_create(i32 6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @4, i32 0, i32 0)) + %18 = load i2, i2* @PauliZ + %19 = call %String* @__quantum__rt__pauli_to_string(i2 %18) + %20 = call i1 @__quantum__rt__string_equal(%String* %17, %String* %19) + %21 = xor i1 %20, true + br i1 %21, label %then0__4, label %continue__4 -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i64) +then0__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) + ret i64 4 -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i64) +continue__4: ; preds = %continue__3 + call void @__quantum__rt__string_update_reference_count(%String* %0, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %7, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %12, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i64 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i64 -1) + ret i64 0 +} define void @Microsoft__Quantum__Testing__QIR__Subtract__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { entry: @@ -1362,7 +1204,165 @@ entry: ret void } -define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %dummy) #0 { +declare void @__quantum__qis__x__body(%Qubit*) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +define double @Microsoft__Quantum__Intrinsic__ArcTan2__body(double %y, double %x) { +entry: + %0 = call double @__quantum__qis__arctan2__body(double %y, double %x) + ret double %0 +} + +declare double @__quantum__qis__arctan2__body(double, double) + +define void @Microsoft__Quantum__Intrinsic__K__body(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__K__adj(%Qubit* %q) { +entry: + call void @__quantum__qis__k__body(%Qubit* %q) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__K__ctl(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__K__ctladj(%Array* %__controlQubits__, %Qubit* %q) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__k__ctl(%Array* %__controlQubits__, %Qubit* %q) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define double @Microsoft__Quantum__Intrinsic__Sqrt__body(double %d) { +entry: + %0 = call double @__quantum__qis__sqrt__body(double %d) + ret double %0 +} + +declare double @__quantum__qis__sqrt__body(double) + +define double @Microsoft__Quantum__Intrinsic__NAN__body() { +entry: + %0 = call double @__quantum__qis__nan__body() + ret double %0 +} + +declare double @__quantum__qis__nan__body() + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i64 -1) + ret void +} + +define i1 @Microsoft__Quantum__Intrinsic__IsNan__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnan__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isnan__body(double) + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i64 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i64 -1) + ret %Result* %0 +} + +define double @Microsoft__Quantum__Intrinsic__Log__body(double %d) { +entry: + %0 = call double @__quantum__qis__log__body(double %d) + ret double %0 +} + +declare double @__quantum__qis__log__body(double) + +define double @Microsoft__Quantum__Intrinsic__INFINITY__body() { +entry: + %0 = call double @__quantum__qis__infinity__body() + ret double %0 +} + +declare double @__quantum__qis__infinity__body() + +define i1 @Microsoft__Quantum__Intrinsic__IsInf__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isinf__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isinf__body(double) + +define i1 @Microsoft__Quantum__Intrinsic__IsNegativeInfinity__body(double %d) { +entry: + %0 = call i1 @__quantum__qis__isnegativeinfinity__body(double %d) + ret i1 %0 +} + +declare i1 @__quantum__qis__isnegativeinfinity__body(double) + +define double @Microsoft__Quantum__Math__E__body() { +entry: + ret double 0x4005BF0A8B145769 +} + +define double @Microsoft__Quantum__Math__PI__body() { +entry: + ret double 0x400921FB54442D18 +} + +declare %String* @__quantum__rt__string_create(i32, i8*) + +declare %String* @__quantum__rt__pauli_to_string(i2) + +declare %String* @__quantum__rt__string_concatenate(%String*, %String*) + +declare void @__quantum__rt__string_update_reference_count(%String*, i64) + +declare i1 @__quantum__rt__string_equal(%String*, %String*) + +define i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays(i64 %array__count, i64* %array, i64 %index, i64 %val, i1 %compilerDecoy) #0 { entry: %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %array__count) %1 = icmp sgt i64 %array__count, 0 @@ -1375,7 +1375,7 @@ copy: ; preds = %entry br label %next next: ; preds = %copy, %entry - %4 = call i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %0, i64 %index, i64 %val, i1 %dummy) + %4 = call i64 @Microsoft__Quantum__Testing__QIR__Test_Arrays__body(%Array* %0, i64 %index, i64 %val, i1 %compilerDecoy) ret i64 %4 }