From 0cbc02c7828353ce7003f994bb8d6dab14a39c5e Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Wed, 7 Apr 2021 16:00:43 -0700 Subject: [PATCH 01/16] Create initial prototype for controller (with dependencies unimplemented) --- Simulation.sln | 19 + src/Qir/Controller/Constant.cs | 16 + src/Qir/Controller/Controller.cs | 51 +- .../Controller/Driver/IQirDriverGenerator.cs | 20 + .../Controller/Driver/QirDriverGenerator.cs | 17 + src/Qir/Controller/Executable/ClangClient.cs | 22 + src/Qir/Controller/Executable/IClangClient.cs | 15 + .../Executable/IQirExecutableGenerator.cs | 21 + .../Executable/IQuantumExecutableRunner.cs | 21 + .../Executable/QirExecutableGenerator.cs | 24 + .../Executable/QuantumExecutableRunner.cs | 17 + src/Qir/Controller/Program.cs | 22 +- src/Qir/Controller/QirController.csproj | 15 +- .../Tests.QirController/ControllerTests.cs | 125 + .../Tests.QirController.csproj | 20 + .../qir/qir-standalone-input-reference.ll | 1427 +++++++++++ .../qsharp/qir/qir-test-simulator.ll | 1387 +++++++++++ .../QIR-dynamic/qsharp/qir/qir-test-random.ll | 159 ++ .../test/QIR-tracer/qsharp/qir/tracer-qir.ll | 2080 +++++++++++++++++ 19 files changed, 5462 insertions(+), 16 deletions(-) create mode 100644 src/Qir/Controller/Constant.cs create mode 100644 src/Qir/Controller/Driver/IQirDriverGenerator.cs create mode 100644 src/Qir/Controller/Driver/QirDriverGenerator.cs create mode 100644 src/Qir/Controller/Executable/ClangClient.cs create mode 100644 src/Qir/Controller/Executable/IClangClient.cs create mode 100644 src/Qir/Controller/Executable/IQirExecutableGenerator.cs create mode 100644 src/Qir/Controller/Executable/IQuantumExecutableRunner.cs create mode 100644 src/Qir/Controller/Executable/QirExecutableGenerator.cs create mode 100644 src/Qir/Controller/Executable/QuantumExecutableRunner.cs create mode 100644 src/Qir/Controller/Tests.QirController/ControllerTests.cs create mode 100644 src/Qir/Controller/Tests.QirController/Tests.QirController.csproj create mode 100644 src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll create mode 100644 src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll create mode 100644 src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll create mode 100644 src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll diff --git a/Simulation.sln b/Simulation.sln index 4ba93680295..6ab8f7cfd5b 100644 --- a/Simulation.sln +++ b/Simulation.sln @@ -107,6 +107,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "controller", "controller", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QirController", "src\Qir\Controller\QirController.csproj", "{55AC2357-5C70-4CAC-9A1F-4146E2D81CE3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.QirController", "src\Qir\Controller\Tests.QirController\Tests.QirController.csproj", "{2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -759,6 +761,22 @@ Global {55AC2357-5C70-4CAC-9A1F-4146E2D81CE3}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU {55AC2357-5C70-4CAC-9A1F-4146E2D81CE3}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU {55AC2357-5C70-4CAC-9A1F-4146E2D81CE3}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Debug|x64.Build.0 = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.MinSizeRel|x64.Build.0 = Debug|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Release|Any CPU.Build.0 = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Release|x64.ActiveCfg = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.Release|x64.Build.0 = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68}.RelWithDebInfo|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -809,6 +827,7 @@ Global {5917D4C5-0CD2-4BD1-A859-19B9B97FF8A7} = {3FFDEA49-C6E8-45BB-BCA5-BBC5378F704F} {A25E062D-C685-48DE-99D1-B5BC0DF73F89} = {C637C9DF-14AA-48CB-95F3-73CE0AC5F9B1} {55AC2357-5C70-4CAC-9A1F-4146E2D81CE3} = {A25E062D-C685-48DE-99D1-B5BC0DF73F89} + {2E4B9604-A5CD-4B49-B1D4-A7AC8ABAEF68} = {A25E062D-C685-48DE-99D1-B5BC0DF73F89} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {929C0464-86D8-4F70-8835-0A5EAF930821} diff --git a/src/Qir/Controller/Constant.cs b/src/Qir/Controller/Constant.cs new file mode 100644 index 00000000000..42475cb494b --- /dev/null +++ b/src/Qir/Controller/Constant.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace Microsoft.Quantum.Qir +{ + public static class Constant + { + public static class FilePath + { + // TODO validate/improve these names. + public const string BytecodeFilePath = "/home/bytecode.ll"; + public const string DriverFilePath = "/home/driver.cpp"; + public const string ExecutableFilePath = "/home/simulation.exe"; + } + } +} diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index 0f613d5fc0c..5d43815a7b4 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -2,25 +2,48 @@ // Licensed under the MIT License. using System.IO; -using System.Text; +using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Driver; +using Microsoft.Quantum.Qir.Executable; +using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; namespace Microsoft.Quantum.Qir { - internal static class Controller + public static class Controller { - internal static void Execute( - FileInfo input, - FileInfo output, - FileInfo error) + public static async Task ExecuteAsync( + FileInfo inputFile, + FileInfo outputFile, + DirectoryInfo libraryDirectory, + FileInfo errorFile, + FileInfo bytecodeFile, + IQirDriverGenerator driverGenerator, + IQirExecutableGenerator executableGenerator, + IQuantumExecutableRunner executableRunner) { - var outputFileStream = output.Exists ? output.OpenWrite() : output.Create(); - outputFileStream.Write(new UTF8Encoding().GetBytes("output")); - outputFileStream.Flush(); - outputFileStream.Close(); - var errorFileStream = error.Exists ? error.OpenWrite() : error.Create(); - errorFileStream.Write(new UTF8Encoding().GetBytes("error")); - errorFileStream.Flush(); - errorFileStream.Close(); + // TODO: Error handling. + // TODO: Logging. + // Step 1: Parse input. + using var inputFileStream = inputFile.OpenRead(); + var input = QirExecutionWrapperSerialization.DeserializeFromFastBinary(inputFileStream); + + // Step 2: Create bytecode file. + using (var bytecodeFileStream = bytecodeFile.OpenWrite()) + { + await bytecodeFileStream.WriteAsync(input.QirBytecode.Array, input.QirBytecode.Offset, input.QirBytecode.Count); + } + + // Step 3: Create the driver file. + var driverFile = new FileInfo(Constant.FilePath.DriverFilePath); + await driverGenerator.GenerateQirDriverCppAsync(input.EntryPoint, driverFile); + + // Step 4: Create the executable. + var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); + await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, executableFile); + + // Step 5: Run the executable. + using var outputFileStream = outputFile.Exists ? outputFile.OpenWrite() : outputFile.Create(); + await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); } } } diff --git a/src/Qir/Controller/Driver/IQirDriverGenerator.cs b/src/Qir/Controller/Driver/IQirDriverGenerator.cs new file mode 100644 index 00000000000..5e26df14ee5 --- /dev/null +++ b/src/Qir/Controller/Driver/IQirDriverGenerator.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; + +namespace Microsoft.Quantum.Qir.Driver +{ + public interface IQirDriverGenerator + { + /// + /// Generates the C++ driver source file to compile with the bytecode. + /// + /// Entry point information. + /// The file to which the source will be written. + /// + Task GenerateQirDriverCppAsync(EntryPointOperation entryPointOperation, FileInfo driverFile); + } +} diff --git a/src/Qir/Controller/Driver/QirDriverGenerator.cs b/src/Qir/Controller/Driver/QirDriverGenerator.cs new file mode 100644 index 00000000000..34caeb01f59 --- /dev/null +++ b/src/Qir/Controller/Driver/QirDriverGenerator.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; + +namespace Microsoft.Quantum.Qir.Driver +{ + public class QirDriverGenerator : IQirDriverGenerator + { + public Task GenerateQirDriverCppAsync(EntryPointOperation entryPointOperation, FileInfo driverFile) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/src/Qir/Controller/Executable/ClangClient.cs b/src/Qir/Controller/Executable/ClangClient.cs new file mode 100644 index 00000000000..4a6c993dd86 --- /dev/null +++ b/src/Qir/Controller/Executable/ClangClient.cs @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.CommandLine.Invocation; +using System.Threading.Tasks; + +namespace Microsoft.Quantum.Qir.Executable +{ + public class ClangClient : IClangClient + { + private const string LinkFlag = " -l "; + + public async Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string outputPath) + { + var inputsArg = string.Join(' ', inputFiles); + var librariesArg = $"{LinkFlag} {string.Join(LinkFlag, libraries)}"; + var arguments = $"{inputsArg} -L {libraryPath} {librariesArg} -o {outputPath}"; + var result = await Process.ExecuteAsync("clang", arguments, stdOut: s => { Console.WriteLine(s); }, stdErr: s => { Console.WriteLine(s); }); + } + } +} diff --git a/src/Qir/Controller/Executable/IClangClient.cs b/src/Qir/Controller/Executable/IClangClient.cs new file mode 100644 index 00000000000..313c92f3e89 --- /dev/null +++ b/src/Qir/Controller/Executable/IClangClient.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Threading.Tasks; + +namespace Microsoft.Quantum.Qir.Executable +{ + /// + /// Wraps the 'clang' tool used for compilation. + /// + public interface IClangClient + { + Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string outputPath); + } +} diff --git a/src/Qir/Controller/Executable/IQirExecutableGenerator.cs b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs new file mode 100644 index 00000000000..54854cfed21 --- /dev/null +++ b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Quantum.Qir.Executable +{ + public interface IQirExecutableGenerator + { + /// + /// Generates a quantum simulation program executable. + /// + /// The C++ source driver file. + /// The QIR bytecode. + /// Location of the libraries that must be linked. + /// File path to create the executable at. + /// + Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, FileInfo executableFile); + } +} diff --git a/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs new file mode 100644 index 00000000000..135fbbbfb4f --- /dev/null +++ b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; + +namespace Microsoft.Quantum.Qir.Executable +{ + public interface IQuantumExecutableRunner + { + /// + /// Runs a quantum program executable with the given arguments. + /// + /// Location of the executable to run. + /// Entry point and arguments to pass. + /// Location to write program output. + /// + Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile); + } +} diff --git a/src/Qir/Controller/Executable/QirExecutableGenerator.cs b/src/Qir/Controller/Executable/QirExecutableGenerator.cs new file mode 100644 index 00000000000..1b521c6f762 --- /dev/null +++ b/src/Qir/Controller/Executable/QirExecutableGenerator.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; + +namespace Microsoft.Quantum.Qir.Executable +{ + public class QirExecutableGenerator : IQirExecutableGenerator + { + private readonly IClangClient clangClient; + + public QirExecutableGenerator(IClangClient clangClient) + { + this.clangClient = clangClient; + } + + public Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, FileInfo executableFile) + { + // TODO: Compile and link libraries- "Microsoft.Quantum.Qir.Runtime", "Microsoft.Quantum.Qir.QSharp.Foundation", "Microsoft.Quantum.Qir.QSharp.Core" + throw new System.NotImplementedException(); + } + } +} diff --git a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs new file mode 100644 index 00000000000..14a35fc8659 --- /dev/null +++ b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; + +namespace Microsoft.Quantum.Qir.Executable +{ + public class QuantumExecutableRunner : IQuantumExecutableRunner + { + public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index e7fec1e6fd0..20a5791de12 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -4,6 +4,8 @@ using System.CommandLine; using System.CommandLine.Invocation; using System.IO; +using Microsoft.Quantum.Qir.Driver; +using Microsoft.Quantum.Qir.Executable; namespace Microsoft.Quantum.Qir { @@ -31,6 +33,15 @@ static void Main(string[] args) }; rootCommand.AddOption(outputOption); + + var libraryDirectoryOption = new Option( + aliases: new string[] { "--libraryDirectory" }) + { + Description = "Path to the directory containing the libraries that must be linked to the driver executable.", + IsRequired = true + }; + + rootCommand.AddOption(libraryDirectoryOption); var errorOption = new Option( aliases: new string[] { "--error",}) { @@ -40,8 +51,17 @@ static void Main(string[] args) rootCommand.AddOption(errorOption); + var execGenerator = new QirExecutableGenerator(new ClangClient()); + var driverGenerator = new QirDriverGenerator(); + var execRunner = new QuantumExecutableRunner(); + + // The bytecode file is not needed as an input to the program, but we provide the path as an argument to the controller so it can be configured by tests. + var bytecodeFile = new FileInfo(Constant.FilePath.BytecodeFilePath); + // Bind to a handler and invoke. - rootCommand.Handler = CommandHandler.Create((input, output, error) => Controller.Execute(input, output, error)); + rootCommand.Handler = CommandHandler.Create( + async (input, output, libraryDirectory, error) => + await Controller.ExecuteAsync(input, output, libraryDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner)); rootCommand.Invoke(args); } } diff --git a/src/Qir/Controller/QirController.csproj b/src/Qir/Controller/QirController.csproj index 0c21b5914f9..e6f5c6fa3fc 100644 --- a/src/Qir/Controller/QirController.csproj +++ b/src/Qir/Controller/QirController.csproj @@ -1,11 +1,24 @@ - + Exe netcoreapp3.1 + Microsoft.Quantum.Qir + + 5 + + + + + + + + + + diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs new file mode 100644 index 00000000000..83c6b17c2b7 --- /dev/null +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.Quantum.Qir; +using Microsoft.Quantum.Qir.Driver; +using Microsoft.Quantum.Qir.Executable; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; +using Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper; +using Moq; +using Xunit; +using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; + +namespace Tests.QirController +{ + public class ControllerTests : IDisposable + { + private Mock driverGeneratorMock; + private Mock executableGeneratorMock; + private Mock executableRunnerMock; + private FileInfo inputFile; + private FileInfo bytecodeFile; + private FileInfo errorFile; + private FileInfo outputFile; + private QirExecutionWrapper input; + + public ControllerTests() + { + driverGeneratorMock = new Mock(); + executableGeneratorMock = new Mock(); + executableRunnerMock = new Mock(); + inputFile = new FileInfo($"{Guid.NewGuid()}-input"); + bytecodeFile = new FileInfo($"{Guid.NewGuid()}-bytecode"); + errorFile = new FileInfo($"{Guid.NewGuid()}-error"); + outputFile = new FileInfo($"{Guid.NewGuid()}-output"); + + // Create a QirExecutableWrapper to be used by the tests. + byte[] bytecode = { 1, 2, 3, 4, 5 }; + input = new QirExecutionWrapper() + { + EntryPoint = new EntryPointOperation() + { + Arguments = new List + { + new Argument() + { + Position = 0, + Name = "argname", + Values = new List { new ArgumentValue { String = "argvalue" } }, + } + } + }, + QirBytecode = new ArraySegment(bytecode, 1, 3), + }; + using var fileStream = inputFile.OpenWrite(); + QirExecutionWrapperSerialization.SerializeToFastBinary(input, fileStream); + } + + public void Dispose() + { + inputFile.Delete(); + bytecodeFile.Delete(); + errorFile.Delete(); + outputFile.Delete(); + } + + [Fact] + public async Task TestExecute() + { + var libraryDirectory = new DirectoryInfo("libraries"); + var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); + var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Callback(() => + { + // Verify that the "bytecode" file was created correctly. + using var bytecode = bytecodeFile.OpenRead(); + Assert.Equal(bytecode.Length, input.QirBytecode.Count); + for (var i = 0; i < bytecode.Length; ++i) + { + Assert.Equal(input.QirBytecode[i], bytecode.ReadByte()); + } + }); + + await Controller.ExecuteAsync( + inputFile, + outputFile, + libraryDirectory, + errorFile, + bytecodeFile, + driverGeneratorMock.Object, + executableGeneratorMock.Object, + executableRunnerMock.Object); + + // Verify driver was created. + driverGeneratorMock.Verify(obj => obj.GenerateQirDriverCppAsync( + It.Is(entryPoint => EntryPointsAreEqual(entryPoint, input.EntryPoint)), + It.Is(fileInfo => fileInfo.FullName == expectedDriverPath.FullName))); + + // Verify executable was generated. + executableGeneratorMock.Verify(obj => obj.GenerateExecutableAsync( + It.Is(driverPath => driverPath.FullName == expectedDriverPath.FullName), + It.Is(actualBytecodeFile => actualBytecodeFile.FullName == bytecodeFile.FullName), + It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), + It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName))); + + // Verify executable was run. + executableRunnerMock.Verify(obj => obj.RunExecutableAsync( + It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName), + It.Is(entryPoint => EntryPointsAreEqual(entryPoint, input.EntryPoint)), + It.Is(actualOutputFile => actualOutputFile.FullName == outputFile.FullName))); + } + + private bool EntryPointsAreEqual(EntryPointOperation entryPointA, EntryPointOperation entryPointB) + { + var method = typeof(Extensions) + .GetMethod("ValueEquals", BindingFlags.Static | BindingFlags.NonPublic, null, new[] { typeof(EntryPointOperation), typeof(EntryPointOperation) }, null); + object[] parameters = { entryPointA, entryPointB }; + return (bool)method.Invoke(null, parameters); + } + } +} diff --git a/src/Qir/Controller/Tests.QirController/Tests.QirController.csproj b/src/Qir/Controller/Tests.QirController/Tests.QirController.csproj new file mode 100644 index 00000000000..ba5183ca742 --- /dev/null +++ b/src/Qir/Controller/Tests.QirController/Tests.QirController.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + false + + + + + + + + + + + + + + + diff --git a/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll b/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll new file mode 100644 index 00000000000..3b75c0034f7 --- /dev/null +++ b/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll @@ -0,0 +1,1427 @@ + +%Range = type { i64, i64, i64 } +%Tuple = type opaque +%Result = type opaque +%Array = type opaque +%String = type opaque +%Callable = type opaque + +@PauliI = constant i2 0 +@PauliX = constant i2 1 +@PauliY = constant i2 -1 +@PauliZ = constant i2 -2 +@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } +@0 = internal constant [36 x i8] c"Exercise Supported Inputs Reference\00" +@1 = internal constant [11 x i8] c"intValue: \00" +@Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@2 = internal constant [11 x i8] c"intArray: \00" +@3 = internal constant [3 x i8] c" (\00" +@4 = internal constant [2 x i8] c")\00" +@5 = internal constant [14 x i8] c"doubleValue: \00" +@Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@6 = internal constant [14 x i8] c"doubleArray: \00" +@7 = internal constant [3 x i8] c" (\00" +@8 = internal constant [2 x i8] c")\00" +@9 = internal constant [12 x i8] c"boolValue: \00" +@Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@10 = internal constant [12 x i8] c"boolArray: \00" +@11 = internal constant [3 x i8] c" (\00" +@12 = internal constant [2 x i8] c")\00" +@13 = internal constant [13 x i8] c"pauliValue: \00" +@Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@14 = internal constant [13 x i8] c"pauliArray: \00" +@15 = internal constant [3 x i8] c" (\00" +@16 = internal constant [2 x i8] c")\00" +@17 = internal constant [13 x i8] c"rangeValue: \00" +@18 = internal constant [14 x i8] c"resultValue: \00" +@Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@19 = internal constant [14 x i8] c"resultArray: \00" +@20 = internal constant [3 x i8] c" (\00" +@21 = internal constant [2 x i8] c")\00" +@22 = internal constant [14 x i8] c"stringValue: \00" +@23 = internal constant [2 x i8] c"[\00" +@24 = internal constant [3 x i8] c", \00" +@25 = internal constant [2 x i8] c"]\00" +@26 = internal constant [2 x i8] c"[\00" +@27 = internal constant [3 x i8] c", \00" +@28 = internal constant [2 x i8] c"]\00" +@29 = internal constant [2 x i8] c"[\00" +@30 = internal constant [3 x i8] c", \00" +@31 = internal constant [2 x i8] c"]\00" +@32 = internal constant [2 x i8] c"[\00" +@33 = internal constant [3 x i8] c", \00" +@34 = internal constant [2 x i8] c"]\00" +@35 = internal constant [2 x i8] c"[\00" +@36 = internal constant [3 x i8] c", \00" +@37 = internal constant [2 x i8] c"]\00" +@38 = internal constant [3 x i8] c"()\00" + +define void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %intArray, double %doubleValue, %Array* %doubleArray, i1 %boolValue, %Array* %boolArray, i2 %pauliValue, %Array* %pauliArray, %Range %rangeValue, %Result* %resultValue, %Array* %resultArray, %String* %stringValue) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %intArray, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %doubleArray, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %boolArray, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %pauliArray, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %resultArray, i32 1) + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @0, i32 0, i32 0)) + call void @__quantum__rt__message(%String* %0) + %1 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @1, i32 0, i32 0)) + %2 = call %String* @__quantum__rt__int_to_string(i64 %intValue) + %3 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %2) + call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %2, i32 -1) + call void @__quantum__rt__message(%String* %3) + %4 = call %String* @Quantum__StandaloneSupportedInputs___58b06fb8838645aba850713a715678d6_ArrayToString__body(%Array* %intArray) + %5 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %6 = call i64 @Microsoft__Quantum__Arrays___8487a9df7d0d4ac5a6694fb1d077b2b4_Count__body(%Callable* %5, %Array* %intArray) + %7 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @2, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %4, i32 1) + %8 = call %String* @__quantum__rt__string_concatenate(%String* %7, %String* %4) + call void @__quantum__rt__string_update_reference_count(%String* %7, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i32 -1) + %9 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @3, i32 0, i32 0)) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + %11 = call %String* @__quantum__rt__int_to_string(i64 %6) + %12 = call %String* @__quantum__rt__string_concatenate(%String* %10, %String* %11) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + %13 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @4, i32 0, i32 0)) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + call void @__quantum__rt__message(%String* %14) + %15 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @5, i32 0, i32 0)) + %16 = call %String* @__quantum__rt__double_to_string(double %doubleValue) + %17 = call %String* @__quantum__rt__string_concatenate(%String* %15, %String* %16) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %16, i32 -1) + call void @__quantum__rt__message(%String* %17) + %18 = call %String* @Quantum__StandaloneSupportedInputs___651cdf0b91af440a8c52eefc05d57b06_ArrayToString__body(%Array* %doubleArray) + %19 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %20 = call i64 @Microsoft__Quantum__Arrays___1575e931e75b478d9338ff1c1ba98161_Count__body(%Callable* %19, %Array* %doubleArray) + %21 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @6, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 1) + %22 = call %String* @__quantum__rt__string_concatenate(%String* %21, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %21, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + %23 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @7, i32 0, i32 0)) + %24 = call %String* @__quantum__rt__string_concatenate(%String* %22, %String* %23) + call void @__quantum__rt__string_update_reference_count(%String* %22, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %23, i32 -1) + %25 = call %String* @__quantum__rt__int_to_string(i64 %20) + %26 = call %String* @__quantum__rt__string_concatenate(%String* %24, %String* %25) + call void @__quantum__rt__string_update_reference_count(%String* %24, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %25, i32 -1) + %27 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @8, i32 0, i32 0)) + %28 = call %String* @__quantum__rt__string_concatenate(%String* %26, %String* %27) + call void @__quantum__rt__string_update_reference_count(%String* %26, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %27, i32 -1) + call void @__quantum__rt__message(%String* %28) + %29 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @9, i32 0, i32 0)) + %30 = call %String* @__quantum__rt__bool_to_string(i1 %boolValue) + %31 = call %String* @__quantum__rt__string_concatenate(%String* %29, %String* %30) + call void @__quantum__rt__string_update_reference_count(%String* %29, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %30, i32 -1) + call void @__quantum__rt__message(%String* %31) + %32 = call %String* @Quantum__StandaloneSupportedInputs___f5a60aadd6b1405d8efce41485ff4d80_ArrayToString__body(%Array* %boolArray) + %33 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %34 = call i64 @Microsoft__Quantum__Arrays___67c459c137a0446995c133a29250678d_Count__body(%Callable* %33, %Array* %boolArray) + %35 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @10, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %32, i32 1) + %36 = call %String* @__quantum__rt__string_concatenate(%String* %35, %String* %32) + call void @__quantum__rt__string_update_reference_count(%String* %35, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %32, i32 -1) + %37 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @11, i32 0, i32 0)) + %38 = call %String* @__quantum__rt__string_concatenate(%String* %36, %String* %37) + call void @__quantum__rt__string_update_reference_count(%String* %36, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %37, i32 -1) + %39 = call %String* @__quantum__rt__int_to_string(i64 %34) + %40 = call %String* @__quantum__rt__string_concatenate(%String* %38, %String* %39) + call void @__quantum__rt__string_update_reference_count(%String* %38, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %39, i32 -1) + %41 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @12, i32 0, i32 0)) + %42 = call %String* @__quantum__rt__string_concatenate(%String* %40, %String* %41) + call void @__quantum__rt__string_update_reference_count(%String* %40, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %41, i32 -1) + call void @__quantum__rt__message(%String* %42) + %43 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @13, i32 0, i32 0)) + %44 = call %String* @__quantum__rt__pauli_to_string(i2 %pauliValue) + %45 = call %String* @__quantum__rt__string_concatenate(%String* %43, %String* %44) + call void @__quantum__rt__string_update_reference_count(%String* %43, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %44, i32 -1) + call void @__quantum__rt__message(%String* %45) + %46 = call %String* @Quantum__StandaloneSupportedInputs___ec0b3349aeaf419f9d7d96decefd1869_ArrayToString__body(%Array* %pauliArray) + %47 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %48 = call i64 @Microsoft__Quantum__Arrays___c71932228c1b4b6fb8c3c63c9d8e35e4_Count__body(%Callable* %47, %Array* %pauliArray) + %49 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @14, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %46, i32 1) + %50 = call %String* @__quantum__rt__string_concatenate(%String* %49, %String* %46) + call void @__quantum__rt__string_update_reference_count(%String* %49, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %46, i32 -1) + %51 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @15, i32 0, i32 0)) + %52 = call %String* @__quantum__rt__string_concatenate(%String* %50, %String* %51) + call void @__quantum__rt__string_update_reference_count(%String* %50, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %51, i32 -1) + %53 = call %String* @__quantum__rt__int_to_string(i64 %48) + %54 = call %String* @__quantum__rt__string_concatenate(%String* %52, %String* %53) + call void @__quantum__rt__string_update_reference_count(%String* %52, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %53, i32 -1) + %55 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @16, i32 0, i32 0)) + %56 = call %String* @__quantum__rt__string_concatenate(%String* %54, %String* %55) + call void @__quantum__rt__string_update_reference_count(%String* %54, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %55, i32 -1) + call void @__quantum__rt__message(%String* %56) + %57 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @17, i32 0, i32 0)) + %58 = call %String* @__quantum__rt__range_to_string(%Range %rangeValue) + %59 = call %String* @__quantum__rt__string_concatenate(%String* %57, %String* %58) + call void @__quantum__rt__string_update_reference_count(%String* %57, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %58, i32 -1) + call void @__quantum__rt__message(%String* %59) + %60 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @18, i32 0, i32 0)) + %61 = call %String* @__quantum__rt__result_to_string(%Result* %resultValue) + %62 = call %String* @__quantum__rt__string_concatenate(%String* %60, %String* %61) + call void @__quantum__rt__string_update_reference_count(%String* %60, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %61, i32 -1) + call void @__quantum__rt__message(%String* %62) + %63 = call %String* @Quantum__StandaloneSupportedInputs___c22db911562e4518b3ec04b3a395976a_ArrayToString__body(%Array* %resultArray) + %64 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %65 = call i64 @Microsoft__Quantum__Arrays___aa464afb2404486a86d7d9b45b4e8d2c_Count__body(%Callable* %64, %Array* %resultArray) + %66 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @19, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %63, i32 1) + %67 = call %String* @__quantum__rt__string_concatenate(%String* %66, %String* %63) + call void @__quantum__rt__string_update_reference_count(%String* %66, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %63, i32 -1) + %68 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @20, i32 0, i32 0)) + %69 = call %String* @__quantum__rt__string_concatenate(%String* %67, %String* %68) + call void @__quantum__rt__string_update_reference_count(%String* %67, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %68, i32 -1) + %70 = call %String* @__quantum__rt__int_to_string(i64 %65) + %71 = call %String* @__quantum__rt__string_concatenate(%String* %69, %String* %70) + call void @__quantum__rt__string_update_reference_count(%String* %69, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %70, i32 -1) + %72 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @21, i32 0, i32 0)) + %73 = call %String* @__quantum__rt__string_concatenate(%String* %71, %String* %72) + call void @__quantum__rt__string_update_reference_count(%String* %71, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %72, i32 -1) + call void @__quantum__rt__message(%String* %73) + %74 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @22, i32 0, i32 0)) + call void @__quantum__rt__string_update_reference_count(%String* %stringValue, i32 1) + %75 = call %String* @__quantum__rt__string_concatenate(%String* %74, %String* %stringValue) + call void @__quantum__rt__string_update_reference_count(%String* %74, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %stringValue, i32 -1) + call void @__quantum__rt__message(%String* %75) + call void @__quantum__rt__array_update_alias_count(%Array* %intArray, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %doubleArray, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %boolArray, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %pauliArray, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %resultArray, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %3, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %4, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %5, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %5, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %28, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %31, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %32, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %33, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %33, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %42, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %45, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %46, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %47, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %47, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %56, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %59, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %62, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %63, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %64, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %64, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %73, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %75, i32 -1) + ret void +} + +declare void @__quantum__rt__array_update_alias_count(%Array*, i32) + +declare %String* @__quantum__rt__string_create(i8*) + +declare void @__quantum__rt__message(%String*) + +declare void @__quantum__rt__string_update_reference_count(%String*, i32) + +declare %String* @__quantum__rt__int_to_string(i64) + +declare %String* @__quantum__rt__string_concatenate(%String*, %String*) + +define %String* @Quantum__StandaloneSupportedInputs___58b06fb8838645aba850713a715678d6_ArrayToString__body(%Array* %array) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %first = alloca i1, align 1 + store i1 true, i1* %first, align 1 + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @23, i32 0, i32 0)) + %itemsString = alloca %String*, align 8 + store %String* %0, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] + %4 = icmp sle i64 %3, %2 + br i1 %4, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) + %6 = bitcast i8* %5 to i64* + %item = load i64, i64* %6, align 4 + %7 = load i1, i1* %first, align 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %body__1 + store i1 false, i1* %first, align 1 + %8 = load %String*, %String** %itemsString, align 8 + %9 = call %String* @__quantum__rt__int_to_string(i64 %item) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) + store %String* %10, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + br label %continue__1 + +else__1: ; preds = %body__1 + %11 = load %String*, %String** %itemsString, align 8 + %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @24, i32 0, i32 0)) + %13 = call %String* @__quantum__rt__int_to_string(i64 %item) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) + store %String* %15, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %16 = add i64 %3, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %17 = load %String*, %String** %itemsString, align 8 + %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @25, i32 0, i32 0)) + %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) + store %String* %19, %String** %itemsString, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) + ret %String* %19 +} + +define i64 @Microsoft__Quantum__Arrays___8487a9df7d0d4ac5a6694fb1d077b2b4_Count__body(%Callable* %predicate, %Array* %array) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %totalFound = alloca i64, align 8 + store i64 0, i64* %totalFound, align 4 + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %1 = sub i64 %0, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %2, %1 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) + %5 = bitcast i8* %4 to i64* + %element = load i64, i64* %5, align 4 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { i64 }* + %8 = getelementptr inbounds { i64 }, { i64 }* %7, i32 0, i32 0 + store i64 %element, i64* %8, align 4 + %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) + %10 = bitcast %Tuple* %9 to { i1 }* + %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 + %12 = load i1, i1* %11, align 1 + br i1 %12, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %13 = load i64, i64* %totalFound, align 4 + %14 = add i64 %13, 1 + store i64 %14, i64* %totalFound, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %2, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i64, i64* %totalFound, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + ret i64 %16 +} + +define void @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i64 }* + %1 = getelementptr inbounds { i64 }, { i64 }* %0, i32 0, i32 0 + %2 = load i64, i64* %1, align 4 + %3 = call i1 @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body(i64 %2) + %4 = bitcast %Tuple* %result-tuple to { i1 }* + %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 + store i1 %3, i1* %5, align 1 + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) + +declare %String* @__quantum__rt__double_to_string(double) + +define %String* @Quantum__StandaloneSupportedInputs___651cdf0b91af440a8c52eefc05d57b06_ArrayToString__body(%Array* %array) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %first = alloca i1, align 1 + store i1 true, i1* %first, align 1 + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @26, i32 0, i32 0)) + %itemsString = alloca %String*, align 8 + store %String* %0, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] + %4 = icmp sle i64 %3, %2 + br i1 %4, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) + %6 = bitcast i8* %5 to double* + %item = load double, double* %6, align 8 + %7 = load i1, i1* %first, align 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %body__1 + store i1 false, i1* %first, align 1 + %8 = load %String*, %String** %itemsString, align 8 + %9 = call %String* @__quantum__rt__double_to_string(double %item) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) + store %String* %10, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + br label %continue__1 + +else__1: ; preds = %body__1 + %11 = load %String*, %String** %itemsString, align 8 + %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @27, i32 0, i32 0)) + %13 = call %String* @__quantum__rt__double_to_string(double %item) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) + store %String* %15, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %16 = add i64 %3, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %17 = load %String*, %String** %itemsString, align 8 + %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @28, i32 0, i32 0)) + %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) + store %String* %19, %String** %itemsString, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) + ret %String* %19 +} + +define i64 @Microsoft__Quantum__Arrays___1575e931e75b478d9338ff1c1ba98161_Count__body(%Callable* %predicate, %Array* %array) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %totalFound = alloca i64, align 8 + store i64 0, i64* %totalFound, align 4 + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %1 = sub i64 %0, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %2, %1 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) + %5 = bitcast i8* %4 to double* + %element = load double, double* %5, align 8 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { double }* + %8 = getelementptr inbounds { double }, { double }* %7, i32 0, i32 0 + store double %element, double* %8, align 8 + %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) + %10 = bitcast %Tuple* %9 to { i1 }* + %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 + %12 = load i1, i1* %11, align 1 + br i1 %12, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %13 = load i64, i64* %totalFound, align 4 + %14 = add i64 %13, 1 + store i64 %14, i64* %totalFound, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %2, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i64, i64* %totalFound, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + ret i64 %16 +} + +define void @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { double }* + %1 = getelementptr inbounds { double }, { double }* %0, i32 0, i32 0 + %2 = load double, double* %1, align 8 + %3 = call i1 @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body(double %2) + %4 = bitcast %Tuple* %result-tuple to { i1 }* + %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 + store i1 %3, i1* %5, align 1 + ret void +} + +declare %String* @__quantum__rt__bool_to_string(i1) + +define %String* @Quantum__StandaloneSupportedInputs___f5a60aadd6b1405d8efce41485ff4d80_ArrayToString__body(%Array* %array) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %first = alloca i1, align 1 + store i1 true, i1* %first, align 1 + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @29, i32 0, i32 0)) + %itemsString = alloca %String*, align 8 + store %String* %0, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] + %4 = icmp sle i64 %3, %2 + br i1 %4, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) + %6 = bitcast i8* %5 to i1* + %item = load i1, i1* %6, align 1 + %7 = load i1, i1* %first, align 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %body__1 + store i1 false, i1* %first, align 1 + %8 = load %String*, %String** %itemsString, align 8 + %9 = call %String* @__quantum__rt__bool_to_string(i1 %item) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) + store %String* %10, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + br label %continue__1 + +else__1: ; preds = %body__1 + %11 = load %String*, %String** %itemsString, align 8 + %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @30, i32 0, i32 0)) + %13 = call %String* @__quantum__rt__bool_to_string(i1 %item) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) + store %String* %15, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %16 = add i64 %3, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %17 = load %String*, %String** %itemsString, align 8 + %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @31, i32 0, i32 0)) + %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) + store %String* %19, %String** %itemsString, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) + ret %String* %19 +} + +define i64 @Microsoft__Quantum__Arrays___67c459c137a0446995c133a29250678d_Count__body(%Callable* %predicate, %Array* %array) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %totalFound = alloca i64, align 8 + store i64 0, i64* %totalFound, align 4 + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %1 = sub i64 %0, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %2, %1 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) + %5 = bitcast i8* %4 to i1* + %element = load i1, i1* %5, align 1 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { i1 }* + %8 = getelementptr inbounds { i1 }, { i1 }* %7, i32 0, i32 0 + store i1 %element, i1* %8, align 1 + %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) + %10 = bitcast %Tuple* %9 to { i1 }* + %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 + %12 = load i1, i1* %11, align 1 + br i1 %12, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %13 = load i64, i64* %totalFound, align 4 + %14 = add i64 %13, 1 + store i64 %14, i64* %totalFound, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %2, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i64, i64* %totalFound, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + ret i64 %16 +} + +define void @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i1 }* + %1 = getelementptr inbounds { i1 }, { i1 }* %0, i32 0, i32 0 + %2 = load i1, i1* %1, align 1 + %3 = call i1 @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body(i1 %2) + %4 = bitcast %Tuple* %result-tuple to { i1 }* + %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 + store i1 %3, i1* %5, align 1 + ret void +} + +declare %String* @__quantum__rt__pauli_to_string(i2) + +define %String* @Quantum__StandaloneSupportedInputs___ec0b3349aeaf419f9d7d96decefd1869_ArrayToString__body(%Array* %array) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %first = alloca i1, align 1 + store i1 true, i1* %first, align 1 + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @32, i32 0, i32 0)) + %itemsString = alloca %String*, align 8 + store %String* %0, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] + %4 = icmp sle i64 %3, %2 + br i1 %4, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) + %6 = bitcast i8* %5 to i2* + %item = load i2, i2* %6, align 1 + %7 = load i1, i1* %first, align 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %body__1 + store i1 false, i1* %first, align 1 + %8 = load %String*, %String** %itemsString, align 8 + %9 = call %String* @__quantum__rt__pauli_to_string(i2 %item) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) + store %String* %10, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + br label %continue__1 + +else__1: ; preds = %body__1 + %11 = load %String*, %String** %itemsString, align 8 + %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @33, i32 0, i32 0)) + %13 = call %String* @__quantum__rt__pauli_to_string(i2 %item) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) + store %String* %15, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %16 = add i64 %3, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %17 = load %String*, %String** %itemsString, align 8 + %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @34, i32 0, i32 0)) + %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) + store %String* %19, %String** %itemsString, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) + ret %String* %19 +} + +define i64 @Microsoft__Quantum__Arrays___c71932228c1b4b6fb8c3c63c9d8e35e4_Count__body(%Callable* %predicate, %Array* %array) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %totalFound = alloca i64, align 8 + store i64 0, i64* %totalFound, align 4 + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %1 = sub i64 %0, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %2, %1 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) + %5 = bitcast i8* %4 to i2* + %element = load i2, i2* %5, align 1 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i2* getelementptr (i2, i2* null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { i2 }* + %8 = getelementptr inbounds { i2 }, { i2 }* %7, i32 0, i32 0 + store i2 %element, i2* %8, align 1 + %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) + %10 = bitcast %Tuple* %9 to { i1 }* + %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 + %12 = load i1, i1* %11, align 1 + br i1 %12, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %13 = load i64, i64* %totalFound, align 4 + %14 = add i64 %13, 1 + store i64 %14, i64* %totalFound, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %2, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i64, i64* %totalFound, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + ret i64 %16 +} + +define void @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i2 }* + %1 = getelementptr inbounds { i2 }, { i2 }* %0, i32 0, i32 0 + %2 = load i2, i2* %1, align 1 + %3 = call i1 @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body(i2 %2) + %4 = bitcast %Tuple* %result-tuple to { i1 }* + %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 + store i1 %3, i1* %5, align 1 + ret void +} + +declare %String* @__quantum__rt__range_to_string(%Range) + +declare %String* @__quantum__rt__result_to_string(%Result*) + +define %String* @Quantum__StandaloneSupportedInputs___c22db911562e4518b3ec04b3a395976a_ArrayToString__body(%Array* %array) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %first = alloca i1, align 1 + store i1 true, i1* %first, align 1 + %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @35, i32 0, i32 0)) + %itemsString = alloca %String*, align 8 + store %String* %0, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] + %4 = icmp sle i64 %3, %2 + br i1 %4, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) + %6 = bitcast i8* %5 to %Result** + %item = load %Result*, %Result** %6, align 8 + %7 = load i1, i1* %first, align 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %body__1 + store i1 false, i1* %first, align 1 + %8 = load %String*, %String** %itemsString, align 8 + %9 = call %String* @__quantum__rt__result_to_string(%Result* %item) + %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) + store %String* %10, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) + br label %continue__1 + +else__1: ; preds = %body__1 + %11 = load %String*, %String** %itemsString, align 8 + %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @36, i32 0, i32 0)) + %13 = call %String* @__quantum__rt__result_to_string(%Result* %item) + %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) + call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) + %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) + store %String* %15, %String** %itemsString, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %16 = add i64 %3, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %17 = load %String*, %String** %itemsString, align 8 + %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @37, i32 0, i32 0)) + %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) + store %String* %19, %String** %itemsString, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) + ret %String* %19 +} + +define i64 @Microsoft__Quantum__Arrays___aa464afb2404486a86d7d9b45b4e8d2c_Count__body(%Callable* %predicate, %Array* %array) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) + %totalFound = alloca i64, align 8 + store i64 0, i64* %totalFound, align 4 + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) + %1 = sub i64 %0, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %2, %1 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) + %5 = bitcast i8* %4 to %Result** + %element = load %Result*, %Result** %5, align 8 + %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %7 = bitcast %Tuple* %6 to { %Result* }* + %8 = getelementptr inbounds { %Result* }, { %Result* }* %7, i32 0, i32 0 + store %Result* %element, %Result** %8, align 8 + %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) + call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) + %10 = bitcast %Tuple* %9 to { i1 }* + %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 + %12 = load i1, i1* %11, align 1 + br i1 %12, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %13 = load i64, i64* %totalFound, align 4 + %14 = add i64 %13, 1 + store i64 %14, i64* %totalFound, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %2, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i64, i64* %totalFound, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) + ret i64 %16 +} + +define void @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Result* }* + %1 = getelementptr inbounds { %Result* }, { %Result* }* %0, i32 0, i32 0 + %2 = load %Result*, %Result** %1, align 8 + %3 = call i1 @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body(%Result* %2) + %4 = bitcast %Tuple* %result-tuple to { i1 }* + %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 + store i1 %3, i1* %5, align 1 + ret void +} + +declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) + +declare i64 @__quantum__rt__array_get_size_1d(%Array*) + +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +define i1 @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body(i64 %input) { +entry: + ret i1 true +} + +define i1 @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body(double %input) { +entry: + ret i1 true +} + +define i1 @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body(i1 %input) { +entry: + ret i1 true +} + +define i1 @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body(i2 %input) { +entry: + ret i1 true +} + +define i1 @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body(%Result* %input) { +entry: + ret i1 true +} + +declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +declare %Tuple* @__quantum__rt__tuple_create(i64) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) + +define void @Quantum__StandaloneSupportedInputs__ExerciseInputs__Interop(i64 %intValue, { i64, i8* }* %intArray, double %doubleValue, { i64, i8* }* %doubleArray, i8 %boolValue, { i64, i8* }* %boolArray, i8 %pauliValue, { i64, i8* }* %pauliArray, { i64, i64, i64 }* %rangeValue, i8 %resultValue, { i64, i8* }* %resultArray, i8* %stringValue) #0 { +entry: + %0 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 0 + %1 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 1 + %2 = load i64, i64* %0, align 4 + %3 = load i8*, i8** %1, align 8 + %4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %2) + %5 = ptrtoint i8* %3 to i64 + %6 = sub i64 %2, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %7 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %8 = icmp sle i64 %7, %6 + br i1 %8, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %9 = mul i64 %7, 8 + %10 = add i64 %5, %9 + %11 = inttoptr i64 %10 to i64* + %12 = load i64, i64* %11, align 4 + %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %4, i64 %7) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + br label %exiting__1 + +exiting__1: ; preds = %body__1 + %15 = add i64 %7, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 0 + %17 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 1 + %18 = load i64, i64* %16, align 4 + %19 = load i8*, i8** %17, align 8 + %20 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %18) + %21 = ptrtoint i8* %19 to i64 + %22 = sub i64 %18, 1 + br label %header__2 + +header__2: ; preds = %exiting__2, %exit__1 + %23 = phi i64 [ 0, %exit__1 ], [ %31, %exiting__2 ] + %24 = icmp sle i64 %23, %22 + br i1 %24, label %body__2, label %exit__2 + +body__2: ; preds = %header__2 + %25 = mul i64 %23, 8 + %26 = add i64 %21, %25 + %27 = inttoptr i64 %26 to double* + %28 = load double, double* %27, align 8 + %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %20, i64 %23) + %30 = bitcast i8* %29 to double* + store double %28, double* %30, align 8 + br label %exiting__2 + +exiting__2: ; preds = %body__2 + %31 = add i64 %23, 1 + br label %header__2 + +exit__2: ; preds = %header__2 + %32 = trunc i8 %boolValue to i1 + %33 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 0 + %34 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 1 + %35 = load i64, i64* %33, align 4 + %36 = load i8*, i8** %34, align 8 + %37 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %35) + %38 = ptrtoint i8* %36 to i64 + %39 = sub i64 %35, 1 + br label %header__3 + +header__3: ; preds = %exiting__3, %exit__2 + %40 = phi i64 [ 0, %exit__2 ], [ %49, %exiting__3 ] + %41 = icmp sle i64 %40, %39 + br i1 %41, label %body__3, label %exit__3 + +body__3: ; preds = %header__3 + %42 = mul i64 %40, 1 + %43 = add i64 %38, %42 + %44 = inttoptr i64 %43 to i8* + %45 = load i8, i8* %44, align 1 + %46 = trunc i8 %45 to i1 + %47 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %37, i64 %40) + %48 = bitcast i8* %47 to i1* + store i1 %46, i1* %48, align 1 + br label %exiting__3 + +exiting__3: ; preds = %body__3 + %49 = add i64 %40, 1 + br label %header__3 + +exit__3: ; preds = %header__3 + %50 = trunc i8 %pauliValue to i2 + %51 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 0 + %52 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 1 + %53 = load i64, i64* %51, align 4 + %54 = load i8*, i8** %52, align 8 + %55 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %53) + %56 = ptrtoint i8* %54 to i64 + %57 = sub i64 %53, 1 + br label %header__4 + +header__4: ; preds = %exiting__4, %exit__3 + %58 = phi i64 [ 0, %exit__3 ], [ %67, %exiting__4 ] + %59 = icmp sle i64 %58, %57 + br i1 %59, label %body__4, label %exit__4 + +body__4: ; preds = %header__4 + %60 = mul i64 %58, 1 + %61 = add i64 %56, %60 + %62 = inttoptr i64 %61 to i8* + %63 = load i8, i8* %62, align 1 + %64 = trunc i8 %63 to i2 + %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %55, i64 %58) + %66 = bitcast i8* %65 to i2* + store i2 %64, i2* %66, align 1 + br label %exiting__4 + +exiting__4: ; preds = %body__4 + %67 = add i64 %58, 1 + br label %header__4 + +exit__4: ; preds = %header__4 + %68 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 0 + %69 = load i64, i64* %68, align 4 + %70 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 1 + %71 = load i64, i64* %70, align 4 + %72 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 2 + %73 = load i64, i64* %72, align 4 + %74 = load %Range, %Range* @EmptyRange, align 4 + %75 = insertvalue %Range %74, i64 %69, 0 + %76 = insertvalue %Range %75, i64 %71, 1 + %77 = insertvalue %Range %76, i64 %73, 2 + %78 = icmp eq i8 %resultValue, 0 + %79 = call %Result* @__quantum__rt__result_get_zero() + %80 = call %Result* @__quantum__rt__result_get_one() + %81 = select i1 %78, %Result* %79, %Result* %80 + %82 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 0 + %83 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 1 + %84 = load i64, i64* %82, align 4 + %85 = load i8*, i8** %83, align 8 + %86 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %84) + %87 = ptrtoint i8* %85 to i64 + %88 = sub i64 %84, 1 + br label %header__5 + +header__5: ; preds = %exiting__5, %exit__4 + %89 = phi i64 [ 0, %exit__4 ], [ %101, %exiting__5 ] + %90 = icmp sle i64 %89, %88 + br i1 %90, label %body__5, label %exit__5 + +body__5: ; preds = %header__5 + %91 = mul i64 %89, 1 + %92 = add i64 %87, %91 + %93 = inttoptr i64 %92 to i8* + %94 = load i8, i8* %93, align 1 + %95 = icmp eq i8 %94, 0 + %96 = call %Result* @__quantum__rt__result_get_zero() + %97 = call %Result* @__quantum__rt__result_get_one() + %98 = select i1 %95, %Result* %96, %Result* %97 + %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %89) + %100 = bitcast i8* %99 to %Result** + store %Result* %98, %Result** %100, align 8 + br label %exiting__5 + +exiting__5: ; preds = %body__5 + %101 = add i64 %89, 1 + br label %header__5 + +exit__5: ; preds = %header__5 + %102 = call %String* @__quantum__rt__string_create(i8* %stringValue) + call void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %4, double %doubleValue, %Array* %20, i1 %32, %Array* %37, i2 %50, %Array* %55, %Range %77, %Result* %81, %Array* %86, %String* %102) + call void @__quantum__rt__array_update_reference_count(%Array* %4, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %20, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %37, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %55, i32 -1) + %103 = sub i64 %84, 1 + br label %header__6 + +header__6: ; preds = %exiting__6, %exit__5 + %104 = phi i64 [ 0, %exit__5 ], [ %109, %exiting__6 ] + %105 = icmp sle i64 %104, %103 + br i1 %105, label %body__6, label %exit__6 + +body__6: ; preds = %header__6 + %106 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %104) + %107 = bitcast i8* %106 to %Result** + %108 = load %Result*, %Result** %107, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %108, i32 -1) + br label %exiting__6 + +exiting__6: ; preds = %body__6 + %109 = add i64 %104, 1 + br label %header__6 + +exit__6: ; preds = %header__6 + call void @__quantum__rt__array_update_reference_count(%Array* %86, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %102, i32 -1) + ret void +} + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare %Result* @__quantum__rt__result_get_zero() + +declare %Result* @__quantum__rt__result_get_one() + +declare void @__quantum__rt__array_update_reference_count(%Array*, i32) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i32) + +define void @Quantum__StandaloneSupportedInputs__ExerciseInputs(i64 %intValue, { i64, i8* }* %intArray, double %doubleValue, { i64, i8* }* %doubleArray, i8 %boolValue, { i64, i8* }* %boolArray, i8 %pauliValue, { i64, i8* }* %pauliArray, { i64, i64, i64 }* %rangeValue, i8 %resultValue, { i64, i8* }* %resultArray, i8* %stringValue) #1 { +entry: + %0 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 0 + %1 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 1 + %2 = load i64, i64* %0, align 4 + %3 = load i8*, i8** %1, align 8 + %4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %2) + %5 = ptrtoint i8* %3 to i64 + %6 = sub i64 %2, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %7 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %8 = icmp sle i64 %7, %6 + br i1 %8, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %9 = mul i64 %7, 8 + %10 = add i64 %5, %9 + %11 = inttoptr i64 %10 to i64* + %12 = load i64, i64* %11, align 4 + %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %4, i64 %7) + %14 = bitcast i8* %13 to i64* + store i64 %12, i64* %14, align 4 + br label %exiting__1 + +exiting__1: ; preds = %body__1 + %15 = add i64 %7, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 0 + %17 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 1 + %18 = load i64, i64* %16, align 4 + %19 = load i8*, i8** %17, align 8 + %20 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %18) + %21 = ptrtoint i8* %19 to i64 + %22 = sub i64 %18, 1 + br label %header__2 + +header__2: ; preds = %exiting__2, %exit__1 + %23 = phi i64 [ 0, %exit__1 ], [ %31, %exiting__2 ] + %24 = icmp sle i64 %23, %22 + br i1 %24, label %body__2, label %exit__2 + +body__2: ; preds = %header__2 + %25 = mul i64 %23, 8 + %26 = add i64 %21, %25 + %27 = inttoptr i64 %26 to double* + %28 = load double, double* %27, align 8 + %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %20, i64 %23) + %30 = bitcast i8* %29 to double* + store double %28, double* %30, align 8 + br label %exiting__2 + +exiting__2: ; preds = %body__2 + %31 = add i64 %23, 1 + br label %header__2 + +exit__2: ; preds = %header__2 + %32 = trunc i8 %boolValue to i1 + %33 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 0 + %34 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 1 + %35 = load i64, i64* %33, align 4 + %36 = load i8*, i8** %34, align 8 + %37 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %35) + %38 = ptrtoint i8* %36 to i64 + %39 = sub i64 %35, 1 + br label %header__3 + +header__3: ; preds = %exiting__3, %exit__2 + %40 = phi i64 [ 0, %exit__2 ], [ %49, %exiting__3 ] + %41 = icmp sle i64 %40, %39 + br i1 %41, label %body__3, label %exit__3 + +body__3: ; preds = %header__3 + %42 = mul i64 %40, 1 + %43 = add i64 %38, %42 + %44 = inttoptr i64 %43 to i8* + %45 = load i8, i8* %44, align 1 + %46 = trunc i8 %45 to i1 + %47 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %37, i64 %40) + %48 = bitcast i8* %47 to i1* + store i1 %46, i1* %48, align 1 + br label %exiting__3 + +exiting__3: ; preds = %body__3 + %49 = add i64 %40, 1 + br label %header__3 + +exit__3: ; preds = %header__3 + %50 = trunc i8 %pauliValue to i2 + %51 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 0 + %52 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 1 + %53 = load i64, i64* %51, align 4 + %54 = load i8*, i8** %52, align 8 + %55 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %53) + %56 = ptrtoint i8* %54 to i64 + %57 = sub i64 %53, 1 + br label %header__4 + +header__4: ; preds = %exiting__4, %exit__3 + %58 = phi i64 [ 0, %exit__3 ], [ %67, %exiting__4 ] + %59 = icmp sle i64 %58, %57 + br i1 %59, label %body__4, label %exit__4 + +body__4: ; preds = %header__4 + %60 = mul i64 %58, 1 + %61 = add i64 %56, %60 + %62 = inttoptr i64 %61 to i8* + %63 = load i8, i8* %62, align 1 + %64 = trunc i8 %63 to i2 + %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %55, i64 %58) + %66 = bitcast i8* %65 to i2* + store i2 %64, i2* %66, align 1 + br label %exiting__4 + +exiting__4: ; preds = %body__4 + %67 = add i64 %58, 1 + br label %header__4 + +exit__4: ; preds = %header__4 + %68 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 0 + %69 = load i64, i64* %68, align 4 + %70 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 1 + %71 = load i64, i64* %70, align 4 + %72 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 2 + %73 = load i64, i64* %72, align 4 + %74 = load %Range, %Range* @EmptyRange, align 4 + %75 = insertvalue %Range %74, i64 %69, 0 + %76 = insertvalue %Range %75, i64 %71, 1 + %77 = insertvalue %Range %76, i64 %73, 2 + %78 = icmp eq i8 %resultValue, 0 + %79 = call %Result* @__quantum__rt__result_get_zero() + %80 = call %Result* @__quantum__rt__result_get_one() + %81 = select i1 %78, %Result* %79, %Result* %80 + %82 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 0 + %83 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 1 + %84 = load i64, i64* %82, align 4 + %85 = load i8*, i8** %83, align 8 + %86 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %84) + %87 = ptrtoint i8* %85 to i64 + %88 = sub i64 %84, 1 + br label %header__5 + +header__5: ; preds = %exiting__5, %exit__4 + %89 = phi i64 [ 0, %exit__4 ], [ %101, %exiting__5 ] + %90 = icmp sle i64 %89, %88 + br i1 %90, label %body__5, label %exit__5 + +body__5: ; preds = %header__5 + %91 = mul i64 %89, 1 + %92 = add i64 %87, %91 + %93 = inttoptr i64 %92 to i8* + %94 = load i8, i8* %93, align 1 + %95 = icmp eq i8 %94, 0 + %96 = call %Result* @__quantum__rt__result_get_zero() + %97 = call %Result* @__quantum__rt__result_get_one() + %98 = select i1 %95, %Result* %96, %Result* %97 + %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %89) + %100 = bitcast i8* %99 to %Result** + store %Result* %98, %Result** %100, align 8 + br label %exiting__5 + +exiting__5: ; preds = %body__5 + %101 = add i64 %89, 1 + br label %header__5 + +exit__5: ; preds = %header__5 + %102 = call %String* @__quantum__rt__string_create(i8* %stringValue) + call void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %4, double %doubleValue, %Array* %20, i1 %32, %Array* %37, i2 %50, %Array* %55, %Range %77, %Result* %81, %Array* %86, %String* %102) + %103 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @38, i32 0, i32 0)) + call void @__quantum__rt__message(%String* %103) + call void @__quantum__rt__array_update_reference_count(%Array* %4, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %20, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %37, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %55, i32 -1) + %104 = sub i64 %84, 1 + br label %header__6 + +header__6: ; preds = %exiting__6, %exit__5 + %105 = phi i64 [ 0, %exit__5 ], [ %110, %exiting__6 ] + %106 = icmp sle i64 %105, %104 + br i1 %106, label %body__6, label %exit__6 + +body__6: ; preds = %header__6 + %107 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %105) + %108 = bitcast i8* %107 to %Result** + %109 = load %Result*, %Result** %108, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 -1) + br label %exiting__6 + +exiting__6: ; preds = %body__6 + %110 = add i64 %105, 1 + br label %header__6 + +exit__6: ; preds = %header__6 + call void @__quantum__rt__array_update_reference_count(%Array* %86, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %102, i32 -1) + call void @__quantum__rt__string_update_reference_count(%String* %103, i32 -1) + ret void +} + +attributes #0 = { "InteropFriendly" } +attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll b/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll new file mode 100644 index 00000000000..a86f7f54e43 --- /dev/null +++ b/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll @@ -0,0 +1,1387 @@ + +%Range = type { i64, i64, i64 } +%Tuple = type opaque +%Callable = type opaque +%Array = type opaque +%Qubit = type opaque +%Result = type opaque +%String = type opaque + +@PauliI = constant i2 0 +@PauliX = constant i2 1 +@PauliY = constant i2 -1 +@PauliZ = constant i2 -2 +@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } +@Microsoft__Quantum__Intrinsic__X = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__Y = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__Z = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__H = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__S = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__T = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__ctladj__wrapper] +@Microsoft__Quantum__Intrinsic__R = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__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*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__1__RefCount, void (%Tuple*, i32)* @MemoryManagement__1__AliasCount] + +@Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__Interop = alias i64 (), i64 ()* @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body + +define i64 @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body() #0 { +entry: + %res = alloca i64, align 8 + store i64 0, i64* %res, align 4 + %0 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__X, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %1 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %0) + store i64 %1, i64* %res, align 4 + %2 = icmp ne i64 %1, 0 + br i1 %2, label %then0__1, label %continue__1 + +then0__1: ; preds = %entry + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + ret i64 %1 + +continue__1: ; preds = %entry + %3 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Y, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %4 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %3) + store i64 %4, i64* %res, align 4 + %5 = icmp ne i64 %4, 0 + br i1 %5, label %then0__2, label %continue__2 + +then0__2: ; preds = %continue__1 + %6 = add i64 10, %4 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + ret i64 %6 + +continue__2: ; preds = %continue__1 + %7 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Z, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %8 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %7) + store i64 %8, i64* %res, align 4 + %9 = icmp ne i64 %8, 0 + br i1 %9, label %then0__3, label %continue__3 + +then0__3: ; preds = %continue__2 + %10 = add i64 20, %8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + ret i64 %10 + +continue__3: ; preds = %continue__2 + %11 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__H, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %12 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %11) + store i64 %12, i64* %res, align 4 + %13 = icmp ne i64 %12, 0 + br i1 %13, label %then0__4, label %continue__4 + +then0__4: ; preds = %continue__3 + %14 = add i64 30, %12 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + ret i64 %14 + +continue__4: ; preds = %continue__3 + %15 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__S, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %16 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %15) + store i64 %16, i64* %res, align 4 + %17 = icmp ne i64 %16, 0 + br i1 %17, label %then0__5, label %continue__5 + +then0__5: ; preds = %continue__4 + %18 = add i64 40, %16 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + ret i64 %18 + +continue__5: ; preds = %continue__4 + %19 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__T, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %20 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %19) + store i64 %20, i64* %res, align 4 + %21 = icmp ne i64 %20, 0 + br i1 %21, label %then0__6, label %continue__6 + +then0__6: ; preds = %continue__5 + %22 = add i64 50, %20 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) + ret i64 %22 + +continue__6: ; preds = %continue__5 + %23 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i2, double }* getelementptr ({ %Callable*, i2, double }, { %Callable*, i2, double }* null, i32 1) to i64)) + %24 = bitcast %Tuple* %23 to { %Callable*, i2, double }* + %25 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 0 + %26 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 1 + %27 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 2 + %28 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__R, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %29 = load i2, i2* @PauliX, align 1 + store %Callable* %28, %Callable** %25, align 8 + store i2 %29, i2* %26, align 1 + store double 4.200000e-01, double* %27, align 8 + %30 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %23) + %31 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %30) + store i64 %31, i64* %res, align 4 + %32 = icmp ne i64 %31, 0 + br i1 %32, label %then0__7, label %continue__7 + +then0__7: ; preds = %continue__6 + %33 = add i64 60, %31 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) + ret i64 %33 + +continue__7: ; preds = %continue__6 + %targets = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) + %ctls = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %paulis = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) + %34 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %35 = bitcast i8* %34 to i2* + %36 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %37 = bitcast i8* %36 to i2* + %38 = load i2, i2* @PauliX, align 1 + %39 = load i2, i2* @PauliY, align 1 + store i2 %38, i2* %35, align 1 + store i2 %39, i2* %37, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) + call void @__quantum__qis__exp__body(%Array* %paulis, double 4.200000e-01, %Array* %targets) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %paulis, i32 -1) + %paulis__1 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) + %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__1, i64 0) + %41 = bitcast i8* %40 to i2* + %42 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__1, i64 1) + %43 = bitcast i8* %42 to i2* + %44 = load i2, i2* @PauliX, align 1 + %45 = load i2, i2* @PauliY, align 1 + store i2 %44, i2* %41, align 1 + store i2 %45, i2* %43, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__1, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) + call void @__quantum__qis__exp__adj(%Array* %paulis__1, double 4.200000e-01, %Array* %targets) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__1, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %paulis__1, i32 -1) + %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %targets, i64 0) + %47 = bitcast i8* %46 to %Qubit** + %48 = load %Qubit*, %Qubit** %47, align 8 + %49 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %48) + %50 = call %Result* @__quantum__rt__result_get_zero() + %51 = call i1 @__quantum__rt__result_equal(%Result* %49, %Result* %50) + %52 = xor i1 %51, true + br i1 %52, label %then0__8, label %continue__8 + +then0__8: ; preds = %continue__7 + store i64 1, i64* %res, align 4 + br label %continue__8 + +continue__8: ; preds = %then0__8, %continue__7 + %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %54 = bitcast i8* %53 to %Qubit** + %qubit = load %Qubit*, %Qubit** %54, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit) + %55 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) + %56 = bitcast i8* %55 to %Qubit** + %qubit__1 = load %Qubit*, %Qubit** %56, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %paulis__2 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) + %57 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__2, i64 0) + %58 = bitcast i8* %57 to i2* + %59 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__2, i64 1) + %60 = bitcast i8* %59 to i2* + %61 = load i2, i2* @PauliX, align 1 + %62 = load i2, i2* @PauliY, align 1 + store i2 %61, i2* %58, align 1 + store i2 %62, i2* %60, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__2, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) + %63 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) + %64 = bitcast %Tuple* %63 to { %Array*, double, %Array* }* + %65 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 0 + %66 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 1 + %67 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 2 + store %Array* %paulis__2, %Array** %65, align 8 + store double 4.200000e-01, double* %66, align 8 + store %Array* %targets, %Array** %67, align 8 + call void @__quantum__qis__exp__ctl(%Array* %ctls, { %Array*, double, %Array* }* %64) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__2, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %paulis__2, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %63, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %paulis__3 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) + %68 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__3, i64 0) + %69 = bitcast i8* %68 to i2* + %70 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__3, i64 1) + %71 = bitcast i8* %70 to i2* + %72 = load i2, i2* @PauliX, align 1 + %73 = load i2, i2* @PauliY, align 1 + store i2 %72, i2* %69, align 1 + store i2 %73, i2* %71, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__3, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) + %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) + %75 = bitcast %Tuple* %74 to { %Array*, double, %Array* }* + %76 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 0 + %77 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 1 + %78 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 2 + store %Array* %paulis__3, %Array** %76, align 8 + store double 4.200000e-01, double* %77, align 8 + store %Array* %targets, %Array** %78, align 8 + call void @__quantum__qis__exp__ctladj(%Array* %ctls, { %Array*, double, %Array* }* %75) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis__3, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %paulis__3, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i32 -1) + %79 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %80 = bitcast i8* %79 to %Qubit** + %qubit__2 = load %Qubit*, %Qubit** %80, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__2) + %81 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) + %82 = bitcast i8* %81 to %Qubit** + %qubit__3 = load %Qubit*, %Qubit** %82, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__3) + %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %targets, i64 0) + %84 = bitcast i8* %83 to %Qubit** + %85 = load %Qubit*, %Qubit** %84, align 8 + %86 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %85) + %87 = call %Result* @__quantum__rt__result_get_zero() + %88 = call i1 @__quantum__rt__result_equal(%Result* %86, %Result* %87) + %89 = xor i1 %88, true + br i1 %89, label %then0__9, label %continue__9 + +then0__9: ; preds = %continue__8 + store i64 2, i64* %res, align 4 + br label %continue__9 + +continue__9: ; preds = %then0__9, %continue__8 + call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %49, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %86, i32 -1) + call void @__quantum__rt__qubit_release_array(%Array* %targets) + call void @__quantum__rt__qubit_release_array(%Array* %ctls) + %90 = load i64, i64* %res, align 4 + %91 = icmp ne i64 %90, 0 + br i1 %91, label %then0__10, label %continue__10 + +then0__10: ; preds = %continue__9 + %92 = add i64 70, %90 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) + ret i64 %92 + +continue__10: ; preds = %continue__9 + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 3) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) + %93 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %94 = bitcast i8* %93 to %Qubit** + %qubit__4 = load %Qubit*, %Qubit** %94, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__4) + %95 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %96 = bitcast i8* %95 to %Qubit** + %qubit__5 = load %Qubit*, %Qubit** %96, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__5) + %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 3) + %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) + %98 = bitcast i8* %97 to i2* + %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 1) + %100 = bitcast i8* %99 to i2* + %101 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 2) + %102 = bitcast i8* %101 to i2* + %103 = load i2, i2* @PauliX, align 1 + %104 = load i2, i2* @PauliZ, align 1 + %105 = load i2, i2* @PauliX, align 1 + store i2 %103, i2* %98, align 1 + store i2 %104, i2* %100, align 1 + store i2 %105, i2* %102, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) + %106 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qs) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) + %107 = call %Result* @__quantum__rt__result_get_zero() + %108 = call i1 @__quantum__rt__result_equal(%Result* %106, %Result* %107) + %109 = xor i1 %108, true + br i1 %109, label %then0__11, label %continue__11 + +then0__11: ; preds = %continue__10 + store i64 80, i64* %res, align 4 + br label %continue__11 + +continue__11: ; preds = %then0__11, %continue__10 + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %106, i32 -1) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + %110 = load i64, i64* %res, align 4 + call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) + ret i64 %110 +} + +define i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %op) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 1) + %res = alloca i64, align 8 + store i64 0, i64* %res, align 4 + %target = call %Qubit* @__quantum__rt__qubit_allocate() + %ctls = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Qubit* }* + %2 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %1, i32 0, i32 0 + store %Qubit* %target, %Qubit** %2, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %op, %Tuple* %0, %Tuple* null) + %3 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %3) + %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %5 = bitcast %Tuple* %4 to { %Qubit* }* + %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 + store %Qubit* %target, %Qubit** %6, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %3, %Tuple* %4, %Tuple* null) + %7 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %target) + %8 = call %Result* @__quantum__rt__result_get_zero() + %9 = call i1 @__quantum__rt__result_equal(%Result* %7, %Result* %8) + %10 = xor i1 %9, true + br i1 %10, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + store i64 1, i64* %res, align 4 + br label %continue__1 + +else__1: ; preds = %entry + %11 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %12 = bitcast i8* %11 to %Qubit** + %qubit = load %Qubit*, %Qubit** %12, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit) + %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) + %14 = bitcast i8* %13 to %Qubit** + %qubit__1 = load %Qubit*, %Qubit** %14, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__1) + %15 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %15) + %16 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %17 = bitcast %Tuple* %16 to { %Array*, %Qubit* }* + %18 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %17, i32 0, i32 0 + %19 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %17, i32 0, i32 1 + store %Array* %ctls, %Array** %18, align 8 + store %Qubit* %target, %Qubit** %19, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %15, %Tuple* %16, %Tuple* null) + %20 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %20, i32 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %20) + call void @__quantum__rt__callable_make_adjoint(%Callable* %20) + %21 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %22 = bitcast %Tuple* %21 to { %Array*, %Qubit* }* + %23 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %22, i32 0, i32 0 + %24 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %22, i32 0, i32 1 + store %Array* %ctls, %Array** %23, align 8 + store %Qubit* %target, %Qubit** %24, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %20, %Tuple* %21, %Tuple* null) + %25 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %target) + %26 = call %Result* @__quantum__rt__result_get_zero() + %27 = call i1 @__quantum__rt__result_equal(%Result* %25, %Result* %26) + %28 = xor i1 %27, true + br i1 %28, label %then0__2, label %else__2 + +then0__2: ; preds = %else__1 + store i64 2, i64* %res, align 4 + br label %continue__2 + +else__2: ; preds = %else__1 + %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %30 = bitcast i8* %29 to %Qubit** + %qubit__2 = load %Qubit*, %Qubit** %30, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__2) + %31 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) + %32 = bitcast i8* %31 to %Qubit** + %qubit__3 = load %Qubit*, %Qubit** %32, align 8 + call void @__quantum__qis__h__body(%Qubit* %qubit__3) + br label %continue__2 + +continue__2: ; preds = %else__2, %then0__2 + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %16, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %20, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %20, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %21, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %25, i32 -1) + br label %continue__1 + +continue__1: ; preds = %continue__2, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %0, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %7, i32 -1) + call void @__quantum__rt__qubit_release(%Qubit* %target) + call void @__quantum__rt__qubit_release_array(%Array* %ctls) + %33 = load i64, i64* %res, align 4 + call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 -1) + ret i64 %33 +} + +define void @Microsoft__Quantum__Intrinsic__X__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) + +declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) + +define void @Microsoft__Quantum__Intrinsic__Y__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +declare %Tuple* @__quantum__rt__tuple_create(i64) + +define void @Microsoft__Quantum__Intrinsic__R__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i2, double, %Qubit* }* + %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 + %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 + %4 = load i2, i2* %1, align 1 + %5 = load double, double* %2, align 8 + %6 = load %Qubit*, %Qubit** %3, align 8 + call void @Microsoft__Quantum__Intrinsic__R__body(i2 %4, double %5, %Qubit* %6) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__R__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { i2, double, %Qubit* }* + %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 + %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 + %4 = load i2, i2* %1, align 1 + %5 = load double, double* %2, align 8 + %6 = load %Qubit*, %Qubit** %3, align 8 + call void @Microsoft__Quantum__Intrinsic__R__adj(i2 %4, double %5, %Qubit* %6) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__R__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { i2, double, %Qubit* }* }* + %1 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load { i2, double, %Qubit* }*, { i2, double, %Qubit* }** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__R__ctl(%Array* %3, { i2, double, %Qubit* }* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__R__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, { i2, double, %Qubit* }* }* + %1 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load { i2, double, %Qubit* }*, { i2, double, %Qubit* }** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__R__ctladj(%Array* %3, { i2, double, %Qubit* }* %4) + ret void +} + +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 1 + %2 = load i2, i2* %1, align 1 + %3 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 2 + %4 = load double, double* %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 + %7 = load %Qubit*, %Qubit** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { i2, double, %Qubit* }* + %10 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 2 + store i2 %2, i2* %10, align 1 + store double %4, double* %11, align 8 + store %Qubit* %7, %Qubit** %12, align 8 + %13 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + ret void +} + +define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 1 + %2 = load i2, i2* %1, align 1 + %3 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 2 + %4 = load double, double* %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 + %7 = load %Qubit*, %Qubit** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %9 = bitcast %Tuple* %8 to { i2, double, %Qubit* }* + %10 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 2 + store i2 %2, i2* %10, align 1 + store double %4, double* %11, align 8 + store %Qubit* %7, %Qubit** %12, align 8 + %13 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + %15 = call %Callable* @__quantum__rt__callable_copy(%Callable* %14, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %15) + call void @__quantum__rt__callable_invoke(%Callable* %15, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -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 inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %6 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 1 + %7 = load i2, i2* %6, align 1 + %8 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 2 + %9 = load double, double* %8, align 8 + %10 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %11 = bitcast %Tuple* %10 to { i2, double, %Qubit* }* + %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 0 + %13 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 1 + %14 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 2 + store i2 %7, i2* %12, align 1 + store double %9, double* %13, align 8 + store %Qubit* %4, %Qubit** %14, align 8 + %15 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %16 = bitcast %Tuple* %15 to { %Array*, { i2, double, %Qubit* }* }* + %17 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 0 + %18 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 1 + store %Array* %3, %Array** %17, align 8 + store { i2, double, %Qubit* }* %11, { i2, double, %Qubit* }** %18, align 8 + %19 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 0 + %20 = load %Callable*, %Callable** %19, align 8 + %21 = call %Callable* @__quantum__rt__callable_copy(%Callable* %20, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 1) + call void @__quantum__rt__callable_make_controlled(%Callable* %21) + call void @__quantum__rt__callable_invoke(%Callable* %21, %Tuple* %15, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %10, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %21, i32 -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 inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %6 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 1 + %7 = load i2, i2* %6, align 1 + %8 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 2 + %9 = load double, double* %8, align 8 + %10 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %11 = bitcast %Tuple* %10 to { i2, double, %Qubit* }* + %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 0 + %13 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 1 + %14 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 2 + store i2 %7, i2* %12, align 1 + store double %9, double* %13, align 8 + store %Qubit* %4, %Qubit** %14, align 8 + %15 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %16 = bitcast %Tuple* %15 to { %Array*, { i2, double, %Qubit* }* }* + %17 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 0 + %18 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 1 + store %Array* %3, %Array** %17, align 8 + store { i2, double, %Qubit* }* %11, { i2, double, %Qubit* }** %18, align 8 + %19 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 0 + %20 = load %Callable*, %Callable** %19, align 8 + %21 = call %Callable* @__quantum__rt__callable_copy(%Callable* %20, i1 false) + call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 1) + call void @__quantum__rt__callable_make_adjoint(%Callable* %21) + call void @__quantum__rt__callable_make_controlled(%Callable* %21) + call void @__quantum__rt__callable_invoke(%Callable* %21, %Tuple* %15, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %10, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %15, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %21, i32 -1) + ret void +} + +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* + %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare void @__quantum__rt__array_update_alias_count(%Array*, i32) + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +declare void @__quantum__qis__exp__body(%Array*, double, %Array*) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i32) + +declare void @__quantum__qis__exp__adj(%Array*, double, %Array*) + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qubit) { +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, align 1 + store i2 %2, i2* %1, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 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* %qubit, %Qubit** %4, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i32 -1) + ret %Result* %5 +} + +declare %Result* @__quantum__rt__result_get_zero() + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare void @__quantum__qis__h__body(%Qubit*) + +declare void @__quantum__qis__exp__ctl(%Array*, { %Array*, double, %Array* }*) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) + +declare void @__quantum__qis__exp__ctladj(%Array*, { %Array*, double, %Array* }*) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i32) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +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__qubit_release(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__Exp__body(%Array* %paulis, double %theta, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + call void @__quantum__qis__exp__body(%Array* %paulis, double %theta, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Exp__adj(%Array* %paulis, double %theta, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + call void @__quantum__qis__exp__adj(%Array* %paulis, double %theta, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Exp__ctl(%Array* %__controlQubits__, { %Array*, double, %Array* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %1 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 0 + %paulis = load %Array*, %Array** %1, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + %2 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 1 + %theta = load double, double* %2, align 8 + %3 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 2 + %qubits = load %Array*, %Array** %3, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) + %5 = bitcast %Tuple* %4 to { %Array*, double, %Array* }* + %6 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 0 + %7 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 1 + %8 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 2 + store %Array* %paulis, %Array** %6, align 8 + store double %theta, double* %7, align 8 + store %Array* %qubits, %Array** %8, align 8 + call void @__quantum__qis__exp__ctl(%Array* %__controlQubits__, { %Array*, double, %Array* }* %5) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Exp__ctladj(%Array* %__controlQubits__, { %Array*, double, %Array* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %1 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 0 + %paulis = load %Array*, %Array** %1, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + %2 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 1 + %theta = load double, double* %2, align 8 + %3 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 2 + %qubits = load %Array*, %Array** %3, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) + %5 = bitcast %Tuple* %4 to { %Array*, double, %Array* }* + %6 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 0 + %7 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 1 + %8 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 2 + store %Array* %paulis, %Array** %6, align 8 + store double %theta, double* %7, align 8 + store %Array* %qubits, %Array** %8, align 8 + call void @__quantum__qis__exp__ctladj(%Array* %__controlQubits__, { %Array*, double, %Array* }* %5) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__t__body(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__t__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__t__adj(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__t__adj(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__t__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__t__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__t__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__t__ctladj(%Array*, %Qubit*) + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +define void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__z__body(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__z__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__z__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__z__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__x__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__x__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__h__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__h__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__h__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__s__body(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__s__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__s__adj(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__s__adj(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__s__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__s__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__s__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__s__ctladj(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__R__body(i2 %pauli, double %theta, %Qubit* %qubit) { +entry: + call void @__quantum__qis__r__body(i2 %pauli, double %theta, %Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__r__body(i2, double, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__R__adj(i2 %pauli, double %theta, %Qubit* %qubit) { +entry: + call void @__quantum__qis__r__adj(i2 %pauli, double %theta, %Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__r__adj(i2, double, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__R__ctl(%Array* %__controlQubits__, { i2, double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 + %pauli = load i2, i2* %1, align 1 + %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 + %theta = load double, double* %2, align 8 + %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 + %qubit = load %Qubit*, %Qubit** %3, align 8 + %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %5 = bitcast %Tuple* %4 to { i2, double, %Qubit* }* + %6 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 0 + %7 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 1 + %8 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 2 + store i2 %pauli, i2* %6, align 1 + store double %theta, double* %7, align 8 + store %Qubit* %qubit, %Qubit** %8, align 8 + call void @__quantum__qis__r__ctl(%Array* %__controlQubits__, { i2, double, %Qubit* }* %5) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) + ret void +} + +declare void @__quantum__qis__r__ctl(%Array*, { i2, double, %Qubit* }*) + +define void @Microsoft__Quantum__Intrinsic__R__ctladj(%Array* %__controlQubits__, { i2, double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 + %pauli = load i2, i2* %1, align 1 + %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 + %theta = load double, double* %2, align 8 + %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 + %qubit = load %Qubit*, %Qubit** %3, align 8 + %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) + %5 = bitcast %Tuple* %4 to { i2, double, %Qubit* }* + %6 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 0 + %7 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 1 + %8 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 2 + store i2 %pauli, i2* %6, align 1 + store double %theta, double* %7, align 8 + store %Qubit* %qubit, %Qubit** %8, align 8 + call void @__quantum__qis__r__ctladj(%Array* %__controlQubits__, { i2, double, %Qubit* }* %5) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) + ret void +} + +declare void @__quantum__qis__r__ctladj(%Array*, { i2, double, %Qubit* }*) + +define void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__y__body(%Qubit* %qubit) + ret void +} + +declare void @__quantum__qis__y__body(%Qubit*) + +define void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__y__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__y__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS() #1 { +entry: + %0 = call i64 @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body() + %1 = call %String* @__quantum__rt__int_to_string(i64 %0) + call void @__quantum__rt__message(%String* %1) + call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) + ret void +} + +declare void @__quantum__rt__message(%String*) + +declare %String* @__quantum__rt__int_to_string(i64) + +declare void @__quantum__rt__string_update_reference_count(%String*, i32) + +declare void @__quantum__rt__tuple_update_alias_count(%Tuple*, i32) + +attributes #0 = { "InteropFriendly" } +attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll b/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll new file mode 100644 index 00000000000..227d27613fc --- /dev/null +++ b/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll @@ -0,0 +1,159 @@ + +%Range = type { i64, i64, i64 } +%Qubit = type opaque +%Result = type opaque +%Array = type opaque +%String = type opaque + +@PauliI = constant i2 0 +@PauliX = constant i2 1 +@PauliY = constant i2 -1 +@PauliZ = constant i2 -2 +@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } + +@Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__Interop = alias i64 (), i64 ()* @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body + +define i64 @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body() #0 { +entry: + %randomNumber = alloca i64, align 8 + store i64 0, i64* %randomNumber, align 4 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 1, %entry ], [ %8, %exiting__1 ] + %0 = icmp sle i64 %i, 64 + br i1 %0, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %q = call %Qubit* @__quantum__rt__qubit_allocate() + call void @__quantum__qis__h__body(%Qubit* %q) + %1 = load i64, i64* %randomNumber, align 4 + %2 = shl i64 %1, 1 + store i64 %2, i64* %randomNumber, align 4 + %3 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) + %4 = call %Result* @__quantum__rt__result_get_one() + %5 = call i1 @__quantum__rt__result_equal(%Result* %3, %Result* %4) + br i1 %5, label %then0__1, label %continue__1 + +then0__1: ; preds = %body__1 + %6 = load i64, i64* %randomNumber, align 4 + %7 = add i64 %6, 1 + store i64 %7, i64* %randomNumber, align 4 + br label %continue__1 + +continue__1: ; preds = %then0__1, %body__1 + call void @__quantum__rt__result_update_reference_count(%Result* %3, i32 -1) + call void @__quantum__rt__qubit_release(%Qubit* %q) + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %8 = add i64 %i, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %9 = load i64, i64* %randomNumber, align 4 + ret i64 %9 +} + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare void @__quantum__qis__h__body(%Qubit*) + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qubit) { +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, align 1 + store i2 %2, i2* %1, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 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* %qubit, %Qubit** %4, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i32 -1) + ret %Result* %5 +} + +declare %Result* @__quantum__rt__result_get_one() + +declare i1 @__quantum__rt__result_equal(%Result*, %Result*) + +declare void @__quantum__rt__result_update_reference_count(%Result*, i32) + +declare void @__quantum__rt__qubit_release(%Qubit*) + +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*, i32) + +declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i32) + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qubit) { +entry: + call void @__quantum__qis__h__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qubit) { +entry: + call void @__quantum__qis__h__body(%Qubit* %qubit) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +declare void @__quantum__qis__h__ctl(%Array*, %Qubit*) + +define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator() #1 { +entry: + %0 = call i64 @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body() + %1 = call %String* @__quantum__rt__int_to_string(i64 %0) + call void @__quantum__rt__message(%String* %1) + call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) + ret void +} + +declare void @__quantum__rt__message(%String*) + +declare %String* @__quantum__rt__int_to_string(i64) + +declare void @__quantum__rt__string_update_reference_count(%String*, i32) + +attributes #0 = { "InteropFriendly" } +attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll b/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll new file mode 100644 index 00000000000..31a343b650f --- /dev/null +++ b/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll @@ -0,0 +1,2080 @@ + +%Range = type { i64, i64, i64 } +%Tuple = type opaque +%Result = type opaque +%Qubit = type opaque +%Array = type opaque +%Callable = type opaque +%String = type opaque + +@PauliI = constant i2 0 +@PauliX = constant i2 1 +@PauliY = constant i2 -1 +@PauliZ = constant i2 -2 +@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } +@Microsoft__Quantum__Testing__Tracer__Delay = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__Tracer__Delay__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@Microsoft__Quantum__Intrinsic__X = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper] +@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*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__1__RefCount, void (%Tuple*, i32)* @MemoryManagement__1__AliasCount] +@Microsoft__Quantum__Intrinsic__Y = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper] +@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] +@Microsoft__Quantum__Intrinsic__Z = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper] +@PartialApplication__3 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__3__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@Microsoft__Quantum__Intrinsic__S = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper] +@PartialApplication__4 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__4__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] +@MemoryManagement__2 = constant [2 x void (%Tuple*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__2__RefCount, void (%Tuple*, i32)* @MemoryManagement__2__AliasCount] + +define %Result* @Microsoft__Quantum__Instructions__Mx__body(%Qubit* %qb) { +entry: + %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb) + ret %Result* %0 +} + +declare %Result* @__quantum__qis__single_qubit_measure(i64, i64, %Qubit*) + +define %Result* @Microsoft__Quantum__Instructions__Mxx__body(%Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +declare void @__quantum__rt__array_update_alias_count(%Array*, i32) + +declare %Result* @__quantum__qis__joint_measure(i64, i64, %Array*) + +define %Result* @Microsoft__Quantum__Instructions__Mxz__body(%Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +define %Result* @Microsoft__Quantum__Instructions__Mz__body(%Qubit* %qb) { +entry: + %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb) + ret %Result* %0 +} + +define %Result* @Microsoft__Quantum__Instructions__Mzx__body(%Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +define %Result* @Microsoft__Quantum__Instructions__Mzz__body(%Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %0 +} + +define void @Microsoft__Quantum__Instructions__Sx__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 17, i64 1, %Qubit* %qb) + ret void +} + +declare void @__quantum__qis__single_qubit_op(i64, i64, %Qubit*) + +define void @Microsoft__Quantum__Instructions__Sx__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 17, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Sx__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 18, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +declare void @__quantum__qis__single_qubit_op_ctl(i64, i64, %Array*, %Qubit*) + +define void @Microsoft__Quantum__Instructions__Sx__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 18, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Sz__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Sz__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Sz__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Sz__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tx__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 13, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tx__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 13, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tx__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 14, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tx__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 14, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tz__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tz__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tz__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Instructions__Tz__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__ApplyConditionallyIntrinsic__body(%Array* %measurementResults, %Array* %resultsValues, %Callable* %onEqualOp, %Callable* %onNonEqualOp) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %measurementResults, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %resultsValues, i32 1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onEqualOp, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onEqualOp, i32 1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onNonEqualOp, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onNonEqualOp, i32 1) + call void @__quantum__qis__apply_conditionally(%Array* %measurementResults, %Array* %resultsValues, %Callable* %onEqualOp, %Callable* %onNonEqualOp) + call void @__quantum__rt__array_update_alias_count(%Array* %measurementResults, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %resultsValues, i32 -1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onEqualOp, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onEqualOp, i32 -1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onNonEqualOp, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onNonEqualOp, i32 -1) + ret void +} + +declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) + +declare void @__quantum__qis__apply_conditionally(%Array*, %Array*, %Callable*, %Callable*) + +define void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %measurementResult, %Callable* %onResultZeroOp, %Callable* %onResultOneOp) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultZeroOp, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultZeroOp, i32 1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultOneOp, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultOneOp, i32 1) + %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 0) + %2 = bitcast i8* %1 to %Result** + store %Result* %measurementResult, %Result** %2, align 8 + %3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 0) + %5 = bitcast i8* %4 to %Result** + %6 = call %Result* @__quantum__rt__result_get_zero() + store %Result* %6, %Result** %5, align 8 + call void @__quantum__qis__apply_conditionally(%Array* %0, %Array* %3, %Callable* %onResultZeroOp, %Callable* %onResultOneOp) + call void @__quantum__rt__result_update_reference_count(%Result* %measurementResult, i32 1) + call void @__quantum__rt__result_update_reference_count(%Result* %6, i32 1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultZeroOp, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultZeroOp, i32 -1) + call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultOneOp, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultOneOp, i32 -1) + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %7 = phi i64 [ 0, %entry ], [ %12, %exiting__1 ] + %8 = icmp sle i64 %7, 0 + br i1 %8, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %7) + %10 = bitcast i8* %9 to %Result** + %11 = load %Result*, %Result** %10, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %11, i32 -1) + br label %exiting__1 + +exiting__1: ; preds = %body__1 + %12 = add i64 %7, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + call void @__quantum__rt__array_update_reference_count(%Array* %0, i32 -1) + br label %header__2 + +header__2: ; preds = %exiting__2, %exit__1 + %13 = phi i64 [ 0, %exit__1 ], [ %18, %exiting__2 ] + %14 = icmp sle i64 %13, 0 + br i1 %14, label %body__2, label %exit__2 + +body__2: ; preds = %header__2 + %15 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 %13) + %16 = bitcast i8* %15 to %Result** + %17 = load %Result*, %Result** %16, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 -1) + br label %exiting__2 + +exiting__2: ; preds = %body__2 + %18 = add i64 %13, 1 + br label %header__2 + +exit__2: ; preds = %header__2 + call void @__quantum__rt__array_update_reference_count(%Array* %3, i32 -1) + ret void +} + +declare %Array* @__quantum__rt__array_create_1d(i32, i64) + +declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) + +declare %Result* @__quantum__rt__result_get_zero() + +declare void @__quantum__rt__result_update_reference_count(%Result*, i32) + +declare void @__quantum__rt__array_update_reference_count(%Array*, i32) + +define void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %control, %Qubit* %target) { +entry: + %ctls = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %1 = bitcast i8* %0 to %Qubit** + store %Qubit* %control, %Qubit** %1, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + br i1 true, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %target) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %target) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__CNOT__adj(%Qubit* %control, %Qubit* %target) { +entry: + call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %control, %Qubit* %target) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__CNOT__ctl(%Array* %ctls, { %Qubit*, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 0 + %control = load %Qubit*, %Qubit** %1, align 8 + %2 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 1 + %target = load %Qubit*, %Qubit** %2, align 8 + %3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 0) + %5 = bitcast i8* %4 to %Qubit** + store %Qubit* %control, %Qubit** %5, align 8 + %ctls__1 = call %Array* @__quantum__rt__array_concatenate(%Array* %ctls, %Array* %3) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 1) + %6 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls__1) + %7 = icmp eq i64 %6, 1 + br i1 %7, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls__1, %Qubit* %target) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls__1, %Qubit* %target) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %3, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__1, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) + +declare i64 @__quantum__rt__array_get_size_1d(%Array*) + +define void @Microsoft__Quantum__Intrinsic__CNOT__ctladj(%Array* %__controlQubits__, { %Qubit*, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %1 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 0 + %control = load %Qubit*, %Qubit** %1, align 8 + %2 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 1 + %target = load %Qubit*, %Qubit** %2, align 8 + %3 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) + %4 = bitcast %Tuple* %3 to { %Qubit*, %Qubit* }* + %5 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %4, i32 0, i32 0 + %6 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %4, i32 0, i32 1 + store %Qubit* %control, %Qubit** %5, align 8 + store %Qubit* %target, %Qubit** %6, align 8 + call void @Microsoft__Quantum__Intrinsic__CNOT__ctl(%Array* %__controlQubits__, { %Qubit*, %Qubit* }* %4) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %3, i32 -1) + ret void +} + +declare %Tuple* @__quantum__rt__tuple_create(i64) + +declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) + +define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { +entry: + %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb) + ret %Result* %0 +} + +define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %paulis, %Array* %qubits) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %0 = call %Result* @__quantum__rt__result_get_one() + %res = alloca %Result*, align 8 + store %Result* %0, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %0, i32 1) + %haveY = alloca i1, align 1 + store i1 false, i1* %haveY, align 1 + %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %paulis) + %2 = sub i64 %1, 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] + %3 = icmp sle i64 %i, %2 + br i1 %3, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) + %5 = bitcast i8* %4 to i2* + %6 = load i2, i2* %5, align 1 + %7 = load i2, i2* @PauliY, align 1 + %8 = icmp eq i2 %6, %7 + br i1 %8, label %condContinue__1, label %condFalse__1 + +condFalse__1: ; preds = %body__1 + %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) + %10 = bitcast i8* %9 to i2* + %11 = load i2, i2* %10, align 1 + %12 = load i2, i2* @PauliI, align 1 + %13 = icmp eq i2 %11, %12 + br label %condContinue__1 + +condContinue__1: ; preds = %condFalse__1, %body__1 + %14 = phi i1 [ %8, %body__1 ], [ %13, %condFalse__1 ] + br i1 %14, label %then0__1, label %continue__1 + +then0__1: ; preds = %condContinue__1 + store i1 true, i1* %haveY, align 1 + br label %continue__1 + +continue__1: ; preds = %then0__1, %condContinue__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %15 = add i64 %i, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %16 = load i1, i1* %haveY, align 1 + br i1 %16, label %then0__2, label %test1__1 + +then0__2: ; preds = %exit__1 + %17 = call %Result* @__quantum__qis__joint_measure(i64 106, i64 1, %Array* %qubits) + call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 1) + store %Result* %17, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %0, i32 -1) + br label %continue__2 + +test1__1: ; preds = %exit__1 + %18 = icmp sgt i64 %1, 2 + br i1 %18, label %then1__1, label %test2__1 + +then1__1: ; preds = %test1__1 + %19 = call %Result* @__quantum__qis__joint_measure(i64 107, i64 1, %Array* %qubits) + call void @__quantum__rt__result_update_reference_count(%Result* %19, i32 1) + %20 = load %Result*, %Result** %res, align 8 + store %Result* %19, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %19, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %20, i32 -1) + br label %continue__2 + +test2__1: ; preds = %test1__1 + %21 = icmp eq i64 %1, 1 + br i1 %21, label %then2__1, label %test3__1 + +then2__1: ; preds = %test2__1 + %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %23 = bitcast i8* %22 to i2* + %24 = load i2, i2* %23, align 1 + %25 = load i2, i2* @PauliX, align 1 + %26 = icmp eq i2 %24, %25 + br i1 %26, label %then0__3, label %else__1 + +then0__3: ; preds = %then2__1 + %27 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %28 = bitcast i8* %27 to %Qubit** + %qb = load %Qubit*, %Qubit** %28, align 8 + %29 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb) + call void @__quantum__rt__result_update_reference_count(%Result* %29, i32 1) + %30 = load %Result*, %Result** %res, align 8 + store %Result* %29, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %29, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %30, i32 -1) + br label %continue__3 + +else__1: ; preds = %then2__1 + %31 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) + %32 = bitcast i8* %31 to %Qubit** + %qb__1 = load %Qubit*, %Qubit** %32, align 8 + %33 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__1) + call void @__quantum__rt__result_update_reference_count(%Result* %33, i32 1) + %34 = load %Result*, %Result** %res, align 8 + store %Result* %33, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %33, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %34, i32 -1) + br label %continue__3 + +continue__3: ; preds = %else__1, %then0__3 + br label %continue__2 + +test3__1: ; preds = %test2__1 + %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %36 = bitcast i8* %35 to i2* + %37 = load i2, i2* %36, align 1 + %38 = load i2, i2* @PauliX, align 1 + %39 = icmp eq i2 %37, %38 + br i1 %39, label %condTrue__1, label %condContinue__2 + +condTrue__1: ; preds = %test3__1 + %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %41 = bitcast i8* %40 to i2* + %42 = load i2, i2* %41, align 1 + %43 = load i2, i2* @PauliX, align 1 + %44 = icmp eq i2 %42, %43 + br label %condContinue__2 + +condContinue__2: ; preds = %condTrue__1, %test3__1 + %45 = phi i1 [ %44, %condTrue__1 ], [ %39, %test3__1 ] + br i1 %45, label %then3__1, label %test4__1 + +then3__1: ; preds = %condContinue__2 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %46 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %46, i32 1) + %47 = load %Result*, %Result** %res, align 8 + store %Result* %46, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %46, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %47, i32 -1) + br label %continue__2 + +test4__1: ; preds = %condContinue__2 + %48 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %49 = bitcast i8* %48 to i2* + %50 = load i2, i2* %49, align 1 + %51 = load i2, i2* @PauliX, align 1 + %52 = icmp eq i2 %50, %51 + br i1 %52, label %condTrue__2, label %condContinue__3 + +condTrue__2: ; preds = %test4__1 + %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %54 = bitcast i8* %53 to i2* + %55 = load i2, i2* %54, align 1 + %56 = load i2, i2* @PauliZ, align 1 + %57 = icmp eq i2 %55, %56 + br label %condContinue__3 + +condContinue__3: ; preds = %condTrue__2, %test4__1 + %58 = phi i1 [ %57, %condTrue__2 ], [ %52, %test4__1 ] + br i1 %58, label %then4__1, label %test5__1 + +then4__1: ; preds = %condContinue__3 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %59 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %59, i32 1) + %60 = load %Result*, %Result** %res, align 8 + store %Result* %59, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %59, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %60, i32 -1) + br label %continue__2 + +test5__1: ; preds = %condContinue__3 + %61 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %62 = bitcast i8* %61 to i2* + %63 = load i2, i2* %62, align 1 + %64 = load i2, i2* @PauliZ, align 1 + %65 = icmp eq i2 %63, %64 + br i1 %65, label %condTrue__3, label %condContinue__4 + +condTrue__3: ; preds = %test5__1 + %66 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %67 = bitcast i8* %66 to i2* + %68 = load i2, i2* %67, align 1 + %69 = load i2, i2* @PauliX, align 1 + %70 = icmp eq i2 %68, %69 + br label %condContinue__4 + +condContinue__4: ; preds = %condTrue__3, %test5__1 + %71 = phi i1 [ %70, %condTrue__3 ], [ %65, %test5__1 ] + br i1 %71, label %then5__1, label %test6__1 + +then5__1: ; preds = %condContinue__4 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %72 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %72, i32 1) + %73 = load %Result*, %Result** %res, align 8 + store %Result* %72, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %72, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %73, i32 -1) + br label %continue__2 + +test6__1: ; preds = %condContinue__4 + %74 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %75 = bitcast i8* %74 to i2* + %76 = load i2, i2* %75, align 1 + %77 = load i2, i2* @PauliZ, align 1 + %78 = icmp eq i2 %76, %77 + br i1 %78, label %condTrue__4, label %condContinue__5 + +condTrue__4: ; preds = %test6__1 + %79 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %80 = bitcast i8* %79 to i2* + %81 = load i2, i2* %80, align 1 + %82 = load i2, i2* @PauliZ, align 1 + %83 = icmp eq i2 %81, %82 + br label %condContinue__5 + +condContinue__5: ; preds = %condTrue__4, %test6__1 + %84 = phi i1 [ %83, %condTrue__4 ], [ %78, %test6__1 ] + br i1 %84, label %then6__1, label %continue__2 + +then6__1: ; preds = %condContinue__5 + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) + %85 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qubits) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %85, i32 1) + %86 = load %Result*, %Result** %res, align 8 + store %Result* %85, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %85, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %86, i32 -1) + br label %continue__2 + +continue__2: ; preds = %then6__1, %condContinue__5, %then5__1, %then4__1, %then3__1, %continue__3, %then1__1, %then0__2 + %87 = load %Result*, %Result** %res, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) + ret %Result* %87 +} + +declare %Result* @__quantum__rt__result_get_one() + +define void @Microsoft__Quantum__Intrinsic__Rx__body(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rx__adj(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rx__ctl(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rx__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Ry__body(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Ry__adj(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Ry__ctl(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Ry__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rz__body(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rz__adj(double %theta, %Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rz__ctl(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Rz__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 + %theta = load double, double* %1, align 8 + %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 + %qb = load %Qubit*, %Qubit** %2, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %qb) { +entry: + call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %ctls, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %ctls, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { +entry: + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) + %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) + %1 = icmp eq i64 %0, 1 + br i1 %1, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %__controlQubits__, %Qubit* %qb) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) + ret void +} + +define %Tuple* @Microsoft__Quantum__Core__Attribute__body() { +entry: + ret %Tuple* null +} + +define %Tuple* @Microsoft__Quantum__Core__EntryPoint__body() { +entry: + ret %Tuple* null +} + +define %Tuple* @Microsoft__Quantum__Core__Inline__body() { +entry: + ret %Tuple* null +} + +define void @Microsoft__Quantum__Testing__Tracer__Delay__body(%Callable* %op, %Qubit* %arg, %Tuple* %aux) { +entry: + call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 1) + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %Qubit* }* + %2 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %1, i32 0, i32 0 + store %Qubit* %arg, %Qubit** %2, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %op, %Tuple* %0, %Tuple* null) + call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 -1) + call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 -1) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %0, i32 -1) + ret void +} + +declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) + +define void @Microsoft__Quantum__Testing__Tracer__TestCoreIntrinsics__body() { +entry: + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 3) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1, align 8 + call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %3 = bitcast i8* %2 to %Qubit** + %qb__1 = load %Qubit*, %Qubit** %3, align 8 + call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb__1) + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %5 = bitcast i8* %4 to %Qubit** + %qb__2 = load %Qubit*, %Qubit** %5, align 8 + call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb__2) + %6 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %7 = bitcast i8* %6 to %Qubit** + %qb__3 = load %Qubit*, %Qubit** %7, align 8 + call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb__3) + %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %9 = bitcast i8* %8 to %Qubit** + %10 = load %Qubit*, %Qubit** %9, align 8 + %11 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %12 = bitcast i8* %11 to %Qubit** + %13 = load %Qubit*, %Qubit** %12, align 8 + call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %10, %Qubit* %13) + %14 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %15 = bitcast i8* %14 to %Qubit** + %qb__4 = load %Qubit*, %Qubit** %15, align 8 + call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__4) + %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %17 = bitcast i8* %16 to %Qubit** + %qb__5 = load %Qubit*, %Qubit** %17, align 8 + call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb__5) + %18 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %19 = bitcast i8* %18 to %Qubit** + %qb__6 = load %Qubit*, %Qubit** %19, align 8 + call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb__6) + %20 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %21 = bitcast i8* %20 to %Qubit** + %qb__7 = load %Qubit*, %Qubit** %21, align 8 + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb__7) + %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %23 = bitcast i8* %22 to %Qubit** + %qb__9 = load %Qubit*, %Qubit** %23, align 8 + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__9) + call void @__quantum__qis__inject_barrier(i64 42, i64 0) + %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %25 = bitcast i8* %24 to %Qubit** + %qb__11 = load %Qubit*, %Qubit** %25, align 8 + call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb__11) + %26 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %27 = bitcast i8* %26 to %Qubit** + %qb__13 = load %Qubit*, %Qubit** %27, align 8 + call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb__13) + %28 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %29 = bitcast i8* %28 to %Qubit** + %qb__15 = load %Qubit*, %Qubit** %29, align 8 + call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb__15) + %30 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %31 = bitcast i8* %30 to %Qubit** + %qb__17 = load %Qubit*, %Qubit** %31, align 8 + call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb__17) + %32 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %33 = bitcast i8* %32 to %Qubit** + %34 = load %Qubit*, %Qubit** %33, align 8 + %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %36 = bitcast i8* %35 to %Qubit** + %37 = load %Qubit*, %Qubit** %36, align 8 + call void @Microsoft__Quantum__Intrinsic__CNOT__adj(%Qubit* %34, %Qubit* %37) + %38 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %39 = bitcast i8* %38 to %Qubit** + %qb__19 = load %Qubit*, %Qubit** %39, align 8 + call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__19) + %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %41 = bitcast i8* %40 to %Qubit** + %qb__20 = load %Qubit*, %Qubit** %41, align 8 + call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb__20) + %42 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %43 = bitcast i8* %42 to %Qubit** + %qb__21 = load %Qubit*, %Qubit** %43, align 8 + call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb__21) + %44 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %45 = bitcast i8* %44 to %Qubit** + %qb__22 = load %Qubit*, %Qubit** %45, align 8 + call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb__22) + %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %47 = bitcast i8* %46 to %Qubit** + %qb__24 = load %Qubit*, %Qubit** %47, align 8 + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__24) + %c = call %Qubit* @__quantum__rt__qubit_allocate() + %ctls = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %48 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) + %49 = bitcast i8* %48 to %Qubit** + store %Qubit* %c, %Qubit** %49, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) + %50 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %51 = bitcast i8* %50 to %Qubit** + %qb__26 = load %Qubit*, %Qubit** %51, align 8 + br i1 true, label %then0__1, label %else__1 + +then0__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %qb__26) + br label %continue__1 + +else__1: ; preds = %entry + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %qb__26) + br label %continue__1 + +continue__1: ; preds = %else__1, %then0__1 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls, i32 -1) + %ctls__1 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %52 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__1, i64 0) + %53 = bitcast i8* %52 to %Qubit** + store %Qubit* %c, %Qubit** %53, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 1) + %54 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %55 = bitcast i8* %54 to %Qubit** + %qb__27 = load %Qubit*, %Qubit** %55, align 8 + br i1 true, label %then0__2, label %else__2 + +then0__2: ; preds = %continue__1 + call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %ctls__1, %Qubit* %qb__27) + br label %continue__2 + +else__2: ; preds = %continue__1 + call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %ctls__1, %Qubit* %qb__27) + br label %continue__2 + +continue__2: ; preds = %else__2, %then0__2 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__1, i32 -1) + %ctls__2 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %56 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__2, i64 0) + %57 = bitcast i8* %56 to %Qubit** + store %Qubit* %c, %Qubit** %57, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__2, i32 1) + %58 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %59 = bitcast i8* %58 to %Qubit** + %qb__28 = load %Qubit*, %Qubit** %59, align 8 + br i1 true, label %then0__3, label %else__3 + +then0__3: ; preds = %continue__2 + call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %ctls__2, %Qubit* %qb__28) + br label %continue__3 + +else__3: ; preds = %continue__2 + call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %ctls__2, %Qubit* %qb__28) + br label %continue__3 + +continue__3: ; preds = %else__3, %then0__3 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__2, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__2, i32 -1) + %ctls__3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %60 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__3, i64 0) + %61 = bitcast i8* %60 to %Qubit** + store %Qubit* %c, %Qubit** %61, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__3, i32 1) + %62 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %63 = bitcast i8* %62 to %Qubit** + %qb__29 = load %Qubit*, %Qubit** %63, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %ctls__3, %Qubit* %qb__29) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__3, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__3, i32 -1) + %ctls__4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %64 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__4, i64 0) + %65 = bitcast i8* %64 to %Qubit** + store %Qubit* %c, %Qubit** %65, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__4, i32 1) + %66 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %67 = bitcast i8* %66 to %Qubit** + %qb__30 = load %Qubit*, %Qubit** %67, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls__4, %Qubit* %qb__30) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__4, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__4, i32 -1) + %ctls__5 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %68 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__5, i64 0) + %69 = bitcast i8* %68 to %Qubit** + store %Qubit* %c, %Qubit** %69, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__5, i32 1) + %70 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %71 = bitcast i8* %70 to %Qubit** + %qb__31 = load %Qubit*, %Qubit** %71, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls__5, %Qubit* %qb__31) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__5, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__5, i32 -1) + %ctls__6 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %72 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__6, i64 0) + %73 = bitcast i8* %72 to %Qubit** + store %Qubit* %c, %Qubit** %73, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__6, i32 1) + %74 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %75 = bitcast i8* %74 to %Qubit** + %qb__32 = load %Qubit*, %Qubit** %75, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls__6, %Qubit* %qb__32) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__6, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__6, i32 -1) + %ctls__7 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %76 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__7, i64 0) + %77 = bitcast i8* %76 to %Qubit** + store %Qubit* %c, %Qubit** %77, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 1) + %78 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %79 = bitcast i8* %78 to %Qubit** + %qb__33 = load %Qubit*, %Qubit** %79, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls__7, %Qubit* %qb__33) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__7, i32 -1) + %ctls__9 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) + %80 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__9, i64 0) + %81 = bitcast i8* %80 to %Qubit** + store %Qubit* %c, %Qubit** %81, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 1) + %82 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %83 = bitcast i8* %82 to %Qubit** + %qb__35 = load %Qubit*, %Qubit** %83, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls__9, %Qubit* %qb__35) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %ctls__9, i32 -1) + call void @__quantum__rt__qubit_release(%Qubit* %c) + %cc = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %84 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %85 = bitcast i8* %84 to %Qubit** + %qb__37 = load %Qubit*, %Qubit** %85, align 8 + %86 = call i64 @__quantum__rt__array_get_size_1d(%Array* %cc) + %87 = icmp eq i64 %86, 1 + br i1 %87, label %then0__4, label %else__4 + +then0__4: ; preds = %continue__3 + call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %cc, %Qubit* %qb__37) + br label %continue__4 + +else__4: ; preds = %continue__3 + call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %cc, %Qubit* %qb__37) + br label %continue__4 + +continue__4: ; preds = %else__4, %then0__4 + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %88 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %89 = bitcast i8* %88 to %Qubit** + %qb__38 = load %Qubit*, %Qubit** %89, align 8 + %90 = icmp eq i64 %86, 1 + br i1 %90, label %then0__5, label %else__5 + +then0__5: ; preds = %continue__4 + call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %cc, %Qubit* %qb__38) + br label %continue__5 + +else__5: ; preds = %continue__4 + call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %cc, %Qubit* %qb__38) + br label %continue__5 + +continue__5: ; preds = %else__5, %then0__5 + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %91 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %92 = bitcast i8* %91 to %Qubit** + %qb__39 = load %Qubit*, %Qubit** %92, align 8 + %93 = icmp eq i64 %86, 1 + br i1 %93, label %then0__6, label %else__6 + +then0__6: ; preds = %continue__5 + call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %cc, %Qubit* %qb__39) + br label %continue__6 + +else__6: ; preds = %continue__5 + call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %cc, %Qubit* %qb__39) + br label %continue__6 + +continue__6: ; preds = %else__6, %then0__6 + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %94 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %95 = bitcast i8* %94 to %Qubit** + %qb__40 = load %Qubit*, %Qubit** %95, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %cc, %Qubit* %qb__40) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %96 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %97 = bitcast i8* %96 to %Qubit** + %qb__41 = load %Qubit*, %Qubit** %97, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %cc, %Qubit* %qb__41) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %98 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %99 = bitcast i8* %98 to %Qubit** + %qb__42 = load %Qubit*, %Qubit** %99, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %cc, %Qubit* %qb__42) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %100 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %101 = bitcast i8* %100 to %Qubit** + %qb__43 = load %Qubit*, %Qubit** %101, align 8 + call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %cc, %Qubit* %qb__43) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %102 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %103 = bitcast i8* %102 to %Qubit** + %qb__44 = load %Qubit*, %Qubit** %103, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %cc, %Qubit* %qb__44) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + %104 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %105 = bitcast i8* %104 to %Qubit** + %qb__46 = load %Qubit*, %Qubit** %105, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) + call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %cc, %Qubit* %qb__46) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) + call void @__quantum__rt__qubit_release_array(%Array* %cc) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + ret void +} + +declare %Qubit* @__quantum__rt__qubit_allocate() + +declare %Array* @__quantum__rt__qubit_allocate_array(i64) + +declare void @__quantum__qis__inject_barrier(i64, i64) + +declare void @__quantum__rt__qubit_release(%Qubit*) + +declare void @__quantum__rt__qubit_release_array(%Array*) + +define void @Microsoft__Quantum__Testing__Tracer__TestMeasurements__body() { +entry: + %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 6) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) + %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %1 = bitcast i8* %0 to %Qubit** + %qb = load %Qubit*, %Qubit** %1, align 8 + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) + %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) + %3 = bitcast i8* %2 to %Qubit** + %qb__2 = load %Qubit*, %Qubit** %3, align 8 + %r0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__2) + %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %5 = bitcast i8* %4 to %Qubit** + %qb__4 = load %Qubit*, %Qubit** %5, align 8 + call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__4) + %6 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %7 = bitcast i8* %6 to %Qubit** + %8 = load %Qubit*, %Qubit** %7, align 8 + %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %10 = bitcast i8* %9 to %Qubit** + %11 = load %Qubit*, %Qubit** %10, align 8 + call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %8, %Qubit* %11) + %qs12 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) + %12 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) + %13 = bitcast i8* %12 to %Qubit** + %14 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 1) + %15 = bitcast i8* %14 to %Qubit** + %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) + %17 = bitcast i8* %16 to %Qubit** + %18 = load %Qubit*, %Qubit** %17, align 8 + %19 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) + %20 = bitcast i8* %19 to %Qubit** + %21 = load %Qubit*, %Qubit** %20, align 8 + store %Qubit* %18, %Qubit** %13, align 8 + store %Qubit* %21, %Qubit** %15, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %paulis = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) + %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %23 = bitcast i8* %22 to i2* + %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %25 = bitcast i8* %24 to i2* + %26 = load i2, i2* @PauliY, align 1 + %27 = load i2, i2* @PauliX, align 1 + store i2 %26, i2* %23, align 1 + store i2 %27, i2* %25, align 1 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %28 = call %Result* @__quantum__rt__result_get_one() + %res = alloca %Result*, align 8 + store %Result* %28, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %28, i32 1) + %haveY = alloca i1, align 1 + store i1 false, i1* %haveY, align 1 + br label %header__1 + +header__1: ; preds = %exiting__1, %entry + %i = phi i64 [ 0, %entry ], [ %41, %exiting__1 ] + %29 = icmp sle i64 %i, 1 + br i1 %29, label %body__1, label %exit__1 + +body__1: ; preds = %header__1 + %30 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) + %31 = bitcast i8* %30 to i2* + %32 = load i2, i2* %31, align 1 + %33 = load i2, i2* @PauliY, align 1 + %34 = icmp eq i2 %32, %33 + br i1 %34, label %condContinue__1, label %condFalse__1 + +condFalse__1: ; preds = %body__1 + %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) + %36 = bitcast i8* %35 to i2* + %37 = load i2, i2* %36, align 1 + %38 = load i2, i2* @PauliI, align 1 + %39 = icmp eq i2 %37, %38 + br label %condContinue__1 + +condContinue__1: ; preds = %condFalse__1, %body__1 + %40 = phi i1 [ %34, %body__1 ], [ %39, %condFalse__1 ] + br i1 %40, label %then0__1, label %continue__1 + +then0__1: ; preds = %condContinue__1 + store i1 true, i1* %haveY, align 1 + br label %continue__1 + +continue__1: ; preds = %then0__1, %condContinue__1 + br label %exiting__1 + +exiting__1: ; preds = %continue__1 + %41 = add i64 %i, 1 + br label %header__1 + +exit__1: ; preds = %header__1 + %42 = load i1, i1* %haveY, align 1 + br i1 %42, label %then0__2, label %test1__1 + +then0__2: ; preds = %exit__1 + %43 = call %Result* @__quantum__qis__joint_measure(i64 106, i64 1, %Array* %qs12) + call void @__quantum__rt__result_update_reference_count(%Result* %43, i32 1) + store %Result* %43, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %43, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %28, i32 -1) + br label %continue__2 + +test1__1: ; preds = %exit__1 + br i1 false, label %then1__1, label %test2__1 + +then1__1: ; preds = %test1__1 + %44 = call %Result* @__quantum__qis__joint_measure(i64 107, i64 1, %Array* %qs12) + call void @__quantum__rt__result_update_reference_count(%Result* %44, i32 1) + %45 = load %Result*, %Result** %res, align 8 + store %Result* %44, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %44, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %45, i32 -1) + br label %continue__2 + +test2__1: ; preds = %test1__1 + br i1 false, label %then2__1, label %test3__1 + +then2__1: ; preds = %test2__1 + %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %47 = bitcast i8* %46 to i2* + %48 = load i2, i2* %47, align 1 + %49 = load i2, i2* @PauliX, align 1 + %50 = icmp eq i2 %48, %49 + br i1 %50, label %then0__3, label %else__1 + +then0__3: ; preds = %then2__1 + %51 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) + %52 = bitcast i8* %51 to %Qubit** + %qb__6 = load %Qubit*, %Qubit** %52, align 8 + %53 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb__6) + call void @__quantum__rt__result_update_reference_count(%Result* %53, i32 1) + %54 = load %Result*, %Result** %res, align 8 + store %Result* %53, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %53, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %54, i32 -1) + br label %continue__3 + +else__1: ; preds = %then2__1 + %55 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) + %56 = bitcast i8* %55 to %Qubit** + %qb__7 = load %Qubit*, %Qubit** %56, align 8 + %57 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__7) + call void @__quantum__rt__result_update_reference_count(%Result* %57, i32 1) + %58 = load %Result*, %Result** %res, align 8 + store %Result* %57, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %57, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %58, i32 -1) + br label %continue__3 + +continue__3: ; preds = %else__1, %then0__3 + br label %continue__2 + +test3__1: ; preds = %test2__1 + %59 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %60 = bitcast i8* %59 to i2* + %61 = load i2, i2* %60, align 1 + %62 = load i2, i2* @PauliX, align 1 + %63 = icmp eq i2 %61, %62 + br i1 %63, label %condTrue__1, label %condContinue__2 + +condTrue__1: ; preds = %test3__1 + %64 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %65 = bitcast i8* %64 to i2* + %66 = load i2, i2* %65, align 1 + %67 = load i2, i2* @PauliX, align 1 + %68 = icmp eq i2 %66, %67 + br label %condContinue__2 + +condContinue__2: ; preds = %condTrue__1, %test3__1 + %69 = phi i1 [ %68, %condTrue__1 ], [ %63, %test3__1 ] + br i1 %69, label %then3__1, label %test4__1 + +then3__1: ; preds = %condContinue__2 + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %70 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qs12) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %70, i32 1) + %71 = load %Result*, %Result** %res, align 8 + store %Result* %70, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %70, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %71, i32 -1) + br label %continue__2 + +test4__1: ; preds = %condContinue__2 + %72 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %73 = bitcast i8* %72 to i2* + %74 = load i2, i2* %73, align 1 + %75 = load i2, i2* @PauliX, align 1 + %76 = icmp eq i2 %74, %75 + br i1 %76, label %condTrue__2, label %condContinue__3 + +condTrue__2: ; preds = %test4__1 + %77 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %78 = bitcast i8* %77 to i2* + %79 = load i2, i2* %78, align 1 + %80 = load i2, i2* @PauliZ, align 1 + %81 = icmp eq i2 %79, %80 + br label %condContinue__3 + +condContinue__3: ; preds = %condTrue__2, %test4__1 + %82 = phi i1 [ %81, %condTrue__2 ], [ %76, %test4__1 ] + br i1 %82, label %then4__1, label %test5__1 + +then4__1: ; preds = %condContinue__3 + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %83 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qs12) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %83, i32 1) + %84 = load %Result*, %Result** %res, align 8 + store %Result* %83, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %83, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %84, i32 -1) + br label %continue__2 + +test5__1: ; preds = %condContinue__3 + %85 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %86 = bitcast i8* %85 to i2* + %87 = load i2, i2* %86, align 1 + %88 = load i2, i2* @PauliZ, align 1 + %89 = icmp eq i2 %87, %88 + br i1 %89, label %condTrue__3, label %condContinue__4 + +condTrue__3: ; preds = %test5__1 + %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %91 = bitcast i8* %90 to i2* + %92 = load i2, i2* %91, align 1 + %93 = load i2, i2* @PauliX, align 1 + %94 = icmp eq i2 %92, %93 + br label %condContinue__4 + +condContinue__4: ; preds = %condTrue__3, %test5__1 + %95 = phi i1 [ %94, %condTrue__3 ], [ %89, %test5__1 ] + br i1 %95, label %then5__1, label %test6__1 + +then5__1: ; preds = %condContinue__4 + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %96 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qs12) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %96, i32 1) + %97 = load %Result*, %Result** %res, align 8 + store %Result* %96, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %96, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %97, i32 -1) + br label %continue__2 + +test6__1: ; preds = %condContinue__4 + %98 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) + %99 = bitcast i8* %98 to i2* + %100 = load i2, i2* %99, align 1 + %101 = load i2, i2* @PauliZ, align 1 + %102 = icmp eq i2 %100, %101 + br i1 %102, label %condTrue__4, label %condContinue__5 + +condTrue__4: ; preds = %test6__1 + %103 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) + %104 = bitcast i8* %103 to i2* + %105 = load i2, i2* %104, align 1 + %106 = load i2, i2* @PauliZ, align 1 + %107 = icmp eq i2 %105, %106 + br label %condContinue__5 + +condContinue__5: ; preds = %condTrue__4, %test6__1 + %108 = phi i1 [ %107, %condTrue__4 ], [ %102, %test6__1 ] + br i1 %108, label %then6__1, label %continue__2 + +then6__1: ; preds = %condContinue__5 + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) + %109 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qs12) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 1) + %110 = load %Result*, %Result** %res, align 8 + store %Result* %109, %Result** %res, align 8 + call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %110, i32 -1) + br label %continue__2 + +continue__2: ; preds = %then6__1, %condContinue__5, %then5__1, %then4__1, %then3__1, %continue__3, %then1__1, %then0__2 + %r12 = load %Result*, %Result** %res, align 8 + call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %paulis, i32 -1) + %111 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %112 = bitcast %Tuple* %111 to { %Callable*, %Callable*, %Qubit* }* + %113 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 0 + %114 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 1 + %115 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 2 + %116 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %117 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__X, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %118 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 3) + %119 = bitcast i8* %118 to %Qubit** + %120 = load %Qubit*, %Qubit** %119, align 8 + store %Callable* %116, %Callable** %113, align 8 + store %Callable* %117, %Callable** %114, align 8 + store %Qubit* %120, %Qubit** %115, align 8 + %121 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %111) + %122 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %123 = bitcast %Tuple* %122 to { %Callable*, %Callable*, %Qubit* }* + %124 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 0 + %125 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 1 + %126 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 2 + %127 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %128 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Y, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %129 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 3) + %130 = bitcast i8* %129 to %Qubit** + %131 = load %Qubit*, %Qubit** %130, align 8 + store %Callable* %127, %Callable** %124, align 8 + store %Callable* %128, %Callable** %125, align 8 + store %Qubit* %131, %Qubit** %126, align 8 + %132 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %122) + call void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %r0, %Callable* %121, %Callable* %132) + %133 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %134 = bitcast %Tuple* %133 to { %Callable*, %Callable*, %Qubit* }* + %135 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 0 + %136 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 1 + %137 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 2 + %138 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %139 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Z, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %140 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 4) + %141 = bitcast i8* %140 to %Qubit** + %142 = load %Qubit*, %Qubit** %141, align 8 + store %Callable* %138, %Callable** %135, align 8 + store %Callable* %139, %Callable** %136, align 8 + store %Qubit* %142, %Qubit** %137, align 8 + %143 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__3, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %133) + %144 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %145 = bitcast %Tuple* %144 to { %Callable*, %Callable*, %Qubit* }* + %146 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 0 + %147 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 1 + %148 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 2 + %149 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %150 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__S, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) + %151 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 4) + %152 = bitcast i8* %151 to %Qubit** + %153 = load %Qubit*, %Qubit** %152, align 8 + store %Callable* %149, %Callable** %146, align 8 + store %Callable* %150, %Callable** %147, align 8 + store %Qubit* %153, %Qubit** %148, align 8 + %154 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__4, [2 x void (%Tuple*, i32)*]* @MemoryManagement__2, %Tuple* %144) + call void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %r12, %Callable* %143, %Callable* %154) + %155 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 5) + %156 = bitcast i8* %155 to %Qubit** + %qb__8 = load %Qubit*, %Qubit** %156, align 8 + call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__8) + call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) + call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %r0, i32 -1) + call void @__quantum__rt__array_update_reference_count(%Array* %qs12, i32 -1) + call void @__quantum__rt__result_update_reference_count(%Result* %r12, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %121, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %121, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %132, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %132, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %143, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %143, i32 -1) + call void @__quantum__rt__capture_update_reference_count(%Callable* %154, i32 -1) + call void @__quantum__rt__callable_update_reference_count(%Callable* %154, i32 -1) + call void @__quantum__rt__qubit_release_array(%Array* %qs) + ret void +} + +define void @Microsoft__Quantum__Testing__Tracer__Delay__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Callable*, %Qubit*, %Tuple* }* + %1 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 1 + %3 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 2 + %4 = load %Callable*, %Callable** %1, align 8 + %5 = load %Qubit*, %Qubit** %2, align 8 + %6 = load %Tuple*, %Tuple** %3, align 8 + call void @Microsoft__Quantum__Testing__Tracer__Delay__body(%Callable* %4, %Qubit* %5, %Tuple* %6) + ret void +} + +declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) + +define void @Microsoft__Quantum__Intrinsic__X__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %2 = load %Callable*, %Callable** %1, align 8 + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 + %4 = load %Qubit*, %Qubit** %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* + %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 + %7 = load %Tuple*, %Tuple** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* + %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 + store %Callable* %2, %Callable** %10, align 8 + store %Qubit* %4, %Qubit** %11, align 8 + store %Tuple* %7, %Tuple** %12, align 8 + %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + ret void +} + +define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %4 = load %Callable*, %Callable** %3, align 8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %4 = load %Callable*, %Callable** %3, align 8 + call void @__quantum__rt__capture_update_alias_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %3, %Qubit* %4) + 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*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %2 = load %Callable*, %Callable** %1, align 8 + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 + %4 = load %Qubit*, %Qubit** %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* + %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 + %7 = load %Tuple*, %Tuple** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* + %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 + store %Callable* %2, %Callable** %10, align 8 + store %Qubit* %4, %Qubit** %11, align 8 + store %Tuple* %7, %Tuple** %12, align 8 + %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Lifted__PartialApplication__3__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %2 = load %Callable*, %Callable** %1, align 8 + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 + %4 = load %Qubit*, %Qubit** %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* + %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 + %7 = load %Tuple*, %Tuple** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* + %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 + store %Callable* %2, %Callable** %10, align 8 + store %Qubit* %4, %Qubit** %11, align 8 + store %Tuple* %7, %Tuple** %12, align 8 + %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* + %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 + %2 = load %Qubit*, %Qubit** %1, align 8 + call void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %2) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %3, %Qubit* %4) + ret void +} + +define void @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* + %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 + %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 + %3 = load %Array*, %Array** %1, align 8 + %4 = load %Qubit*, %Qubit** %2, align 8 + call void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %3, %Qubit* %4) + ret void +} + +define void @Lifted__PartialApplication__4__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %2 = load %Callable*, %Callable** %1, align 8 + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 + %4 = load %Qubit*, %Qubit** %3, align 8 + %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* + %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 + %7 = load %Tuple*, %Tuple** %6, align 8 + %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) + %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* + %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 + %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 + %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 + store %Callable* %2, %Callable** %10, align 8 + store %Qubit* %4, %Qubit** %11, align 8 + store %Tuple* %7, %Tuple** %12, align 8 + %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %14 = load %Callable*, %Callable** %13, align 8 + call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) + ret void +} + +define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %4 = load %Callable*, %Callable** %3, align 8 + call void @__quantum__rt__capture_update_reference_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__callable_update_reference_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { +entry: + %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* + %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 + %2 = load %Callable*, %Callable** %1, align 8 + call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) + %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 + %4 = load %Callable*, %Callable** %3, align 8 + call void @__quantum__rt__capture_update_alias_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__callable_update_alias_count(%Callable* %4, i32 %count-change) + call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) + ret void +} + +declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) + +declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) + +define { %String* }* @Microsoft__Quantum__Targeting__TargetInstruction__body(%String* %__Item1__) { +entry: + %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) + %1 = bitcast %Tuple* %0 to { %String* }* + %2 = getelementptr inbounds { %String* }, { %String* }* %1, i32 0, i32 0 + store %String* %__Item1__, %String** %2, align 8 + call void @__quantum__rt__string_update_reference_count(%String* %__Item1__, i32 1) + ret { %String* }* %1 +} + +declare void @__quantum__rt__string_update_reference_count(%String*, i32) + +declare void @__quantum__rt__tuple_update_alias_count(%Tuple*, i32) From ddf30c8ddf3cbec17544081d0ae1fde1318f8e38 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Wed, 7 Apr 2021 16:14:12 -0700 Subject: [PATCH 02/16] Remove generated qir --- .../qir/qir-standalone-input-reference.ll | 1427 ----------- .../qsharp/qir/qir-test-simulator.ll | 1387 ----------- .../QIR-dynamic/qsharp/qir/qir-test-random.ll | 159 -- .../test/QIR-tracer/qsharp/qir/tracer-qir.ll | 2080 ----------------- 4 files changed, 5053 deletions(-) delete mode 100644 src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll delete mode 100644 src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll delete mode 100644 src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll delete mode 100644 src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll diff --git a/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll b/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll deleted file mode 100644 index 3b75c0034f7..00000000000 --- a/src/QirRuntime/samples/StandaloneInputReference/qsharp/qir/qir-standalone-input-reference.ll +++ /dev/null @@ -1,1427 +0,0 @@ - -%Range = type { i64, i64, i64 } -%Tuple = type opaque -%Result = type opaque -%Array = type opaque -%String = type opaque -%Callable = type opaque - -@PauliI = constant i2 0 -@PauliX = constant i2 1 -@PauliY = constant i2 -1 -@PauliZ = constant i2 -2 -@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@0 = internal constant [36 x i8] c"Exercise Supported Inputs Reference\00" -@1 = internal constant [11 x i8] c"intValue: \00" -@Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@2 = internal constant [11 x i8] c"intArray: \00" -@3 = internal constant [3 x i8] c" (\00" -@4 = internal constant [2 x i8] c")\00" -@5 = internal constant [14 x i8] c"doubleValue: \00" -@Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@6 = internal constant [14 x i8] c"doubleArray: \00" -@7 = internal constant [3 x i8] c" (\00" -@8 = internal constant [2 x i8] c")\00" -@9 = internal constant [12 x i8] c"boolValue: \00" -@Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@10 = internal constant [12 x i8] c"boolArray: \00" -@11 = internal constant [3 x i8] c" (\00" -@12 = internal constant [2 x i8] c")\00" -@13 = internal constant [13 x i8] c"pauliValue: \00" -@Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@14 = internal constant [13 x i8] c"pauliArray: \00" -@15 = internal constant [3 x i8] c" (\00" -@16 = internal constant [2 x i8] c")\00" -@17 = internal constant [13 x i8] c"rangeValue: \00" -@18 = internal constant [14 x i8] c"resultValue: \00" -@Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@19 = internal constant [14 x i8] c"resultArray: \00" -@20 = internal constant [3 x i8] c" (\00" -@21 = internal constant [2 x i8] c")\00" -@22 = internal constant [14 x i8] c"stringValue: \00" -@23 = internal constant [2 x i8] c"[\00" -@24 = internal constant [3 x i8] c", \00" -@25 = internal constant [2 x i8] c"]\00" -@26 = internal constant [2 x i8] c"[\00" -@27 = internal constant [3 x i8] c", \00" -@28 = internal constant [2 x i8] c"]\00" -@29 = internal constant [2 x i8] c"[\00" -@30 = internal constant [3 x i8] c", \00" -@31 = internal constant [2 x i8] c"]\00" -@32 = internal constant [2 x i8] c"[\00" -@33 = internal constant [3 x i8] c", \00" -@34 = internal constant [2 x i8] c"]\00" -@35 = internal constant [2 x i8] c"[\00" -@36 = internal constant [3 x i8] c", \00" -@37 = internal constant [2 x i8] c"]\00" -@38 = internal constant [3 x i8] c"()\00" - -define void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %intArray, double %doubleValue, %Array* %doubleArray, i1 %boolValue, %Array* %boolArray, i2 %pauliValue, %Array* %pauliArray, %Range %rangeValue, %Result* %resultValue, %Array* %resultArray, %String* %stringValue) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %intArray, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %doubleArray, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %boolArray, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %pauliArray, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %resultArray, i32 1) - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__message(%String* %0) - %1 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @1, i32 0, i32 0)) - %2 = call %String* @__quantum__rt__int_to_string(i64 %intValue) - %3 = call %String* @__quantum__rt__string_concatenate(%String* %1, %String* %2) - call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %2, i32 -1) - call void @__quantum__rt__message(%String* %3) - %4 = call %String* @Quantum__StandaloneSupportedInputs___58b06fb8838645aba850713a715678d6_ArrayToString__body(%Array* %intArray) - %5 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %6 = call i64 @Microsoft__Quantum__Arrays___8487a9df7d0d4ac5a6694fb1d077b2b4_Count__body(%Callable* %5, %Array* %intArray) - %7 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %4, i32 1) - %8 = call %String* @__quantum__rt__string_concatenate(%String* %7, %String* %4) - call void @__quantum__rt__string_update_reference_count(%String* %7, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i32 -1) - %9 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @3, i32 0, i32 0)) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - %11 = call %String* @__quantum__rt__int_to_string(i64 %6) - %12 = call %String* @__quantum__rt__string_concatenate(%String* %10, %String* %11) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - %13 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @4, i32 0, i32 0)) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - call void @__quantum__rt__message(%String* %14) - %15 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @5, i32 0, i32 0)) - %16 = call %String* @__quantum__rt__double_to_string(double %doubleValue) - %17 = call %String* @__quantum__rt__string_concatenate(%String* %15, %String* %16) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %16, i32 -1) - call void @__quantum__rt__message(%String* %17) - %18 = call %String* @Quantum__StandaloneSupportedInputs___651cdf0b91af440a8c52eefc05d57b06_ArrayToString__body(%Array* %doubleArray) - %19 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %20 = call i64 @Microsoft__Quantum__Arrays___1575e931e75b478d9338ff1c1ba98161_Count__body(%Callable* %19, %Array* %doubleArray) - %21 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @6, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 1) - %22 = call %String* @__quantum__rt__string_concatenate(%String* %21, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %21, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - %23 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @7, i32 0, i32 0)) - %24 = call %String* @__quantum__rt__string_concatenate(%String* %22, %String* %23) - call void @__quantum__rt__string_update_reference_count(%String* %22, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %23, i32 -1) - %25 = call %String* @__quantum__rt__int_to_string(i64 %20) - %26 = call %String* @__quantum__rt__string_concatenate(%String* %24, %String* %25) - call void @__quantum__rt__string_update_reference_count(%String* %24, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %25, i32 -1) - %27 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @8, i32 0, i32 0)) - %28 = call %String* @__quantum__rt__string_concatenate(%String* %26, %String* %27) - call void @__quantum__rt__string_update_reference_count(%String* %26, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %27, i32 -1) - call void @__quantum__rt__message(%String* %28) - %29 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @9, i32 0, i32 0)) - %30 = call %String* @__quantum__rt__bool_to_string(i1 %boolValue) - %31 = call %String* @__quantum__rt__string_concatenate(%String* %29, %String* %30) - call void @__quantum__rt__string_update_reference_count(%String* %29, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %30, i32 -1) - call void @__quantum__rt__message(%String* %31) - %32 = call %String* @Quantum__StandaloneSupportedInputs___f5a60aadd6b1405d8efce41485ff4d80_ArrayToString__body(%Array* %boolArray) - %33 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %34 = call i64 @Microsoft__Quantum__Arrays___67c459c137a0446995c133a29250678d_Count__body(%Callable* %33, %Array* %boolArray) - %35 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @10, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %32, i32 1) - %36 = call %String* @__quantum__rt__string_concatenate(%String* %35, %String* %32) - call void @__quantum__rt__string_update_reference_count(%String* %35, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %32, i32 -1) - %37 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @11, i32 0, i32 0)) - %38 = call %String* @__quantum__rt__string_concatenate(%String* %36, %String* %37) - call void @__quantum__rt__string_update_reference_count(%String* %36, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %37, i32 -1) - %39 = call %String* @__quantum__rt__int_to_string(i64 %34) - %40 = call %String* @__quantum__rt__string_concatenate(%String* %38, %String* %39) - call void @__quantum__rt__string_update_reference_count(%String* %38, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %39, i32 -1) - %41 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @12, i32 0, i32 0)) - %42 = call %String* @__quantum__rt__string_concatenate(%String* %40, %String* %41) - call void @__quantum__rt__string_update_reference_count(%String* %40, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %41, i32 -1) - call void @__quantum__rt__message(%String* %42) - %43 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @13, i32 0, i32 0)) - %44 = call %String* @__quantum__rt__pauli_to_string(i2 %pauliValue) - %45 = call %String* @__quantum__rt__string_concatenate(%String* %43, %String* %44) - call void @__quantum__rt__string_update_reference_count(%String* %43, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %44, i32 -1) - call void @__quantum__rt__message(%String* %45) - %46 = call %String* @Quantum__StandaloneSupportedInputs___ec0b3349aeaf419f9d7d96decefd1869_ArrayToString__body(%Array* %pauliArray) - %47 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %48 = call i64 @Microsoft__Quantum__Arrays___c71932228c1b4b6fb8c3c63c9d8e35e4_Count__body(%Callable* %47, %Array* %pauliArray) - %49 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @14, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %46, i32 1) - %50 = call %String* @__quantum__rt__string_concatenate(%String* %49, %String* %46) - call void @__quantum__rt__string_update_reference_count(%String* %49, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %46, i32 -1) - %51 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @15, i32 0, i32 0)) - %52 = call %String* @__quantum__rt__string_concatenate(%String* %50, %String* %51) - call void @__quantum__rt__string_update_reference_count(%String* %50, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %51, i32 -1) - %53 = call %String* @__quantum__rt__int_to_string(i64 %48) - %54 = call %String* @__quantum__rt__string_concatenate(%String* %52, %String* %53) - call void @__quantum__rt__string_update_reference_count(%String* %52, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %53, i32 -1) - %55 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @16, i32 0, i32 0)) - %56 = call %String* @__quantum__rt__string_concatenate(%String* %54, %String* %55) - call void @__quantum__rt__string_update_reference_count(%String* %54, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %55, i32 -1) - call void @__quantum__rt__message(%String* %56) - %57 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @17, i32 0, i32 0)) - %58 = call %String* @__quantum__rt__range_to_string(%Range %rangeValue) - %59 = call %String* @__quantum__rt__string_concatenate(%String* %57, %String* %58) - call void @__quantum__rt__string_update_reference_count(%String* %57, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %58, i32 -1) - call void @__quantum__rt__message(%String* %59) - %60 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @18, i32 0, i32 0)) - %61 = call %String* @__quantum__rt__result_to_string(%Result* %resultValue) - %62 = call %String* @__quantum__rt__string_concatenate(%String* %60, %String* %61) - call void @__quantum__rt__string_update_reference_count(%String* %60, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %61, i32 -1) - call void @__quantum__rt__message(%String* %62) - %63 = call %String* @Quantum__StandaloneSupportedInputs___c22db911562e4518b3ec04b3a395976a_ArrayToString__body(%Array* %resultArray) - %64 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %65 = call i64 @Microsoft__Quantum__Arrays___aa464afb2404486a86d7d9b45b4e8d2c_Count__body(%Callable* %64, %Array* %resultArray) - %66 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @19, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %63, i32 1) - %67 = call %String* @__quantum__rt__string_concatenate(%String* %66, %String* %63) - call void @__quantum__rt__string_update_reference_count(%String* %66, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %63, i32 -1) - %68 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @20, i32 0, i32 0)) - %69 = call %String* @__quantum__rt__string_concatenate(%String* %67, %String* %68) - call void @__quantum__rt__string_update_reference_count(%String* %67, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %68, i32 -1) - %70 = call %String* @__quantum__rt__int_to_string(i64 %65) - %71 = call %String* @__quantum__rt__string_concatenate(%String* %69, %String* %70) - call void @__quantum__rt__string_update_reference_count(%String* %69, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %70, i32 -1) - %72 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @21, i32 0, i32 0)) - %73 = call %String* @__quantum__rt__string_concatenate(%String* %71, %String* %72) - call void @__quantum__rt__string_update_reference_count(%String* %71, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %72, i32 -1) - call void @__quantum__rt__message(%String* %73) - %74 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @22, i32 0, i32 0)) - call void @__quantum__rt__string_update_reference_count(%String* %stringValue, i32 1) - %75 = call %String* @__quantum__rt__string_concatenate(%String* %74, %String* %stringValue) - call void @__quantum__rt__string_update_reference_count(%String* %74, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %stringValue, i32 -1) - call void @__quantum__rt__message(%String* %75) - call void @__quantum__rt__array_update_alias_count(%Array* %intArray, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %doubleArray, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %boolArray, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %pauliArray, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %resultArray, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %3, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %4, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %5, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %5, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %28, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %31, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %32, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %33, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %33, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %42, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %45, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %46, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %47, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %47, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %56, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %59, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %62, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %63, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %64, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %64, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %73, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %75, i32 -1) - ret void -} - -declare void @__quantum__rt__array_update_alias_count(%Array*, i32) - -declare %String* @__quantum__rt__string_create(i8*) - -declare void @__quantum__rt__message(%String*) - -declare void @__quantum__rt__string_update_reference_count(%String*, i32) - -declare %String* @__quantum__rt__int_to_string(i64) - -declare %String* @__quantum__rt__string_concatenate(%String*, %String*) - -define %String* @Quantum__StandaloneSupportedInputs___58b06fb8838645aba850713a715678d6_ArrayToString__body(%Array* %array) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %first = alloca i1, align 1 - store i1 true, i1* %first, align 1 - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @23, i32 0, i32 0)) - %itemsString = alloca %String*, align 8 - store %String* %0, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] - %4 = icmp sle i64 %3, %2 - br i1 %4, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) - %6 = bitcast i8* %5 to i64* - %item = load i64, i64* %6, align 4 - %7 = load i1, i1* %first, align 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %body__1 - store i1 false, i1* %first, align 1 - %8 = load %String*, %String** %itemsString, align 8 - %9 = call %String* @__quantum__rt__int_to_string(i64 %item) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) - store %String* %10, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - br label %continue__1 - -else__1: ; preds = %body__1 - %11 = load %String*, %String** %itemsString, align 8 - %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @24, i32 0, i32 0)) - %13 = call %String* @__quantum__rt__int_to_string(i64 %item) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) - store %String* %15, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %16 = add i64 %3, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %17 = load %String*, %String** %itemsString, align 8 - %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @25, i32 0, i32 0)) - %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) - store %String* %19, %String** %itemsString, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) - ret %String* %19 -} - -define i64 @Microsoft__Quantum__Arrays___8487a9df7d0d4ac5a6694fb1d077b2b4_Count__body(%Callable* %predicate, %Array* %array) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %totalFound = alloca i64, align 8 - store i64 0, i64* %totalFound, align 4 - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %1 = sub i64 %0, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %2, %1 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) - %5 = bitcast i8* %4 to i64* - %element = load i64, i64* %5, align 4 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { i64 }* - %8 = getelementptr inbounds { i64 }, { i64 }* %7, i32 0, i32 0 - store i64 %element, i64* %8, align 4 - %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) - %10 = bitcast %Tuple* %9 to { i1 }* - %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 - %12 = load i1, i1* %11, align 1 - br i1 %12, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %13 = load i64, i64* %totalFound, align 4 - %14 = add i64 %13, 1 - store i64 %14, i64* %totalFound, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %2, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i64, i64* %totalFound, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - ret i64 %16 -} - -define void @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i64 }* - %1 = getelementptr inbounds { i64 }, { i64 }* %0, i32 0, i32 0 - %2 = load i64, i64* %1, align 4 - %3 = call i1 @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body(i64 %2) - %4 = bitcast %Tuple* %result-tuple to { i1 }* - %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 - store i1 %3, i1* %5, align 1 - ret void -} - -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) - -declare %String* @__quantum__rt__double_to_string(double) - -define %String* @Quantum__StandaloneSupportedInputs___651cdf0b91af440a8c52eefc05d57b06_ArrayToString__body(%Array* %array) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %first = alloca i1, align 1 - store i1 true, i1* %first, align 1 - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @26, i32 0, i32 0)) - %itemsString = alloca %String*, align 8 - store %String* %0, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] - %4 = icmp sle i64 %3, %2 - br i1 %4, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) - %6 = bitcast i8* %5 to double* - %item = load double, double* %6, align 8 - %7 = load i1, i1* %first, align 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %body__1 - store i1 false, i1* %first, align 1 - %8 = load %String*, %String** %itemsString, align 8 - %9 = call %String* @__quantum__rt__double_to_string(double %item) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) - store %String* %10, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - br label %continue__1 - -else__1: ; preds = %body__1 - %11 = load %String*, %String** %itemsString, align 8 - %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @27, i32 0, i32 0)) - %13 = call %String* @__quantum__rt__double_to_string(double %item) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) - store %String* %15, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %16 = add i64 %3, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %17 = load %String*, %String** %itemsString, align 8 - %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @28, i32 0, i32 0)) - %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) - store %String* %19, %String** %itemsString, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) - ret %String* %19 -} - -define i64 @Microsoft__Quantum__Arrays___1575e931e75b478d9338ff1c1ba98161_Count__body(%Callable* %predicate, %Array* %array) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %totalFound = alloca i64, align 8 - store i64 0, i64* %totalFound, align 4 - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %1 = sub i64 %0, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %2, %1 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) - %5 = bitcast i8* %4 to double* - %element = load double, double* %5, align 8 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { double }* - %8 = getelementptr inbounds { double }, { double }* %7, i32 0, i32 0 - store double %element, double* %8, align 8 - %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) - %10 = bitcast %Tuple* %9 to { i1 }* - %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 - %12 = load i1, i1* %11, align 1 - br i1 %12, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %13 = load i64, i64* %totalFound, align 4 - %14 = add i64 %13, 1 - store i64 %14, i64* %totalFound, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %2, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i64, i64* %totalFound, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - ret i64 %16 -} - -define void @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { double }* - %1 = getelementptr inbounds { double }, { double }* %0, i32 0, i32 0 - %2 = load double, double* %1, align 8 - %3 = call i1 @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body(double %2) - %4 = bitcast %Tuple* %result-tuple to { i1 }* - %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 - store i1 %3, i1* %5, align 1 - ret void -} - -declare %String* @__quantum__rt__bool_to_string(i1) - -define %String* @Quantum__StandaloneSupportedInputs___f5a60aadd6b1405d8efce41485ff4d80_ArrayToString__body(%Array* %array) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %first = alloca i1, align 1 - store i1 true, i1* %first, align 1 - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @29, i32 0, i32 0)) - %itemsString = alloca %String*, align 8 - store %String* %0, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] - %4 = icmp sle i64 %3, %2 - br i1 %4, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) - %6 = bitcast i8* %5 to i1* - %item = load i1, i1* %6, align 1 - %7 = load i1, i1* %first, align 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %body__1 - store i1 false, i1* %first, align 1 - %8 = load %String*, %String** %itemsString, align 8 - %9 = call %String* @__quantum__rt__bool_to_string(i1 %item) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) - store %String* %10, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - br label %continue__1 - -else__1: ; preds = %body__1 - %11 = load %String*, %String** %itemsString, align 8 - %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @30, i32 0, i32 0)) - %13 = call %String* @__quantum__rt__bool_to_string(i1 %item) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) - store %String* %15, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %16 = add i64 %3, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %17 = load %String*, %String** %itemsString, align 8 - %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @31, i32 0, i32 0)) - %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) - store %String* %19, %String** %itemsString, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) - ret %String* %19 -} - -define i64 @Microsoft__Quantum__Arrays___67c459c137a0446995c133a29250678d_Count__body(%Callable* %predicate, %Array* %array) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %totalFound = alloca i64, align 8 - store i64 0, i64* %totalFound, align 4 - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %1 = sub i64 %0, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %2, %1 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) - %5 = bitcast i8* %4 to i1* - %element = load i1, i1* %5, align 1 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { i1 }* - %8 = getelementptr inbounds { i1 }, { i1 }* %7, i32 0, i32 0 - store i1 %element, i1* %8, align 1 - %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) - %10 = bitcast %Tuple* %9 to { i1 }* - %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 - %12 = load i1, i1* %11, align 1 - br i1 %12, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %13 = load i64, i64* %totalFound, align 4 - %14 = add i64 %13, 1 - store i64 %14, i64* %totalFound, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %2, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i64, i64* %totalFound, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - ret i64 %16 -} - -define void @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i1 }* - %1 = getelementptr inbounds { i1 }, { i1 }* %0, i32 0, i32 0 - %2 = load i1, i1* %1, align 1 - %3 = call i1 @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body(i1 %2) - %4 = bitcast %Tuple* %result-tuple to { i1 }* - %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 - store i1 %3, i1* %5, align 1 - ret void -} - -declare %String* @__quantum__rt__pauli_to_string(i2) - -define %String* @Quantum__StandaloneSupportedInputs___ec0b3349aeaf419f9d7d96decefd1869_ArrayToString__body(%Array* %array) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %first = alloca i1, align 1 - store i1 true, i1* %first, align 1 - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @32, i32 0, i32 0)) - %itemsString = alloca %String*, align 8 - store %String* %0, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] - %4 = icmp sle i64 %3, %2 - br i1 %4, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) - %6 = bitcast i8* %5 to i2* - %item = load i2, i2* %6, align 1 - %7 = load i1, i1* %first, align 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %body__1 - store i1 false, i1* %first, align 1 - %8 = load %String*, %String** %itemsString, align 8 - %9 = call %String* @__quantum__rt__pauli_to_string(i2 %item) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) - store %String* %10, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - br label %continue__1 - -else__1: ; preds = %body__1 - %11 = load %String*, %String** %itemsString, align 8 - %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @33, i32 0, i32 0)) - %13 = call %String* @__quantum__rt__pauli_to_string(i2 %item) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) - store %String* %15, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %16 = add i64 %3, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %17 = load %String*, %String** %itemsString, align 8 - %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @34, i32 0, i32 0)) - %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) - store %String* %19, %String** %itemsString, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) - ret %String* %19 -} - -define i64 @Microsoft__Quantum__Arrays___c71932228c1b4b6fb8c3c63c9d8e35e4_Count__body(%Callable* %predicate, %Array* %array) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %totalFound = alloca i64, align 8 - store i64 0, i64* %totalFound, align 4 - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %1 = sub i64 %0, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %2, %1 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) - %5 = bitcast i8* %4 to i2* - %element = load i2, i2* %5, align 1 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i2* getelementptr (i2, i2* null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { i2 }* - %8 = getelementptr inbounds { i2 }, { i2 }* %7, i32 0, i32 0 - store i2 %element, i2* %8, align 1 - %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) - %10 = bitcast %Tuple* %9 to { i1 }* - %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 - %12 = load i1, i1* %11, align 1 - br i1 %12, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %13 = load i64, i64* %totalFound, align 4 - %14 = add i64 %13, 1 - store i64 %14, i64* %totalFound, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %2, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i64, i64* %totalFound, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - ret i64 %16 -} - -define void @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i2 }* - %1 = getelementptr inbounds { i2 }, { i2 }* %0, i32 0, i32 0 - %2 = load i2, i2* %1, align 1 - %3 = call i1 @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body(i2 %2) - %4 = bitcast %Tuple* %result-tuple to { i1 }* - %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 - store i1 %3, i1* %5, align 1 - ret void -} - -declare %String* @__quantum__rt__range_to_string(%Range) - -declare %String* @__quantum__rt__result_to_string(%Result*) - -define %String* @Quantum__StandaloneSupportedInputs___c22db911562e4518b3ec04b3a395976a_ArrayToString__body(%Array* %array) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %first = alloca i1, align 1 - store i1 true, i1* %first, align 1 - %0 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @35, i32 0, i32 0)) - %itemsString = alloca %String*, align 8 - store %String* %0, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 1) - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %3 = phi i64 [ 0, %entry ], [ %16, %exiting__1 ] - %4 = icmp sle i64 %3, %2 - br i1 %4, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %5 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %3) - %6 = bitcast i8* %5 to %Result** - %item = load %Result*, %Result** %6, align 8 - %7 = load i1, i1* %first, align 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %body__1 - store i1 false, i1* %first, align 1 - %8 = load %String*, %String** %itemsString, align 8 - %9 = call %String* @__quantum__rt__result_to_string(%Result* %item) - %10 = call %String* @__quantum__rt__string_concatenate(%String* %8, %String* %9) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 1) - store %String* %10, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %9, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %10, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %8, i32 -1) - br label %continue__1 - -else__1: ; preds = %body__1 - %11 = load %String*, %String** %itemsString, align 8 - %12 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @36, i32 0, i32 0)) - %13 = call %String* @__quantum__rt__result_to_string(%Result* %item) - %14 = call %String* @__quantum__rt__string_concatenate(%String* %12, %String* %13) - call void @__quantum__rt__string_update_reference_count(%String* %12, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %13, i32 -1) - %15 = call %String* @__quantum__rt__string_concatenate(%String* %11, %String* %14) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 1) - store %String* %15, %String** %itemsString, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %14, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %15, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %11, i32 -1) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %16 = add i64 %3, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %17 = load %String*, %String** %itemsString, align 8 - %18 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @37, i32 0, i32 0)) - %19 = call %String* @__quantum__rt__string_concatenate(%String* %17, %String* %18) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 1) - store %String* %19, %String** %itemsString, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %0, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %18, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %17, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %19, i32 -1) - ret %String* %19 -} - -define i64 @Microsoft__Quantum__Arrays___aa464afb2404486a86d7d9b45b4e8d2c_Count__body(%Callable* %predicate, %Array* %array) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 1) - %totalFound = alloca i64, align 8 - store i64 0, i64* %totalFound, align 4 - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %array) - %1 = sub i64 %0, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %2 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %2, %1 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %array, i64 %2) - %5 = bitcast i8* %4 to %Result** - %element = load %Result*, %Result** %5, align 8 - %6 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %7 = bitcast %Tuple* %6 to { %Result* }* - %8 = getelementptr inbounds { %Result* }, { %Result* }* %7, i32 0, i32 0 - store %Result* %element, %Result** %8, align 8 - %9 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1* getelementptr (i1, i1* null, i32 1) to i64)) - call void @__quantum__rt__callable_invoke(%Callable* %predicate, %Tuple* %6, %Tuple* %9) - %10 = bitcast %Tuple* %9 to { i1 }* - %11 = getelementptr inbounds { i1 }, { i1 }* %10, i32 0, i32 0 - %12 = load i1, i1* %11, align 1 - br i1 %12, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %13 = load i64, i64* %totalFound, align 4 - %14 = add i64 %13, 1 - store i64 %14, i64* %totalFound, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %6, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %9, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %2, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i64, i64* %totalFound, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %predicate, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %array, i32 -1) - ret i64 %16 -} - -define void @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Result* }* - %1 = getelementptr inbounds { %Result* }, { %Result* }* %0, i32 0, i32 0 - %2 = load %Result*, %Result** %1, align 8 - %3 = call i1 @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body(%Result* %2) - %4 = bitcast %Tuple* %result-tuple to { i1 }* - %5 = getelementptr inbounds { i1 }, { i1 }* %4, i32 0, i32 0 - store i1 %3, i1* %5, align 1 - ret void -} - -declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) - -declare i64 @__quantum__rt__array_get_size_1d(%Array*) - -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) - -define i1 @Quantum__StandaloneSupportedInputs___ebb122eaf9244a3ca8f07f274c8368b4_TautologyPredicate__body(i64 %input) { -entry: - ret i1 true -} - -define i1 @Quantum__StandaloneSupportedInputs___8723f095507647b0aef15b4b24f7fa0c_TautologyPredicate__body(double %input) { -entry: - ret i1 true -} - -define i1 @Quantum__StandaloneSupportedInputs___d127770a63ce4b8b924428e84b62936a_TautologyPredicate__body(i1 %input) { -entry: - ret i1 true -} - -define i1 @Quantum__StandaloneSupportedInputs___92bcc13ad4b7481581e7813da34f42ed_TautologyPredicate__body(i2 %input) { -entry: - ret i1 true -} - -define i1 @Quantum__StandaloneSupportedInputs___34109cb82da642eabac2d5c8cf2751a5_TautologyPredicate__body(%Result* %input) { -entry: - ret i1 true -} - -declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) - -declare %Tuple* @__quantum__rt__tuple_create(i64) - -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) - -define void @Quantum__StandaloneSupportedInputs__ExerciseInputs__Interop(i64 %intValue, { i64, i8* }* %intArray, double %doubleValue, { i64, i8* }* %doubleArray, i8 %boolValue, { i64, i8* }* %boolArray, i8 %pauliValue, { i64, i8* }* %pauliArray, { i64, i64, i64 }* %rangeValue, i8 %resultValue, { i64, i8* }* %resultArray, i8* %stringValue) #0 { -entry: - %0 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 0 - %1 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 1 - %2 = load i64, i64* %0, align 4 - %3 = load i8*, i8** %1, align 8 - %4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %2) - %5 = ptrtoint i8* %3 to i64 - %6 = sub i64 %2, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %7 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %8 = icmp sle i64 %7, %6 - br i1 %8, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %9 = mul i64 %7, 8 - %10 = add i64 %5, %9 - %11 = inttoptr i64 %10 to i64* - %12 = load i64, i64* %11, align 4 - %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %4, i64 %7) - %14 = bitcast i8* %13 to i64* - store i64 %12, i64* %14, align 4 - br label %exiting__1 - -exiting__1: ; preds = %body__1 - %15 = add i64 %7, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 0 - %17 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 1 - %18 = load i64, i64* %16, align 4 - %19 = load i8*, i8** %17, align 8 - %20 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %18) - %21 = ptrtoint i8* %19 to i64 - %22 = sub i64 %18, 1 - br label %header__2 - -header__2: ; preds = %exiting__2, %exit__1 - %23 = phi i64 [ 0, %exit__1 ], [ %31, %exiting__2 ] - %24 = icmp sle i64 %23, %22 - br i1 %24, label %body__2, label %exit__2 - -body__2: ; preds = %header__2 - %25 = mul i64 %23, 8 - %26 = add i64 %21, %25 - %27 = inttoptr i64 %26 to double* - %28 = load double, double* %27, align 8 - %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %20, i64 %23) - %30 = bitcast i8* %29 to double* - store double %28, double* %30, align 8 - br label %exiting__2 - -exiting__2: ; preds = %body__2 - %31 = add i64 %23, 1 - br label %header__2 - -exit__2: ; preds = %header__2 - %32 = trunc i8 %boolValue to i1 - %33 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 0 - %34 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 1 - %35 = load i64, i64* %33, align 4 - %36 = load i8*, i8** %34, align 8 - %37 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %35) - %38 = ptrtoint i8* %36 to i64 - %39 = sub i64 %35, 1 - br label %header__3 - -header__3: ; preds = %exiting__3, %exit__2 - %40 = phi i64 [ 0, %exit__2 ], [ %49, %exiting__3 ] - %41 = icmp sle i64 %40, %39 - br i1 %41, label %body__3, label %exit__3 - -body__3: ; preds = %header__3 - %42 = mul i64 %40, 1 - %43 = add i64 %38, %42 - %44 = inttoptr i64 %43 to i8* - %45 = load i8, i8* %44, align 1 - %46 = trunc i8 %45 to i1 - %47 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %37, i64 %40) - %48 = bitcast i8* %47 to i1* - store i1 %46, i1* %48, align 1 - br label %exiting__3 - -exiting__3: ; preds = %body__3 - %49 = add i64 %40, 1 - br label %header__3 - -exit__3: ; preds = %header__3 - %50 = trunc i8 %pauliValue to i2 - %51 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 0 - %52 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 1 - %53 = load i64, i64* %51, align 4 - %54 = load i8*, i8** %52, align 8 - %55 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %53) - %56 = ptrtoint i8* %54 to i64 - %57 = sub i64 %53, 1 - br label %header__4 - -header__4: ; preds = %exiting__4, %exit__3 - %58 = phi i64 [ 0, %exit__3 ], [ %67, %exiting__4 ] - %59 = icmp sle i64 %58, %57 - br i1 %59, label %body__4, label %exit__4 - -body__4: ; preds = %header__4 - %60 = mul i64 %58, 1 - %61 = add i64 %56, %60 - %62 = inttoptr i64 %61 to i8* - %63 = load i8, i8* %62, align 1 - %64 = trunc i8 %63 to i2 - %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %55, i64 %58) - %66 = bitcast i8* %65 to i2* - store i2 %64, i2* %66, align 1 - br label %exiting__4 - -exiting__4: ; preds = %body__4 - %67 = add i64 %58, 1 - br label %header__4 - -exit__4: ; preds = %header__4 - %68 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 0 - %69 = load i64, i64* %68, align 4 - %70 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 1 - %71 = load i64, i64* %70, align 4 - %72 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 2 - %73 = load i64, i64* %72, align 4 - %74 = load %Range, %Range* @EmptyRange, align 4 - %75 = insertvalue %Range %74, i64 %69, 0 - %76 = insertvalue %Range %75, i64 %71, 1 - %77 = insertvalue %Range %76, i64 %73, 2 - %78 = icmp eq i8 %resultValue, 0 - %79 = call %Result* @__quantum__rt__result_get_zero() - %80 = call %Result* @__quantum__rt__result_get_one() - %81 = select i1 %78, %Result* %79, %Result* %80 - %82 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 0 - %83 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 1 - %84 = load i64, i64* %82, align 4 - %85 = load i8*, i8** %83, align 8 - %86 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %84) - %87 = ptrtoint i8* %85 to i64 - %88 = sub i64 %84, 1 - br label %header__5 - -header__5: ; preds = %exiting__5, %exit__4 - %89 = phi i64 [ 0, %exit__4 ], [ %101, %exiting__5 ] - %90 = icmp sle i64 %89, %88 - br i1 %90, label %body__5, label %exit__5 - -body__5: ; preds = %header__5 - %91 = mul i64 %89, 1 - %92 = add i64 %87, %91 - %93 = inttoptr i64 %92 to i8* - %94 = load i8, i8* %93, align 1 - %95 = icmp eq i8 %94, 0 - %96 = call %Result* @__quantum__rt__result_get_zero() - %97 = call %Result* @__quantum__rt__result_get_one() - %98 = select i1 %95, %Result* %96, %Result* %97 - %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %89) - %100 = bitcast i8* %99 to %Result** - store %Result* %98, %Result** %100, align 8 - br label %exiting__5 - -exiting__5: ; preds = %body__5 - %101 = add i64 %89, 1 - br label %header__5 - -exit__5: ; preds = %header__5 - %102 = call %String* @__quantum__rt__string_create(i8* %stringValue) - call void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %4, double %doubleValue, %Array* %20, i1 %32, %Array* %37, i2 %50, %Array* %55, %Range %77, %Result* %81, %Array* %86, %String* %102) - call void @__quantum__rt__array_update_reference_count(%Array* %4, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %20, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %37, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %55, i32 -1) - %103 = sub i64 %84, 1 - br label %header__6 - -header__6: ; preds = %exiting__6, %exit__5 - %104 = phi i64 [ 0, %exit__5 ], [ %109, %exiting__6 ] - %105 = icmp sle i64 %104, %103 - br i1 %105, label %body__6, label %exit__6 - -body__6: ; preds = %header__6 - %106 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %104) - %107 = bitcast i8* %106 to %Result** - %108 = load %Result*, %Result** %107, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %108, i32 -1) - br label %exiting__6 - -exiting__6: ; preds = %body__6 - %109 = add i64 %104, 1 - br label %header__6 - -exit__6: ; preds = %header__6 - call void @__quantum__rt__array_update_reference_count(%Array* %86, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %102, i32 -1) - ret void -} - -declare %Array* @__quantum__rt__array_create_1d(i32, i64) - -declare %Result* @__quantum__rt__result_get_zero() - -declare %Result* @__quantum__rt__result_get_one() - -declare void @__quantum__rt__array_update_reference_count(%Array*, i32) - -declare void @__quantum__rt__result_update_reference_count(%Result*, i32) - -define void @Quantum__StandaloneSupportedInputs__ExerciseInputs(i64 %intValue, { i64, i8* }* %intArray, double %doubleValue, { i64, i8* }* %doubleArray, i8 %boolValue, { i64, i8* }* %boolArray, i8 %pauliValue, { i64, i8* }* %pauliArray, { i64, i64, i64 }* %rangeValue, i8 %resultValue, { i64, i8* }* %resultArray, i8* %stringValue) #1 { -entry: - %0 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 0 - %1 = getelementptr { i64, i8* }, { i64, i8* }* %intArray, i64 0, i32 1 - %2 = load i64, i64* %0, align 4 - %3 = load i8*, i8** %1, align 8 - %4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %2) - %5 = ptrtoint i8* %3 to i64 - %6 = sub i64 %2, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %7 = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %8 = icmp sle i64 %7, %6 - br i1 %8, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %9 = mul i64 %7, 8 - %10 = add i64 %5, %9 - %11 = inttoptr i64 %10 to i64* - %12 = load i64, i64* %11, align 4 - %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %4, i64 %7) - %14 = bitcast i8* %13 to i64* - store i64 %12, i64* %14, align 4 - br label %exiting__1 - -exiting__1: ; preds = %body__1 - %15 = add i64 %7, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 0 - %17 = getelementptr { i64, i8* }, { i64, i8* }* %doubleArray, i64 0, i32 1 - %18 = load i64, i64* %16, align 4 - %19 = load i8*, i8** %17, align 8 - %20 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %18) - %21 = ptrtoint i8* %19 to i64 - %22 = sub i64 %18, 1 - br label %header__2 - -header__2: ; preds = %exiting__2, %exit__1 - %23 = phi i64 [ 0, %exit__1 ], [ %31, %exiting__2 ] - %24 = icmp sle i64 %23, %22 - br i1 %24, label %body__2, label %exit__2 - -body__2: ; preds = %header__2 - %25 = mul i64 %23, 8 - %26 = add i64 %21, %25 - %27 = inttoptr i64 %26 to double* - %28 = load double, double* %27, align 8 - %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %20, i64 %23) - %30 = bitcast i8* %29 to double* - store double %28, double* %30, align 8 - br label %exiting__2 - -exiting__2: ; preds = %body__2 - %31 = add i64 %23, 1 - br label %header__2 - -exit__2: ; preds = %header__2 - %32 = trunc i8 %boolValue to i1 - %33 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 0 - %34 = getelementptr { i64, i8* }, { i64, i8* }* %boolArray, i64 0, i32 1 - %35 = load i64, i64* %33, align 4 - %36 = load i8*, i8** %34, align 8 - %37 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %35) - %38 = ptrtoint i8* %36 to i64 - %39 = sub i64 %35, 1 - br label %header__3 - -header__3: ; preds = %exiting__3, %exit__2 - %40 = phi i64 [ 0, %exit__2 ], [ %49, %exiting__3 ] - %41 = icmp sle i64 %40, %39 - br i1 %41, label %body__3, label %exit__3 - -body__3: ; preds = %header__3 - %42 = mul i64 %40, 1 - %43 = add i64 %38, %42 - %44 = inttoptr i64 %43 to i8* - %45 = load i8, i8* %44, align 1 - %46 = trunc i8 %45 to i1 - %47 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %37, i64 %40) - %48 = bitcast i8* %47 to i1* - store i1 %46, i1* %48, align 1 - br label %exiting__3 - -exiting__3: ; preds = %body__3 - %49 = add i64 %40, 1 - br label %header__3 - -exit__3: ; preds = %header__3 - %50 = trunc i8 %pauliValue to i2 - %51 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 0 - %52 = getelementptr { i64, i8* }, { i64, i8* }* %pauliArray, i64 0, i32 1 - %53 = load i64, i64* %51, align 4 - %54 = load i8*, i8** %52, align 8 - %55 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 %53) - %56 = ptrtoint i8* %54 to i64 - %57 = sub i64 %53, 1 - br label %header__4 - -header__4: ; preds = %exiting__4, %exit__3 - %58 = phi i64 [ 0, %exit__3 ], [ %67, %exiting__4 ] - %59 = icmp sle i64 %58, %57 - br i1 %59, label %body__4, label %exit__4 - -body__4: ; preds = %header__4 - %60 = mul i64 %58, 1 - %61 = add i64 %56, %60 - %62 = inttoptr i64 %61 to i8* - %63 = load i8, i8* %62, align 1 - %64 = trunc i8 %63 to i2 - %65 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %55, i64 %58) - %66 = bitcast i8* %65 to i2* - store i2 %64, i2* %66, align 1 - br label %exiting__4 - -exiting__4: ; preds = %body__4 - %67 = add i64 %58, 1 - br label %header__4 - -exit__4: ; preds = %header__4 - %68 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 0 - %69 = load i64, i64* %68, align 4 - %70 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 1 - %71 = load i64, i64* %70, align 4 - %72 = getelementptr { i64, i64, i64 }, { i64, i64, i64 }* %rangeValue, i64 0, i32 2 - %73 = load i64, i64* %72, align 4 - %74 = load %Range, %Range* @EmptyRange, align 4 - %75 = insertvalue %Range %74, i64 %69, 0 - %76 = insertvalue %Range %75, i64 %71, 1 - %77 = insertvalue %Range %76, i64 %73, 2 - %78 = icmp eq i8 %resultValue, 0 - %79 = call %Result* @__quantum__rt__result_get_zero() - %80 = call %Result* @__quantum__rt__result_get_one() - %81 = select i1 %78, %Result* %79, %Result* %80 - %82 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 0 - %83 = getelementptr { i64, i8* }, { i64, i8* }* %resultArray, i64 0, i32 1 - %84 = load i64, i64* %82, align 4 - %85 = load i8*, i8** %83, align 8 - %86 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 %84) - %87 = ptrtoint i8* %85 to i64 - %88 = sub i64 %84, 1 - br label %header__5 - -header__5: ; preds = %exiting__5, %exit__4 - %89 = phi i64 [ 0, %exit__4 ], [ %101, %exiting__5 ] - %90 = icmp sle i64 %89, %88 - br i1 %90, label %body__5, label %exit__5 - -body__5: ; preds = %header__5 - %91 = mul i64 %89, 1 - %92 = add i64 %87, %91 - %93 = inttoptr i64 %92 to i8* - %94 = load i8, i8* %93, align 1 - %95 = icmp eq i8 %94, 0 - %96 = call %Result* @__quantum__rt__result_get_zero() - %97 = call %Result* @__quantum__rt__result_get_one() - %98 = select i1 %95, %Result* %96, %Result* %97 - %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %89) - %100 = bitcast i8* %99 to %Result** - store %Result* %98, %Result** %100, align 8 - br label %exiting__5 - -exiting__5: ; preds = %body__5 - %101 = add i64 %89, 1 - br label %header__5 - -exit__5: ; preds = %header__5 - %102 = call %String* @__quantum__rt__string_create(i8* %stringValue) - call void @Quantum__StandaloneSupportedInputs__ExerciseInputs__body(i64 %intValue, %Array* %4, double %doubleValue, %Array* %20, i1 %32, %Array* %37, i2 %50, %Array* %55, %Range %77, %Result* %81, %Array* %86, %String* %102) - %103 = call %String* @__quantum__rt__string_create(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @38, i32 0, i32 0)) - call void @__quantum__rt__message(%String* %103) - call void @__quantum__rt__array_update_reference_count(%Array* %4, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %20, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %37, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %55, i32 -1) - %104 = sub i64 %84, 1 - br label %header__6 - -header__6: ; preds = %exiting__6, %exit__5 - %105 = phi i64 [ 0, %exit__5 ], [ %110, %exiting__6 ] - %106 = icmp sle i64 %105, %104 - br i1 %106, label %body__6, label %exit__6 - -body__6: ; preds = %header__6 - %107 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %86, i64 %105) - %108 = bitcast i8* %107 to %Result** - %109 = load %Result*, %Result** %108, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 -1) - br label %exiting__6 - -exiting__6: ; preds = %body__6 - %110 = add i64 %105, 1 - br label %header__6 - -exit__6: ; preds = %header__6 - call void @__quantum__rt__array_update_reference_count(%Array* %86, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %102, i32 -1) - call void @__quantum__rt__string_update_reference_count(%String* %103, i32 -1) - ret void -} - -attributes #0 = { "InteropFriendly" } -attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll b/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll deleted file mode 100644 index a86f7f54e43..00000000000 --- a/src/QirRuntime/test/FullstateSimulator/qsharp/qir/qir-test-simulator.ll +++ /dev/null @@ -1,1387 +0,0 @@ - -%Range = type { i64, i64, i64 } -%Tuple = type opaque -%Callable = type opaque -%Array = type opaque -%Qubit = type opaque -%Result = type opaque -%String = type opaque - -@PauliI = constant i2 0 -@PauliX = constant i2 1 -@PauliY = constant i2 -1 -@PauliZ = constant i2 -2 -@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@Microsoft__Quantum__Intrinsic__X = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__Y = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__Z = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__H = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__H__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__S = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__T = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__T__ctladj__wrapper] -@Microsoft__Quantum__Intrinsic__R = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__R__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*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__1__RefCount, void (%Tuple*, i32)* @MemoryManagement__1__AliasCount] - -@Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__Interop = alias i64 (), i64 ()* @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body - -define i64 @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body() #0 { -entry: - %res = alloca i64, align 8 - store i64 0, i64* %res, align 4 - %0 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__X, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %1 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %0) - store i64 %1, i64* %res, align 4 - %2 = icmp ne i64 %1, 0 - br i1 %2, label %then0__1, label %continue__1 - -then0__1: ; preds = %entry - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - ret i64 %1 - -continue__1: ; preds = %entry - %3 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Y, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %4 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %3) - store i64 %4, i64* %res, align 4 - %5 = icmp ne i64 %4, 0 - br i1 %5, label %then0__2, label %continue__2 - -then0__2: ; preds = %continue__1 - %6 = add i64 10, %4 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - ret i64 %6 - -continue__2: ; preds = %continue__1 - %7 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Z, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %8 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %7) - store i64 %8, i64* %res, align 4 - %9 = icmp ne i64 %8, 0 - br i1 %9, label %then0__3, label %continue__3 - -then0__3: ; preds = %continue__2 - %10 = add i64 20, %8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - ret i64 %10 - -continue__3: ; preds = %continue__2 - %11 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__H, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %12 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %11) - store i64 %12, i64* %res, align 4 - %13 = icmp ne i64 %12, 0 - br i1 %13, label %then0__4, label %continue__4 - -then0__4: ; preds = %continue__3 - %14 = add i64 30, %12 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - ret i64 %14 - -continue__4: ; preds = %continue__3 - %15 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__S, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %16 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %15) - store i64 %16, i64* %res, align 4 - %17 = icmp ne i64 %16, 0 - br i1 %17, label %then0__5, label %continue__5 - -then0__5: ; preds = %continue__4 - %18 = add i64 40, %16 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - ret i64 %18 - -continue__5: ; preds = %continue__4 - %19 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__T, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %20 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %19) - store i64 %20, i64* %res, align 4 - %21 = icmp ne i64 %20, 0 - br i1 %21, label %then0__6, label %continue__6 - -then0__6: ; preds = %continue__5 - %22 = add i64 50, %20 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) - ret i64 %22 - -continue__6: ; preds = %continue__5 - %23 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Callable*, i2, double }* getelementptr ({ %Callable*, i2, double }, { %Callable*, i2, double }* null, i32 1) to i64)) - %24 = bitcast %Tuple* %23 to { %Callable*, i2, double }* - %25 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 0 - %26 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 1 - %27 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %24, i32 0, i32 2 - %28 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__R, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %29 = load i2, i2* @PauliX, align 1 - store %Callable* %28, %Callable** %25, align 8 - store i2 %29, i2* %26, align 1 - store double 4.200000e-01, double* %27, align 8 - %30 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %23) - %31 = call i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %30) - store i64 %31, i64* %res, align 4 - %32 = icmp ne i64 %31, 0 - br i1 %32, label %then0__7, label %continue__7 - -then0__7: ; preds = %continue__6 - %33 = add i64 60, %31 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) - ret i64 %33 - -continue__7: ; preds = %continue__6 - %targets = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) - %ctls = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %paulis = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) - %34 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %35 = bitcast i8* %34 to i2* - %36 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %37 = bitcast i8* %36 to i2* - %38 = load i2, i2* @PauliX, align 1 - %39 = load i2, i2* @PauliY, align 1 - store i2 %38, i2* %35, align 1 - store i2 %39, i2* %37, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) - call void @__quantum__qis__exp__body(%Array* %paulis, double 4.200000e-01, %Array* %targets) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %paulis, i32 -1) - %paulis__1 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) - %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__1, i64 0) - %41 = bitcast i8* %40 to i2* - %42 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__1, i64 1) - %43 = bitcast i8* %42 to i2* - %44 = load i2, i2* @PauliX, align 1 - %45 = load i2, i2* @PauliY, align 1 - store i2 %44, i2* %41, align 1 - store i2 %45, i2* %43, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__1, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) - call void @__quantum__qis__exp__adj(%Array* %paulis__1, double 4.200000e-01, %Array* %targets) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__1, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %paulis__1, i32 -1) - %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %targets, i64 0) - %47 = bitcast i8* %46 to %Qubit** - %48 = load %Qubit*, %Qubit** %47, align 8 - %49 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %48) - %50 = call %Result* @__quantum__rt__result_get_zero() - %51 = call i1 @__quantum__rt__result_equal(%Result* %49, %Result* %50) - %52 = xor i1 %51, true - br i1 %52, label %then0__8, label %continue__8 - -then0__8: ; preds = %continue__7 - store i64 1, i64* %res, align 4 - br label %continue__8 - -continue__8: ; preds = %then0__8, %continue__7 - %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %54 = bitcast i8* %53 to %Qubit** - %qubit = load %Qubit*, %Qubit** %54, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit) - %55 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) - %56 = bitcast i8* %55 to %Qubit** - %qubit__1 = load %Qubit*, %Qubit** %56, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %paulis__2 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) - %57 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__2, i64 0) - %58 = bitcast i8* %57 to i2* - %59 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__2, i64 1) - %60 = bitcast i8* %59 to i2* - %61 = load i2, i2* @PauliX, align 1 - %62 = load i2, i2* @PauliY, align 1 - store i2 %61, i2* %58, align 1 - store i2 %62, i2* %60, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__2, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) - %63 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) - %64 = bitcast %Tuple* %63 to { %Array*, double, %Array* }* - %65 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 0 - %66 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 1 - %67 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %64, i32 0, i32 2 - store %Array* %paulis__2, %Array** %65, align 8 - store double 4.200000e-01, double* %66, align 8 - store %Array* %targets, %Array** %67, align 8 - call void @__quantum__qis__exp__ctl(%Array* %ctls, { %Array*, double, %Array* }* %64) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__2, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %paulis__2, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %63, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %paulis__3 = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) - %68 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__3, i64 0) - %69 = bitcast i8* %68 to i2* - %70 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis__3, i64 1) - %71 = bitcast i8* %70 to i2* - %72 = load i2, i2* @PauliX, align 1 - %73 = load i2, i2* @PauliY, align 1 - store i2 %72, i2* %69, align 1 - store i2 %73, i2* %71, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__3, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 1) - %74 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) - %75 = bitcast %Tuple* %74 to { %Array*, double, %Array* }* - %76 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 0 - %77 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 1 - %78 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %75, i32 0, i32 2 - store %Array* %paulis__3, %Array** %76, align 8 - store double 4.200000e-01, double* %77, align 8 - store %Array* %targets, %Array** %78, align 8 - call void @__quantum__qis__exp__ctladj(%Array* %ctls, { %Array*, double, %Array* }* %75) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis__3, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %paulis__3, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %74, i32 -1) - %79 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %80 = bitcast i8* %79 to %Qubit** - %qubit__2 = load %Qubit*, %Qubit** %80, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__2) - %81 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) - %82 = bitcast i8* %81 to %Qubit** - %qubit__3 = load %Qubit*, %Qubit** %82, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__3) - %83 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %targets, i64 0) - %84 = bitcast i8* %83 to %Qubit** - %85 = load %Qubit*, %Qubit** %84, align 8 - %86 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %85) - %87 = call %Result* @__quantum__rt__result_get_zero() - %88 = call i1 @__quantum__rt__result_equal(%Result* %86, %Result* %87) - %89 = xor i1 %88, true - br i1 %89, label %then0__9, label %continue__9 - -then0__9: ; preds = %continue__8 - store i64 2, i64* %res, align 4 - br label %continue__9 - -continue__9: ; preds = %then0__9, %continue__8 - call void @__quantum__rt__array_update_alias_count(%Array* %targets, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %49, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %86, i32 -1) - call void @__quantum__rt__qubit_release_array(%Array* %targets) - call void @__quantum__rt__qubit_release_array(%Array* %ctls) - %90 = load i64, i64* %res, align 4 - %91 = icmp ne i64 %90, 0 - br i1 %91, label %then0__10, label %continue__10 - -then0__10: ; preds = %continue__9 - %92 = add i64 70, %90 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) - ret i64 %92 - -continue__10: ; preds = %continue__9 - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 3) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) - %93 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %94 = bitcast i8* %93 to %Qubit** - %qubit__4 = load %Qubit*, %Qubit** %94, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__4) - %95 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %96 = bitcast i8* %95 to %Qubit** - %qubit__5 = load %Qubit*, %Qubit** %96, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__5) - %bases = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 3) - %97 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 0) - %98 = bitcast i8* %97 to i2* - %99 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 1) - %100 = bitcast i8* %99 to i2* - %101 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %bases, i64 2) - %102 = bitcast i8* %101 to i2* - %103 = load i2, i2* @PauliX, align 1 - %104 = load i2, i2* @PauliZ, align 1 - %105 = load i2, i2* @PauliX, align 1 - store i2 %103, i2* %98, align 1 - store i2 %104, i2* %100, align 1 - store i2 %105, i2* %102, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) - %106 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qs) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) - %107 = call %Result* @__quantum__rt__result_get_zero() - %108 = call i1 @__quantum__rt__result_equal(%Result* %106, %Result* %107) - %109 = xor i1 %108, true - br i1 %109, label %then0__11, label %continue__11 - -then0__11: ; preds = %continue__10 - store i64 80, i64* %res, align 4 - br label %continue__11 - -continue__11: ; preds = %then0__11, %continue__10 - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %106, i32 -1) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - %110 = load i64, i64* %res, align 4 - call void @__quantum__rt__capture_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %7, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %11, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %19, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %30, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %30, i32 -1) - ret i64 %110 -} - -define i64 @Microsoft__Quantum__Testing__QIR__InvokeAllVariants__body(%Callable* %op) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 1) - %res = alloca i64, align 8 - store i64 0, i64* %res, align 4 - %target = call %Qubit* @__quantum__rt__qubit_allocate() - %ctls = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Qubit* }* - %2 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %1, i32 0, i32 0 - store %Qubit* %target, %Qubit** %2, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %op, %Tuple* %0, %Tuple* null) - %3 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %3) - %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %5 = bitcast %Tuple* %4 to { %Qubit* }* - %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 - store %Qubit* %target, %Qubit** %6, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %3, %Tuple* %4, %Tuple* null) - %7 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %target) - %8 = call %Result* @__quantum__rt__result_get_zero() - %9 = call i1 @__quantum__rt__result_equal(%Result* %7, %Result* %8) - %10 = xor i1 %9, true - br i1 %10, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - store i64 1, i64* %res, align 4 - br label %continue__1 - -else__1: ; preds = %entry - %11 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %12 = bitcast i8* %11 to %Qubit** - %qubit = load %Qubit*, %Qubit** %12, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit) - %13 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) - %14 = bitcast i8* %13 to %Qubit** - %qubit__1 = load %Qubit*, %Qubit** %14, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__1) - %15 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %15) - %16 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %17 = bitcast %Tuple* %16 to { %Array*, %Qubit* }* - %18 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %17, i32 0, i32 0 - %19 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %17, i32 0, i32 1 - store %Array* %ctls, %Array** %18, align 8 - store %Qubit* %target, %Qubit** %19, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %15, %Tuple* %16, %Tuple* null) - %20 = call %Callable* @__quantum__rt__callable_copy(%Callable* %op, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %20, i32 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %20) - call void @__quantum__rt__callable_make_adjoint(%Callable* %20) - %21 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %22 = bitcast %Tuple* %21 to { %Array*, %Qubit* }* - %23 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %22, i32 0, i32 0 - %24 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %22, i32 0, i32 1 - store %Array* %ctls, %Array** %23, align 8 - store %Qubit* %target, %Qubit** %24, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %20, %Tuple* %21, %Tuple* null) - %25 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %target) - %26 = call %Result* @__quantum__rt__result_get_zero() - %27 = call i1 @__quantum__rt__result_equal(%Result* %25, %Result* %26) - %28 = xor i1 %27, true - br i1 %28, label %then0__2, label %else__2 - -then0__2: ; preds = %else__1 - store i64 2, i64* %res, align 4 - br label %continue__2 - -else__2: ; preds = %else__1 - %29 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %30 = bitcast i8* %29 to %Qubit** - %qubit__2 = load %Qubit*, %Qubit** %30, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__2) - %31 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 1) - %32 = bitcast i8* %31 to %Qubit** - %qubit__3 = load %Qubit*, %Qubit** %32, align 8 - call void @__quantum__qis__h__body(%Qubit* %qubit__3) - br label %continue__2 - -continue__2: ; preds = %else__2, %then0__2 - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %16, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %20, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %20, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %21, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %25, i32 -1) - br label %continue__1 - -continue__1: ; preds = %continue__2, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %0, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %3, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %7, i32 -1) - call void @__quantum__rt__qubit_release(%Qubit* %target) - call void @__quantum__rt__qubit_release_array(%Array* %ctls) - %33 = load i64, i64* %res, align 4 - call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 -1) - ret i64 %33 -} - -define void @Microsoft__Quantum__Intrinsic__X__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) - -declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) - -define void @Microsoft__Quantum__Intrinsic__Y__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -declare %Tuple* @__quantum__rt__tuple_create(i64) - -define void @Microsoft__Quantum__Intrinsic__R__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i2, double, %Qubit* }* - %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 - %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 - %4 = load i2, i2* %1, align 1 - %5 = load double, double* %2, align 8 - %6 = load %Qubit*, %Qubit** %3, align 8 - call void @Microsoft__Quantum__Intrinsic__R__body(i2 %4, double %5, %Qubit* %6) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__R__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { i2, double, %Qubit* }* - %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 - %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 - %4 = load i2, i2* %1, align 1 - %5 = load double, double* %2, align 8 - %6 = load %Qubit*, %Qubit** %3, align 8 - call void @Microsoft__Quantum__Intrinsic__R__adj(i2 %4, double %5, %Qubit* %6) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__R__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { i2, double, %Qubit* }* }* - %1 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load { i2, double, %Qubit* }*, { i2, double, %Qubit* }** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__R__ctl(%Array* %3, { i2, double, %Qubit* }* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__R__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, { i2, double, %Qubit* }* }* - %1 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load { i2, double, %Qubit* }*, { i2, double, %Qubit* }** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__R__ctladj(%Array* %3, { i2, double, %Qubit* }* %4) - ret void -} - -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 1 - %2 = load i2, i2* %1, align 1 - %3 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 2 - %4 = load double, double* %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 - %7 = load %Qubit*, %Qubit** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { i2, double, %Qubit* }* - %10 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 2 - store i2 %2, i2* %10, align 1 - store double %4, double* %11, align 8 - store %Qubit* %7, %Qubit** %12, align 8 - %13 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - ret void -} - -define void @Lifted__PartialApplication__1__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 1 - %2 = load i2, i2* %1, align 1 - %3 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 2 - %4 = load double, double* %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %6 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %5, i32 0, i32 0 - %7 = load %Qubit*, %Qubit** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %9 = bitcast %Tuple* %8 to { i2, double, %Qubit* }* - %10 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %9, i32 0, i32 2 - store i2 %2, i2* %10, align 1 - store double %4, double* %11, align 8 - store %Qubit* %7, %Qubit** %12, align 8 - %13 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - %15 = call %Callable* @__quantum__rt__callable_copy(%Callable* %14, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %15) - call void @__quantum__rt__callable_invoke(%Callable* %15, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %15, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %15, i32 -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 inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %6 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 1 - %7 = load i2, i2* %6, align 1 - %8 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 2 - %9 = load double, double* %8, align 8 - %10 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %11 = bitcast %Tuple* %10 to { i2, double, %Qubit* }* - %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 0 - %13 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 1 - %14 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 2 - store i2 %7, i2* %12, align 1 - store double %9, double* %13, align 8 - store %Qubit* %4, %Qubit** %14, align 8 - %15 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %16 = bitcast %Tuple* %15 to { %Array*, { i2, double, %Qubit* }* }* - %17 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 0 - %18 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 1 - store %Array* %3, %Array** %17, align 8 - store { i2, double, %Qubit* }* %11, { i2, double, %Qubit* }** %18, align 8 - %19 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 0 - %20 = load %Callable*, %Callable** %19, align 8 - %21 = call %Callable* @__quantum__rt__callable_copy(%Callable* %20, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 1) - call void @__quantum__rt__callable_make_controlled(%Callable* %21) - call void @__quantum__rt__callable_invoke(%Callable* %21, %Tuple* %15, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %10, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %21, i32 -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 inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - %5 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %6 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 1 - %7 = load i2, i2* %6, align 1 - %8 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 2 - %9 = load double, double* %8, align 8 - %10 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %11 = bitcast %Tuple* %10 to { i2, double, %Qubit* }* - %12 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 0 - %13 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 1 - %14 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %11, i32 0, i32 2 - store i2 %7, i2* %12, align 1 - store double %9, double* %13, align 8 - store %Qubit* %4, %Qubit** %14, align 8 - %15 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %16 = bitcast %Tuple* %15 to { %Array*, { i2, double, %Qubit* }* }* - %17 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 0 - %18 = getelementptr inbounds { %Array*, { i2, double, %Qubit* }* }, { %Array*, { i2, double, %Qubit* }* }* %16, i32 0, i32 1 - store %Array* %3, %Array** %17, align 8 - store { i2, double, %Qubit* }* %11, { i2, double, %Qubit* }** %18, align 8 - %19 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %5, i32 0, i32 0 - %20 = load %Callable*, %Callable** %19, align 8 - %21 = call %Callable* @__quantum__rt__callable_copy(%Callable* %20, i1 false) - call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 1) - call void @__quantum__rt__callable_make_adjoint(%Callable* %21) - call void @__quantum__rt__callable_make_controlled(%Callable* %21) - call void @__quantum__rt__callable_invoke(%Callable* %21, %Tuple* %15, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %10, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %15, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %21, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %21, i32 -1) - ret void -} - -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, i2, double }* - %1 = getelementptr inbounds { %Callable*, i2, double }, { %Callable*, i2, double }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare void @__quantum__rt__array_update_alias_count(%Array*, i32) - -declare %Array* @__quantum__rt__array_create_1d(i32, i64) - -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) - -declare void @__quantum__qis__exp__body(%Array*, double, %Array*) - -declare void @__quantum__rt__array_update_reference_count(%Array*, i32) - -declare void @__quantum__qis__exp__adj(%Array*, double, %Array*) - -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qubit) { -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, align 1 - store i2 %2, i2* %1, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 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* %qubit, %Qubit** %4, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i32 -1) - ret %Result* %5 -} - -declare %Result* @__quantum__rt__result_get_zero() - -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) - -declare void @__quantum__qis__h__body(%Qubit*) - -declare void @__quantum__qis__exp__ctl(%Array*, { %Array*, double, %Array* }*) - -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) - -declare void @__quantum__qis__exp__ctladj(%Array*, { %Array*, double, %Array* }*) - -declare void @__quantum__rt__result_update_reference_count(%Result*, i32) - -declare void @__quantum__rt__qubit_release_array(%Array*) - -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) - -declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) - -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__qubit_release(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__Exp__body(%Array* %paulis, double %theta, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - call void @__quantum__qis__exp__body(%Array* %paulis, double %theta, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Exp__adj(%Array* %paulis, double %theta, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - call void @__quantum__qis__exp__adj(%Array* %paulis, double %theta, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Exp__ctl(%Array* %__controlQubits__, { %Array*, double, %Array* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %1 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 0 - %paulis = load %Array*, %Array** %1, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - %2 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 1 - %theta = load double, double* %2, align 8 - %3 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 2 - %qubits = load %Array*, %Array** %3, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) - %5 = bitcast %Tuple* %4 to { %Array*, double, %Array* }* - %6 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 0 - %7 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 1 - %8 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 2 - store %Array* %paulis, %Array** %6, align 8 - store double %theta, double* %7, align 8 - store %Array* %qubits, %Array** %8, align 8 - call void @__quantum__qis__exp__ctl(%Array* %__controlQubits__, { %Array*, double, %Array* }* %5) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Exp__ctladj(%Array* %__controlQubits__, { %Array*, double, %Array* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %1 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 0 - %paulis = load %Array*, %Array** %1, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - %2 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 1 - %theta = load double, double* %2, align 8 - %3 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %0, i32 0, i32 2 - %qubits = load %Array*, %Array** %3, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ %Array*, double, %Array* }* getelementptr ({ %Array*, double, %Array* }, { %Array*, double, %Array* }* null, i32 1) to i64)) - %5 = bitcast %Tuple* %4 to { %Array*, double, %Array* }* - %6 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 0 - %7 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 1 - %8 = getelementptr inbounds { %Array*, double, %Array* }, { %Array*, double, %Array* }* %5, i32 0, i32 2 - store %Array* %paulis, %Array** %6, align 8 - store double %theta, double* %7, align 8 - store %Array* %qubits, %Array** %8, align 8 - call void @__quantum__qis__exp__ctladj(%Array* %__controlQubits__, { %Array*, double, %Array* }* %5) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__t__body(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__t__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__t__adj(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__t__adj(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__t__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__t__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__t__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__t__ctladj(%Array*, %Qubit*) - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -define void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__z__body(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__z__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__z__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__z__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__z__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__x__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__x__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__x__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__x__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__h__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__h__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__h__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__s__body(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__s__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__s__adj(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__s__adj(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__s__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__s__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__s__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__s__ctladj(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__R__body(i2 %pauli, double %theta, %Qubit* %qubit) { -entry: - call void @__quantum__qis__r__body(i2 %pauli, double %theta, %Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__r__body(i2, double, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__R__adj(i2 %pauli, double %theta, %Qubit* %qubit) { -entry: - call void @__quantum__qis__r__adj(i2 %pauli, double %theta, %Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__r__adj(i2, double, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__R__ctl(%Array* %__controlQubits__, { i2, double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 - %pauli = load i2, i2* %1, align 1 - %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 - %theta = load double, double* %2, align 8 - %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 - %qubit = load %Qubit*, %Qubit** %3, align 8 - %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %5 = bitcast %Tuple* %4 to { i2, double, %Qubit* }* - %6 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 0 - %7 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 1 - %8 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 2 - store i2 %pauli, i2* %6, align 1 - store double %theta, double* %7, align 8 - store %Qubit* %qubit, %Qubit** %8, align 8 - call void @__quantum__qis__r__ctl(%Array* %__controlQubits__, { i2, double, %Qubit* }* %5) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) - ret void -} - -declare void @__quantum__qis__r__ctl(%Array*, { i2, double, %Qubit* }*) - -define void @Microsoft__Quantum__Intrinsic__R__ctladj(%Array* %__controlQubits__, { i2, double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %1 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 0 - %pauli = load i2, i2* %1, align 1 - %2 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 1 - %theta = load double, double* %2, align 8 - %3 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %0, i32 0, i32 2 - %qubit = load %Qubit*, %Qubit** %3, align 8 - %4 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint ({ i2, double, %Qubit* }* getelementptr ({ i2, double, %Qubit* }, { i2, double, %Qubit* }* null, i32 1) to i64)) - %5 = bitcast %Tuple* %4 to { i2, double, %Qubit* }* - %6 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 0 - %7 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 1 - %8 = getelementptr inbounds { i2, double, %Qubit* }, { i2, double, %Qubit* }* %5, i32 0, i32 2 - store i2 %pauli, i2* %6, align 1 - store double %theta, double* %7, align 8 - store %Qubit* %qubit, %Qubit** %8, align 8 - call void @__quantum__qis__r__ctladj(%Array* %__controlQubits__, { i2, double, %Qubit* }* %5) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %4, i32 -1) - ret void -} - -declare void @__quantum__qis__r__ctladj(%Array*, { i2, double, %Qubit* }*) - -define void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__y__body(%Qubit* %qubit) - ret void -} - -declare void @__quantum__qis__y__body(%Qubit*) - -define void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__y__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__y__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__y__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS() #1 { -entry: - %0 = call i64 @Microsoft__Quantum__Testing__QIR__Test_Simulator_QIS__body() - %1 = call %String* @__quantum__rt__int_to_string(i64 %0) - call void @__quantum__rt__message(%String* %1) - call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) - ret void -} - -declare void @__quantum__rt__message(%String*) - -declare %String* @__quantum__rt__int_to_string(i64) - -declare void @__quantum__rt__string_update_reference_count(%String*, i32) - -declare void @__quantum__rt__tuple_update_alias_count(%Tuple*, i32) - -attributes #0 = { "InteropFriendly" } -attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll b/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll deleted file mode 100644 index 227d27613fc..00000000000 --- a/src/QirRuntime/test/QIR-dynamic/qsharp/qir/qir-test-random.ll +++ /dev/null @@ -1,159 +0,0 @@ - -%Range = type { i64, i64, i64 } -%Qubit = type opaque -%Result = type opaque -%Array = type opaque -%String = type opaque - -@PauliI = constant i2 0 -@PauliX = constant i2 1 -@PauliY = constant i2 -1 -@PauliZ = constant i2 -2 -@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } - -@Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__Interop = alias i64 (), i64 ()* @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body - -define i64 @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body() #0 { -entry: - %randomNumber = alloca i64, align 8 - store i64 0, i64* %randomNumber, align 4 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 1, %entry ], [ %8, %exiting__1 ] - %0 = icmp sle i64 %i, 64 - br i1 %0, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %q = call %Qubit* @__quantum__rt__qubit_allocate() - call void @__quantum__qis__h__body(%Qubit* %q) - %1 = load i64, i64* %randomNumber, align 4 - %2 = shl i64 %1, 1 - store i64 %2, i64* %randomNumber, align 4 - %3 = call %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %q) - %4 = call %Result* @__quantum__rt__result_get_one() - %5 = call i1 @__quantum__rt__result_equal(%Result* %3, %Result* %4) - br i1 %5, label %then0__1, label %continue__1 - -then0__1: ; preds = %body__1 - %6 = load i64, i64* %randomNumber, align 4 - %7 = add i64 %6, 1 - store i64 %7, i64* %randomNumber, align 4 - br label %continue__1 - -continue__1: ; preds = %then0__1, %body__1 - call void @__quantum__rt__result_update_reference_count(%Result* %3, i32 -1) - call void @__quantum__rt__qubit_release(%Qubit* %q) - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %8 = add i64 %i, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %9 = load i64, i64* %randomNumber, align 4 - ret i64 %9 -} - -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare void @__quantum__qis__h__body(%Qubit*) - -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qubit) { -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, align 1 - store i2 %2, i2* %1, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 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* %qubit, %Qubit** %4, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %5 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qubits, i32 -1) - ret %Result* %5 -} - -declare %Result* @__quantum__rt__result_get_one() - -declare i1 @__quantum__rt__result_equal(%Result*, %Result*) - -declare void @__quantum__rt__result_update_reference_count(%Result*, i32) - -declare void @__quantum__rt__qubit_release(%Qubit*) - -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*, i32) - -declare %Result* @__quantum__qis__measure__body(%Array*, %Array*) - -declare void @__quantum__rt__array_update_reference_count(%Array*, i32) - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %bases, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__measure__body(%Array* %bases, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %bases, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qubit) { -entry: - call void @__quantum__qis__h__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qubit) { -entry: - call void @__quantum__qis__h__body(%Qubit* %qubit) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -declare void @__quantum__qis__h__ctl(%Array*, %Qubit*) - -define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qubit) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__h__ctl(%Array* %__controlQubits__, %Qubit* %qubit) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator() #1 { -entry: - %0 = call i64 @Microsoft__Quantum__Testing__QIR__QuantumRandomNumberGenerator__body() - %1 = call %String* @__quantum__rt__int_to_string(i64 %0) - call void @__quantum__rt__message(%String* %1) - call void @__quantum__rt__string_update_reference_count(%String* %1, i32 -1) - ret void -} - -declare void @__quantum__rt__message(%String*) - -declare %String* @__quantum__rt__int_to_string(i64) - -declare void @__quantum__rt__string_update_reference_count(%String*, i32) - -attributes #0 = { "InteropFriendly" } -attributes #1 = { "EntryPoint" } diff --git a/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll b/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll deleted file mode 100644 index 31a343b650f..00000000000 --- a/src/QirRuntime/test/QIR-tracer/qsharp/qir/tracer-qir.ll +++ /dev/null @@ -1,2080 +0,0 @@ - -%Range = type { i64, i64, i64 } -%Tuple = type opaque -%Result = type opaque -%Qubit = type opaque -%Array = type opaque -%Callable = type opaque -%String = type opaque - -@PauliI = constant i2 0 -@PauliX = constant i2 1 -@PauliY = constant i2 -1 -@PauliZ = constant i2 -2 -@EmptyRange = internal constant %Range { i64 0, i64 1, i64 -1 } -@Microsoft__Quantum__Testing__Tracer__Delay = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Testing__Tracer__Delay__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@Microsoft__Quantum__Intrinsic__X = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper] -@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*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__1__RefCount, void (%Tuple*, i32)* @MemoryManagement__1__AliasCount] -@Microsoft__Quantum__Intrinsic__Y = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper] -@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] -@Microsoft__Quantum__Intrinsic__Z = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper] -@PartialApplication__3 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__3__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@Microsoft__Quantum__Intrinsic__S = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__adj__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctl__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper] -@PartialApplication__4 = constant [4 x void (%Tuple*, %Tuple*, %Tuple*)*] [void (%Tuple*, %Tuple*, %Tuple*)* @Lifted__PartialApplication__4__body__wrapper, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null, void (%Tuple*, %Tuple*, %Tuple*)* null] -@MemoryManagement__2 = constant [2 x void (%Tuple*, i32)*] [void (%Tuple*, i32)* @MemoryManagement__2__RefCount, void (%Tuple*, i32)* @MemoryManagement__2__AliasCount] - -define %Result* @Microsoft__Quantum__Instructions__Mx__body(%Qubit* %qb) { -entry: - %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb) - ret %Result* %0 -} - -declare %Result* @__quantum__qis__single_qubit_measure(i64, i64, %Qubit*) - -define %Result* @Microsoft__Quantum__Instructions__Mxx__body(%Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -declare void @__quantum__rt__array_update_alias_count(%Array*, i32) - -declare %Result* @__quantum__qis__joint_measure(i64, i64, %Array*) - -define %Result* @Microsoft__Quantum__Instructions__Mxz__body(%Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -define %Result* @Microsoft__Quantum__Instructions__Mz__body(%Qubit* %qb) { -entry: - %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb) - ret %Result* %0 -} - -define %Result* @Microsoft__Quantum__Instructions__Mzx__body(%Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -define %Result* @Microsoft__Quantum__Instructions__Mzz__body(%Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %0 -} - -define void @Microsoft__Quantum__Instructions__Sx__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 17, i64 1, %Qubit* %qb) - ret void -} - -declare void @__quantum__qis__single_qubit_op(i64, i64, %Qubit*) - -define void @Microsoft__Quantum__Instructions__Sx__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 17, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Sx__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 18, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -declare void @__quantum__qis__single_qubit_op_ctl(i64, i64, %Array*, %Qubit*) - -define void @Microsoft__Quantum__Instructions__Sx__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 18, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Sz__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Sz__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Sz__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Sz__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tx__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 13, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tx__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 13, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tx__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 14, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tx__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 14, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tz__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tz__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tz__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Instructions__Tz__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__ApplyConditionallyIntrinsic__body(%Array* %measurementResults, %Array* %resultsValues, %Callable* %onEqualOp, %Callable* %onNonEqualOp) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %measurementResults, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %resultsValues, i32 1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onEqualOp, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onEqualOp, i32 1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onNonEqualOp, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onNonEqualOp, i32 1) - call void @__quantum__qis__apply_conditionally(%Array* %measurementResults, %Array* %resultsValues, %Callable* %onEqualOp, %Callable* %onNonEqualOp) - call void @__quantum__rt__array_update_alias_count(%Array* %measurementResults, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %resultsValues, i32 -1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onEqualOp, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onEqualOp, i32 -1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onNonEqualOp, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onNonEqualOp, i32 -1) - ret void -} - -declare void @__quantum__rt__capture_update_alias_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_alias_count(%Callable*, i32) - -declare void @__quantum__qis__apply_conditionally(%Array*, %Array*, %Callable*, %Callable*) - -define void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %measurementResult, %Callable* %onResultZeroOp, %Callable* %onResultOneOp) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultZeroOp, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultZeroOp, i32 1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultOneOp, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultOneOp, i32 1) - %0 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %1 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 0) - %2 = bitcast i8* %1 to %Result** - store %Result* %measurementResult, %Result** %2, align 8 - %3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 0) - %5 = bitcast i8* %4 to %Result** - %6 = call %Result* @__quantum__rt__result_get_zero() - store %Result* %6, %Result** %5, align 8 - call void @__quantum__qis__apply_conditionally(%Array* %0, %Array* %3, %Callable* %onResultZeroOp, %Callable* %onResultOneOp) - call void @__quantum__rt__result_update_reference_count(%Result* %measurementResult, i32 1) - call void @__quantum__rt__result_update_reference_count(%Result* %6, i32 1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultZeroOp, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultZeroOp, i32 -1) - call void @__quantum__rt__capture_update_alias_count(%Callable* %onResultOneOp, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %onResultOneOp, i32 -1) - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %7 = phi i64 [ 0, %entry ], [ %12, %exiting__1 ] - %8 = icmp sle i64 %7, 0 - br i1 %8, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %0, i64 %7) - %10 = bitcast i8* %9 to %Result** - %11 = load %Result*, %Result** %10, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %11, i32 -1) - br label %exiting__1 - -exiting__1: ; preds = %body__1 - %12 = add i64 %7, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - call void @__quantum__rt__array_update_reference_count(%Array* %0, i32 -1) - br label %header__2 - -header__2: ; preds = %exiting__2, %exit__1 - %13 = phi i64 [ 0, %exit__1 ], [ %18, %exiting__2 ] - %14 = icmp sle i64 %13, 0 - br i1 %14, label %body__2, label %exit__2 - -body__2: ; preds = %header__2 - %15 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 %13) - %16 = bitcast i8* %15 to %Result** - %17 = load %Result*, %Result** %16, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 -1) - br label %exiting__2 - -exiting__2: ; preds = %body__2 - %18 = add i64 %13, 1 - br label %header__2 - -exit__2: ; preds = %header__2 - call void @__quantum__rt__array_update_reference_count(%Array* %3, i32 -1) - ret void -} - -declare %Array* @__quantum__rt__array_create_1d(i32, i64) - -declare i8* @__quantum__rt__array_get_element_ptr_1d(%Array*, i64) - -declare %Result* @__quantum__rt__result_get_zero() - -declare void @__quantum__rt__result_update_reference_count(%Result*, i32) - -declare void @__quantum__rt__array_update_reference_count(%Array*, i32) - -define void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %control, %Qubit* %target) { -entry: - %ctls = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %1 = bitcast i8* %0 to %Qubit** - store %Qubit* %control, %Qubit** %1, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - br i1 true, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %target) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %target) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__CNOT__adj(%Qubit* %control, %Qubit* %target) { -entry: - call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %control, %Qubit* %target) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__CNOT__ctl(%Array* %ctls, { %Qubit*, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 0 - %control = load %Qubit*, %Qubit** %1, align 8 - %2 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 1 - %target = load %Qubit*, %Qubit** %2, align 8 - %3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %3, i64 0) - %5 = bitcast i8* %4 to %Qubit** - store %Qubit* %control, %Qubit** %5, align 8 - %ctls__1 = call %Array* @__quantum__rt__array_concatenate(%Array* %ctls, %Array* %3) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 1) - %6 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls__1) - %7 = icmp eq i64 %6, 1 - br i1 %7, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls__1, %Qubit* %target) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls__1, %Qubit* %target) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %3, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__1, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -declare %Array* @__quantum__rt__array_concatenate(%Array*, %Array*) - -declare i64 @__quantum__rt__array_get_size_1d(%Array*) - -define void @Microsoft__Quantum__Intrinsic__CNOT__ctladj(%Array* %__controlQubits__, { %Qubit*, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %1 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 0 - %control = load %Qubit*, %Qubit** %1, align 8 - %2 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %0, i32 0, i32 1 - %target = load %Qubit*, %Qubit** %2, align 8 - %3 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 2)) - %4 = bitcast %Tuple* %3 to { %Qubit*, %Qubit* }* - %5 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %4, i32 0, i32 0 - %6 = getelementptr inbounds { %Qubit*, %Qubit* }, { %Qubit*, %Qubit* }* %4, i32 0, i32 1 - store %Qubit* %control, %Qubit** %5, align 8 - store %Qubit* %target, %Qubit** %6, align 8 - call void @Microsoft__Quantum__Intrinsic__CNOT__ctl(%Array* %__controlQubits__, { %Qubit*, %Qubit* }* %4) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %3, i32 -1) - ret void -} - -declare %Tuple* @__quantum__rt__tuple_create(i64) - -declare void @__quantum__rt__tuple_update_reference_count(%Tuple*, i32) - -define void @Microsoft__Quantum__Intrinsic__H__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__H__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define %Result* @Microsoft__Quantum__Intrinsic__M__body(%Qubit* %qb) { -entry: - %0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb) - ret %Result* %0 -} - -define %Result* @Microsoft__Quantum__Intrinsic__Measure__body(%Array* %paulis, %Array* %qubits) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %0 = call %Result* @__quantum__rt__result_get_one() - %res = alloca %Result*, align 8 - store %Result* %0, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %0, i32 1) - %haveY = alloca i1, align 1 - store i1 false, i1* %haveY, align 1 - %1 = call i64 @__quantum__rt__array_get_size_1d(%Array* %paulis) - %2 = sub i64 %1, 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 0, %entry ], [ %15, %exiting__1 ] - %3 = icmp sle i64 %i, %2 - br i1 %3, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) - %5 = bitcast i8* %4 to i2* - %6 = load i2, i2* %5, align 1 - %7 = load i2, i2* @PauliY, align 1 - %8 = icmp eq i2 %6, %7 - br i1 %8, label %condContinue__1, label %condFalse__1 - -condFalse__1: ; preds = %body__1 - %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) - %10 = bitcast i8* %9 to i2* - %11 = load i2, i2* %10, align 1 - %12 = load i2, i2* @PauliI, align 1 - %13 = icmp eq i2 %11, %12 - br label %condContinue__1 - -condContinue__1: ; preds = %condFalse__1, %body__1 - %14 = phi i1 [ %8, %body__1 ], [ %13, %condFalse__1 ] - br i1 %14, label %then0__1, label %continue__1 - -then0__1: ; preds = %condContinue__1 - store i1 true, i1* %haveY, align 1 - br label %continue__1 - -continue__1: ; preds = %then0__1, %condContinue__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %15 = add i64 %i, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %16 = load i1, i1* %haveY, align 1 - br i1 %16, label %then0__2, label %test1__1 - -then0__2: ; preds = %exit__1 - %17 = call %Result* @__quantum__qis__joint_measure(i64 106, i64 1, %Array* %qubits) - call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 1) - store %Result* %17, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %17, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %0, i32 -1) - br label %continue__2 - -test1__1: ; preds = %exit__1 - %18 = icmp sgt i64 %1, 2 - br i1 %18, label %then1__1, label %test2__1 - -then1__1: ; preds = %test1__1 - %19 = call %Result* @__quantum__qis__joint_measure(i64 107, i64 1, %Array* %qubits) - call void @__quantum__rt__result_update_reference_count(%Result* %19, i32 1) - %20 = load %Result*, %Result** %res, align 8 - store %Result* %19, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %19, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %20, i32 -1) - br label %continue__2 - -test2__1: ; preds = %test1__1 - %21 = icmp eq i64 %1, 1 - br i1 %21, label %then2__1, label %test3__1 - -then2__1: ; preds = %test2__1 - %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %23 = bitcast i8* %22 to i2* - %24 = load i2, i2* %23, align 1 - %25 = load i2, i2* @PauliX, align 1 - %26 = icmp eq i2 %24, %25 - br i1 %26, label %then0__3, label %else__1 - -then0__3: ; preds = %then2__1 - %27 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %28 = bitcast i8* %27 to %Qubit** - %qb = load %Qubit*, %Qubit** %28, align 8 - %29 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb) - call void @__quantum__rt__result_update_reference_count(%Result* %29, i32 1) - %30 = load %Result*, %Result** %res, align 8 - store %Result* %29, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %29, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %30, i32 -1) - br label %continue__3 - -else__1: ; preds = %then2__1 - %31 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qubits, i64 0) - %32 = bitcast i8* %31 to %Qubit** - %qb__1 = load %Qubit*, %Qubit** %32, align 8 - %33 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__1) - call void @__quantum__rt__result_update_reference_count(%Result* %33, i32 1) - %34 = load %Result*, %Result** %res, align 8 - store %Result* %33, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %33, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %34, i32 -1) - br label %continue__3 - -continue__3: ; preds = %else__1, %then0__3 - br label %continue__2 - -test3__1: ; preds = %test2__1 - %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %36 = bitcast i8* %35 to i2* - %37 = load i2, i2* %36, align 1 - %38 = load i2, i2* @PauliX, align 1 - %39 = icmp eq i2 %37, %38 - br i1 %39, label %condTrue__1, label %condContinue__2 - -condTrue__1: ; preds = %test3__1 - %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %41 = bitcast i8* %40 to i2* - %42 = load i2, i2* %41, align 1 - %43 = load i2, i2* @PauliX, align 1 - %44 = icmp eq i2 %42, %43 - br label %condContinue__2 - -condContinue__2: ; preds = %condTrue__1, %test3__1 - %45 = phi i1 [ %44, %condTrue__1 ], [ %39, %test3__1 ] - br i1 %45, label %then3__1, label %test4__1 - -then3__1: ; preds = %condContinue__2 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %46 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %46, i32 1) - %47 = load %Result*, %Result** %res, align 8 - store %Result* %46, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %46, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %47, i32 -1) - br label %continue__2 - -test4__1: ; preds = %condContinue__2 - %48 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %49 = bitcast i8* %48 to i2* - %50 = load i2, i2* %49, align 1 - %51 = load i2, i2* @PauliX, align 1 - %52 = icmp eq i2 %50, %51 - br i1 %52, label %condTrue__2, label %condContinue__3 - -condTrue__2: ; preds = %test4__1 - %53 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %54 = bitcast i8* %53 to i2* - %55 = load i2, i2* %54, align 1 - %56 = load i2, i2* @PauliZ, align 1 - %57 = icmp eq i2 %55, %56 - br label %condContinue__3 - -condContinue__3: ; preds = %condTrue__2, %test4__1 - %58 = phi i1 [ %57, %condTrue__2 ], [ %52, %test4__1 ] - br i1 %58, label %then4__1, label %test5__1 - -then4__1: ; preds = %condContinue__3 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %59 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %59, i32 1) - %60 = load %Result*, %Result** %res, align 8 - store %Result* %59, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %59, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %60, i32 -1) - br label %continue__2 - -test5__1: ; preds = %condContinue__3 - %61 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %62 = bitcast i8* %61 to i2* - %63 = load i2, i2* %62, align 1 - %64 = load i2, i2* @PauliZ, align 1 - %65 = icmp eq i2 %63, %64 - br i1 %65, label %condTrue__3, label %condContinue__4 - -condTrue__3: ; preds = %test5__1 - %66 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %67 = bitcast i8* %66 to i2* - %68 = load i2, i2* %67, align 1 - %69 = load i2, i2* @PauliX, align 1 - %70 = icmp eq i2 %68, %69 - br label %condContinue__4 - -condContinue__4: ; preds = %condTrue__3, %test5__1 - %71 = phi i1 [ %70, %condTrue__3 ], [ %65, %test5__1 ] - br i1 %71, label %then5__1, label %test6__1 - -then5__1: ; preds = %condContinue__4 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %72 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %72, i32 1) - %73 = load %Result*, %Result** %res, align 8 - store %Result* %72, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %72, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %73, i32 -1) - br label %continue__2 - -test6__1: ; preds = %condContinue__4 - %74 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %75 = bitcast i8* %74 to i2* - %76 = load i2, i2* %75, align 1 - %77 = load i2, i2* @PauliZ, align 1 - %78 = icmp eq i2 %76, %77 - br i1 %78, label %condTrue__4, label %condContinue__5 - -condTrue__4: ; preds = %test6__1 - %79 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %80 = bitcast i8* %79 to i2* - %81 = load i2, i2* %80, align 1 - %82 = load i2, i2* @PauliZ, align 1 - %83 = icmp eq i2 %81, %82 - br label %condContinue__5 - -condContinue__5: ; preds = %condTrue__4, %test6__1 - %84 = phi i1 [ %83, %condTrue__4 ], [ %78, %test6__1 ] - br i1 %84, label %then6__1, label %continue__2 - -then6__1: ; preds = %condContinue__5 - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 1) - %85 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qubits) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %85, i32 1) - %86 = load %Result*, %Result** %res, align 8 - store %Result* %85, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %85, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %86, i32 -1) - br label %continue__2 - -continue__2: ; preds = %then6__1, %condContinue__5, %then5__1, %then4__1, %then3__1, %continue__3, %then1__1, %then0__2 - %87 = load %Result*, %Result** %res, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qubits, i32 -1) - ret %Result* %87 -} - -declare %Result* @__quantum__rt__result_get_one() - -define void @Microsoft__Quantum__Intrinsic__Rx__body(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rx__adj(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rx__ctl(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rx__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Ry__body(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Ry__adj(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Ry__ctl(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Ry__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rz__body(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rz__adj(double %theta, %Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rz__ctl(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Rz__ctladj(%Array* %ctls, { double, %Qubit* }* %0) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %1 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 0 - %theta = load double, double* %1, align 8 - %2 = getelementptr inbounds { double, %Qubit* }, { double, %Qubit* }* %0, i32 0, i32 1 - %qb = load %Qubit*, %Qubit** %2, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__T__ctladj(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls, %Qubit* %qb) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %qb) { -entry: - call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %ctls, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %ctls) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %ctls, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %__controlQubits__, %Qubit* %qb) { -entry: - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 1) - %0 = call i64 @__quantum__rt__array_get_size_1d(%Array* %__controlQubits__) - %1 = icmp eq i64 %0, 1 - br i1 %1, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %__controlQubits__, %Qubit* %qb) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %__controlQubits__, i32 -1) - ret void -} - -define %Tuple* @Microsoft__Quantum__Core__Attribute__body() { -entry: - ret %Tuple* null -} - -define %Tuple* @Microsoft__Quantum__Core__EntryPoint__body() { -entry: - ret %Tuple* null -} - -define %Tuple* @Microsoft__Quantum__Core__Inline__body() { -entry: - ret %Tuple* null -} - -define void @Microsoft__Quantum__Testing__Tracer__Delay__body(%Callable* %op, %Qubit* %arg, %Tuple* %aux) { -entry: - call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 1) - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %Qubit* }* - %2 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %1, i32 0, i32 0 - store %Qubit* %arg, %Qubit** %2, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %op, %Tuple* %0, %Tuple* null) - call void @__quantum__rt__capture_update_alias_count(%Callable* %op, i32 -1) - call void @__quantum__rt__callable_update_alias_count(%Callable* %op, i32 -1) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %0, i32 -1) - ret void -} - -declare void @__quantum__rt__callable_invoke(%Callable*, %Tuple*, %Tuple*) - -define void @Microsoft__Quantum__Testing__Tracer__TestCoreIntrinsics__body() { -entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 3) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %1 = bitcast i8* %0 to %Qubit** - %qb = load %Qubit*, %Qubit** %1, align 8 - call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb) - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %3 = bitcast i8* %2 to %Qubit** - %qb__1 = load %Qubit*, %Qubit** %3, align 8 - call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb__1) - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %5 = bitcast i8* %4 to %Qubit** - %qb__2 = load %Qubit*, %Qubit** %5, align 8 - call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb__2) - %6 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %7 = bitcast i8* %6 to %Qubit** - %qb__3 = load %Qubit*, %Qubit** %7, align 8 - call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb__3) - %8 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %9 = bitcast i8* %8 to %Qubit** - %10 = load %Qubit*, %Qubit** %9, align 8 - %11 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %12 = bitcast i8* %11 to %Qubit** - %13 = load %Qubit*, %Qubit** %12, align 8 - call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %10, %Qubit* %13) - %14 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %15 = bitcast i8* %14 to %Qubit** - %qb__4 = load %Qubit*, %Qubit** %15, align 8 - call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__4) - %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %17 = bitcast i8* %16 to %Qubit** - %qb__5 = load %Qubit*, %Qubit** %17, align 8 - call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb__5) - %18 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %19 = bitcast i8* %18 to %Qubit** - %qb__6 = load %Qubit*, %Qubit** %19, align 8 - call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb__6) - %20 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %21 = bitcast i8* %20 to %Qubit** - %qb__7 = load %Qubit*, %Qubit** %21, align 8 - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb__7) - %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %23 = bitcast i8* %22 to %Qubit** - %qb__9 = load %Qubit*, %Qubit** %23, align 8 - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__9) - call void @__quantum__qis__inject_barrier(i64 42, i64 0) - %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %25 = bitcast i8* %24 to %Qubit** - %qb__11 = load %Qubit*, %Qubit** %25, align 8 - call void @__quantum__qis__single_qubit_op(i64 0, i64 1, %Qubit* %qb__11) - %26 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %27 = bitcast i8* %26 to %Qubit** - %qb__13 = load %Qubit*, %Qubit** %27, align 8 - call void @__quantum__qis__single_qubit_op(i64 3, i64 1, %Qubit* %qb__13) - %28 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %29 = bitcast i8* %28 to %Qubit** - %qb__15 = load %Qubit*, %Qubit** %29, align 8 - call void @__quantum__qis__single_qubit_op(i64 6, i64 1, %Qubit* %qb__15) - %30 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %31 = bitcast i8* %30 to %Qubit** - %qb__17 = load %Qubit*, %Qubit** %31, align 8 - call void @__quantum__qis__single_qubit_op(i64 9, i64 1, %Qubit* %qb__17) - %32 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %33 = bitcast i8* %32 to %Qubit** - %34 = load %Qubit*, %Qubit** %33, align 8 - %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %36 = bitcast i8* %35 to %Qubit** - %37 = load %Qubit*, %Qubit** %36, align 8 - call void @Microsoft__Quantum__Intrinsic__CNOT__adj(%Qubit* %34, %Qubit* %37) - %38 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %39 = bitcast i8* %38 to %Qubit** - %qb__19 = load %Qubit*, %Qubit** %39, align 8 - call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__19) - %40 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %41 = bitcast i8* %40 to %Qubit** - %qb__20 = load %Qubit*, %Qubit** %41, align 8 - call void @__quantum__qis__single_qubit_op(i64 21, i64 1, %Qubit* %qb__20) - %42 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %43 = bitcast i8* %42 to %Qubit** - %qb__21 = load %Qubit*, %Qubit** %43, align 8 - call void @__quantum__qis__single_qubit_op(i64 23, i64 1, %Qubit* %qb__21) - %44 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %45 = bitcast i8* %44 to %Qubit** - %qb__22 = load %Qubit*, %Qubit** %45, align 8 - call void @__quantum__qis__single_qubit_op(i64 15, i64 1, %Qubit* %qb__22) - %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %47 = bitcast i8* %46 to %Qubit** - %qb__24 = load %Qubit*, %Qubit** %47, align 8 - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__24) - %c = call %Qubit* @__quantum__rt__qubit_allocate() - %ctls = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %48 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls, i64 0) - %49 = bitcast i8* %48 to %Qubit** - store %Qubit* %c, %Qubit** %49, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 1) - %50 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %51 = bitcast i8* %50 to %Qubit** - %qb__26 = load %Qubit*, %Qubit** %51, align 8 - br i1 true, label %then0__1, label %else__1 - -then0__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %ctls, %Qubit* %qb__26) - br label %continue__1 - -else__1: ; preds = %entry - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %ctls, %Qubit* %qb__26) - br label %continue__1 - -continue__1: ; preds = %else__1, %then0__1 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls, i32 -1) - %ctls__1 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %52 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__1, i64 0) - %53 = bitcast i8* %52 to %Qubit** - store %Qubit* %c, %Qubit** %53, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 1) - %54 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %55 = bitcast i8* %54 to %Qubit** - %qb__27 = load %Qubit*, %Qubit** %55, align 8 - br i1 true, label %then0__2, label %else__2 - -then0__2: ; preds = %continue__1 - call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %ctls__1, %Qubit* %qb__27) - br label %continue__2 - -else__2: ; preds = %continue__1 - call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %ctls__1, %Qubit* %qb__27) - br label %continue__2 - -continue__2: ; preds = %else__2, %then0__2 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__1, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__1, i32 -1) - %ctls__2 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %56 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__2, i64 0) - %57 = bitcast i8* %56 to %Qubit** - store %Qubit* %c, %Qubit** %57, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__2, i32 1) - %58 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %59 = bitcast i8* %58 to %Qubit** - %qb__28 = load %Qubit*, %Qubit** %59, align 8 - br i1 true, label %then0__3, label %else__3 - -then0__3: ; preds = %continue__2 - call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %ctls__2, %Qubit* %qb__28) - br label %continue__3 - -else__3: ; preds = %continue__2 - call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %ctls__2, %Qubit* %qb__28) - br label %continue__3 - -continue__3: ; preds = %else__3, %then0__3 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__2, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__2, i32 -1) - %ctls__3 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %60 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__3, i64 0) - %61 = bitcast i8* %60 to %Qubit** - store %Qubit* %c, %Qubit** %61, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__3, i32 1) - %62 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %63 = bitcast i8* %62 to %Qubit** - %qb__29 = load %Qubit*, %Qubit** %63, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %ctls__3, %Qubit* %qb__29) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__3, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__3, i32 -1) - %ctls__4 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %64 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__4, i64 0) - %65 = bitcast i8* %64 to %Qubit** - store %Qubit* %c, %Qubit** %65, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__4, i32 1) - %66 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %67 = bitcast i8* %66 to %Qubit** - %qb__30 = load %Qubit*, %Qubit** %67, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %ctls__4, %Qubit* %qb__30) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__4, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__4, i32 -1) - %ctls__5 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %68 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__5, i64 0) - %69 = bitcast i8* %68 to %Qubit** - store %Qubit* %c, %Qubit** %69, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__5, i32 1) - %70 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %71 = bitcast i8* %70 to %Qubit** - %qb__31 = load %Qubit*, %Qubit** %71, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %ctls__5, %Qubit* %qb__31) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__5, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__5, i32 -1) - %ctls__6 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %72 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__6, i64 0) - %73 = bitcast i8* %72 to %Qubit** - store %Qubit* %c, %Qubit** %73, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__6, i32 1) - %74 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %75 = bitcast i8* %74 to %Qubit** - %qb__32 = load %Qubit*, %Qubit** %75, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %ctls__6, %Qubit* %qb__32) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__6, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__6, i32 -1) - %ctls__7 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %76 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__7, i64 0) - %77 = bitcast i8* %76 to %Qubit** - store %Qubit* %c, %Qubit** %77, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 1) - %78 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %79 = bitcast i8* %78 to %Qubit** - %qb__33 = load %Qubit*, %Qubit** %79, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %ctls__7, %Qubit* %qb__33) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__7, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__7, i32 -1) - %ctls__9 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 1) - %80 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %ctls__9, i64 0) - %81 = bitcast i8* %80 to %Qubit** - store %Qubit* %c, %Qubit** %81, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 1) - %82 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %83 = bitcast i8* %82 to %Qubit** - %qb__35 = load %Qubit*, %Qubit** %83, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %ctls__9, %Qubit* %qb__35) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %ctls__9, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %ctls__9, i32 -1) - call void @__quantum__rt__qubit_release(%Qubit* %c) - %cc = call %Array* @__quantum__rt__qubit_allocate_array(i64 2) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %84 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %85 = bitcast i8* %84 to %Qubit** - %qb__37 = load %Qubit*, %Qubit** %85, align 8 - %86 = call i64 @__quantum__rt__array_get_size_1d(%Array* %cc) - %87 = icmp eq i64 %86, 1 - br i1 %87, label %then0__4, label %else__4 - -then0__4: ; preds = %continue__3 - call void @__quantum__qis__single_qubit_op_ctl(i64 1, i64 1, %Array* %cc, %Qubit* %qb__37) - br label %continue__4 - -else__4: ; preds = %continue__3 - call void @__quantum__qis__single_qubit_op_ctl(i64 2, i64 1, %Array* %cc, %Qubit* %qb__37) - br label %continue__4 - -continue__4: ; preds = %else__4, %then0__4 - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %88 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %89 = bitcast i8* %88 to %Qubit** - %qb__38 = load %Qubit*, %Qubit** %89, align 8 - %90 = icmp eq i64 %86, 1 - br i1 %90, label %then0__5, label %else__5 - -then0__5: ; preds = %continue__4 - call void @__quantum__qis__single_qubit_op_ctl(i64 4, i64 1, %Array* %cc, %Qubit* %qb__38) - br label %continue__5 - -else__5: ; preds = %continue__4 - call void @__quantum__qis__single_qubit_op_ctl(i64 5, i64 1, %Array* %cc, %Qubit* %qb__38) - br label %continue__5 - -continue__5: ; preds = %else__5, %then0__5 - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %91 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %92 = bitcast i8* %91 to %Qubit** - %qb__39 = load %Qubit*, %Qubit** %92, align 8 - %93 = icmp eq i64 %86, 1 - br i1 %93, label %then0__6, label %else__6 - -then0__6: ; preds = %continue__5 - call void @__quantum__qis__single_qubit_op_ctl(i64 7, i64 1, %Array* %cc, %Qubit* %qb__39) - br label %continue__6 - -else__6: ; preds = %continue__5 - call void @__quantum__qis__single_qubit_op_ctl(i64 8, i64 1, %Array* %cc, %Qubit* %qb__39) - br label %continue__6 - -continue__6: ; preds = %else__6, %then0__6 - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %94 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %95 = bitcast i8* %94 to %Qubit** - %qb__40 = load %Qubit*, %Qubit** %95, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 10, i64 1, %Array* %cc, %Qubit* %qb__40) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %96 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %97 = bitcast i8* %96 to %Qubit** - %qb__41 = load %Qubit*, %Qubit** %97, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 20, i64 1, %Array* %cc, %Qubit* %qb__41) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %98 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %99 = bitcast i8* %98 to %Qubit** - %qb__42 = load %Qubit*, %Qubit** %99, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 22, i64 1, %Array* %cc, %Qubit* %qb__42) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %100 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %101 = bitcast i8* %100 to %Qubit** - %qb__43 = load %Qubit*, %Qubit** %101, align 8 - call void @__quantum__qis__single_qubit_op_ctl(i64 24, i64 1, %Array* %cc, %Qubit* %qb__43) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %102 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %103 = bitcast i8* %102 to %Qubit** - %qb__44 = load %Qubit*, %Qubit** %103, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 16, i64 1, %Array* %cc, %Qubit* %qb__44) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - %104 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %105 = bitcast i8* %104 to %Qubit** - %qb__46 = load %Qubit*, %Qubit** %105, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 1) - call void @__quantum__qis__single_qubit_op_ctl(i64 12, i64 1, %Array* %cc, %Qubit* %qb__46) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %cc, i32 -1) - call void @__quantum__rt__qubit_release_array(%Array* %cc) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - ret void -} - -declare %Qubit* @__quantum__rt__qubit_allocate() - -declare %Array* @__quantum__rt__qubit_allocate_array(i64) - -declare void @__quantum__qis__inject_barrier(i64, i64) - -declare void @__quantum__rt__qubit_release(%Qubit*) - -declare void @__quantum__rt__qubit_release_array(%Array*) - -define void @Microsoft__Quantum__Testing__Tracer__TestMeasurements__body() { -entry: - %qs = call %Array* @__quantum__rt__qubit_allocate_array(i64 6) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 1) - %0 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %1 = bitcast i8* %0 to %Qubit** - %qb = load %Qubit*, %Qubit** %1, align 8 - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb) - %2 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 0) - %3 = bitcast i8* %2 to %Qubit** - %qb__2 = load %Qubit*, %Qubit** %3, align 8 - %r0 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__2) - %4 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %5 = bitcast i8* %4 to %Qubit** - %qb__4 = load %Qubit*, %Qubit** %5, align 8 - call void @__quantum__qis__single_qubit_op(i64 11, i64 1, %Qubit* %qb__4) - %6 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %7 = bitcast i8* %6 to %Qubit** - %8 = load %Qubit*, %Qubit** %7, align 8 - %9 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %10 = bitcast i8* %9 to %Qubit** - %11 = load %Qubit*, %Qubit** %10, align 8 - call void @Microsoft__Quantum__Intrinsic__CNOT__body(%Qubit* %8, %Qubit* %11) - %qs12 = call %Array* @__quantum__rt__array_create_1d(i32 8, i64 2) - %12 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) - %13 = bitcast i8* %12 to %Qubit** - %14 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 1) - %15 = bitcast i8* %14 to %Qubit** - %16 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 1) - %17 = bitcast i8* %16 to %Qubit** - %18 = load %Qubit*, %Qubit** %17, align 8 - %19 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 2) - %20 = bitcast i8* %19 to %Qubit** - %21 = load %Qubit*, %Qubit** %20, align 8 - store %Qubit* %18, %Qubit** %13, align 8 - store %Qubit* %21, %Qubit** %15, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %paulis = call %Array* @__quantum__rt__array_create_1d(i32 1, i64 2) - %22 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %23 = bitcast i8* %22 to i2* - %24 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %25 = bitcast i8* %24 to i2* - %26 = load i2, i2* @PauliY, align 1 - %27 = load i2, i2* @PauliX, align 1 - store i2 %26, i2* %23, align 1 - store i2 %27, i2* %25, align 1 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 1) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %28 = call %Result* @__quantum__rt__result_get_one() - %res = alloca %Result*, align 8 - store %Result* %28, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %28, i32 1) - %haveY = alloca i1, align 1 - store i1 false, i1* %haveY, align 1 - br label %header__1 - -header__1: ; preds = %exiting__1, %entry - %i = phi i64 [ 0, %entry ], [ %41, %exiting__1 ] - %29 = icmp sle i64 %i, 1 - br i1 %29, label %body__1, label %exit__1 - -body__1: ; preds = %header__1 - %30 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) - %31 = bitcast i8* %30 to i2* - %32 = load i2, i2* %31, align 1 - %33 = load i2, i2* @PauliY, align 1 - %34 = icmp eq i2 %32, %33 - br i1 %34, label %condContinue__1, label %condFalse__1 - -condFalse__1: ; preds = %body__1 - %35 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 %i) - %36 = bitcast i8* %35 to i2* - %37 = load i2, i2* %36, align 1 - %38 = load i2, i2* @PauliI, align 1 - %39 = icmp eq i2 %37, %38 - br label %condContinue__1 - -condContinue__1: ; preds = %condFalse__1, %body__1 - %40 = phi i1 [ %34, %body__1 ], [ %39, %condFalse__1 ] - br i1 %40, label %then0__1, label %continue__1 - -then0__1: ; preds = %condContinue__1 - store i1 true, i1* %haveY, align 1 - br label %continue__1 - -continue__1: ; preds = %then0__1, %condContinue__1 - br label %exiting__1 - -exiting__1: ; preds = %continue__1 - %41 = add i64 %i, 1 - br label %header__1 - -exit__1: ; preds = %header__1 - %42 = load i1, i1* %haveY, align 1 - br i1 %42, label %then0__2, label %test1__1 - -then0__2: ; preds = %exit__1 - %43 = call %Result* @__quantum__qis__joint_measure(i64 106, i64 1, %Array* %qs12) - call void @__quantum__rt__result_update_reference_count(%Result* %43, i32 1) - store %Result* %43, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %43, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %28, i32 -1) - br label %continue__2 - -test1__1: ; preds = %exit__1 - br i1 false, label %then1__1, label %test2__1 - -then1__1: ; preds = %test1__1 - %44 = call %Result* @__quantum__qis__joint_measure(i64 107, i64 1, %Array* %qs12) - call void @__quantum__rt__result_update_reference_count(%Result* %44, i32 1) - %45 = load %Result*, %Result** %res, align 8 - store %Result* %44, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %44, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %45, i32 -1) - br label %continue__2 - -test2__1: ; preds = %test1__1 - br i1 false, label %then2__1, label %test3__1 - -then2__1: ; preds = %test2__1 - %46 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %47 = bitcast i8* %46 to i2* - %48 = load i2, i2* %47, align 1 - %49 = load i2, i2* @PauliX, align 1 - %50 = icmp eq i2 %48, %49 - br i1 %50, label %then0__3, label %else__1 - -then0__3: ; preds = %then2__1 - %51 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) - %52 = bitcast i8* %51 to %Qubit** - %qb__6 = load %Qubit*, %Qubit** %52, align 8 - %53 = call %Result* @__quantum__qis__single_qubit_measure(i64 101, i64 1, %Qubit* %qb__6) - call void @__quantum__rt__result_update_reference_count(%Result* %53, i32 1) - %54 = load %Result*, %Result** %res, align 8 - store %Result* %53, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %53, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %54, i32 -1) - br label %continue__3 - -else__1: ; preds = %then2__1 - %55 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs12, i64 0) - %56 = bitcast i8* %55 to %Qubit** - %qb__7 = load %Qubit*, %Qubit** %56, align 8 - %57 = call %Result* @__quantum__qis__single_qubit_measure(i64 100, i64 1, %Qubit* %qb__7) - call void @__quantum__rt__result_update_reference_count(%Result* %57, i32 1) - %58 = load %Result*, %Result** %res, align 8 - store %Result* %57, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %57, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %58, i32 -1) - br label %continue__3 - -continue__3: ; preds = %else__1, %then0__3 - br label %continue__2 - -test3__1: ; preds = %test2__1 - %59 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %60 = bitcast i8* %59 to i2* - %61 = load i2, i2* %60, align 1 - %62 = load i2, i2* @PauliX, align 1 - %63 = icmp eq i2 %61, %62 - br i1 %63, label %condTrue__1, label %condContinue__2 - -condTrue__1: ; preds = %test3__1 - %64 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %65 = bitcast i8* %64 to i2* - %66 = load i2, i2* %65, align 1 - %67 = load i2, i2* @PauliX, align 1 - %68 = icmp eq i2 %66, %67 - br label %condContinue__2 - -condContinue__2: ; preds = %condTrue__1, %test3__1 - %69 = phi i1 [ %68, %condTrue__1 ], [ %63, %test3__1 ] - br i1 %69, label %then3__1, label %test4__1 - -then3__1: ; preds = %condContinue__2 - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %70 = call %Result* @__quantum__qis__joint_measure(i64 105, i64 1, %Array* %qs12) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %70, i32 1) - %71 = load %Result*, %Result** %res, align 8 - store %Result* %70, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %70, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %71, i32 -1) - br label %continue__2 - -test4__1: ; preds = %condContinue__2 - %72 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %73 = bitcast i8* %72 to i2* - %74 = load i2, i2* %73, align 1 - %75 = load i2, i2* @PauliX, align 1 - %76 = icmp eq i2 %74, %75 - br i1 %76, label %condTrue__2, label %condContinue__3 - -condTrue__2: ; preds = %test4__1 - %77 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %78 = bitcast i8* %77 to i2* - %79 = load i2, i2* %78, align 1 - %80 = load i2, i2* @PauliZ, align 1 - %81 = icmp eq i2 %79, %80 - br label %condContinue__3 - -condContinue__3: ; preds = %condTrue__2, %test4__1 - %82 = phi i1 [ %81, %condTrue__2 ], [ %76, %test4__1 ] - br i1 %82, label %then4__1, label %test5__1 - -then4__1: ; preds = %condContinue__3 - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %83 = call %Result* @__quantum__qis__joint_measure(i64 103, i64 1, %Array* %qs12) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %83, i32 1) - %84 = load %Result*, %Result** %res, align 8 - store %Result* %83, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %83, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %84, i32 -1) - br label %continue__2 - -test5__1: ; preds = %condContinue__3 - %85 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %86 = bitcast i8* %85 to i2* - %87 = load i2, i2* %86, align 1 - %88 = load i2, i2* @PauliZ, align 1 - %89 = icmp eq i2 %87, %88 - br i1 %89, label %condTrue__3, label %condContinue__4 - -condTrue__3: ; preds = %test5__1 - %90 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %91 = bitcast i8* %90 to i2* - %92 = load i2, i2* %91, align 1 - %93 = load i2, i2* @PauliX, align 1 - %94 = icmp eq i2 %92, %93 - br label %condContinue__4 - -condContinue__4: ; preds = %condTrue__3, %test5__1 - %95 = phi i1 [ %94, %condTrue__3 ], [ %89, %test5__1 ] - br i1 %95, label %then5__1, label %test6__1 - -then5__1: ; preds = %condContinue__4 - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %96 = call %Result* @__quantum__qis__joint_measure(i64 104, i64 1, %Array* %qs12) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %96, i32 1) - %97 = load %Result*, %Result** %res, align 8 - store %Result* %96, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %96, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %97, i32 -1) - br label %continue__2 - -test6__1: ; preds = %condContinue__4 - %98 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 0) - %99 = bitcast i8* %98 to i2* - %100 = load i2, i2* %99, align 1 - %101 = load i2, i2* @PauliZ, align 1 - %102 = icmp eq i2 %100, %101 - br i1 %102, label %condTrue__4, label %condContinue__5 - -condTrue__4: ; preds = %test6__1 - %103 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %paulis, i64 1) - %104 = bitcast i8* %103 to i2* - %105 = load i2, i2* %104, align 1 - %106 = load i2, i2* @PauliZ, align 1 - %107 = icmp eq i2 %105, %106 - br label %condContinue__5 - -condContinue__5: ; preds = %condTrue__4, %test6__1 - %108 = phi i1 [ %107, %condTrue__4 ], [ %102, %test6__1 ] - br i1 %108, label %then6__1, label %continue__2 - -then6__1: ; preds = %condContinue__5 - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 1) - %109 = call %Result* @__quantum__qis__joint_measure(i64 102, i64 1, %Array* %qs12) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 1) - %110 = load %Result*, %Result** %res, align 8 - store %Result* %109, %Result** %res, align 8 - call void @__quantum__rt__result_update_reference_count(%Result* %109, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %110, i32 -1) - br label %continue__2 - -continue__2: ; preds = %then6__1, %condContinue__5, %then5__1, %then4__1, %then3__1, %continue__3, %then1__1, %then0__2 - %r12 = load %Result*, %Result** %res, align 8 - call void @__quantum__rt__array_update_alias_count(%Array* %paulis, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %paulis, i32 -1) - %111 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %112 = bitcast %Tuple* %111 to { %Callable*, %Callable*, %Qubit* }* - %113 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 0 - %114 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 1 - %115 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %112, i32 0, i32 2 - %116 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %117 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__X, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %118 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 3) - %119 = bitcast i8* %118 to %Qubit** - %120 = load %Qubit*, %Qubit** %119, align 8 - store %Callable* %116, %Callable** %113, align 8 - store %Callable* %117, %Callable** %114, align 8 - store %Qubit* %120, %Qubit** %115, align 8 - %121 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__1, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %111) - %122 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %123 = bitcast %Tuple* %122 to { %Callable*, %Callable*, %Qubit* }* - %124 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 0 - %125 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 1 - %126 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %123, i32 0, i32 2 - %127 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %128 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Y, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %129 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 3) - %130 = bitcast i8* %129 to %Qubit** - %131 = load %Qubit*, %Qubit** %130, align 8 - store %Callable* %127, %Callable** %124, align 8 - store %Callable* %128, %Callable** %125, align 8 - store %Qubit* %131, %Qubit** %126, align 8 - %132 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__2, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %122) - call void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %r0, %Callable* %121, %Callable* %132) - %133 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %134 = bitcast %Tuple* %133 to { %Callable*, %Callable*, %Qubit* }* - %135 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 0 - %136 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 1 - %137 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %134, i32 0, i32 2 - %138 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %139 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__Z, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %140 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 4) - %141 = bitcast i8* %140 to %Qubit** - %142 = load %Qubit*, %Qubit** %141, align 8 - store %Callable* %138, %Callable** %135, align 8 - store %Callable* %139, %Callable** %136, align 8 - store %Qubit* %142, %Qubit** %137, align 8 - %143 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__3, [2 x void (%Tuple*, i32)*]* @MemoryManagement__1, %Tuple* %133) - %144 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %145 = bitcast %Tuple* %144 to { %Callable*, %Callable*, %Qubit* }* - %146 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 0 - %147 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 1 - %148 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %145, i32 0, i32 2 - %149 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Testing__Tracer__Delay, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %150 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @Microsoft__Quantum__Intrinsic__S, [2 x void (%Tuple*, i32)*]* null, %Tuple* null) - %151 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 4) - %152 = bitcast i8* %151 to %Qubit** - %153 = load %Qubit*, %Qubit** %152, align 8 - store %Callable* %149, %Callable** %146, align 8 - store %Callable* %150, %Callable** %147, align 8 - store %Qubit* %153, %Qubit** %148, align 8 - %154 = call %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]* @PartialApplication__4, [2 x void (%Tuple*, i32)*]* @MemoryManagement__2, %Tuple* %144) - call void @Microsoft__Quantum__Intrinsic__ApplyIfElseIntrinsic__body(%Result* %r12, %Callable* %143, %Callable* %154) - %155 = call i8* @__quantum__rt__array_get_element_ptr_1d(%Array* %qs, i64 5) - %156 = bitcast i8* %155 to %Qubit** - %qb__8 = load %Qubit*, %Qubit** %156, align 8 - call void @__quantum__qis__single_qubit_op(i64 19, i64 1, %Qubit* %qb__8) - call void @__quantum__rt__array_update_alias_count(%Array* %qs, i32 -1) - call void @__quantum__rt__array_update_alias_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %r0, i32 -1) - call void @__quantum__rt__array_update_reference_count(%Array* %qs12, i32 -1) - call void @__quantum__rt__result_update_reference_count(%Result* %r12, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %121, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %121, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %132, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %132, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %143, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %143, i32 -1) - call void @__quantum__rt__capture_update_reference_count(%Callable* %154, i32 -1) - call void @__quantum__rt__callable_update_reference_count(%Callable* %154, i32 -1) - call void @__quantum__rt__qubit_release_array(%Array* %qs) - ret void -} - -define void @Microsoft__Quantum__Testing__Tracer__Delay__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Callable*, %Qubit*, %Tuple* }* - %1 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 1 - %3 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %0, i32 0, i32 2 - %4 = load %Callable*, %Callable** %1, align 8 - %5 = load %Qubit*, %Qubit** %2, align 8 - %6 = load %Tuple*, %Tuple** %3, align 8 - call void @Microsoft__Quantum__Testing__Tracer__Delay__body(%Callable* %4, %Qubit* %5, %Tuple* %6) - ret void -} - -declare %Callable* @__quantum__rt__callable_create([4 x void (%Tuple*, %Tuple*, %Tuple*)*]*, [2 x void (%Tuple*, i32)*]*, %Tuple*) - -define void @Microsoft__Quantum__Intrinsic__X__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__X__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__X__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__X__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__X__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__X__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Lifted__PartialApplication__1__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %2 = load %Callable*, %Callable** %1, align 8 - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 - %4 = load %Qubit*, %Qubit** %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* - %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 - %7 = load %Tuple*, %Tuple** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* - %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 - store %Callable* %2, %Callable** %10, align 8 - store %Qubit* %4, %Qubit** %11, align 8 - store %Tuple* %7, %Tuple** %12, align 8 - %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - ret void -} - -define void @MemoryManagement__1__RefCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %4 = load %Callable*, %Callable** %3, align 8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -define void @MemoryManagement__1__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %4 = load %Callable*, %Callable** %3, align 8 - call void @__quantum__rt__capture_update_alias_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Y__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Y__ctladj(%Array* %3, %Qubit* %4) - 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*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %2 = load %Callable*, %Callable** %1, align 8 - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 - %4 = load %Qubit*, %Qubit** %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* - %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 - %7 = load %Tuple*, %Tuple** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* - %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 - store %Callable* %2, %Callable** %10, align 8 - store %Qubit* %4, %Qubit** %11, align 8 - store %Tuple* %7, %Tuple** %12, align 8 - %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__Z__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__Z__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Lifted__PartialApplication__3__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %2 = load %Callable*, %Callable** %1, align 8 - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 - %4 = load %Qubit*, %Qubit** %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* - %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 - %7 = load %Tuple*, %Tuple** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* - %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 - store %Callable* %2, %Callable** %10, align 8 - store %Qubit* %4, %Qubit** %11, align 8 - store %Tuple* %7, %Tuple** %12, align 8 - %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__S__body(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__adj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Qubit* }* - %1 = getelementptr inbounds { %Qubit* }, { %Qubit* }* %0, i32 0, i32 0 - %2 = load %Qubit*, %Qubit** %1, align 8 - call void @Microsoft__Quantum__Intrinsic__S__adj(%Qubit* %2) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctl__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__S__ctl(%Array* %3, %Qubit* %4) - ret void -} - -define void @Microsoft__Quantum__Intrinsic__S__ctladj__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %arg-tuple to { %Array*, %Qubit* }* - %1 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 0 - %2 = getelementptr inbounds { %Array*, %Qubit* }, { %Array*, %Qubit* }* %0, i32 0, i32 1 - %3 = load %Array*, %Array** %1, align 8 - %4 = load %Qubit*, %Qubit** %2, align 8 - call void @Microsoft__Quantum__Intrinsic__S__ctladj(%Array* %3, %Qubit* %4) - ret void -} - -define void @Lifted__PartialApplication__4__body__wrapper(%Tuple* %capture-tuple, %Tuple* %arg-tuple, %Tuple* %result-tuple) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %2 = load %Callable*, %Callable** %1, align 8 - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 2 - %4 = load %Qubit*, %Qubit** %3, align 8 - %5 = bitcast %Tuple* %arg-tuple to { %Tuple* }* - %6 = getelementptr inbounds { %Tuple* }, { %Tuple* }* %5, i32 0, i32 0 - %7 = load %Tuple*, %Tuple** %6, align 8 - %8 = call %Tuple* @__quantum__rt__tuple_create(i64 mul nuw (i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64), i64 3)) - %9 = bitcast %Tuple* %8 to { %Callable*, %Qubit*, %Tuple* }* - %10 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 0 - %11 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 1 - %12 = getelementptr inbounds { %Callable*, %Qubit*, %Tuple* }, { %Callable*, %Qubit*, %Tuple* }* %9, i32 0, i32 2 - store %Callable* %2, %Callable** %10, align 8 - store %Qubit* %4, %Qubit** %11, align 8 - store %Tuple* %7, %Tuple** %12, align 8 - %13 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %14 = load %Callable*, %Callable** %13, align 8 - call void @__quantum__rt__callable_invoke(%Callable* %14, %Tuple* %8, %Tuple* %result-tuple) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %8, i32 -1) - ret void -} - -define void @MemoryManagement__2__RefCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %2, i32 %count-change) - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %4 = load %Callable*, %Callable** %3, align 8 - call void @__quantum__rt__capture_update_reference_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__callable_update_reference_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__tuple_update_reference_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -define void @MemoryManagement__2__AliasCount(%Tuple* %capture-tuple, i32 %count-change) { -entry: - %0 = bitcast %Tuple* %capture-tuple to { %Callable*, %Callable*, %Qubit* }* - %1 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 0 - %2 = load %Callable*, %Callable** %1, align 8 - call void @__quantum__rt__capture_update_alias_count(%Callable* %2, i32 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %2, i32 %count-change) - %3 = getelementptr inbounds { %Callable*, %Callable*, %Qubit* }, { %Callable*, %Callable*, %Qubit* }* %0, i32 0, i32 1 - %4 = load %Callable*, %Callable** %3, align 8 - call void @__quantum__rt__capture_update_alias_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__callable_update_alias_count(%Callable* %4, i32 %count-change) - call void @__quantum__rt__tuple_update_alias_count(%Tuple* %capture-tuple, i32 %count-change) - ret void -} - -declare void @__quantum__rt__capture_update_reference_count(%Callable*, i32) - -declare void @__quantum__rt__callable_update_reference_count(%Callable*, i32) - -define { %String* }* @Microsoft__Quantum__Targeting__TargetInstruction__body(%String* %__Item1__) { -entry: - %0 = call %Tuple* @__quantum__rt__tuple_create(i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64)) - %1 = bitcast %Tuple* %0 to { %String* }* - %2 = getelementptr inbounds { %String* }, { %String* }* %1, i32 0, i32 0 - store %String* %__Item1__, %String** %2, align 8 - call void @__quantum__rt__string_update_reference_count(%String* %__Item1__, i32 1) - ret { %String* }* %1 -} - -declare void @__quantum__rt__string_update_reference_count(%String*, i32) - -declare void @__quantum__rt__tuple_update_alias_count(%Tuple*, i32) From dca7fbb785d3e3ecb25f0624467cfe76c3ab599f Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Wed, 7 Apr 2021 17:19:17 -0700 Subject: [PATCH 03/16] Remove placeholder tests --- src/Qir/Controller/test-cases/01.err | 1 - src/Qir/Controller/test-cases/01.in | 1 - src/Qir/Controller/test-cases/01.out | 1 - 3 files changed, 3 deletions(-) delete mode 100644 src/Qir/Controller/test-cases/01.err delete mode 100644 src/Qir/Controller/test-cases/01.in delete mode 100644 src/Qir/Controller/test-cases/01.out diff --git a/src/Qir/Controller/test-cases/01.err b/src/Qir/Controller/test-cases/01.err deleted file mode 100644 index 760589cb5d6..00000000000 --- a/src/Qir/Controller/test-cases/01.err +++ /dev/null @@ -1 +0,0 @@ -error \ No newline at end of file diff --git a/src/Qir/Controller/test-cases/01.in b/src/Qir/Controller/test-cases/01.in deleted file mode 100644 index 770eab4480b..00000000000 --- a/src/Qir/Controller/test-cases/01.in +++ /dev/null @@ -1 +0,0 @@ -input \ No newline at end of file diff --git a/src/Qir/Controller/test-cases/01.out b/src/Qir/Controller/test-cases/01.out deleted file mode 100644 index 6caf68aff42..00000000000 --- a/src/Qir/Controller/test-cases/01.out +++ /dev/null @@ -1 +0,0 @@ -output \ No newline at end of file From 2c8ca9f550974aa7203acba9a73ecde32c9bade7 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 11:23:06 -0700 Subject: [PATCH 04/16] Allow test cases folder not to exist --- src/Qir/Controller/test-qir-controller.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Qir/Controller/test-qir-controller.ps1 b/src/Qir/Controller/test-qir-controller.ps1 index 876626b703a..bddb55ff62c 100644 --- a/src/Qir/Controller/test-qir-controller.ps1 +++ b/src/Qir/Controller/test-qir-controller.ps1 @@ -8,6 +8,10 @@ Write-Host "##[info]Test QIR Controller" $controllerProject = (Join-Path $PSScriptRoot QirController.csproj) $testCasesFolder = (Join-Path $PSScriptRoot "test-cases") $testArtifactsFolder = (Join-Path $PSScriptRoot "test-artifacts") +if (!(Test-Path $testCasesFolder)) { + Write-Host "No tests found. Returning." + return +} if (!(Test-Path $testArtifactsFolder -PathType Container)) { New-Item -ItemType Directory -Force -Path $testArtifactsFolder } From 7558e4644db6355aa0dc61526971e969e1ece633 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 13:10:10 -0700 Subject: [PATCH 05/16] Add default error handling --- .gitignore | 3 + src/Qir/Controller/Constant.cs | 6 + src/Qir/Controller/Controller.cs | 75 ++++++++--- src/Qir/Controller/ControllerException.cs | 21 +++ src/Qir/Controller/ErrorMessages.Designer.cs | 72 ++++++++++ src/Qir/Controller/ErrorMessages.resx | 123 ++++++++++++++++++ src/Qir/Controller/Model/Error.cs | 16 +++ src/Qir/Controller/QirController.csproj | 15 +++ .../Tests.QirController/ControllerTests.cs | 114 ++++++++++++++++ .../test-cases/internal-error-test.err | 4 + .../test-cases/internal-error-test.in | 1 + src/Qir/Controller/test-qir-controller.ps1 | 58 ++++++--- 12 files changed, 474 insertions(+), 34 deletions(-) create mode 100644 src/Qir/Controller/ControllerException.cs create mode 100644 src/Qir/Controller/ErrorMessages.Designer.cs create mode 100644 src/Qir/Controller/ErrorMessages.resx create mode 100644 src/Qir/Controller/Model/Error.cs create mode 100644 src/Qir/Controller/test-cases/internal-error-test.err create mode 100644 src/Qir/Controller/test-cases/internal-error-test.in diff --git a/.gitignore b/.gitignore index 5b33b48524e..7127ca52075 100644 --- a/.gitignore +++ b/.gitignore @@ -339,3 +339,6 @@ ASALocalRun/ /src/Simulation/Simulators.Tests/TestProjects/QSharpExe/built /src/Simulation/Simulators.Tests/TestProjects/TargetedExe/built dbw_test + +# Controller test artifacts +/src/Qir/Controller/test-artifacts/ \ No newline at end of file diff --git a/src/Qir/Controller/Constant.cs b/src/Qir/Controller/Constant.cs index 42475cb494b..13cb9b2cef1 100644 --- a/src/Qir/Controller/Constant.cs +++ b/src/Qir/Controller/Constant.cs @@ -12,5 +12,11 @@ public static class FilePath public const string DriverFilePath = "/home/driver.cpp"; public const string ExecutableFilePath = "/home/simulation.exe"; } + + // TODO: errors will be added as dependencies are implemented. + public static class ErrorCode + { + public const string InternalError = "InternalError"; + } } } diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index 5d43815a7b4..a44ebbcdb14 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -1,10 +1,13 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.IO; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.Quantum.Qir.Driver; using Microsoft.Quantum.Qir.Executable; +using Microsoft.Quantum.Qir.Model; using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; namespace Microsoft.Quantum.Qir @@ -21,29 +24,69 @@ public static async Task ExecuteAsync( IQirExecutableGenerator executableGenerator, IQuantumExecutableRunner executableRunner) { - // TODO: Error handling. // TODO: Logging. - // Step 1: Parse input. - using var inputFileStream = inputFile.OpenRead(); - var input = QirExecutionWrapperSerialization.DeserializeFromFastBinary(inputFileStream); + try + { + // Step 1: Parse input. + using var inputFileStream = inputFile.OpenRead(); + var input = QirExecutionWrapperSerialization.DeserializeFromFastBinary(inputFileStream); + + // Step 2: Create bytecode file. + using (var bytecodeFileStream = bytecodeFile.OpenWrite()) + { + await bytecodeFileStream.WriteAsync(input.QirBytecode.Array, input.QirBytecode.Offset, input.QirBytecode.Count); + } + + // Step 3: Create the driver file. + var driverFile = new FileInfo(Constant.FilePath.DriverFilePath); + await driverGenerator.GenerateQirDriverCppAsync(input.EntryPoint, driverFile); - // Step 2: Create bytecode file. - using (var bytecodeFileStream = bytecodeFile.OpenWrite()) + // Step 4: Create the executable. + var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); + await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, executableFile); + + // Step 5: Run the executable. + using var outputFileStream = outputFile.OpenWrite(); + await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); + } + catch (Exception e) { - await bytecodeFileStream.WriteAsync(input.QirBytecode.Array, input.QirBytecode.Offset, input.QirBytecode.Count); + await WriteExceptionToFileAsync(e, errorFile); + outputFile.Delete(); } + } - // Step 3: Create the driver file. - var driverFile = new FileInfo(Constant.FilePath.DriverFilePath); - await driverGenerator.GenerateQirDriverCppAsync(input.EntryPoint, driverFile); + private static async Task WriteExceptionToFileAsync(Exception e, FileInfo errorFile) + { + // Create the error object. + Error error; + if (e is ControllerException controllerException) + { + error = new Error + { + Code = controllerException.Code, + Message = controllerException.Message, + }; + } + else + { + error = new Error + { + Code = Constant.ErrorCode.InternalError, + Message = ErrorMessages.InternalError, + }; + } - // Step 4: Create the executable. - var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); - await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, executableFile); + // Serialize the error to JSON. + var errorJson = JsonSerializer.Serialize(error, new JsonSerializerOptions + { + WriteIndented = true, + }); - // Step 5: Run the executable. - using var outputFileStream = outputFile.Exists ? outputFile.OpenWrite() : outputFile.Create(); - await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); + // Write the error to the error file. + using var errorFileStream = errorFile.OpenWrite(); + using var streamWriter = new StreamWriter(errorFileStream); + await streamWriter.WriteAsync(errorJson); } } } diff --git a/src/Qir/Controller/ControllerException.cs b/src/Qir/Controller/ControllerException.cs new file mode 100644 index 00000000000..05cbd872cf9 --- /dev/null +++ b/src/Qir/Controller/ControllerException.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; + +namespace Microsoft.Quantum.Qir +{ + /// + /// Exception that represents an error that can be written to an error file. + /// + public class ControllerException : Exception + { + public ControllerException(string message, string code) + : base(message) + { + Code = code; + } + + public string Code { get; } + } +} diff --git a/src/Qir/Controller/ErrorMessages.Designer.cs b/src/Qir/Controller/ErrorMessages.Designer.cs new file mode 100644 index 00000000000..dbd8ce8ba5e --- /dev/null +++ b/src/Qir/Controller/ErrorMessages.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Quantum.Qir { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class ErrorMessages { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ErrorMessages() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Quantum.Qir.ErrorMessages", typeof(ErrorMessages).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to An internal error occurred.. + /// + public static string InternalError { + get { + return ResourceManager.GetString("InternalError", resourceCulture); + } + } + } +} diff --git a/src/Qir/Controller/ErrorMessages.resx b/src/Qir/Controller/ErrorMessages.resx new file mode 100644 index 00000000000..6cfb82bccc5 --- /dev/null +++ b/src/Qir/Controller/ErrorMessages.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + An internal error occurred. + + \ No newline at end of file diff --git a/src/Qir/Controller/Model/Error.cs b/src/Qir/Controller/Model/Error.cs new file mode 100644 index 00000000000..ee96bff5348 --- /dev/null +++ b/src/Qir/Controller/Model/Error.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Text.Json.Serialization; + +namespace Microsoft.Quantum.Qir.Model +{ + public class Error + { + [JsonPropertyName("code")] + public string Code { get; set; } + + [JsonPropertyName("message")] + public string Message { get; set; } + } +} diff --git a/src/Qir/Controller/QirController.csproj b/src/Qir/Controller/QirController.csproj index e6f5c6fa3fc..b00c550f212 100644 --- a/src/Qir/Controller/QirController.csproj +++ b/src/Qir/Controller/QirController.csproj @@ -22,4 +22,19 @@ + + + True + True + ErrorMessages.resx + + + + + + PublicResXFileCodeGenerator + ErrorMessages.Designer.cs + + + diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 83c6b17c2b7..5c60c270cb1 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -5,10 +5,12 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.Quantum.Qir; using Microsoft.Quantum.Qir.Driver; using Microsoft.Quantum.Qir.Executable; +using Microsoft.Quantum.Qir.Model; using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; using Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper; using Moq; @@ -114,6 +116,118 @@ await Controller.ExecuteAsync( It.Is(actualOutputFile => actualOutputFile.FullName == outputFile.FullName))); } + [Fact] + public async Task TestExecuteEncountersGenericExceptionWithOutputFileAlreadyCreated() + { + var libraryDirectory = new DirectoryInfo("libraries"); + var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); + var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ThrowsAsync(new Exception("exception message")); + + // Create output file to ensure that it will be deleted unconditionally. + using (var outputFileStream = outputFile.OpenWrite()) + using (var streamWriter = new StreamWriter(outputFileStream)) + { + await streamWriter.WriteAsync("program output"); + } + + // Execute controller. + await Controller.ExecuteAsync( + inputFile, + outputFile, + libraryDirectory, + errorFile, + bytecodeFile, + driverGeneratorMock.Object, + executableGeneratorMock.Object, + executableRunnerMock.Object); + + // Verify error file was created and contains the error. + Assert.True(errorFile.Exists); + using var errorFileStream = errorFile.OpenRead(); + using var streamReader = new StreamReader(errorFileStream); + var errorFileContents = await streamReader.ReadToEndAsync(); + var error = JsonSerializer.Deserialize(errorFileContents); + Assert.Equal(ErrorMessages.InternalError, error.Message); + Assert.Equal(Constant.ErrorCode.InternalError, error.Code); + + // Verify output file was deleted. + Assert.False(outputFile.Exists); + } + + [Fact] + public async Task TestExecuteEncountersGenericExceptionWithOutputFileNeverCreated() + { + var libraryDirectory = new DirectoryInfo("libraries"); + var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); + var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ThrowsAsync(new Exception("exception message")); + + // Execute controller. + await Controller.ExecuteAsync( + inputFile, + outputFile, + libraryDirectory, + errorFile, + bytecodeFile, + driverGeneratorMock.Object, + executableGeneratorMock.Object, + executableRunnerMock.Object); + + // Verify error file was created and contains the error. + Assert.True(errorFile.Exists); + using var errorFileStream = errorFile.OpenRead(); + using var streamReader = new StreamReader(errorFileStream); + var errorFileContents = await streamReader.ReadToEndAsync(); + var error = JsonSerializer.Deserialize(errorFileContents); + Assert.Equal(ErrorMessages.InternalError, error.Message); + Assert.Equal(Constant.ErrorCode.InternalError, error.Code); + } + + [Fact] + public async Task TestExecuteEncountersControllerException() + { + var exceptionMessage = "exception message"; + var errorCode = "error code"; + var libraryDirectory = new DirectoryInfo("libraries"); + var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); + var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ThrowsAsync(new ControllerException(exceptionMessage, errorCode)); + + // Create output file to ensure that it will be deleted unconditionally. + using (var outputFileStream = outputFile.OpenWrite()) + using (var streamWriter = new StreamWriter(outputFileStream)) + { + await streamWriter.WriteAsync("program output"); + } + + // Execute controller. + await Controller.ExecuteAsync( + inputFile, + outputFile, + libraryDirectory, + errorFile, + bytecodeFile, + driverGeneratorMock.Object, + executableGeneratorMock.Object, + executableRunnerMock.Object); + + // Verify error file was created and contains the error. + Assert.True(errorFile.Exists); + using var errorFileStream = errorFile.OpenRead(); + using var streamReader = new StreamReader(errorFileStream); + var errorFileContents = await streamReader.ReadToEndAsync(); + var error = JsonSerializer.Deserialize(errorFileContents); + Assert.Equal(exceptionMessage, error.Message); + Assert.Equal(errorCode, error.Code); + + // Verify output file was deleted. + Assert.False(outputFile.Exists); + } + private bool EntryPointsAreEqual(EntryPointOperation entryPointA, EntryPointOperation entryPointB) { var method = typeof(Extensions) diff --git a/src/Qir/Controller/test-cases/internal-error-test.err b/src/Qir/Controller/test-cases/internal-error-test.err new file mode 100644 index 00000000000..cc5c5a256f3 --- /dev/null +++ b/src/Qir/Controller/test-cases/internal-error-test.err @@ -0,0 +1,4 @@ +{ + "code": "InternalError", + "message": "An internal error occurred." +} \ No newline at end of file diff --git a/src/Qir/Controller/test-cases/internal-error-test.in b/src/Qir/Controller/test-cases/internal-error-test.in new file mode 100644 index 00000000000..37fc5162678 --- /dev/null +++ b/src/Qir/Controller/test-cases/internal-error-test.in @@ -0,0 +1 @@ +any input will do for now, but as errors become more specific, the corresponding test will need to change. \ No newline at end of file diff --git a/src/Qir/Controller/test-qir-controller.ps1 b/src/Qir/Controller/test-qir-controller.ps1 index bddb55ff62c..5b96a520b96 100644 --- a/src/Qir/Controller/test-qir-controller.ps1 +++ b/src/Qir/Controller/test-qir-controller.ps1 @@ -8,10 +8,7 @@ Write-Host "##[info]Test QIR Controller" $controllerProject = (Join-Path $PSScriptRoot QirController.csproj) $testCasesFolder = (Join-Path $PSScriptRoot "test-cases") $testArtifactsFolder = (Join-Path $PSScriptRoot "test-artifacts") -if (!(Test-Path $testCasesFolder)) { - Write-Host "No tests found. Returning." - return -} + if (!(Test-Path $testArtifactsFolder -PathType Container)) { New-Item -ItemType Directory -Force -Path $testArtifactsFolder } @@ -23,23 +20,38 @@ Foreach-Object { # Get the paths to the output and error files to pass to the QIR controller. $outputFile = (Join-Path $testArtifactsFolder ($_.BaseName + ".out")) $errorFile = (Join-Path $testArtifactsFolder ($_.BaseName + ".err")) - dotnet run --project $controllerProject -- --input $_.FullName --output $outputFile --error $errorFile + dotnet run --project $controllerProject -- --input $_.FullName --output $outputFile --error $errorFile --libraryDirectory "placeholder for now" # Compare the expected content of the output and error files vs the actual content. $expectedOutputFile = (Join-Path $testCasesFolder ($_.BaseName + ".out")) - $expectedOutput = Get-Content -Path $expectedOutputFile -Raw - $actualOutput = Get-Content -Path $outputFile -Raw - if (-not ($expectedOutput -ceq $actualOutput)) { - Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" - Write-Host "##[info]Expected output:" - Write-Host $expectedOutput - Write-Host "##[info]Actual output:" - Write-Host $actualOutput - $script:all_ok = $False - break + $expectedErrorFile = (Join-Path $testCasesFolder ($_.BaseName + ".err")) + + if ((Test-Path $expectedOutputFile)) { + $expectedOutput = Get-Content -Path $expectedOutputFile -Raw + $actualOutput = Get-Content -Path $outputFile -Raw + if (-not ($expectedOutput -ceq $actualOutput)) { + Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" + Write-Host "##[info]Expected output:" + Write-Host $expectedOutput + Write-Host "##[info]Actual output:" + Write-Host $actualOutput + $script:all_ok = $False + } + elseif ((Test-Path $errorFile)) { + $actualError = Get-Content -Path $errorFile -Raw + + # An error file should not have been generated, so fail test if one was found. + Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" + Write-Host "##[info]Unexpected error file was found:" + Write-Host $actualError + $script:all_ok = $False + } + else { + Write-Host "##[info]Test case '$($_.BaseName)' passed" + } + continue; } - $expectedErrorFile = (Join-Path $testCasesFolder ($_.BaseName + ".err")) $expectedError = Get-Content -Path $expectedErrorFile -Raw $actualError = Get-Content -Path $errorFile -Raw if (-not ($expectedError -ceq $actualError)) { @@ -49,10 +61,20 @@ Foreach-Object { Write-Host "##[info]Actual error:" Write-Host $actualError $script:all_ok = $False - break + continue } + elseif ((Test-Path $outputFile)) { + $actualOutput = Get-Content -Path $outputFile -Raw - Write-Host "##[info]Test case '$($_.BaseName)' passed" + # An error file should not have been generated, so fail test if one was found. + Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" + Write-Host "##[info]Unexpected output file was found:" + Write-Host $actualOutput + $script:all_ok = $False + } + else { + Write-Host "##[info]Test case '$($_.BaseName)' passed" + } } if (-not $all_ok) { From d1924152fca873568e2330674565dda857c39f23 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 13:56:35 -0700 Subject: [PATCH 06/16] Remove test artifacts from solution --- src/Qir/Controller/QirController.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Qir/Controller/QirController.csproj b/src/Qir/Controller/QirController.csproj index b00c550f212..3c7e124c26a 100644 --- a/src/Qir/Controller/QirController.csproj +++ b/src/Qir/Controller/QirController.csproj @@ -11,9 +11,13 @@ + + + + From 84725d33c2a6976b7e88db7c9c75b04acb8eaa24 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 14:56:10 -0700 Subject: [PATCH 07/16] Create logger and tests --- src/Qir/Controller/Controller.cs | 16 ++- src/Qir/Controller/Program.cs | 4 +- .../Tests.QirController/ControllerTests.cs | 14 ++- .../Tests.QirController/LoggerTests.cs | 100 ++++++++++++++++++ src/Qir/Controller/Utility/Clock.cs | 12 +++ src/Qir/Controller/Utility/IClock.cs | 15 +++ src/Qir/Controller/Utility/ILogger.cs | 24 +++++ src/Qir/Controller/Utility/Logger.cs | 41 +++++++ 8 files changed, 216 insertions(+), 10 deletions(-) create mode 100644 src/Qir/Controller/Tests.QirController/LoggerTests.cs create mode 100644 src/Qir/Controller/Utility/Clock.cs create mode 100644 src/Qir/Controller/Utility/IClock.cs create mode 100644 src/Qir/Controller/Utility/ILogger.cs create mode 100644 src/Qir/Controller/Utility/Logger.cs diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index a44ebbcdb14..e0c8f5dfa4c 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -8,6 +8,7 @@ using Microsoft.Quantum.Qir.Driver; using Microsoft.Quantum.Qir.Executable; using Microsoft.Quantum.Qir.Model; +using Microsoft.Quantum.Qir.Utility; using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; namespace Microsoft.Quantum.Qir @@ -22,30 +23,35 @@ public static async Task ExecuteAsync( FileInfo bytecodeFile, IQirDriverGenerator driverGenerator, IQirExecutableGenerator executableGenerator, - IQuantumExecutableRunner executableRunner) + IQuantumExecutableRunner executableRunner, + ILogger logger) { - // TODO: Logging. try { // Step 1: Parse input. + logger.LogInfo("Parsing input."); using var inputFileStream = inputFile.OpenRead(); var input = QirExecutionWrapperSerialization.DeserializeFromFastBinary(inputFileStream); // Step 2: Create bytecode file. + logger.LogInfo("Creating bytecode file."); using (var bytecodeFileStream = bytecodeFile.OpenWrite()) { await bytecodeFileStream.WriteAsync(input.QirBytecode.Array, input.QirBytecode.Offset, input.QirBytecode.Count); } - // Step 3: Create the driver file. + // Step 3: Create driver file. + logger.LogInfo("Creating driver file."); var driverFile = new FileInfo(Constant.FilePath.DriverFilePath); await driverGenerator.GenerateQirDriverCppAsync(input.EntryPoint, driverFile); - // Step 4: Create the executable. + // Step 4: Create executable. + logger.LogInfo("Compiling and linking executable."); var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, executableFile); - // Step 5: Run the executable. + // Step 5: Run executable. + logger.LogInfo("Running executable."); using var outputFileStream = outputFile.OpenWrite(); await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); } diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index 20a5791de12..1fb847b567d 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -6,6 +6,7 @@ using System.IO; using Microsoft.Quantum.Qir.Driver; using Microsoft.Quantum.Qir.Executable; +using Microsoft.Quantum.Qir.Utility; namespace Microsoft.Quantum.Qir { @@ -54,6 +55,7 @@ static void Main(string[] args) var execGenerator = new QirExecutableGenerator(new ClangClient()); var driverGenerator = new QirDriverGenerator(); var execRunner = new QuantumExecutableRunner(); + var logger = new Logger(new Clock()); // The bytecode file is not needed as an input to the program, but we provide the path as an argument to the controller so it can be configured by tests. var bytecodeFile = new FileInfo(Constant.FilePath.BytecodeFilePath); @@ -61,7 +63,7 @@ static void Main(string[] args) // Bind to a handler and invoke. rootCommand.Handler = CommandHandler.Create( async (input, output, libraryDirectory, error) => - await Controller.ExecuteAsync(input, output, libraryDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner)); + await Controller.ExecuteAsync(input, output, libraryDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner, logger)); rootCommand.Invoke(args); } } diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 5c60c270cb1..52345d233a0 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -11,6 +11,7 @@ using Microsoft.Quantum.Qir.Driver; using Microsoft.Quantum.Qir.Executable; using Microsoft.Quantum.Qir.Model; +using Microsoft.Quantum.Qir.Utility; using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; using Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper; using Moq; @@ -24,6 +25,7 @@ public class ControllerTests : IDisposable private Mock driverGeneratorMock; private Mock executableGeneratorMock; private Mock executableRunnerMock; + private Mock loggerMock; private FileInfo inputFile; private FileInfo bytecodeFile; private FileInfo errorFile; @@ -95,7 +97,8 @@ await Controller.ExecuteAsync( bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, - executableRunnerMock.Object); + executableRunnerMock.Object, + loggerMock.Object); // Verify driver was created. driverGeneratorMock.Verify(obj => obj.GenerateQirDriverCppAsync( @@ -141,7 +144,8 @@ await Controller.ExecuteAsync( bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, - executableRunnerMock.Object); + executableRunnerMock.Object, + loggerMock.Object); // Verify error file was created and contains the error. Assert.True(errorFile.Exists); @@ -174,7 +178,8 @@ await Controller.ExecuteAsync( bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, - executableRunnerMock.Object); + executableRunnerMock.Object, + loggerMock.Object); // Verify error file was created and contains the error. Assert.True(errorFile.Exists); @@ -213,7 +218,8 @@ await Controller.ExecuteAsync( bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, - executableRunnerMock.Object); + executableRunnerMock.Object, + loggerMock.Object); // Verify error file was created and contains the error. Assert.True(errorFile.Exists); diff --git a/src/Qir/Controller/Tests.QirController/LoggerTests.cs b/src/Qir/Controller/Tests.QirController/LoggerTests.cs new file mode 100644 index 00000000000..eb180e7fecc --- /dev/null +++ b/src/Qir/Controller/Tests.QirController/LoggerTests.cs @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Quantum.Qir; +using Microsoft.Quantum.Qir.Driver; +using Microsoft.Quantum.Qir.Executable; +using Microsoft.Quantum.Qir.Model; +using Microsoft.Quantum.Qir.Utility; +using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; +using Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper; +using Moq; +using Xunit; +using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; + +namespace Tests.QirController +{ + public class LoggerTests + { + private readonly Mock clockMock; + private readonly Logger logger; + + public LoggerTests() + { + clockMock = new Mock(); + logger = new Logger(clockMock.Object); + } + + [Fact] + public void TestLogInfo() + { + using var consoleOutput = new StringWriter(); + var message = "some message"; + clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + var expectedLog = "1/1/0001 12:00:00 AM +00:00 [INFO]: some message" + Environment.NewLine; + Console.SetOut(consoleOutput); + logger.LogInfo(message); + var actualLog = consoleOutput.ToString(); + Assert.Equal(expectedLog, actualLog); + } + + [Fact] + public void TestLogError() + { + using var consoleOutput = new StringWriter(); + var message = "some message"; + clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: some message" + Environment.NewLine; + Console.SetOut(consoleOutput); + logger.LogError(message); + var actualLog = consoleOutput.ToString(); + Assert.Equal(expectedLog, actualLog); + } + + [Fact] + public void TestLogExceptionWithoutStackTrace() + { + using var consoleOutput = new StringWriter(); + clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + var exception = new InvalidOperationException(); + var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: " + + "Exception encountered: System.InvalidOperationException: " + + exception.Message + Environment.NewLine + exception.StackTrace + Environment.NewLine; + Console.SetOut(consoleOutput); + logger.LogException(exception); + var actualLog = consoleOutput.ToString(); + Assert.Equal(expectedLog, actualLog); + } + + [Fact] + public void TestLogExceptionWithStackTrace() + { + using var consoleOutput = new StringWriter(); + clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + Exception exception; + try + { + throw new InvalidOperationException(); + } + // Throw exception to generate stack trace. + catch (Exception thrownException) + { + exception = thrownException; + } + + var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: " + + "Exception encountered: System.InvalidOperationException: " + + exception.Message + Environment.NewLine + exception.StackTrace + Environment.NewLine; + Console.SetOut(consoleOutput); + logger.LogException(exception); + var actualLog = consoleOutput.ToString(); + Assert.Equal(expectedLog, actualLog); + } + } +} diff --git a/src/Qir/Controller/Utility/Clock.cs b/src/Qir/Controller/Utility/Clock.cs new file mode 100644 index 00000000000..7f1fdc8c78e --- /dev/null +++ b/src/Qir/Controller/Utility/Clock.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; + +namespace Microsoft.Quantum.Qir.Utility +{ + public class Clock : IClock + { + public DateTimeOffset Now => DateTimeOffset.Now; + } +} diff --git a/src/Qir/Controller/Utility/IClock.cs b/src/Qir/Controller/Utility/IClock.cs new file mode 100644 index 00000000000..da69204b74a --- /dev/null +++ b/src/Qir/Controller/Utility/IClock.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; + +namespace Microsoft.Quantum.Qir.Utility +{ + /// + /// Mockable clock interface. + /// + public interface IClock + { + public DateTimeOffset Now { get; } + } +} diff --git a/src/Qir/Controller/Utility/ILogger.cs b/src/Qir/Controller/Utility/ILogger.cs new file mode 100644 index 00000000000..83a0bb86452 --- /dev/null +++ b/src/Qir/Controller/Utility/ILogger.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace Microsoft.Quantum.Qir.Utility +{ + /// + /// Logger for internal traces and errors. + /// + /// For now, this thinly wraps console logging. In the future, this might be extended to log to files or other systems. + public interface ILogger + { + /// + /// Logs a message at the "information" level. + /// + /// Message to log. + void LogInfo(string message); + + /// + /// Logs a message at the "error" level. + /// + /// Message to log. + void LogError(string message); + } +} diff --git a/src/Qir/Controller/Utility/Logger.cs b/src/Qir/Controller/Utility/Logger.cs new file mode 100644 index 00000000000..4aa2074a760 --- /dev/null +++ b/src/Qir/Controller/Utility/Logger.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; + +namespace Microsoft.Quantum.Qir.Utility +{ + public class Logger : ILogger + { + private readonly IClock clock; + + public Logger(IClock clock) + { + this.clock = clock; + } + + // {timestamp} [{log level}]: {message}. + private const string LogFormat = "{0} [{1}]: {2}"; + + // ...{exception type}: {exception message}{Environment.NewLine}{stack trace}. + private const string ExceptionMessageFormat = "Exception encountered: {0}: {1}{2}{3}"; + private const string InfoLevel = "INFO"; + private const string ErrorLevel = "ERROR"; + + public void LogInfo(string message) + { + Console.WriteLine(LogFormat, clock.Now, InfoLevel, message); + } + + public void LogError(string message) + { + Console.WriteLine(LogFormat, clock.Now, ErrorLevel, message); + } + + public void LogException(Exception e) + { + var message = string.Format(ExceptionMessageFormat, e.GetType(), e.Message, Environment.NewLine, e.StackTrace); + LogError(message); + } + } +} From 52cca9f25596b304bb9194005dab7d3a8d15318e Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 15:08:46 -0700 Subject: [PATCH 08/16] Add logs --- src/Qir/Controller/Controller.cs | 2 ++ src/Qir/Controller/Driver/QirDriverGenerator.cs | 8 ++++++++ src/Qir/Controller/Executable/ClangClient.cs | 15 +++++++++++++-- .../Executable/QirExecutableGenerator.cs | 5 ++++- .../Executable/QuantumExecutableRunner.cs | 8 ++++++++ src/Qir/Controller/Program.cs | 11 ++++++----- .../Tests.QirController/ControllerTests.cs | 1 + src/Qir/Controller/Utility/ILogger.cs | 8 ++++++++ 8 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index e0c8f5dfa4c..5849fa99d33 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -57,6 +57,8 @@ public static async Task ExecuteAsync( } catch (Exception e) { + logger.LogError("An error has been encountered. Will write an error to the error file and delete any output that has been generated."); + logger.LogException(e); await WriteExceptionToFileAsync(e, errorFile); outputFile.Delete(); } diff --git a/src/Qir/Controller/Driver/QirDriverGenerator.cs b/src/Qir/Controller/Driver/QirDriverGenerator.cs index 34caeb01f59..75711d7a056 100644 --- a/src/Qir/Controller/Driver/QirDriverGenerator.cs +++ b/src/Qir/Controller/Driver/QirDriverGenerator.cs @@ -3,12 +3,20 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Utility; using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; namespace Microsoft.Quantum.Qir.Driver { public class QirDriverGenerator : IQirDriverGenerator { + private readonly ILogger logger; + + public QirDriverGenerator(ILogger logger) + { + this.logger = logger; + } + public Task GenerateQirDriverCppAsync(EntryPointOperation entryPointOperation, FileInfo driverFile) { throw new System.NotImplementedException(); diff --git a/src/Qir/Controller/Executable/ClangClient.cs b/src/Qir/Controller/Executable/ClangClient.cs index 4a6c993dd86..59693fafdf4 100644 --- a/src/Qir/Controller/Executable/ClangClient.cs +++ b/src/Qir/Controller/Executable/ClangClient.cs @@ -1,22 +1,33 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using System; using System.CommandLine.Invocation; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Utility; namespace Microsoft.Quantum.Qir.Executable { public class ClangClient : IClangClient { private const string LinkFlag = " -l "; + private readonly ILogger logger; + + public ClangClient(ILogger logger) + { + this.logger = logger; + } public async Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string outputPath) { var inputsArg = string.Join(' ', inputFiles); var librariesArg = $"{LinkFlag} {string.Join(LinkFlag, libraries)}"; var arguments = $"{inputsArg} -L {libraryPath} {librariesArg} -o {outputPath}"; - var result = await Process.ExecuteAsync("clang", arguments, stdOut: s => { Console.WriteLine(s); }, stdErr: s => { Console.WriteLine(s); }); + logger.LogInfo($"Invoking clang with the following arguments: {arguments}"); + var result = await Process.ExecuteAsync( + "clang", + arguments, + stdOut: s => { logger.LogInfo("clang: " + s); }, + stdErr: s => { logger.LogError("clang: " + s); }); } } } diff --git a/src/Qir/Controller/Executable/QirExecutableGenerator.cs b/src/Qir/Controller/Executable/QirExecutableGenerator.cs index 1b521c6f762..46daf7ebb8a 100644 --- a/src/Qir/Controller/Executable/QirExecutableGenerator.cs +++ b/src/Qir/Controller/Executable/QirExecutableGenerator.cs @@ -3,16 +3,19 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Utility; namespace Microsoft.Quantum.Qir.Executable { public class QirExecutableGenerator : IQirExecutableGenerator { private readonly IClangClient clangClient; + private readonly ILogger logger; - public QirExecutableGenerator(IClangClient clangClient) + public QirExecutableGenerator(IClangClient clangClient, ILogger logger) { this.clangClient = clangClient; + this.logger = logger; } public Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, FileInfo executableFile) diff --git a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs index 14a35fc8659..774aa0cf517 100644 --- a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs +++ b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs @@ -3,12 +3,20 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Utility; using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; namespace Microsoft.Quantum.Qir.Executable { public class QuantumExecutableRunner : IQuantumExecutableRunner { + private readonly ILogger logger; + + public QuantumExecutableRunner(ILogger logger) + { + this.logger = logger; + } + public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile) { throw new System.NotImplementedException(); diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index 1fb847b567d..92d0041fca1 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -14,6 +14,12 @@ class Program { static void Main(string[] args) { + var logger = new Logger(new Clock()); + var execGenerator = new QirExecutableGenerator(new ClangClient(logger), logger); + var driverGenerator = new QirDriverGenerator(logger); + var execRunner = new QuantumExecutableRunner(logger); + logger.LogInfo("QIR controller beginning."); + var rootCommand = new RootCommand( description: "Builds and runs QIR executable."); @@ -52,11 +58,6 @@ static void Main(string[] args) rootCommand.AddOption(errorOption); - var execGenerator = new QirExecutableGenerator(new ClangClient()); - var driverGenerator = new QirDriverGenerator(); - var execRunner = new QuantumExecutableRunner(); - var logger = new Logger(new Clock()); - // The bytecode file is not needed as an input to the program, but we provide the path as an argument to the controller so it can be configured by tests. var bytecodeFile = new FileInfo(Constant.FilePath.BytecodeFilePath); diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 52345d233a0..2298026d4d6 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -41,6 +41,7 @@ public ControllerTests() bytecodeFile = new FileInfo($"{Guid.NewGuid()}-bytecode"); errorFile = new FileInfo($"{Guid.NewGuid()}-error"); outputFile = new FileInfo($"{Guid.NewGuid()}-output"); + loggerMock = new Mock(); // Create a QirExecutableWrapper to be used by the tests. byte[] bytecode = { 1, 2, 3, 4, 5 }; diff --git a/src/Qir/Controller/Utility/ILogger.cs b/src/Qir/Controller/Utility/ILogger.cs index 83a0bb86452..7049bee9582 100644 --- a/src/Qir/Controller/Utility/ILogger.cs +++ b/src/Qir/Controller/Utility/ILogger.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; + namespace Microsoft.Quantum.Qir.Utility { /// @@ -20,5 +22,11 @@ public interface ILogger /// /// Message to log. void LogError(string message); + + /// + /// Formats an exception into an error log. Logs the exception type, message, and stack trace. + /// + /// Exception to log. + void LogException(Exception e); } } From 351385898af088f58f253595efb375399db6d166 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Thu, 8 Apr 2021 16:54:52 -0700 Subject: [PATCH 09/16] Fix warning level --- src/Qir/Controller/QirController.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Qir/Controller/QirController.csproj b/src/Qir/Controller/QirController.csproj index 3c7e124c26a..aff9bd1d39c 100644 --- a/src/Qir/Controller/QirController.csproj +++ b/src/Qir/Controller/QirController.csproj @@ -7,7 +7,7 @@ - 5 + 4 From 74fb929cd4425c84ec57577ab38f0097d1651b4c Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 09:25:05 -0700 Subject: [PATCH 10/16] Fix unit tests for linux --- .../Tests.QirController/LoggerTests.cs | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/Qir/Controller/Tests.QirController/LoggerTests.cs b/src/Qir/Controller/Tests.QirController/LoggerTests.cs index eb180e7fecc..ee7adfee70a 100644 --- a/src/Qir/Controller/Tests.QirController/LoggerTests.cs +++ b/src/Qir/Controller/Tests.QirController/LoggerTests.cs @@ -1,22 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; -using System.Collections.Generic; using System.IO; -using System.Reflection; -using System.Text.Json; -using System.Threading.Tasks; -using Microsoft.Quantum.Qir; -using Microsoft.Quantum.Qir.Driver; -using Microsoft.Quantum.Qir.Executable; -using Microsoft.Quantum.Qir.Model; using Microsoft.Quantum.Qir.Utility; -using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; -using Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper; using Moq; using Xunit; -using QirExecutionWrapperSerialization = Microsoft.Quantum.QsCompiler.BondSchemas.QirExecutionWrapper.Protocols; namespace Tests.QirController { @@ -36,8 +25,9 @@ public void TestLogInfo() { using var consoleOutput = new StringWriter(); var message = "some message"; - clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); - var expectedLog = "1/1/0001 12:00:00 AM +00:00 [INFO]: some message" + Environment.NewLine; + var time = DateTimeOffset.MinValue; + clockMock.SetupGet(obj => obj.Now).Returns(time); + var expectedLog = $"{time} [INFO]: some message" + Environment.NewLine; Console.SetOut(consoleOutput); logger.LogInfo(message); var actualLog = consoleOutput.ToString(); @@ -49,8 +39,9 @@ public void TestLogError() { using var consoleOutput = new StringWriter(); var message = "some message"; - clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); - var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: some message" + Environment.NewLine; + var time = DateTimeOffset.MinValue; + clockMock.SetupGet(obj => obj.Now).Returns(time); + var expectedLog = $"{time} [ERROR]: some message" + Environment.NewLine; Console.SetOut(consoleOutput); logger.LogError(message); var actualLog = consoleOutput.ToString(); @@ -61,9 +52,10 @@ public void TestLogError() public void TestLogExceptionWithoutStackTrace() { using var consoleOutput = new StringWriter(); - clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + var time = DateTimeOffset.MinValue; + clockMock.SetupGet(obj => obj.Now).Returns(time); var exception = new InvalidOperationException(); - var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: " + + var expectedLog = $"{time} [ERROR]: " + "Exception encountered: System.InvalidOperationException: " + exception.Message + Environment.NewLine + exception.StackTrace + Environment.NewLine; Console.SetOut(consoleOutput); @@ -76,7 +68,8 @@ public void TestLogExceptionWithoutStackTrace() public void TestLogExceptionWithStackTrace() { using var consoleOutput = new StringWriter(); - clockMock.SetupGet(obj => obj.Now).Returns(DateTimeOffset.MinValue); + var time = DateTimeOffset.MinValue; + clockMock.SetupGet(obj => obj.Now).Returns(time); Exception exception; try { @@ -88,7 +81,7 @@ public void TestLogExceptionWithStackTrace() exception = thrownException; } - var expectedLog = "1/1/0001 12:00:00 AM +00:00 [ERROR]: " + + var expectedLog = $"{time} [ERROR]: " + "Exception encountered: System.InvalidOperationException: " + exception.Message + Environment.NewLine + exception.StackTrace + Environment.NewLine; Console.SetOut(consoleOutput); From 66ddfb007f738fe838a736bc3f65b42b9d000344 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 09:27:03 -0700 Subject: [PATCH 11/16] Fix header --- src/Qir/Controller/Tests.QirController/ControllerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 2298026d4d6..69071170985 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; From f2ff7b27f7a38837895b8eaeaabc520e886e0137 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 09:44:39 -0700 Subject: [PATCH 12/16] Add include directory --- src/Qir/Controller/Controller.cs | 5 +++-- src/Qir/Controller/Executable/ClangClient.cs | 4 ++-- src/Qir/Controller/Executable/IClangClient.cs | 2 +- .../Executable/IQirExecutableGenerator.cs | 3 ++- .../Executable/IQuantumExecutableRunner.cs | 3 ++- .../Executable/QirExecutableGenerator.cs | 2 +- .../Executable/QuantumExecutableRunner.cs | 2 +- src/Qir/Controller/Program.cs | 13 ++++++++++--- .../Tests.QirController/ControllerTests.cs | 18 ++++++++++++++---- src/Qir/Controller/test-qir-controller.ps1 | 2 +- 10 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index 5849fa99d33..ffa0c0617a1 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -19,6 +19,7 @@ public static async Task ExecuteAsync( FileInfo inputFile, FileInfo outputFile, DirectoryInfo libraryDirectory, + DirectoryInfo includeDirectory, FileInfo errorFile, FileInfo bytecodeFile, IQirDriverGenerator driverGenerator, @@ -48,12 +49,12 @@ public static async Task ExecuteAsync( // Step 4: Create executable. logger.LogInfo("Compiling and linking executable."); var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); - await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, executableFile); + await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, includeDirectory, executableFile); // Step 5: Run executable. logger.LogInfo("Running executable."); using var outputFileStream = outputFile.OpenWrite(); - await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); + await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, libraryDirectory, outputFile); } catch (Exception e) { diff --git a/src/Qir/Controller/Executable/ClangClient.cs b/src/Qir/Controller/Executable/ClangClient.cs index 59693fafdf4..27a13806c3f 100644 --- a/src/Qir/Controller/Executable/ClangClient.cs +++ b/src/Qir/Controller/Executable/ClangClient.cs @@ -17,11 +17,11 @@ public ClangClient(ILogger logger) this.logger = logger; } - public async Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string outputPath) + public async Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string includePath, string outputPath) { var inputsArg = string.Join(' ', inputFiles); var librariesArg = $"{LinkFlag} {string.Join(LinkFlag, libraries)}"; - var arguments = $"{inputsArg} -L {libraryPath} {librariesArg} -o {outputPath}"; + var arguments = $"{inputsArg} -I {includePath} -L {libraryPath} {librariesArg} -o {outputPath}"; logger.LogInfo($"Invoking clang with the following arguments: {arguments}"); var result = await Process.ExecuteAsync( "clang", diff --git a/src/Qir/Controller/Executable/IClangClient.cs b/src/Qir/Controller/Executable/IClangClient.cs index 313c92f3e89..7e7a8e1c95d 100644 --- a/src/Qir/Controller/Executable/IClangClient.cs +++ b/src/Qir/Controller/Executable/IClangClient.cs @@ -10,6 +10,6 @@ namespace Microsoft.Quantum.Qir.Executable /// public interface IClangClient { - Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string outputPath); + Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string includePath, string outputPath); } } diff --git a/src/Qir/Controller/Executable/IQirExecutableGenerator.cs b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs index 54854cfed21..21aab292831 100644 --- a/src/Qir/Controller/Executable/IQirExecutableGenerator.cs +++ b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs @@ -14,8 +14,9 @@ public interface IQirExecutableGenerator /// The C++ source driver file. /// The QIR bytecode. /// Location of the libraries that must be linked. + /// Location of the headers that must be included. /// File path to create the executable at. /// - Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, FileInfo executableFile); + Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory, FileInfo executableFile); } } diff --git a/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs index 135fbbbfb4f..f74aae5a028 100644 --- a/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs +++ b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs @@ -14,8 +14,9 @@ public interface IQuantumExecutableRunner /// /// Location of the executable to run. /// Entry point and arguments to pass. + /// Location of the libraries that are linked to the executable. /// Location to write program output. /// - Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile); + Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, DirectoryInfo libraryDirectory, FileInfo outputFile); } } diff --git a/src/Qir/Controller/Executable/QirExecutableGenerator.cs b/src/Qir/Controller/Executable/QirExecutableGenerator.cs index 46daf7ebb8a..59fa798e955 100644 --- a/src/Qir/Controller/Executable/QirExecutableGenerator.cs +++ b/src/Qir/Controller/Executable/QirExecutableGenerator.cs @@ -18,7 +18,7 @@ public QirExecutableGenerator(IClangClient clangClient, ILogger logger) this.logger = logger; } - public Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, FileInfo executableFile) + public Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory, FileInfo executableFile) { // TODO: Compile and link libraries- "Microsoft.Quantum.Qir.Runtime", "Microsoft.Quantum.Qir.QSharp.Foundation", "Microsoft.Quantum.Qir.QSharp.Core" throw new System.NotImplementedException(); diff --git a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs index 774aa0cf517..0d7875ead4d 100644 --- a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs +++ b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs @@ -17,7 +17,7 @@ public QuantumExecutableRunner(ILogger logger) this.logger = logger; } - public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile) + public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, DirectoryInfo libraryDirectory, FileInfo outputFile) { throw new System.NotImplementedException(); } diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index 92d0041fca1..3edddc4cbdf 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -48,6 +48,13 @@ static void Main(string[] args) IsRequired = true }; + var includeDirectoryOption = new Option( + aliases: new string[] { "--includeDirectory" }) + { + Description = "Path to the directory containing headers that must be included by the C++ driver.", + IsRequired = true + }; + rootCommand.AddOption(libraryDirectoryOption); var errorOption = new Option( aliases: new string[] { "--error",}) @@ -62,9 +69,9 @@ static void Main(string[] args) var bytecodeFile = new FileInfo(Constant.FilePath.BytecodeFilePath); // Bind to a handler and invoke. - rootCommand.Handler = CommandHandler.Create( - async (input, output, libraryDirectory, error) => - await Controller.ExecuteAsync(input, output, libraryDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner, logger)); + rootCommand.Handler = CommandHandler.Create( + async (input, output, libraryDirectory, includeDirectory, error) => + await Controller.ExecuteAsync(input, output, libraryDirectory, includeDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner, logger)); rootCommand.Invoke(args); } } diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 69071170985..5eafd144888 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -77,9 +77,10 @@ public void Dispose() public async Task TestExecute() { var libraryDirectory = new DirectoryInfo("libraries"); + var includeDirectory = new DirectoryInfo("includes"); var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Callback(() => + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Callback(() => { // Verify that the "bytecode" file was created correctly. using var bytecode = bytecodeFile.OpenRead(); @@ -94,6 +95,7 @@ await Controller.ExecuteAsync( inputFile, outputFile, libraryDirectory, + includeDirectory, errorFile, bytecodeFile, driverGeneratorMock.Object, @@ -111,12 +113,14 @@ await Controller.ExecuteAsync( It.Is(driverPath => driverPath.FullName == expectedDriverPath.FullName), It.Is(actualBytecodeFile => actualBytecodeFile.FullName == bytecodeFile.FullName), It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), + It.Is(actualIncludeDirectory => actualIncludeDirectory.FullName == includeDirectory.FullName), It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName))); // Verify executable was run. executableRunnerMock.Verify(obj => obj.RunExecutableAsync( It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName), It.Is(entryPoint => EntryPointsAreEqual(entryPoint, input.EntryPoint)), + It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), It.Is(actualOutputFile => actualOutputFile.FullName == outputFile.FullName))); } @@ -124,9 +128,10 @@ await Controller.ExecuteAsync( public async Task TestExecuteEncountersGenericExceptionWithOutputFileAlreadyCreated() { var libraryDirectory = new DirectoryInfo("libraries"); + var includeDirectory = new DirectoryInfo("includes"); var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception("exception message")); // Create output file to ensure that it will be deleted unconditionally. @@ -141,6 +146,7 @@ await Controller.ExecuteAsync( inputFile, outputFile, libraryDirectory, + includeDirectory, errorFile, bytecodeFile, driverGeneratorMock.Object, @@ -165,9 +171,10 @@ await Controller.ExecuteAsync( public async Task TestExecuteEncountersGenericExceptionWithOutputFileNeverCreated() { var libraryDirectory = new DirectoryInfo("libraries"); + var includeDirectory = new DirectoryInfo("includes"); var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception("exception message")); // Execute controller. @@ -175,6 +182,7 @@ await Controller.ExecuteAsync( inputFile, outputFile, libraryDirectory, + includeDirectory, errorFile, bytecodeFile, driverGeneratorMock.Object, @@ -198,9 +206,10 @@ public async Task TestExecuteEncountersControllerException() var exceptionMessage = "exception message"; var errorCode = "error code"; var libraryDirectory = new DirectoryInfo("libraries"); + var includeDirectory = new DirectoryInfo("includes"); var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new ControllerException(exceptionMessage, errorCode)); // Create output file to ensure that it will be deleted unconditionally. @@ -215,6 +224,7 @@ await Controller.ExecuteAsync( inputFile, outputFile, libraryDirectory, + includeDirectory, errorFile, bytecodeFile, driverGeneratorMock.Object, diff --git a/src/Qir/Controller/test-qir-controller.ps1 b/src/Qir/Controller/test-qir-controller.ps1 index 5b96a520b96..824c8ad4bba 100644 --- a/src/Qir/Controller/test-qir-controller.ps1 +++ b/src/Qir/Controller/test-qir-controller.ps1 @@ -20,7 +20,7 @@ Foreach-Object { # Get the paths to the output and error files to pass to the QIR controller. $outputFile = (Join-Path $testArtifactsFolder ($_.BaseName + ".out")) $errorFile = (Join-Path $testArtifactsFolder ($_.BaseName + ".err")) - dotnet run --project $controllerProject -- --input $_.FullName --output $outputFile --error $errorFile --libraryDirectory "placeholder for now" + dotnet run --project $controllerProject -- --input $_.FullName --output $outputFile --error $errorFile --includeDirectory "placeholder for now" --libraryDirectory "placeholder for now" # Compare the expected content of the output and error files vs the actual content. $expectedOutputFile = (Join-Path $testCasesFolder ($_.BaseName + ".out")) From 0b1936607b5a51b477dd1d924472fdc9c54517db Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 09:49:17 -0700 Subject: [PATCH 13/16] Clean up and fix input --- src/Qir/Controller/Program.cs | 3 ++- src/Qir/Controller/QirController.csproj | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index 3edddc4cbdf..6448ebcc678 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -48,6 +48,7 @@ static void Main(string[] args) IsRequired = true }; + rootCommand.AddOption(libraryDirectoryOption); var includeDirectoryOption = new Option( aliases: new string[] { "--includeDirectory" }) { @@ -55,7 +56,7 @@ static void Main(string[] args) IsRequired = true }; - rootCommand.AddOption(libraryDirectoryOption); + rootCommand.AddOption(includeDirectoryOption); var errorOption = new Option( aliases: new string[] { "--error",}) { diff --git a/src/Qir/Controller/QirController.csproj b/src/Qir/Controller/QirController.csproj index aff9bd1d39c..4570cafa210 100644 --- a/src/Qir/Controller/QirController.csproj +++ b/src/Qir/Controller/QirController.csproj @@ -6,10 +6,6 @@ Microsoft.Quantum.Qir - - 4 - - From ae18d34ad636789fb6b488569c041a000de5609b Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 12:05:05 -0700 Subject: [PATCH 14/16] Change how directories are passed --- src/Qir/Controller/Constant.cs | 8 --- src/Qir/Controller/Controller.cs | 29 ++++---- .../Controller/Driver/IQirDriverGenerator.cs | 8 ++- .../Controller/Driver/QirDriverGenerator.cs | 5 +- .../Executable/IQirExecutableGenerator.cs | 7 +- .../Executable/IQuantumExecutableRunner.cs | 3 +- .../Executable/QirExecutableGenerator.cs | 2 +- .../Executable/QuantumExecutableRunner.cs | 2 +- src/Qir/Controller/Program.cs | 5 +- .../Tests.QirController/ControllerTests.cs | 69 ++++++++++--------- 10 files changed, 66 insertions(+), 72 deletions(-) diff --git a/src/Qir/Controller/Constant.cs b/src/Qir/Controller/Constant.cs index 13cb9b2cef1..23d5a8ba351 100644 --- a/src/Qir/Controller/Constant.cs +++ b/src/Qir/Controller/Constant.cs @@ -5,14 +5,6 @@ namespace Microsoft.Quantum.Qir { public static class Constant { - public static class FilePath - { - // TODO validate/improve these names. - public const string BytecodeFilePath = "/home/bytecode.ll"; - public const string DriverFilePath = "/home/driver.cpp"; - public const string ExecutableFilePath = "/home/simulation.exe"; - } - // TODO: errors will be added as dependencies are implemented. public static class ErrorCode { diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index ffa0c0617a1..463c28014a4 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -15,13 +15,16 @@ namespace Microsoft.Quantum.Qir { public static class Controller { + private const string SourceDirectoryPath = "src"; + private const string BinaryDirectoryPath = "bin"; + private const string ExecutableName = "simulation.exe"; + public static async Task ExecuteAsync( FileInfo inputFile, FileInfo outputFile, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory, FileInfo errorFile, - FileInfo bytecodeFile, IQirDriverGenerator driverGenerator, IQirExecutableGenerator executableGenerator, IQuantumExecutableRunner executableRunner, @@ -34,27 +37,21 @@ public static async Task ExecuteAsync( using var inputFileStream = inputFile.OpenRead(); var input = QirExecutionWrapperSerialization.DeserializeFromFastBinary(inputFileStream); - // Step 2: Create bytecode file. - logger.LogInfo("Creating bytecode file."); - using (var bytecodeFileStream = bytecodeFile.OpenWrite()) - { - await bytecodeFileStream.WriteAsync(input.QirBytecode.Array, input.QirBytecode.Offset, input.QirBytecode.Count); - } - - // Step 3: Create driver file. + // Step 32: Create driver. logger.LogInfo("Creating driver file."); - var driverFile = new FileInfo(Constant.FilePath.DriverFilePath); - await driverGenerator.GenerateQirDriverCppAsync(input.EntryPoint, driverFile); + var sourceDirectory = new DirectoryInfo(SourceDirectoryPath); + await driverGenerator.GenerateQirDriverCppAsync(sourceDirectory, input.EntryPoint, input.QirBytecode); - // Step 4: Create executable. + // Step 3: Create executable. logger.LogInfo("Compiling and linking executable."); - var executableFile = new FileInfo(Constant.FilePath.ExecutableFilePath); - await executableGenerator.GenerateExecutableAsync(driverFile, bytecodeFile, libraryDirectory, includeDirectory, executableFile); + var binaryDirectory = new DirectoryInfo(BinaryDirectoryPath); + var executableFile = new FileInfo(Path.Combine(BinaryDirectoryPath, ExecutableName)); + await executableGenerator.GenerateExecutableAsync(executableFile, sourceDirectory, libraryDirectory, includeDirectory); - // Step 5: Run executable. + // Step 4: Run executable. logger.LogInfo("Running executable."); using var outputFileStream = outputFile.OpenWrite(); - await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, libraryDirectory, outputFile); + await executableRunner.RunExecutableAsync(executableFile, input.EntryPoint, outputFile); } catch (Exception e) { diff --git a/src/Qir/Controller/Driver/IQirDriverGenerator.cs b/src/Qir/Controller/Driver/IQirDriverGenerator.cs index 5e26df14ee5..e4dc2a6172c 100644 --- a/src/Qir/Controller/Driver/IQirDriverGenerator.cs +++ b/src/Qir/Controller/Driver/IQirDriverGenerator.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Quantum.QsCompiler.BondSchemas.EntryPoint; @@ -10,11 +11,12 @@ namespace Microsoft.Quantum.Qir.Driver public interface IQirDriverGenerator { /// - /// Generates the C++ driver source file to compile with the bytecode. + /// Generates the C++ driver source file and writes the bytecode to a file. /// + /// Directory to which driver and bytecode will be written. /// Entry point information. - /// The file to which the source will be written. + /// The QIR bytecode. /// - Task GenerateQirDriverCppAsync(EntryPointOperation entryPointOperation, FileInfo driverFile); + Task GenerateQirDriverCppAsync(DirectoryInfo sourceDirectory, EntryPointOperation entryPointOperation, ArraySegment bytecode); } } diff --git a/src/Qir/Controller/Driver/QirDriverGenerator.cs b/src/Qir/Controller/Driver/QirDriverGenerator.cs index 75711d7a056..e169ea12be4 100644 --- a/src/Qir/Controller/Driver/QirDriverGenerator.cs +++ b/src/Qir/Controller/Driver/QirDriverGenerator.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Quantum.Qir.Utility; @@ -17,9 +18,9 @@ public QirDriverGenerator(ILogger logger) this.logger = logger; } - public Task GenerateQirDriverCppAsync(EntryPointOperation entryPointOperation, FileInfo driverFile) + public Task GenerateQirDriverCppAsync(DirectoryInfo sourceDirectory, EntryPointOperation entryPointOperation, ArraySegment bytecode) { - throw new System.NotImplementedException(); + throw new NotImplementedException(); } } } diff --git a/src/Qir/Controller/Executable/IQirExecutableGenerator.cs b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs index 21aab292831..e8ce44f7b7a 100644 --- a/src/Qir/Controller/Executable/IQirExecutableGenerator.cs +++ b/src/Qir/Controller/Executable/IQirExecutableGenerator.cs @@ -11,12 +11,11 @@ public interface IQirExecutableGenerator /// /// Generates a quantum simulation program executable. /// - /// The C++ source driver file. - /// The QIR bytecode. + /// File path to create the executable at. Dependencies will be copied to its directory. + /// Location of the source files. /// Location of the libraries that must be linked. /// Location of the headers that must be included. - /// File path to create the executable at. /// - Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory, FileInfo executableFile); + public Task GenerateExecutableAsync(FileInfo executableFile, DirectoryInfo sourceDirectory, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory); } } diff --git a/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs index f74aae5a028..135fbbbfb4f 100644 --- a/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs +++ b/src/Qir/Controller/Executable/IQuantumExecutableRunner.cs @@ -14,9 +14,8 @@ public interface IQuantumExecutableRunner /// /// Location of the executable to run. /// Entry point and arguments to pass. - /// Location of the libraries that are linked to the executable. /// Location to write program output. /// - Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, DirectoryInfo libraryDirectory, FileInfo outputFile); + Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile); } } diff --git a/src/Qir/Controller/Executable/QirExecutableGenerator.cs b/src/Qir/Controller/Executable/QirExecutableGenerator.cs index 59fa798e955..c09a7a0fa67 100644 --- a/src/Qir/Controller/Executable/QirExecutableGenerator.cs +++ b/src/Qir/Controller/Executable/QirExecutableGenerator.cs @@ -18,7 +18,7 @@ public QirExecutableGenerator(IClangClient clangClient, ILogger logger) this.logger = logger; } - public Task GenerateExecutableAsync(FileInfo driverFile, FileInfo bytecodeFile, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory, FileInfo executableFile) + public Task GenerateExecutableAsync(FileInfo executableFile, DirectoryInfo sourceDirectory, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory) { // TODO: Compile and link libraries- "Microsoft.Quantum.Qir.Runtime", "Microsoft.Quantum.Qir.QSharp.Foundation", "Microsoft.Quantum.Qir.QSharp.Core" throw new System.NotImplementedException(); diff --git a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs index 0d7875ead4d..774aa0cf517 100644 --- a/src/Qir/Controller/Executable/QuantumExecutableRunner.cs +++ b/src/Qir/Controller/Executable/QuantumExecutableRunner.cs @@ -17,7 +17,7 @@ public QuantumExecutableRunner(ILogger logger) this.logger = logger; } - public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, DirectoryInfo libraryDirectory, FileInfo outputFile) + public Task RunExecutableAsync(FileInfo executableFile, EntryPointOperation entryPointOperation, FileInfo outputFile) { throw new System.NotImplementedException(); } diff --git a/src/Qir/Controller/Program.cs b/src/Qir/Controller/Program.cs index 6448ebcc678..88677d0d1ce 100644 --- a/src/Qir/Controller/Program.cs +++ b/src/Qir/Controller/Program.cs @@ -66,13 +66,10 @@ static void Main(string[] args) rootCommand.AddOption(errorOption); - // The bytecode file is not needed as an input to the program, but we provide the path as an argument to the controller so it can be configured by tests. - var bytecodeFile = new FileInfo(Constant.FilePath.BytecodeFilePath); - // Bind to a handler and invoke. rootCommand.Handler = CommandHandler.Create( async (input, output, libraryDirectory, includeDirectory, error) => - await Controller.ExecuteAsync(input, output, libraryDirectory, includeDirectory, error, bytecodeFile, driverGenerator, execGenerator, execRunner, logger)); + await Controller.ExecuteAsync(input, output, libraryDirectory, includeDirectory, error, driverGenerator, execGenerator, execRunner, logger)); rootCommand.Invoke(args); } } diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 5eafd144888..6475d753913 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -78,18 +78,17 @@ public async Task TestExecute() { var libraryDirectory = new DirectoryInfo("libraries"); var includeDirectory = new DirectoryInfo("includes"); - var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); - var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Callback(() => + FileInfo actualExecutableFile = null; + Action generateExecutableCallback = async (executableFile, srcDir, libDir, inclDir) => { - // Verify that the "bytecode" file was created correctly. - using var bytecode = bytecodeFile.OpenRead(); - Assert.Equal(bytecode.Length, input.QirBytecode.Count); - for (var i = 0; i < bytecode.Length; ++i) - { - Assert.Equal(input.QirBytecode[i], bytecode.ReadByte()); - } - }); + actualExecutableFile = executableFile; + await Task.CompletedTask; + }; + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync( + It.IsAny(), + It.IsAny(), + It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), + It.Is(actualIncludeDirectory => actualIncludeDirectory.FullName == includeDirectory.FullName))).Callback(generateExecutableCallback); await Controller.ExecuteAsync( inputFile, @@ -97,7 +96,6 @@ await Controller.ExecuteAsync( libraryDirectory, includeDirectory, errorFile, - bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, executableRunnerMock.Object, @@ -105,22 +103,22 @@ await Controller.ExecuteAsync( // Verify driver was created. driverGeneratorMock.Verify(obj => obj.GenerateQirDriverCppAsync( + It.IsAny(), It.Is(entryPoint => EntryPointsAreEqual(entryPoint, input.EntryPoint)), - It.Is(fileInfo => fileInfo.FullName == expectedDriverPath.FullName))); + It.Is>(bytecode => BytecodesAreEqual(bytecode, input.QirBytecode)))); // Verify executable was generated. executableGeneratorMock.Verify(obj => obj.GenerateExecutableAsync( - It.Is(driverPath => driverPath.FullName == expectedDriverPath.FullName), - It.Is(actualBytecodeFile => actualBytecodeFile.FullName == bytecodeFile.FullName), + It.IsAny(), + It.IsAny(), It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), - It.Is(actualIncludeDirectory => actualIncludeDirectory.FullName == includeDirectory.FullName), - It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName))); + It.Is(actualIncludeDirectory => actualIncludeDirectory.FullName == includeDirectory.FullName))); + Assert.NotNull(actualExecutableFile); // Verify executable was run. executableRunnerMock.Verify(obj => obj.RunExecutableAsync( - It.Is(actualExecutableFile => actualExecutableFile.FullName == expectedExecutablePath.FullName), + It.Is(executableFile => actualExecutableFile.FullName == executableFile.FullName), It.Is(entryPoint => EntryPointsAreEqual(entryPoint, input.EntryPoint)), - It.Is(actualLibraryDirectory => actualLibraryDirectory.FullName == libraryDirectory.FullName), It.Is(actualOutputFile => actualOutputFile.FullName == outputFile.FullName))); } @@ -129,9 +127,7 @@ public async Task TestExecuteEncountersGenericExceptionWithOutputFileAlreadyCrea { var libraryDirectory = new DirectoryInfo("libraries"); var includeDirectory = new DirectoryInfo("includes"); - var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); - var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception("exception message")); // Create output file to ensure that it will be deleted unconditionally. @@ -148,7 +144,6 @@ await Controller.ExecuteAsync( libraryDirectory, includeDirectory, errorFile, - bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, executableRunnerMock.Object, @@ -172,9 +167,7 @@ public async Task TestExecuteEncountersGenericExceptionWithOutputFileNeverCreate { var libraryDirectory = new DirectoryInfo("libraries"); var includeDirectory = new DirectoryInfo("includes"); - var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); - var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception("exception message")); // Execute controller. @@ -184,7 +177,6 @@ await Controller.ExecuteAsync( libraryDirectory, includeDirectory, errorFile, - bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, executableRunnerMock.Object, @@ -207,9 +199,7 @@ public async Task TestExecuteEncountersControllerException() var errorCode = "error code"; var libraryDirectory = new DirectoryInfo("libraries"); var includeDirectory = new DirectoryInfo("includes"); - var expectedDriverPath = new FileInfo(Constant.FilePath.DriverFilePath); - var expectedExecutablePath = new FileInfo(Constant.FilePath.ExecutableFilePath); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new ControllerException(exceptionMessage, errorCode)); // Create output file to ensure that it will be deleted unconditionally. @@ -226,7 +216,6 @@ await Controller.ExecuteAsync( libraryDirectory, includeDirectory, errorFile, - bytecodeFile, driverGeneratorMock.Object, executableGeneratorMock.Object, executableRunnerMock.Object, @@ -252,5 +241,23 @@ private bool EntryPointsAreEqual(EntryPointOperation entryPointA, EntryPointOper object[] parameters = { entryPointA, entryPointB }; return (bool)method.Invoke(null, parameters); } + + private bool BytecodesAreEqual(ArraySegment bytecodeA, ArraySegment bytecodeB) + { + if (bytecodeA.Count != bytecodeB.Count) + { + return false; + } + + for (var i = 0; i < bytecodeA.Count; ++i) + { + if (bytecodeA[i] != bytecodeB[i]) + { + return false; + } + } + + return true; + } } } From ef1a2f8e5091cfde94a245d2a8b84a08274dfa70 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 12:05:48 -0700 Subject: [PATCH 15/16] Add comment --- src/Qir/Controller/Executable/ClangClient.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Qir/Controller/Executable/ClangClient.cs b/src/Qir/Controller/Executable/ClangClient.cs index 27a13806c3f..72fc903d4e8 100644 --- a/src/Qir/Controller/Executable/ClangClient.cs +++ b/src/Qir/Controller/Executable/ClangClient.cs @@ -20,6 +20,8 @@ public ClangClient(ILogger logger) public async Task CreateExecutableAsync(string[] inputFiles, string[] libraries, string libraryPath, string includePath, string outputPath) { var inputsArg = string.Join(' ', inputFiles); + + // string.Join does not automatically prepend the delimiter, so it is included again in the string here. var librariesArg = $"{LinkFlag} {string.Join(LinkFlag, libraries)}"; var arguments = $"{inputsArg} -I {includePath} -L {libraryPath} {librariesArg} -o {outputPath}"; logger.LogInfo($"Invoking clang with the following arguments: {arguments}"); From ce030fab3de69659a7b5d5f21d1524122fbaa168 Mon Sep 17 00:00:00 2001 From: Alexander Chocron Date: Fri, 9 Apr 2021 14:32:34 -0700 Subject: [PATCH 16/16] Do not delete output file on error --- src/Qir/Controller/Controller.cs | 1 - .../Tests.QirController/ControllerTests.cs | 52 +------------------ src/Qir/Controller/test-qir-controller.ps1 | 18 ------- 3 files changed, 1 insertion(+), 70 deletions(-) diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index 463c28014a4..5f9cc2b65cc 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -58,7 +58,6 @@ public static async Task ExecuteAsync( logger.LogError("An error has been encountered. Will write an error to the error file and delete any output that has been generated."); logger.LogException(e); await WriteExceptionToFileAsync(e, errorFile); - outputFile.Delete(); } } diff --git a/src/Qir/Controller/Tests.QirController/ControllerTests.cs b/src/Qir/Controller/Tests.QirController/ControllerTests.cs index 6475d753913..5da9e861d37 100644 --- a/src/Qir/Controller/Tests.QirController/ControllerTests.cs +++ b/src/Qir/Controller/Tests.QirController/ControllerTests.cs @@ -123,47 +123,7 @@ await Controller.ExecuteAsync( } [Fact] - public async Task TestExecuteEncountersGenericExceptionWithOutputFileAlreadyCreated() - { - var libraryDirectory = new DirectoryInfo("libraries"); - var includeDirectory = new DirectoryInfo("includes"); - executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) - .ThrowsAsync(new Exception("exception message")); - - // Create output file to ensure that it will be deleted unconditionally. - using (var outputFileStream = outputFile.OpenWrite()) - using (var streamWriter = new StreamWriter(outputFileStream)) - { - await streamWriter.WriteAsync("program output"); - } - - // Execute controller. - await Controller.ExecuteAsync( - inputFile, - outputFile, - libraryDirectory, - includeDirectory, - errorFile, - driverGeneratorMock.Object, - executableGeneratorMock.Object, - executableRunnerMock.Object, - loggerMock.Object); - - // Verify error file was created and contains the error. - Assert.True(errorFile.Exists); - using var errorFileStream = errorFile.OpenRead(); - using var streamReader = new StreamReader(errorFileStream); - var errorFileContents = await streamReader.ReadToEndAsync(); - var error = JsonSerializer.Deserialize(errorFileContents); - Assert.Equal(ErrorMessages.InternalError, error.Message); - Assert.Equal(Constant.ErrorCode.InternalError, error.Code); - - // Verify output file was deleted. - Assert.False(outputFile.Exists); - } - - [Fact] - public async Task TestExecuteEncountersGenericExceptionWithOutputFileNeverCreated() + public async Task TestExecuteEncountersGenericException() { var libraryDirectory = new DirectoryInfo("libraries"); var includeDirectory = new DirectoryInfo("includes"); @@ -202,13 +162,6 @@ public async Task TestExecuteEncountersControllerException() executableGeneratorMock.Setup(obj => obj.GenerateExecutableAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new ControllerException(exceptionMessage, errorCode)); - // Create output file to ensure that it will be deleted unconditionally. - using (var outputFileStream = outputFile.OpenWrite()) - using (var streamWriter = new StreamWriter(outputFileStream)) - { - await streamWriter.WriteAsync("program output"); - } - // Execute controller. await Controller.ExecuteAsync( inputFile, @@ -229,9 +182,6 @@ await Controller.ExecuteAsync( var error = JsonSerializer.Deserialize(errorFileContents); Assert.Equal(exceptionMessage, error.Message); Assert.Equal(errorCode, error.Code); - - // Verify output file was deleted. - Assert.False(outputFile.Exists); } private bool EntryPointsAreEqual(EntryPointOperation entryPointA, EntryPointOperation entryPointB) diff --git a/src/Qir/Controller/test-qir-controller.ps1 b/src/Qir/Controller/test-qir-controller.ps1 index 824c8ad4bba..ad70d23d1b7 100644 --- a/src/Qir/Controller/test-qir-controller.ps1 +++ b/src/Qir/Controller/test-qir-controller.ps1 @@ -37,15 +37,6 @@ Foreach-Object { Write-Host $actualOutput $script:all_ok = $False } - elseif ((Test-Path $errorFile)) { - $actualError = Get-Content -Path $errorFile -Raw - - # An error file should not have been generated, so fail test if one was found. - Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" - Write-Host "##[info]Unexpected error file was found:" - Write-Host $actualError - $script:all_ok = $False - } else { Write-Host "##[info]Test case '$($_.BaseName)' passed" } @@ -63,15 +54,6 @@ Foreach-Object { $script:all_ok = $False continue } - elseif ((Test-Path $outputFile)) { - $actualOutput = Get-Content -Path $outputFile -Raw - - # An error file should not have been generated, so fail test if one was found. - Write-Host "##vso[task.logissue type=error;]Failed QIR Controller test case: $($_.BaseName)" - Write-Host "##[info]Unexpected output file was found:" - Write-Host $actualOutput - $script:all_ok = $False - } else { Write-Host "##[info]Test case '$($_.BaseName)' passed" }