diff --git a/pytket/qir/conversion/api.py b/pytket/qir/conversion/api.py index c3279dbc..e785e4a9 100644 --- a/pytket/qir/conversion/api.py +++ b/pytket/qir/conversion/api.py @@ -101,15 +101,17 @@ def keep_line(line: str) -> bool: return ( ("@__quantum__qis__read_result__body" not in line) and ("@set_one_bit_in_reg" not in line) - and ("@reg2var" not in line) and ("@read_bit_from_reg" not in line) and ("@set_all_bits_in_reg" not in line) + and ("@read_all_bits_from_reg" not in line) + and ("@create_reg" not in line) ) result = "\n".join(filter(keep_line, initial_result.split("\n"))) # replace the use of the removed register variable with i64 0 result = result.replace("i64 %0", "i64 0") + result = result.replace("i64 %3", "i64 0") for _ in range(10): result = result.replace("\n\n\n\n", "\n\n") diff --git a/pytket/qir/conversion/conversion.py b/pytket/qir/conversion/conversion.py index 05fd3ab9..15a451f8 100644 --- a/pytket/qir/conversion/conversion.py +++ b/pytket/qir/conversion/conversion.py @@ -115,6 +115,7 @@ def __init__( self.module = module self.wasm_int_type = pyqir.IntType(self.module.context, wasm_int_type) self.qir_int_type = pyqir.IntType(self.module.context, qir_int_type) + self.qir_i1p_type = pyqir.PointerType(pyqir.IntType(self.module.context, 1)) self.qir_bool_type = pyqir.IntType(self.module.context, 1) self.qubit_type = pyqir.qubit_type(self.module.context) self.result_type = pyqir.result_type(self.module.context) @@ -132,35 +133,35 @@ def __init__( self.set_cregs: Dict[str, List] = {} # Keep track of set registers. self.ssa_vars: Dict[str, Value] = {} # Keep track of set ssa variables. - # i1 read_bit_from_reg(i64 reg, i64 index) + # i1 read_bit_from_reg(i1* reg, i64 index) self.read_bit_from_reg = self.module.module.add_external_function( "read_bit_from_reg", pyqir.FunctionType( pyqir.IntType(self.module.module.context, 1), - [self.qir_int_type] * 2, + [self.qir_i1p_type, self.qir_int_type], ), ) - # void set_one_bit_in_reg(i64 reg, i64 index, i1 value) + # void set_one_bit_in_reg(i1* reg, i64 index, i1 value) self.set_one_bit_in_reg = self.module.module.add_external_function( "set_one_bit_in_reg", pyqir.FunctionType( pyqir.Type.void(self.module.module.context), [ - self.qir_int_type, + self.qir_i1p_type, self.qir_int_type, pyqir.IntType(self.module.module.context, 1), ], ), ) - # void set_all_bits_in_reg(i64 reg, i64 value) + # void set_all_bits_in_reg(i1* reg, i64 value) self.set_all_bits_in_reg = self.module.module.add_external_function( "set_all_bits_in_reg", pyqir.FunctionType( pyqir.Type.void(self.module.module.context), [ - self.qir_int_type, + self.qir_i1p_type, self.qir_int_type, ], ), @@ -175,12 +176,23 @@ def __init__( ), ) - # i64 reg2var(i1, i1, i1, ...) - self.reg2var = self.module.module.add_external_function( - "reg2var", + # i1* create_reg(i64 size) + self.create_reg = self.module.module.add_external_function( + "create_reg", + pyqir.FunctionType( + self.qir_i1p_type, + [pyqir.IntType(self.module.module.context, qir_int_type)], + ), + ) + + # i64 create_reg(i1* reg) + self.read_all_bits_from_reg = self.module.module.add_external_function( + "read_all_bits_from_reg", pyqir.FunctionType( - pyqir.IntType(self.module.module.context, qir_int_type), - [pyqir.IntType(self.module.module.context, 1)] * qir_int_type, + self.qir_int_type, + [ + self.qir_i1p_type, + ], ), ) @@ -377,6 +389,13 @@ def _get_optype_and_params(self, op: Op) -> Tuple[OpType, Sequence[float]]: params = op.params return (optype, params) + def _get_i64_ssa_reg(self, name: str) -> Value: + ssa_var = self.module.builder.call( + self.read_all_bits_from_reg, + [self.ssa_vars[name]], + ) + return ssa_var + def _to_qis_qubits(self, qubits: List[Qubit]) -> Sequence[Qubit]: return [self.module.module.qubits[qubit.index[0]] for qubit in qubits] @@ -405,11 +424,11 @@ def _reg2ssa_var(self, bit_reg: BitRegister, int_size: int) -> Value: return pyqir.const(self.qir_int_type, value) else: bit_reg = [False] * len(bit_reg) - if (size := len(bit_reg)) <= int_size: # Widening by zero-padding. - bool_reg = bit_reg + [False] * (int_size - size) - else: # Narrowing by truncation. - bool_reg = bit_reg[:int_size] - ssa_var = cast(Value, self.module.builder.call(self.reg2var, [*bool_reg])) # type: ignore + if len(bit_reg) > int_size: + raise ValueError( + f"Classical register should only have the size of {int_size}" + ) + ssa_var = cast(Value, self.module.builder.call(self.create_reg, [pyqir.const(self.qir_int_type, len(bit_reg))])) # type: ignore self.ssa_vars[reg_name] = ssa_var return ssa_var else: @@ -453,7 +472,7 @@ def _get_ssa_from_cl_reg_op( ) return output_instruction # type: ignore elif type(reg) == BitRegister: - return self.ssa_vars[reg.name] + return self._get_i64_ssa_reg(reg.name) elif type(reg) == int: return pyqir.const(self.qir_int_type, reg) else: @@ -506,7 +525,7 @@ def circuit_to_module( result = module.module.builder.icmp( pyqir.IntPredicate.EQ, pyqir.const(self.qir_int_type, op.lower), - self.ssa_vars[registername], + self._get_i64_ssa_reg(registername), ) condition_bit_index = command.args[-1].index[0] @@ -529,10 +548,14 @@ def circuit_to_module( registername = command.args[0].reg_name lower_cond = module.module.builder.icmp( - pyqir.IntPredicate.SGT, lower_qir, self.ssa_vars[registername] + pyqir.IntPredicate.SGT, + lower_qir, + self._get_i64_ssa_reg(registername), ) upper_cond = module.module.builder.icmp( - pyqir.IntPredicate.SGT, self.ssa_vars[registername], upper_qir + pyqir.IntPredicate.SGT, + self._get_i64_ssa_reg(registername), + upper_qir, ) result = module.module.builder.and_(lower_cond, upper_cond) @@ -620,7 +643,7 @@ def condition_block() -> None: ssabool = module.module.builder.icmp( pyqir.IntPredicate.EQ, pyqir.const(self.qir_int_type, op.value), - self.ssa_vars[condition_name], + self._get_i64_ssa_reg(condition_name), ) module.module.builder.if_( @@ -809,18 +832,18 @@ def condition_block() -> None: 0 # defines the default value for ops that returns bool, see below ) outputs = command.args[-1].reg_name - ssa_left = self.ssa_vars[list(self.ssa_vars)[0]] # set default value - ssa_right = self.ssa_vars[list(self.ssa_vars)[0]] # set default value - - # + ssa_left = (self._get_i64_ssa_reg(list(self.ssa_vars)[0]),) + ssa_right = (self._get_i64_ssa_reg(list(self.ssa_vars)[0]),) if type(op.get_exp()) in _TK_CLOPS_TO_PYQIR_REG: # classical ops acting on registers returning register - ssa_left = self._get_ssa_from_cl_reg_op( - op.get_exp().args[0], module + ssa_left = cast( + Value, + self._get_ssa_from_cl_reg_op(op.get_exp().args[0], module), ) - ssa_right = self._get_ssa_from_cl_reg_op( - op.get_exp().args[1], module + ssa_right = cast( + Value, + self._get_ssa_from_cl_reg_op(op.get_exp().args[1], module), ) # add function to module @@ -830,11 +853,13 @@ def condition_block() -> None: elif type(op.get_exp()) in _TK_CLOPS_TO_PYQIR_BIT: # classical ops acting on bits returning bit - ssa_left = self._get_ssa_from_cl_bit_op( - op.get_exp().args[0], module + ssa_left = cast( + Value, + self._get_ssa_from_cl_bit_op(op.get_exp().args[0], module), ) - ssa_right = self._get_ssa_from_cl_bit_op( - op.get_exp().args[1], module + ssa_right = cast( + Value, + self._get_ssa_from_cl_bit_op(op.get_exp().args[1], module), ) # add function to module @@ -846,11 +871,13 @@ def condition_block() -> None: elif type(op.get_exp()) in _TK_CLOPS_TO_PYQIR_REG_BOOL: # classical ops acting on registers returning bit - ssa_left = self._get_ssa_from_cl_reg_op( - op.get_exp().args[0], module + ssa_left = cast( + Value, + self._get_ssa_from_cl_reg_op(op.get_exp().args[0], module), ) - ssa_right = self._get_ssa_from_cl_reg_op( - op.get_exp().args[1], module + ssa_right = cast( + Value, + self._get_ssa_from_cl_reg_op(op.get_exp().args[1], module), ) # add function to module @@ -984,7 +1011,7 @@ def condition_block() -> None: self.module.builder.call( self.record_output_i64, [ - self.ssa_vars[reg_name], + self._get_i64_ssa_reg(reg_name), self.reg_const[reg_name], ], ) diff --git a/tests/conditional_test.py b/tests/conditional_test.py index 2cf26ec8..99c378c2 100644 --- a/tests/conditional_test.py +++ b/tests/conditional_test.py @@ -122,18 +122,8 @@ def test_pytket_qir_conditional_v() -> None: circ, name="test_pytket_qir_conditional_v", qir_format=QIRFormat.STRING ) - circ = Circuit(2, 2).H(0).H(1).measure_all() - - circ.add_gate(OpType.H, [0], condition_bits=[0, 1], condition_value=3) - - result_2 = pytket_to_qir( - circ, name="test_pytket_qir_conditional_v", qir_format=QIRFormat.STRING - ) - check_qir_result(result, "test_pytket_qir_conditional_v") - check_qir_result(result_2, "test_pytket_qir_conditional_v") - def test_pytket_qir_conditional_6() -> None: # test conditional for manual added gates diff --git a/tests/conversion_test.py b/tests/conversion_test.py index ae94b862..e86fe9bb 100644 --- a/tests/conversion_test.py +++ b/tests/conversion_test.py @@ -199,11 +199,9 @@ def test_pytket_qir_11() -> None: c.add_c_copyreg(a, b) - result = pytket_to_qir(c, name="test_pytket_qir_10", qir_format=QIRFormat.STRING) + result = pytket_to_qir(c, name="test_pytket_qir_11", qir_format=QIRFormat.STRING) - check_qir_result( - result, "test_pytket_qir_10" - ) # should be identical to the testcase above + check_qir_result(result, "test_pytket_qir_11") def test_pytket_qir_12() -> None: diff --git a/tests/qir/test_pytket_qir.ll b/tests/qir/test_pytket_qir.ll index 435c44d5..25c7f69b 100644 --- a/tests/qir/test_pytket_qir.ll +++ b/tests/qir/test_pytket_qir.ll @@ -12,15 +12,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_10.ll b/tests/qir/test_pytket_qir_10.ll index fd268de7..a8053287 100644 --- a/tests/qir/test_pytket_qir_10.ll +++ b/tests/qir/test_pytket_qir_10.ll @@ -8,28 +8,32 @@ source_filename = "test_pytket_qir_10" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i1 @read_bit_from_reg(i64 %0, i64 0) - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %2) - %3 = call i1 @read_bit_from_reg(i64 %0, i64 1) - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 %3) + %0 = call i1* @create_reg(i64 4) + %1 = call i1* @create_reg(i64 2) + %2 = call i1 @read_bit_from_reg(i1* %0, i64 0) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %2) + %3 = call i1 @read_bit_from_reg(i1* %0, i64 1) + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %3) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_11.ll b/tests/qir/test_pytket_qir_11.ll new file mode 100644 index 00000000..a1f75b46 --- /dev/null +++ b/tests/qir/test_pytket_qir_11.ll @@ -0,0 +1,51 @@ +; ModuleID = 'test_pytket_qir_11' +source_filename = "test_pytket_qir_11" + +%Result = type opaque + +@0 = internal constant [2 x i8] c"a\00" +@1 = internal constant [2 x i8] c"b\00" + +define void @main() #0 { +entry: + %0 = call i1* @create_reg(i64 2) + %1 = call i1* @create_reg(i64 4) + %2 = call i1 @read_bit_from_reg(i1* %0, i64 0) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %2) + %3 = call i1 @read_bit_from_reg(i1* %0, i64 1) + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %3) + call void @__quantum__rt__tuple_start_record_output() + %4 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + call void @__quantum__rt__tuple_end_record_output() + ret void +} + +declare i1 @read_bit_from_reg(i1*, i64) + +declare void @set_one_bit_in_reg(i1*, i64, i1) + +declare void @set_all_bits_in_reg(i1*, i64) + +declare i1 @__quantum__qis__read_result__body(%Result*) + +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) + +declare void @__quantum__rt__int_record_output(i64, i8*) + +declare void @__quantum__rt__tuple_start_record_output() + +declare void @__quantum__rt__tuple_end_record_output() + +attributes #0 = { "entry_point" "num_required_qubits"="1" "num_required_results"="1" "output_labeling_schema" "qir_profiles"="custom" } + +!llvm.module.flags = !{!0, !1, !2, !3} + +!0 = !{i32 1, !"qir_major_version", i32 1} +!1 = !{i32 7, !"qir_minor_version", i32 0} +!2 = !{i32 1, !"dynamic_qubit_management", i1 false} +!3 = !{i32 1, !"dynamic_result_management", i1 false} diff --git a/tests/qir/test_pytket_qir_12.ll b/tests/qir/test_pytket_qir_12.ll index 5a84e9d0..b1992341 100644 --- a/tests/qir/test_pytket_qir_12.ll +++ b/tests/qir/test_pytket_qir_12.ll @@ -7,24 +7,30 @@ source_filename = "test_pytket_qir_12" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = shl i64 %0, 1 - call void @set_all_bits_in_reg(i64 %0, i64 %1) + %0 = call i1* @create_reg(i64 8) + %1 = call i64 @read_all_bits_from_reg(i1* %0) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = shl i64 %3, 1 + call void @set_all_bits_in_reg(i1* %0, i64 %4) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_13.ll b/tests/qir/test_pytket_qir_13.ll index 356f14d0..ea0fcc71 100644 --- a/tests/qir/test_pytket_qir_13.ll +++ b/tests/qir/test_pytket_qir_13.ll @@ -8,28 +8,38 @@ source_filename = "test_pytket_qir_13" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = shl i64 %0, 1 - call void @set_all_bits_in_reg(i64 %0, i64 %2) - %3 = lshr i64 %0, 3 - call void @set_all_bits_in_reg(i64 %1, i64 %3) + %0 = call i1* @create_reg(i64 8) + %1 = call i1* @create_reg(i64 8) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = shl i64 %4, 1 + call void @set_all_bits_in_reg(i1* %0, i64 %5) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %0) + %8 = call i64 @read_all_bits_from_reg(i1* %0) + %9 = lshr i64 %8, 3 + call void @set_all_bits_in_reg(i1* %1, i64 %9) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %10, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %11 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %11, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_14.ll b/tests/qir/test_pytket_qir_14.ll index 3e6cfc97..bc374d31 100644 --- a/tests/qir/test_pytket_qir_14.ll +++ b/tests/qir/test_pytket_qir_14.ll @@ -14,82 +14,104 @@ source_filename = "test_pytket_qir_14" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %5 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %6 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 true) - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 true) - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 true) - call void @set_one_bit_in_reg(i64 %1, i64 2, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 3, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 4, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 5, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 6, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 7, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 8, i1 false) - call void @set_one_bit_in_reg(i64 %1, i64 9, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 2, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 3, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 4, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 5, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 6, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 7, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 2, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 3, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 4, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 5, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 6, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 7, i1 false) - %7 = call i1 @read_bit_from_reg(i64 %0, i64 0) - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %7) - %8 = call i1 @read_bit_from_reg(i64 %0, i64 1) - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 %8) - %9 = call i1 @read_bit_from_reg(i64 %0, i64 2) - call void @set_one_bit_in_reg(i64 %1, i64 2, i1 %9) - %10 = call i1 @read_bit_from_reg(i64 %0, i64 3) - call void @set_one_bit_in_reg(i64 %1, i64 3, i1 %10) - %11 = call i1 @read_bit_from_reg(i64 %0, i64 4) - call void @set_one_bit_in_reg(i64 %1, i64 4, i1 %11) - %12 = call i1 @read_bit_from_reg(i64 %0, i64 5) - call void @set_one_bit_in_reg(i64 %1, i64 5, i1 %12) - %13 = call i1 @read_bit_from_reg(i64 %0, i64 6) - call void @set_one_bit_in_reg(i64 %1, i64 6, i1 %13) - %14 = call i1 @read_bit_from_reg(i64 %0, i64 7) - call void @set_one_bit_in_reg(i64 %1, i64 7, i1 %14) - %15 = add i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %15) - %16 = sub i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %16) - %17 = shl i64 %0, 1 - call void @set_all_bits_in_reg(i64 %0, i64 %17) - %18 = lshr i64 %0, 1 - call void @set_all_bits_in_reg(i64 %1, i64 %18) - %19 = icmp eq i64 1, %0 - call void @set_one_bit_in_reg(i64 %3, i64 4, i1 %19) - %20 = icmp sgt i64 2, %0 - %21 = icmp sgt i64 %0, 4294967295 - %22 = and i1 %20, %21 - call void @set_one_bit_in_reg(i64 %3, i64 5, i1 %22) - %23 = icmp eq i64 0, %0 - call void @set_one_bit_in_reg(i64 %3, i64 6, i1 %23) - %24 = icmp sgt i64 1, %0 - %25 = icmp sgt i64 %0, 4294967295 - %26 = and i1 %24, %25 - call void @set_one_bit_in_reg(i64 %3, i64 7, i1 %26) - %27 = icmp sgt i64 0, %0 - %28 = icmp sgt i64 %0, 1 - %29 = and i1 %27, %28 - call void @set_one_bit_in_reg(i64 %3, i64 8, i1 %29) - %30 = call i1 @read_bit_from_reg(i64 %0, i64 0) - br i1 %30, label %then, label %else + %0 = call i1* @create_reg(i64 8) + %1 = call i1* @create_reg(i64 10) + %2 = call i1* @create_reg(i64 10) + %3 = call i1* @create_reg(i64 9) + %4 = call i1* @create_reg(i64 32) + %5 = call i1* @create_reg(i64 32) + %6 = call i1* @create_reg(i64 32) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 true) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 true) + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 true) + call void @set_one_bit_in_reg(i1* %1, i64 2, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 3, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 4, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 5, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 6, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 7, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 8, i1 false) + call void @set_one_bit_in_reg(i1* %1, i64 9, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 2, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 3, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 4, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 5, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 6, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 7, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 2, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 3, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 4, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 5, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 6, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 7, i1 false) + %7 = call i1 @read_bit_from_reg(i1* %0, i64 0) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %7) + %8 = call i1 @read_bit_from_reg(i1* %0, i64 1) + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %8) + %9 = call i1 @read_bit_from_reg(i1* %0, i64 2) + call void @set_one_bit_in_reg(i1* %1, i64 2, i1 %9) + %10 = call i1 @read_bit_from_reg(i1* %0, i64 3) + call void @set_one_bit_in_reg(i1* %1, i64 3, i1 %10) + %11 = call i1 @read_bit_from_reg(i1* %0, i64 4) + call void @set_one_bit_in_reg(i1* %1, i64 4, i1 %11) + %12 = call i1 @read_bit_from_reg(i1* %0, i64 5) + call void @set_one_bit_in_reg(i1* %1, i64 5, i1 %12) + %13 = call i1 @read_bit_from_reg(i1* %0, i64 6) + call void @set_one_bit_in_reg(i1* %1, i64 6, i1 %13) + %14 = call i1 @read_bit_from_reg(i1* %0, i64 7) + call void @set_one_bit_in_reg(i1* %1, i64 7, i1 %14) + %15 = call i64 @read_all_bits_from_reg(i1* %0) + %16 = call i64 @read_all_bits_from_reg(i1* %0) + %17 = call i64 @read_all_bits_from_reg(i1* %0) + %18 = call i64 @read_all_bits_from_reg(i1* %1) + %19 = add i64 %17, %18 + call void @set_all_bits_in_reg(i1* %2, i64 %19) + %20 = call i64 @read_all_bits_from_reg(i1* %0) + %21 = call i64 @read_all_bits_from_reg(i1* %0) + %22 = call i64 @read_all_bits_from_reg(i1* %0) + %23 = call i64 @read_all_bits_from_reg(i1* %1) + %24 = sub i64 %22, %23 + call void @set_all_bits_in_reg(i1* %2, i64 %24) + %25 = call i64 @read_all_bits_from_reg(i1* %0) + %26 = call i64 @read_all_bits_from_reg(i1* %0) + %27 = call i64 @read_all_bits_from_reg(i1* %0) + %28 = shl i64 %27, 1 + call void @set_all_bits_in_reg(i1* %0, i64 %28) + %29 = call i64 @read_all_bits_from_reg(i1* %0) + %30 = call i64 @read_all_bits_from_reg(i1* %0) + %31 = call i64 @read_all_bits_from_reg(i1* %0) + %32 = lshr i64 %31, 1 + call void @set_all_bits_in_reg(i1* %1, i64 %32) + %33 = call i64 @read_all_bits_from_reg(i1* %0) + %34 = icmp eq i64 1, %33 + call void @set_one_bit_in_reg(i1* %3, i64 4, i1 %34) + %35 = call i64 @read_all_bits_from_reg(i1* %0) + %36 = icmp sgt i64 2, %35 + %37 = call i64 @read_all_bits_from_reg(i1* %0) + %38 = icmp sgt i64 %37, 4294967295 + %39 = and i1 %36, %38 + call void @set_one_bit_in_reg(i1* %3, i64 5, i1 %39) + %40 = call i64 @read_all_bits_from_reg(i1* %0) + %41 = icmp eq i64 0, %40 + call void @set_one_bit_in_reg(i1* %3, i64 6, i1 %41) + %42 = call i64 @read_all_bits_from_reg(i1* %0) + %43 = icmp sgt i64 1, %42 + %44 = call i64 @read_all_bits_from_reg(i1* %0) + %45 = icmp sgt i64 %44, 4294967295 + %46 = and i1 %43, %45 + call void @set_one_bit_in_reg(i1* %3, i64 7, i1 %46) + %47 = call i64 @read_all_bits_from_reg(i1* %0) + %48 = icmp sgt i64 0, %47 + %49 = call i64 @read_all_bits_from_reg(i1* %0) + %50 = icmp sgt i64 %49, 1 + %51 = and i1 %48, %50 + call void @set_one_bit_in_reg(i1* %3, i64 8, i1 %51) + %52 = call i1 @read_bit_from_reg(i1* %0, i64 0) + br i1 %52, label %then, label %else then: ; preds = %entry br label %continue @@ -98,24 +120,41 @@ else: ; preds = %entry br label %continue continue: ; preds = %else, %then - %31 = call i1 @read_bit_from_reg(i64 %0, i64 0) - %32 = call i1 @read_bit_from_reg(i64 %1, i64 0) - %33 = xor i1 %31, %32 - call void @set_one_bit_in_reg(i64 %3, i64 1, i1 %33) - %34 = xor i64 %0, %1 - call void @set_all_bits_in_reg(i64 %4, i64 %34) - %35 = and i64 %0, %1 - call void @set_all_bits_in_reg(i64 %5, i64 %35) - %36 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %6, i64 %36) - %37 = icmp eq i64 1, %4 - call void @set_one_bit_in_reg(i64 %3, i64 0, i1 %37) - %38 = icmp eq i64 1, %5 - call void @set_one_bit_in_reg(i64 %3, i64 2, i1 %38) - %39 = icmp eq i64 1, %6 - call void @set_one_bit_in_reg(i64 %3, i64 3, i1 %39) - %40 = call i1 @read_bit_from_reg(i64 %3, i64 0) - br i1 %40, label %then1, label %else2 + %53 = call i64 @read_all_bits_from_reg(i1* %0) + %54 = call i64 @read_all_bits_from_reg(i1* %0) + %55 = call i1 @read_bit_from_reg(i1* %0, i64 0) + %56 = call i1 @read_bit_from_reg(i1* %1, i64 0) + %57 = xor i1 %55, %56 + call void @set_one_bit_in_reg(i1* %3, i64 1, i1 %57) + %58 = call i64 @read_all_bits_from_reg(i1* %0) + %59 = call i64 @read_all_bits_from_reg(i1* %0) + %60 = call i64 @read_all_bits_from_reg(i1* %0) + %61 = call i64 @read_all_bits_from_reg(i1* %1) + %62 = xor i64 %60, %61 + call void @set_all_bits_in_reg(i1* %4, i64 %62) + %63 = call i64 @read_all_bits_from_reg(i1* %0) + %64 = call i64 @read_all_bits_from_reg(i1* %0) + %65 = call i64 @read_all_bits_from_reg(i1* %0) + %66 = call i64 @read_all_bits_from_reg(i1* %1) + %67 = and i64 %65, %66 + call void @set_all_bits_in_reg(i1* %5, i64 %67) + %68 = call i64 @read_all_bits_from_reg(i1* %0) + %69 = call i64 @read_all_bits_from_reg(i1* %0) + %70 = call i64 @read_all_bits_from_reg(i1* %0) + %71 = call i64 @read_all_bits_from_reg(i1* %1) + %72 = or i64 %70, %71 + call void @set_all_bits_in_reg(i1* %6, i64 %72) + %73 = call i64 @read_all_bits_from_reg(i1* %4) + %74 = icmp eq i64 1, %73 + call void @set_one_bit_in_reg(i1* %3, i64 0, i1 %74) + %75 = call i64 @read_all_bits_from_reg(i1* %5) + %76 = icmp eq i64 1, %75 + call void @set_one_bit_in_reg(i1* %3, i64 2, i1 %76) + %77 = call i64 @read_all_bits_from_reg(i1* %6) + %78 = icmp eq i64 1, %77 + call void @set_one_bit_in_reg(i1* %3, i64 3, i1 %78) + %79 = call i1 @read_bit_from_reg(i1* %3, i64 0) + br i1 %79, label %then1, label %else2 then1: ; preds = %continue call void @__quantum__qis__x__body(%Qubit* null) @@ -125,8 +164,8 @@ else2: ; preds = %continue br label %continue3 continue3: ; preds = %else2, %then1 - %41 = call i1 @read_bit_from_reg(i64 %3, i64 1) - br i1 %41, label %then4, label %else5 + %80 = call i1 @read_bit_from_reg(i1* %3, i64 1) + br i1 %80, label %then4, label %else5 then4: ; preds = %continue3 call void @__quantum__qis__x__body(%Qubit* null) @@ -136,8 +175,8 @@ else5: ; preds = %continue3 br label %continue6 continue6: ; preds = %else5, %then4 - %42 = call i1 @read_bit_from_reg(i64 %3, i64 2) - br i1 %42, label %then7, label %else8 + %81 = call i1 @read_bit_from_reg(i1* %3, i64 2) + br i1 %81, label %then7, label %else8 then7: ; preds = %continue6 call void @__quantum__qis__x__body(%Qubit* null) @@ -147,8 +186,8 @@ else8: ; preds = %continue6 br label %continue9 continue9: ; preds = %else8, %then7 - %43 = call i1 @read_bit_from_reg(i64 %3, i64 3) - br i1 %43, label %then10, label %else11 + %82 = call i1 @read_bit_from_reg(i1* %3, i64 3) + br i1 %82, label %then10, label %else11 then10: ; preds = %continue9 call void @__quantum__qis__x__body(%Qubit* null) @@ -158,8 +197,8 @@ else11: ; preds = %continue9 br label %continue12 continue12: ; preds = %else11, %then10 - %44 = call i1 @read_bit_from_reg(i64 %0, i64 0) - br i1 %44, label %then13, label %else14 + %83 = call i1 @read_bit_from_reg(i1* %0, i64 0) + br i1 %83, label %then13, label %else14 then13: ; preds = %continue12 call void @__quantum__qis__x__body(%Qubit* null) @@ -169,8 +208,8 @@ else14: ; preds = %continue12 br label %continue15 continue15: ; preds = %else14, %then13 - %45 = call i1 @read_bit_from_reg(i64 %3, i64 4) - br i1 %45, label %then16, label %else17 + %84 = call i1 @read_bit_from_reg(i1* %3, i64 4) + br i1 %84, label %then16, label %else17 then16: ; preds = %continue15 br label %continue18 @@ -180,8 +219,8 @@ else17: ; preds = %continue15 br label %continue18 continue18: ; preds = %else17, %then16 - %46 = call i1 @read_bit_from_reg(i64 %0, i64 0) - br i1 %46, label %then19, label %else20 + %85 = call i1 @read_bit_from_reg(i1* %0, i64 0) + br i1 %85, label %then19, label %else20 then19: ; preds = %continue18 br label %continue21 @@ -191,8 +230,8 @@ else20: ; preds = %continue18 br label %continue21 continue21: ; preds = %else20, %then19 - %47 = call i1 @read_bit_from_reg(i64 %3, i64 5) - br i1 %47, label %then22, label %else23 + %86 = call i1 @read_bit_from_reg(i1* %3, i64 5) + br i1 %86, label %then22, label %else23 then22: ; preds = %continue21 call void @__quantum__qis__x__body(%Qubit* null) @@ -202,8 +241,8 @@ else23: ; preds = %continue21 br label %continue24 continue24: ; preds = %else23, %then22 - %48 = call i1 @read_bit_from_reg(i64 %3, i64 6) - br i1 %48, label %then25, label %else26 + %87 = call i1 @read_bit_from_reg(i1* %3, i64 6) + br i1 %87, label %then25, label %else26 then25: ; preds = %continue24 call void @__quantum__qis__x__body(%Qubit* null) @@ -213,8 +252,8 @@ else26: ; preds = %continue24 br label %continue27 continue27: ; preds = %else26, %then25 - %49 = call i1 @read_bit_from_reg(i64 %3, i64 7) - br i1 %49, label %then28, label %else29 + %88 = call i1 @read_bit_from_reg(i1* %3, i64 7) + br i1 %88, label %then28, label %else29 then28: ; preds = %continue27 call void @__quantum__qis__x__body(%Qubit* null) @@ -224,8 +263,8 @@ else29: ; preds = %continue27 br label %continue30 continue30: ; preds = %else29, %then28 - %50 = call i1 @read_bit_from_reg(i64 %3, i64 8) - br i1 %50, label %then31, label %else32 + %89 = call i1 @read_bit_from_reg(i1* %3, i64 8) + br i1 %89, label %then31, label %else32 then31: ; preds = %continue30 call void @__quantum__qis__x__body(%Qubit* null) @@ -236,26 +275,35 @@ else32: ; preds = %continue30 continue33: ; preds = %else32, %then31 call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @3, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @4, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @5, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %6, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @6, i32 0, i32 0)) + %90 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %90, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %91 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %91, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %92 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %92, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %93 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %93, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @3, i32 0, i32 0)) + %94 = call i64 @read_all_bits_from_reg(i1* %4) + call void @__quantum__rt__int_record_output(i64 %94, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @4, i32 0, i32 0)) + %95 = call i64 @read_all_bits_from_reg(i1* %5) + call void @__quantum__rt__int_record_output(i64 %95, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @5, i32 0, i32 0)) + %96 = call i64 @read_all_bits_from_reg(i1* %6) + call void @__quantum__rt__int_record_output(i64 %96, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @6, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_15.ll b/tests/qir/test_pytket_qir_15.ll index 1d51a18e..6d871627 100644 --- a/tests/qir/test_pytket_qir_15.ll +++ b/tests/qir/test_pytket_qir_15.ll @@ -8,32 +8,36 @@ source_filename = "test_pytket_qir_15" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 2, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 3, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 4, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 5, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 6, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 7, i1 false) + %0 = call i1* @create_reg(i64 8) + %1 = call i1* @create_reg(i64 1) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 2, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 3, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 4, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 5, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 6, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 7, i1 false) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %3 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_17.ll b/tests/qir/test_pytket_qir_17.ll index 392df349..f33f2905 100644 --- a/tests/qir/test_pytket_qir_17.ll +++ b/tests/qir/test_pytket_qir_17.ll @@ -9,32 +9,36 @@ source_filename = "test_pytket_qir_17" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 1) + %1 = call i1* @create_reg(i64 1) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) %2 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 %2) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 %2) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %3 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %3) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %3) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @1, i32 0, i32 0)) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_2.ll b/tests/qir/test_pytket_qir_2.ll index bf76c299..308a859a 100644 --- a/tests/qir/test_pytket_qir_2.ll +++ b/tests/qir/test_pytket_qir_2.ll @@ -12,15 +12,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_3.ll b/tests/qir/test_pytket_qir_3.ll index a1a8722b..7c5cf73f 100644 --- a/tests/qir/test_pytket_qir_3.ll +++ b/tests/qir/test_pytket_qir_3.ll @@ -8,25 +8,28 @@ source_filename = "test_pytket_qir_3" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 3) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %1 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_4.ll b/tests/qir/test_pytket_qir_4.ll index fa1aadc2..19911aa8 100644 --- a/tests/qir/test_pytket_qir_4.ll +++ b/tests/qir/test_pytket_qir_4.ll @@ -10,14 +10,18 @@ source_filename = "test_pytket_qir_4" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %3) + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 5) + %2 = call i1* @create_reg(i64 5) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %1) + %7 = or i64 %5, %6 + call void @set_all_bits_in_reg(i1* %2, i64 %7) call void @__quantum__qis__h__body(%Qubit* null) - %4 = call i1 @read_bit_from_reg(i64 %1, i64 4) - br i1 %4, label %then, label %else + %8 = call i1 @read_bit_from_reg(i1* %1, i64 4) + br i1 %8, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -29,22 +33,27 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %9 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %9, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %10 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %10, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %11 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %11, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_5.ll b/tests/qir/test_pytket_qir_5.ll index 9c81fbd3..1310e7ac 100644 --- a/tests/qir/test_pytket_qir_5.ll +++ b/tests/qir/test_pytket_qir_5.ll @@ -11,15 +11,19 @@ source_filename = "test_pytket_qir_5" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %4) + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 5) + %2 = call i1* @create_reg(i64 5) + %3 = call i1* @create_reg(i64 5) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %1) + %8 = or i64 %6, %7 + call void @set_all_bits_in_reg(i1* %2, i64 %8) call void @__quantum__qis__h__body(%Qubit* null) - %5 = call i1 @read_bit_from_reg(i64 %2, i64 3) - br i1 %5, label %then, label %else + %9 = call i1 @read_bit_from_reg(i1* %2, i64 3) + br i1 %9, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -31,23 +35,29 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %10, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %11 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %11, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %12 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %12, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %13 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %13, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_6.ll b/tests/qir/test_pytket_qir_6.ll index 1c50be75..2de50a71 100644 --- a/tests/qir/test_pytket_qir_6.ll +++ b/tests/qir/test_pytket_qir_6.ll @@ -11,20 +11,24 @@ source_filename = "test_pytket_qir_6" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %4) + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 5) + %2 = call i1* @create_reg(i64 5) + %3 = call i1* @create_reg(i64 5) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %1) + %8 = or i64 %6, %7 + call void @set_all_bits_in_reg(i1* %2, i64 %8) call void @__quantum__qis__x__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) - %5 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %2, i64 4, i1 %5) - %6 = call i1 @read_bit_from_reg(i64 %2, i64 4) - br i1 %6, label %then, label %else + %9 = call i1 @__quantum__qis__read_result__body(%Result* null) + call void @set_one_bit_in_reg(i1* %2, i64 4, i1 %9) + %10 = call i1 @read_bit_from_reg(i1* %2, i64 4) + br i1 %10, label %then, label %else then: ; preds = %entry call void @__quantum__qis__z__body(%Qubit* null) @@ -36,23 +40,29 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %11 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %11, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %12 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %12, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %13 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %13, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %14 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %14, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_7.ll b/tests/qir/test_pytket_qir_7.ll index 419aabf7..b81bf874 100644 --- a/tests/qir/test_pytket_qir_7.ll +++ b/tests/qir/test_pytket_qir_7.ll @@ -10,56 +10,118 @@ source_filename = "test_pytket_qir_7" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = and i64 %0, %3 - call void @set_all_bits_in_reg(i64 %2, i64 %4) - %5 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %5) - %6 = xor i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %6) - %7 = add i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %7) - %8 = sub i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %8) - %9 = mul i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %9) - %10 = shl i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %10) - %11 = lshr i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %11) - %12 = icmp eq i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %12) - %13 = icmp ne i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %13) - %14 = icmp ugt i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %14) - %15 = icmp uge i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %15) - %16 = icmp ult i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %16) - %17 = icmp ule i64 %0, %1 - call void @set_one_bit_in_reg(i64 %2, i64 0, i1 %17) + %0 = call i1* @create_reg(i64 3) + %1 = call i1* @create_reg(i64 3) + %2 = call i1* @create_reg(i64 3) + %3 = call i1* @create_reg(i64 3) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %3) + %8 = and i64 %6, %7 + call void @set_all_bits_in_reg(i1* %2, i64 %8) + %9 = call i64 @read_all_bits_from_reg(i1* %0) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + %11 = call i64 @read_all_bits_from_reg(i1* %0) + %12 = call i64 @read_all_bits_from_reg(i1* %1) + %13 = or i64 %11, %12 + call void @set_all_bits_in_reg(i1* %2, i64 %13) + %14 = call i64 @read_all_bits_from_reg(i1* %0) + %15 = call i64 @read_all_bits_from_reg(i1* %0) + %16 = call i64 @read_all_bits_from_reg(i1* %0) + %17 = call i64 @read_all_bits_from_reg(i1* %1) + %18 = xor i64 %16, %17 + call void @set_all_bits_in_reg(i1* %2, i64 %18) + %19 = call i64 @read_all_bits_from_reg(i1* %0) + %20 = call i64 @read_all_bits_from_reg(i1* %0) + %21 = call i64 @read_all_bits_from_reg(i1* %0) + %22 = call i64 @read_all_bits_from_reg(i1* %1) + %23 = add i64 %21, %22 + call void @set_all_bits_in_reg(i1* %2, i64 %23) + %24 = call i64 @read_all_bits_from_reg(i1* %0) + %25 = call i64 @read_all_bits_from_reg(i1* %0) + %26 = call i64 @read_all_bits_from_reg(i1* %0) + %27 = call i64 @read_all_bits_from_reg(i1* %1) + %28 = sub i64 %26, %27 + call void @set_all_bits_in_reg(i1* %2, i64 %28) + %29 = call i64 @read_all_bits_from_reg(i1* %0) + %30 = call i64 @read_all_bits_from_reg(i1* %0) + %31 = call i64 @read_all_bits_from_reg(i1* %0) + %32 = call i64 @read_all_bits_from_reg(i1* %1) + %33 = mul i64 %31, %32 + call void @set_all_bits_in_reg(i1* %2, i64 %33) + %34 = call i64 @read_all_bits_from_reg(i1* %0) + %35 = call i64 @read_all_bits_from_reg(i1* %0) + %36 = call i64 @read_all_bits_from_reg(i1* %0) + %37 = call i64 @read_all_bits_from_reg(i1* %1) + %38 = shl i64 %36, %37 + call void @set_all_bits_in_reg(i1* %2, i64 %38) + %39 = call i64 @read_all_bits_from_reg(i1* %0) + %40 = call i64 @read_all_bits_from_reg(i1* %0) + %41 = call i64 @read_all_bits_from_reg(i1* %0) + %42 = call i64 @read_all_bits_from_reg(i1* %1) + %43 = lshr i64 %41, %42 + call void @set_all_bits_in_reg(i1* %2, i64 %43) + %44 = call i64 @read_all_bits_from_reg(i1* %0) + %45 = call i64 @read_all_bits_from_reg(i1* %0) + %46 = call i64 @read_all_bits_from_reg(i1* %0) + %47 = call i64 @read_all_bits_from_reg(i1* %1) + %48 = icmp eq i64 %46, %47 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %48) + %49 = call i64 @read_all_bits_from_reg(i1* %0) + %50 = call i64 @read_all_bits_from_reg(i1* %0) + %51 = call i64 @read_all_bits_from_reg(i1* %0) + %52 = call i64 @read_all_bits_from_reg(i1* %1) + %53 = icmp ne i64 %51, %52 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %53) + %54 = call i64 @read_all_bits_from_reg(i1* %0) + %55 = call i64 @read_all_bits_from_reg(i1* %0) + %56 = call i64 @read_all_bits_from_reg(i1* %0) + %57 = call i64 @read_all_bits_from_reg(i1* %1) + %58 = icmp ugt i64 %56, %57 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %58) + %59 = call i64 @read_all_bits_from_reg(i1* %0) + %60 = call i64 @read_all_bits_from_reg(i1* %0) + %61 = call i64 @read_all_bits_from_reg(i1* %0) + %62 = call i64 @read_all_bits_from_reg(i1* %1) + %63 = icmp uge i64 %61, %62 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %63) + %64 = call i64 @read_all_bits_from_reg(i1* %0) + %65 = call i64 @read_all_bits_from_reg(i1* %0) + %66 = call i64 @read_all_bits_from_reg(i1* %0) + %67 = call i64 @read_all_bits_from_reg(i1* %1) + %68 = icmp ult i64 %66, %67 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %68) + %69 = call i64 @read_all_bits_from_reg(i1* %0) + %70 = call i64 @read_all_bits_from_reg(i1* %0) + %71 = call i64 @read_all_bits_from_reg(i1* %0) + %72 = call i64 @read_all_bits_from_reg(i1* %1) + %73 = icmp ule i64 %71, %72 + call void @set_one_bit_in_reg(i1* %2, i64 0, i1 %73) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %74 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %74, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %75 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %75, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %76 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %76, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %77 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %77, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_8.ll b/tests/qir/test_pytket_qir_8.ll index 4ad4dc41..f62aa663 100644 --- a/tests/qir/test_pytket_qir_8.ll +++ b/tests/qir/test_pytket_qir_8.ll @@ -7,34 +7,37 @@ source_filename = "test_pytket_qir_8" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 2, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 7, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 true) - call void @set_one_bit_in_reg(i64 %0, i64 2, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 3, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 4, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 5, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 6, i1 false) - call void @set_one_bit_in_reg(i64 %0, i64 7, i1 false) + %0 = call i1* @create_reg(i64 8) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 2, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 7, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 true) + call void @set_one_bit_in_reg(i1* %0, i64 2, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 3, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 4, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 5, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 6, i1 false) + call void @set_one_bit_in_reg(i1* %0, i64 7, i1 false) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %1 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_9.ll b/tests/qir/test_pytket_qir_9.ll index a9776687..8c038266 100644 --- a/tests/qir/test_pytket_qir_9.ll +++ b/tests/qir/test_pytket_qir_9.ll @@ -8,28 +8,32 @@ source_filename = "test_pytket_qir_9" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i1 @read_bit_from_reg(i64 %0, i64 0) - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %2) - %3 = call i1 @read_bit_from_reg(i64 %0, i64 1) - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 %3) + %0 = call i1* @create_reg(i64 2) + %1 = call i1* @create_reg(i64 2) + %2 = call i1 @read_bit_from_reg(i1* %0, i64 0) + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %2) + %3 = call i1 @read_bit_from_reg(i1* %0, i64 1) + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %3) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_barrier.ll b/tests/qir/test_pytket_qir_barrier.ll index 1a8245da..42d438a3 100644 --- a/tests/qir/test_pytket_qir_barrier.ll +++ b/tests/qir/test_pytket_qir_barrier.ll @@ -18,15 +18,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_barrier_ii.ll b/tests/qir/test_pytket_qir_barrier_ii.ll index 5ac03078..aca19821 100644 --- a/tests/qir/test_pytket_qir_barrier_ii.ll +++ b/tests/qir/test_pytket_qir_barrier_ii.ll @@ -20,15 +20,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional.ll b/tests/qir/test_pytket_qir_conditional.ll index 3e3656cf..68bfb775 100644 --- a/tests/qir/test_pytket_qir_conditional.ll +++ b/tests/qir/test_pytket_qir_conditional.ll @@ -11,24 +11,36 @@ source_filename = "test_pytket_qir_conditional" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %4) + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 5) + %2 = call i1* @create_reg(i64 5) + %3 = call i1* @create_reg(i64 5) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %1) + %8 = or i64 %6, %7 + call void @set_all_bits_in_reg(i1* %2, i64 %8) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*)) - %5 = or i64 %2, %1 - call void @set_all_bits_in_reg(i64 %3, i64 %5) + %9 = call i64 @read_all_bits_from_reg(i1* %0) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + %11 = call i64 @read_all_bits_from_reg(i1* %2) + %12 = call i64 @read_all_bits_from_reg(i1* %1) + %13 = or i64 %11, %12 + call void @set_all_bits_in_reg(i1* %3, i64 %13) call void @__quantum__qis__h__body(%Qubit* null) - %6 = call i1 @read_bit_from_reg(i64 %0, i64 4) - br i1 %6, label %then, label %else + %14 = call i1 @read_bit_from_reg(i1* %0, i64 4) + br i1 %14, label %then, label %else then: ; preds = %entry - %7 = or i64 %2, %1 - call void @set_all_bits_in_reg(i64 %3, i64 %7) + %15 = call i64 @read_all_bits_from_reg(i1* %0) + %16 = call i64 @read_all_bits_from_reg(i1* %0) + %17 = call i64 @read_all_bits_from_reg(i1* %2) + %18 = call i64 @read_all_bits_from_reg(i1* %1) + %19 = or i64 %17, %18 + call void @set_all_bits_in_reg(i1* %3, i64 %19) br label %continue else: ; preds = %entry @@ -36,32 +48,38 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 2 to %Result*)) - %8 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 2 to %Result*)) - call void @set_one_bit_in_reg(i64 %3, i64 2, i1 %8) + %20 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 2 to %Result*)) + call void @set_one_bit_in_reg(i1* %3, i64 2, i1 %20) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) - %9 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %3, i64 3, i1 %9) + %21 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) + call void @set_one_bit_in_reg(i1* %3, i64 3, i1 %21) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) - %10 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %3, i64 4, i1 %10) + %22 = call i1 @__quantum__qis__read_result__body(%Result* null) + call void @set_one_bit_in_reg(i1* %3, i64 4, i1 %22) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %23 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %23, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %24 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %24, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %25 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %25, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %26 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %26, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_10.ll b/tests/qir/test_pytket_qir_conditional_10.ll index a3a68d76..5c7a8164 100644 --- a/tests/qir/test_pytket_qir_conditional_10.ll +++ b/tests/qir/test_pytket_qir_conditional_10.ll @@ -9,14 +9,18 @@ source_filename = "test_pytket_qir_conditional_10" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i1 @read_bit_from_reg(i64 %0, i64 0) + %0 = call i1* @create_reg(i64 4) + %1 = call i1* @create_reg(i64 5) + %2 = call i1 @read_bit_from_reg(i1* %0, i64 0) br i1 %2, label %then, label %else then: ; preds = %entry - %3 = or i64 %1, %1 - call void @set_all_bits_in_reg(i64 %1, i64 %3) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %1) + %6 = call i64 @read_all_bits_from_reg(i1* %1) + %7 = or i64 %5, %6 + call void @set_all_bits_in_reg(i1* %1, i64 %7) call void @__quantum__qis__x__body(%Qubit* null) call void @__quantum__qis__z__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__y__body(%Qubit* inttoptr (i64 2 to %Qubit*)) @@ -29,21 +33,25 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %8 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %8, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %9 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %9, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_6.ll b/tests/qir/test_pytket_qir_conditional_6.ll index 223b8ddf..68ab352d 100644 --- a/tests/qir/test_pytket_qir_conditional_6.ll +++ b/tests/qir/test_pytket_qir_conditional_6.ll @@ -8,11 +8,12 @@ source_filename = "test_pytket_qir_conditional_6" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 3) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) - %1 = icmp eq i64 3, %0 - br i1 %1, label %then, label %else + %1 = call i64 @read_all_bits_from_reg(i1* %0) + %2 = icmp eq i64 3, %1 + br i1 %2, label %then, label %else then: ; preds = %entry call void @__quantum__qis__phasedx__body(double 0x3FD41B2F769CF0E0, double 0x3FE41B2F769CF0E0, %Qubit* null) @@ -23,20 +24,23 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_7.ll b/tests/qir/test_pytket_qir_conditional_7.ll index 5951fce7..1a62da57 100644 --- a/tests/qir/test_pytket_qir_conditional_7.ll +++ b/tests/qir/test_pytket_qir_conditional_7.ll @@ -9,22 +9,28 @@ source_filename = "test_pytket_qir_conditional_7" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = icmp eq i64 1, %0 - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %2) - %3 = icmp eq i64 2, %0 - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 %3) - %4 = icmp eq i64 2, %0 - call void @set_one_bit_in_reg(i64 %1, i64 2, i1 %4) - %5 = icmp eq i64 3, %0 - call void @set_one_bit_in_reg(i64 %1, i64 3, i1 %5) - %6 = icmp eq i64 4, %0 - call void @set_one_bit_in_reg(i64 %1, i64 4, i1 %6) - %7 = icmp eq i64 4, %0 - call void @set_one_bit_in_reg(i64 %1, i64 5, i1 %7) - %8 = call i1 @read_bit_from_reg(i64 %1, i64 0) - br i1 %8, label %then, label %else + %0 = call i1* @create_reg(i64 4) + %1 = call i1* @create_reg(i64 6) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + %3 = icmp eq i64 1, %2 + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %3) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = icmp eq i64 2, %4 + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %5) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = icmp eq i64 2, %6 + call void @set_one_bit_in_reg(i1* %1, i64 2, i1 %7) + %8 = call i64 @read_all_bits_from_reg(i1* %0) + %9 = icmp eq i64 3, %8 + call void @set_one_bit_in_reg(i1* %1, i64 3, i1 %9) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + %11 = icmp eq i64 4, %10 + call void @set_one_bit_in_reg(i1* %1, i64 4, i1 %11) + %12 = call i64 @read_all_bits_from_reg(i1* %0) + %13 = icmp eq i64 4, %12 + call void @set_one_bit_in_reg(i1* %1, i64 5, i1 %13) + %14 = call i1 @read_bit_from_reg(i1* %1, i64 0) + br i1 %14, label %then, label %else then: ; preds = %entry call void @__quantum__qis__x__body(%Qubit* null) @@ -34,8 +40,8 @@ else: ; preds = %entry br label %continue continue: ; preds = %else, %then - %9 = call i1 @read_bit_from_reg(i64 %1, i64 1) - br i1 %9, label %then1, label %else2 + %15 = call i1 @read_bit_from_reg(i1* %1, i64 1) + br i1 %15, label %then1, label %else2 then1: ; preds = %continue call void @__quantum__qis__x__body(%Qubit* null) @@ -45,8 +51,8 @@ else2: ; preds = %continue br label %continue3 continue3: ; preds = %else2, %then1 - %10 = call i1 @read_bit_from_reg(i64 %1, i64 2) - br i1 %10, label %then4, label %else5 + %16 = call i1 @read_bit_from_reg(i1* %1, i64 2) + br i1 %16, label %then4, label %else5 then4: ; preds = %continue3 call void @__quantum__qis__x__body(%Qubit* null) @@ -56,8 +62,8 @@ else5: ; preds = %continue3 br label %continue6 continue6: ; preds = %else5, %then4 - %11 = call i1 @read_bit_from_reg(i64 %1, i64 3) - br i1 %11, label %then7, label %else8 + %17 = call i1 @read_bit_from_reg(i1* %1, i64 3) + br i1 %17, label %then7, label %else8 then7: ; preds = %continue6 call void @__quantum__qis__x__body(%Qubit* null) @@ -67,8 +73,8 @@ else8: ; preds = %continue6 br label %continue9 continue9: ; preds = %else8, %then7 - %12 = call i1 @read_bit_from_reg(i64 %1, i64 4) - br i1 %12, label %then10, label %else11 + %18 = call i1 @read_bit_from_reg(i1* %1, i64 4) + br i1 %18, label %then10, label %else11 then10: ; preds = %continue9 call void @__quantum__qis__x__body(%Qubit* null) @@ -78,8 +84,8 @@ else11: ; preds = %continue9 br label %continue12 continue12: ; preds = %else11, %then10 - %13 = call i1 @read_bit_from_reg(i64 %1, i64 5) - br i1 %13, label %then13, label %else14 + %19 = call i1 @read_bit_from_reg(i1* %1, i64 5) + br i1 %19, label %then13, label %else14 then13: ; preds = %continue12 call void @__quantum__qis__x__body(%Qubit* null) @@ -90,21 +96,25 @@ else14: ; preds = %continue12 continue15: ; preds = %else14, %then13 call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @1, i32 0, i32 0)) + %20 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %20, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0)) + %21 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %21, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_8.ll b/tests/qir/test_pytket_qir_conditional_8.ll index 74d700f5..d0ad9c7a 100644 --- a/tests/qir/test_pytket_qir_conditional_8.ll +++ b/tests/qir/test_pytket_qir_conditional_8.ll @@ -8,8 +8,8 @@ source_filename = "test_pytket_qir_conditional_8" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i1 @read_bit_from_reg(i64 %0, i64 0) + %0 = call i1* @create_reg(i64 4) + %1 = call i1 @read_bit_from_reg(i1* %0, i64 0) br i1 %1, label %then, label %else then: ; preds = %entry @@ -24,20 +24,23 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_9.ll b/tests/qir/test_pytket_qir_conditional_9.ll index d8942ff3..75b1022b 100644 --- a/tests/qir/test_pytket_qir_conditional_9.ll +++ b/tests/qir/test_pytket_qir_conditional_9.ll @@ -8,8 +8,8 @@ source_filename = "test_pytket_qir_conditional_9" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i1 @read_bit_from_reg(i64 %0, i64 0) + %0 = call i1* @create_reg(i64 4) + %1 = call i1 @read_bit_from_reg(i1* %0, i64 0) br i1 %1, label %then, label %else then: ; preds = %entry @@ -24,20 +24,23 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_ii.ll b/tests/qir/test_pytket_qir_conditional_ii.ll index 16ce833c..d0982fee 100644 --- a/tests/qir/test_pytket_qir_conditional_ii.ll +++ b/tests/qir/test_pytket_qir_conditional_ii.ll @@ -11,57 +11,75 @@ source_filename = "test_pytket_qir_conditional_ii" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = or i64 %0, %1 - call void @set_all_bits_in_reg(i64 %2, i64 %4) + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 5) + %2 = call i1* @create_reg(i64 5) + %3 = call i1* @create_reg(i64 5) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %1) + %8 = or i64 %6, %7 + call void @set_all_bits_in_reg(i1* %2, i64 %8) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 2 to %Qubit*)) - %5 = or i64 %2, %1 - call void @set_all_bits_in_reg(i64 %3, i64 %5) + %9 = call i64 @read_all_bits_from_reg(i1* %0) + %10 = call i64 @read_all_bits_from_reg(i1* %0) + %11 = call i64 @read_all_bits_from_reg(i1* %2) + %12 = call i64 @read_all_bits_from_reg(i1* %1) + %13 = or i64 %11, %12 + call void @set_all_bits_in_reg(i1* %3, i64 %13) call void @__quantum__qis__h__body(%Qubit* null) - %6 = call i1 @read_bit_from_reg(i64 %0, i64 4) - br i1 %6, label %then, label %else + %14 = call i1 @read_bit_from_reg(i1* %0, i64 4) + br i1 %14, label %then, label %else then: ; preds = %entry br label %continue else: ; preds = %entry - %7 = or i64 %2, %1 - call void @set_all_bits_in_reg(i64 %3, i64 %7) + %15 = call i64 @read_all_bits_from_reg(i1* %0) + %16 = call i64 @read_all_bits_from_reg(i1* %0) + %17 = call i64 @read_all_bits_from_reg(i1* %2) + %18 = call i64 @read_all_bits_from_reg(i1* %1) + %19 = or i64 %17, %18 + call void @set_all_bits_in_reg(i1* %3, i64 %19) br label %continue continue: ; preds = %else, %then call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Result* inttoptr (i64 2 to %Result*)) - %8 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 2 to %Result*)) - call void @set_one_bit_in_reg(i64 %3, i64 2, i1 %8) + %20 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 2 to %Result*)) + call void @set_one_bit_in_reg(i1* %3, i64 2, i1 %20) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) - %9 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %3, i64 3, i1 %9) + %21 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) + call void @set_one_bit_in_reg(i1* %3, i64 3, i1 %21) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) - %10 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %3, i64 4, i1 %10) + %22 = call i1 @__quantum__qis__read_result__body(%Result* null) + call void @set_one_bit_in_reg(i1* %3, i64 4, i1 %22) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %23 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %23, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %24 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %24, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %25 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %25, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %26 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %26, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_iii.ll b/tests/qir/test_pytket_qir_conditional_iii.ll index 85b5d859..13dd993b 100644 --- a/tests/qir/test_pytket_qir_conditional_iii.ll +++ b/tests/qir/test_pytket_qir_conditional_iii.ll @@ -13,28 +13,35 @@ source_filename = "test_pytket_qir_conditional_iii" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %3 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %4 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %5 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 15) + %1 = call i1* @create_reg(i64 15) + %2 = call i1* @create_reg(i64 15) + %3 = call i1* @create_reg(i64 15) + %4 = call i1* @create_reg(i64 15) + %5 = call i1* @create_reg(i64 1) call void @__quantum__qis__h__body(%Qubit* null) - %6 = call i1 @read_bit_from_reg(i64 %2, i64 4) - %7 = call i1 @read_bit_from_reg(i64 %2, i64 5) - %8 = call i1 @read_bit_from_reg(i64 %2, i64 6) - %9 = xor i1 %7, %8 - %10 = or i1 %6, %9 - %11 = call i1 @read_bit_from_reg(i64 %2, i64 7) - %12 = call i1 @read_bit_from_reg(i64 %2, i64 8) - %13 = and i1 %11, %12 - %14 = or i1 %10, %13 - call void @set_one_bit_in_reg(i64 %5, i64 0, i1 %14) - %15 = add i64 %0, %1 - %16 = sub i64 %15, %3 - call void @set_all_bits_in_reg(i64 %2, i64 %16) - %17 = call i1 @read_bit_from_reg(i64 %5, i64 0) - br i1 %17, label %then, label %else + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = call i64 @read_all_bits_from_reg(i1* %0) + %8 = call i1 @read_bit_from_reg(i1* %2, i64 4) + %9 = call i1 @read_bit_from_reg(i1* %2, i64 5) + %10 = call i1 @read_bit_from_reg(i1* %2, i64 6) + %11 = xor i1 %9, %10 + %12 = or i1 %8, %11 + %13 = call i1 @read_bit_from_reg(i1* %2, i64 7) + %14 = call i1 @read_bit_from_reg(i1* %2, i64 8) + %15 = and i1 %13, %14 + %16 = or i1 %12, %15 + call void @set_one_bit_in_reg(i1* %5, i64 0, i1 %16) + %17 = call i64 @read_all_bits_from_reg(i1* %0) + %18 = call i64 @read_all_bits_from_reg(i1* %0) + %19 = call i64 @read_all_bits_from_reg(i1* %0) + %20 = call i64 @read_all_bits_from_reg(i1* %1) + %21 = add i64 %19, %20 + %22 = call i64 @read_all_bits_from_reg(i1* %3) + %23 = sub i64 %21, %22 + call void @set_all_bits_in_reg(i1* %2, i64 %23) + %24 = call i1 @read_bit_from_reg(i1* %5, i64 0) + br i1 %24, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -44,30 +51,44 @@ else: ; preds = %entry br label %continue continue: ; preds = %else, %then - %18 = mul i64 %0, %1 - %19 = mul i64 %18, %3 - %20 = mul i64 %19, %2 - call void @set_all_bits_in_reg(i64 %4, i64 %20) + %25 = call i64 @read_all_bits_from_reg(i1* %0) + %26 = call i64 @read_all_bits_from_reg(i1* %0) + %27 = call i64 @read_all_bits_from_reg(i1* %0) + %28 = call i64 @read_all_bits_from_reg(i1* %1) + %29 = mul i64 %27, %28 + %30 = call i64 @read_all_bits_from_reg(i1* %3) + %31 = mul i64 %29, %30 + %32 = call i64 @read_all_bits_from_reg(i1* %2) + %33 = mul i64 %31, %32 + call void @set_all_bits_in_reg(i1* %4, i64 %33) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %4, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @4, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @5, i32 0, i32 0)) + %34 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %34, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %35 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %35, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @1, i32 0, i32 0)) + %36 = call i64 @read_all_bits_from_reg(i1* %2) + call void @__quantum__rt__int_record_output(i64 %36, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0)) + %37 = call i64 @read_all_bits_from_reg(i1* %3) + call void @__quantum__rt__int_record_output(i64 %37, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0)) + %38 = call i64 @read_all_bits_from_reg(i1* %4) + call void @__quantum__rt__int_record_output(i64 %38, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @4, i32 0, i32 0)) + %39 = call i64 @read_all_bits_from_reg(i1* %5) + call void @__quantum__rt__int_record_output(i64 %39, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @5, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_iv.ll b/tests/qir/test_pytket_qir_conditional_iv.ll index 93c7b778..5a1e2419 100644 --- a/tests/qir/test_pytket_qir_conditional_iv.ll +++ b/tests/qir/test_pytket_qir_conditional_iv.ll @@ -8,17 +8,18 @@ source_filename = "test_pytket_qir_conditional_iv" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 2) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) %1 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 %1) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %2 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %2) - %3 = icmp eq i64 3, %0 - br i1 %3, label %then, label %else + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %2) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = icmp eq i64 3, %3 + br i1 %4, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -29,20 +30,23 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_conditional_v.ll b/tests/qir/test_pytket_qir_conditional_v.ll index f6ca761b..8ab0e416 100644 --- a/tests/qir/test_pytket_qir_conditional_v.ll +++ b/tests/qir/test_pytket_qir_conditional_v.ll @@ -8,17 +8,18 @@ source_filename = "test_pytket_qir_conditional_v" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 3) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) %1 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 %1) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %2 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %2) - %3 = icmp eq i64 3, %0 - br i1 %3, label %then, label %else + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %2) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + %4 = icmp eq i64 3, %3 + br i1 %4, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -29,20 +30,23 @@ else: ; preds = %entry continue: ; preds = %else, %then call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %5 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_module.ll b/tests/qir/test_pytket_qir_module.ll index 435c44d5..25c7f69b 100644 --- a/tests/qir/test_pytket_qir_module.ll +++ b/tests/qir/test_pytket_qir_module.ll @@ -12,15 +12,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_optimised.ll b/tests/qir/test_pytket_qir_optimised.ll index 9345e4e4..a1220f83 100644 --- a/tests/qir/test_pytket_qir_optimised.ll +++ b/tests/qir/test_pytket_qir_optimised.ll @@ -12,7 +12,6 @@ entry: ret void } - declare void @__quantum__rt__int_record_output(i64, i8*) declare void @__quantum__rt__tuple_start_record_output() diff --git a/tests/qir/test_pytket_qir_optimised_ii.ll b/tests/qir/test_pytket_qir_optimised_ii.ll index 812c1adb..53d9d69e 100644 --- a/tests/qir/test_pytket_qir_optimised_ii.ll +++ b/tests/qir/test_pytket_qir_optimised_ii.ll @@ -18,7 +18,6 @@ entry: ret void } - declare void @__quantum__rt__int_record_output(i64, i8*) declare void @__quantum__rt__tuple_start_record_output() diff --git a/tests/qir/test_pytket_qir_quantum.ll b/tests/qir/test_pytket_qir_quantum.ll index 6c8c0d48..ab0561a9 100644 --- a/tests/qir/test_pytket_qir_quantum.ll +++ b/tests/qir/test_pytket_qir_quantum.ll @@ -12,15 +12,17 @@ entry: ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_quantum_ii.ll b/tests/qir/test_pytket_qir_quantum_ii.ll index e16d3bb8..677df3d7 100644 --- a/tests/qir/test_pytket_qir_quantum_ii.ll +++ b/tests/qir/test_pytket_qir_quantum_ii.ll @@ -8,7 +8,7 @@ source_filename = "test_pytket_qir_quantum" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 4) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__cnot__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__qis__x__body(%Qubit* null) @@ -17,24 +17,27 @@ entry: call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %1 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %1) call void @__quantum__qis__z__body(%Qubit* null) call void @__quantum__qis__rx__body(double 0x3FF921FB54442D18, %Qubit* null) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_quantum_iii.ll b/tests/qir/test_pytket_qir_quantum_iii.ll index 45961437..012a3fbd 100644 --- a/tests/qir/test_pytket_qir_quantum_iii.ll +++ b/tests/qir/test_pytket_qir_quantum_iii.ll @@ -8,30 +8,33 @@ source_filename = "test_pytket_qir_quantum" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 2) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__cnot__body(%Qubit* null, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* null, %Result* null) %1 = call i1 @__quantum__qis__read_result__body(%Result* null) - call void @set_one_bit_in_reg(i64 %0, i64 0, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 0, i1 %1) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %2 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %2) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %2) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %3 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_quantum_iv.ll b/tests/qir/test_pytket_qir_quantum_iv.ll index 0a648f13..5fc318b2 100644 --- a/tests/qir/test_pytket_qir_quantum_iv.ll +++ b/tests/qir/test_pytket_qir_quantum_iv.ll @@ -8,7 +8,7 @@ source_filename = "test_pytket_qir_quantum_iv" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 4) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__x__body(%Qubit* null) call void @__quantum__qis__y__body(%Qubit* null) @@ -22,22 +22,25 @@ entry: call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %1 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %1) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_quantum_v.ll b/tests/qir/test_pytket_qir_quantum_v.ll index 40b84e94..5dbb8761 100644 --- a/tests/qir/test_pytket_qir_quantum_v.ll +++ b/tests/qir/test_pytket_qir_quantum_v.ll @@ -8,7 +8,7 @@ source_filename = "test_pytket_qir_quantum_v" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) + %0 = call i1* @create_reg(i64 4) call void @__quantum__qis__h__body(%Qubit* null) call void @__quantum__qis__x__body(%Qubit* null) call void @__quantum__qis__y__body(%Qubit* null) @@ -23,22 +23,25 @@ entry: call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__mz__body(%Qubit* inttoptr (i64 1 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) %1 = call i1 @__quantum__qis__read_result__body(%Result* inttoptr (i64 1 to %Result*)) - call void @set_one_bit_in_reg(i64 %0, i64 1, i1 %1) + call void @set_one_bit_in_reg(i1* %0, i64 1, i1 %1) call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %2, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*) diff --git a/tests/qir/test_pytket_qir_rangepredicate.ll b/tests/qir/test_pytket_qir_rangepredicate.ll index 695a83e2..c4b4deff 100644 --- a/tests/qir/test_pytket_qir_rangepredicate.ll +++ b/tests/qir/test_pytket_qir_rangepredicate.ll @@ -9,28 +9,37 @@ source_filename = "test_pytket_qir_rangepredicate" define void @main() #0 { entry: - %0 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %1 = call i64 @reg2var(i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false) - %2 = icmp eq i64 1, %0 - call void @set_one_bit_in_reg(i64 %1, i64 0, i1 %2) - %3 = icmp eq i64 1, %0 - call void @set_one_bit_in_reg(i64 %1, i64 1, i1 %3) - %4 = icmp eq i64 0, %0 - call void @set_one_bit_in_reg(i64 %1, i64 2, i1 %4) - %5 = icmp sgt i64 2, %0 - %6 = icmp sgt i64 %0, 4294967295 - %7 = and i1 %5, %6 - call void @set_one_bit_in_reg(i64 %1, i64 3, i1 %7) - %8 = icmp sgt i64 0, %0 - %9 = icmp sgt i64 %0, 1 - %10 = and i1 %8, %9 - call void @set_one_bit_in_reg(i64 %1, i64 4, i1 %10) - %11 = icmp sgt i64 1, %0 - %12 = icmp sgt i64 %0, 4294967295 - %13 = and i1 %11, %12 - call void @set_one_bit_in_reg(i64 %1, i64 5, i1 %13) - %14 = call i1 @read_bit_from_reg(i64 %1, i64 0) - br i1 %14, label %then, label %else + %0 = call i1* @create_reg(i64 5) + %1 = call i1* @create_reg(i64 6) + %2 = call i64 @read_all_bits_from_reg(i1* %0) + %3 = icmp eq i64 1, %2 + call void @set_one_bit_in_reg(i1* %1, i64 0, i1 %3) + %4 = call i64 @read_all_bits_from_reg(i1* %0) + %5 = icmp eq i64 1, %4 + call void @set_one_bit_in_reg(i1* %1, i64 1, i1 %5) + %6 = call i64 @read_all_bits_from_reg(i1* %0) + %7 = icmp eq i64 0, %6 + call void @set_one_bit_in_reg(i1* %1, i64 2, i1 %7) + %8 = call i64 @read_all_bits_from_reg(i1* %0) + %9 = icmp sgt i64 2, %8 + %10 = call i64 @read_all_bits_from_reg(i1* %0) + %11 = icmp sgt i64 %10, 4294967295 + %12 = and i1 %9, %11 + call void @set_one_bit_in_reg(i1* %1, i64 3, i1 %12) + %13 = call i64 @read_all_bits_from_reg(i1* %0) + %14 = icmp sgt i64 0, %13 + %15 = call i64 @read_all_bits_from_reg(i1* %0) + %16 = icmp sgt i64 %15, 1 + %17 = and i1 %14, %16 + call void @set_one_bit_in_reg(i1* %1, i64 4, i1 %17) + %18 = call i64 @read_all_bits_from_reg(i1* %0) + %19 = icmp sgt i64 1, %18 + %20 = call i64 @read_all_bits_from_reg(i1* %0) + %21 = icmp sgt i64 %20, 4294967295 + %22 = and i1 %19, %21 + call void @set_one_bit_in_reg(i1* %1, i64 5, i1 %22) + %23 = call i1 @read_bit_from_reg(i1* %1, i64 0) + br i1 %23, label %then, label %else then: ; preds = %entry call void @__quantum__qis__h__body(%Qubit* null) @@ -40,8 +49,8 @@ else: ; preds = %entry br label %continue continue: ; preds = %else, %then - %15 = call i1 @read_bit_from_reg(i64 %1, i64 1) - br i1 %15, label %then1, label %else2 + %24 = call i1 @read_bit_from_reg(i1* %1, i64 1) + br i1 %24, label %then1, label %else2 then1: ; preds = %continue br label %continue3 @@ -51,8 +60,8 @@ else2: ; preds = %continue br label %continue3 continue3: ; preds = %else2, %then1 - %16 = call i1 @read_bit_from_reg(i64 %1, i64 2) - br i1 %16, label %then4, label %else5 + %25 = call i1 @read_bit_from_reg(i1* %1, i64 2) + br i1 %25, label %then4, label %else5 then4: ; preds = %continue3 call void @__quantum__qis__h__body(%Qubit* null) @@ -62,8 +71,8 @@ else5: ; preds = %continue3 br label %continue6 continue6: ; preds = %else5, %then4 - %17 = call i1 @read_bit_from_reg(i64 %1, i64 3) - br i1 %17, label %then7, label %else8 + %26 = call i1 @read_bit_from_reg(i1* %1, i64 3) + br i1 %26, label %then7, label %else8 then7: ; preds = %continue6 call void @__quantum__qis__h__body(%Qubit* null) @@ -73,8 +82,8 @@ else8: ; preds = %continue6 br label %continue9 continue9: ; preds = %else8, %then7 - %18 = call i1 @read_bit_from_reg(i64 %1, i64 4) - br i1 %18, label %then10, label %else11 + %27 = call i1 @read_bit_from_reg(i1* %1, i64 4) + br i1 %27, label %then10, label %else11 then10: ; preds = %continue9 call void @__quantum__qis__h__body(%Qubit* null) @@ -84,8 +93,8 @@ else11: ; preds = %continue9 br label %continue12 continue12: ; preds = %else11, %then10 - %19 = call i1 @read_bit_from_reg(i64 %1, i64 5) - br i1 %19, label %then13, label %else14 + %28 = call i1 @read_bit_from_reg(i1* %1, i64 5) + br i1 %28, label %then13, label %else14 then13: ; preds = %continue12 call void @__quantum__qis__h__body(%Qubit* null) @@ -96,21 +105,25 @@ else14: ; preds = %continue12 continue15: ; preds = %else14, %then13 call void @__quantum__rt__tuple_start_record_output() - call void @__quantum__rt__int_record_output(i64 %0, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) - call void @__quantum__rt__int_record_output(i64 %1, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @1, i32 0, i32 0)) + %29 = call i64 @read_all_bits_from_reg(i1* %0) + call void @__quantum__rt__int_record_output(i64 %29, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0)) + %30 = call i64 @read_all_bits_from_reg(i1* %1) + call void @__quantum__rt__int_record_output(i64 %30, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @1, i32 0, i32 0)) call void @__quantum__rt__tuple_end_record_output() ret void } -declare i1 @read_bit_from_reg(i64, i64) +declare i1 @read_bit_from_reg(i1*, i64) -declare void @set_one_bit_in_reg(i64, i64, i1) +declare void @set_one_bit_in_reg(i1*, i64, i1) -declare void @set_all_bits_in_reg(i64, i64) +declare void @set_all_bits_in_reg(i1*, i64) declare i1 @__quantum__qis__read_result__body(%Result*) -declare i64 @reg2var(i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1, i1) +declare i1* @create_reg(i64) + +declare i64 @read_all_bits_from_reg(i1*) declare void @__quantum__rt__int_record_output(i64, i8*)