diff --git a/source/compiler/qsc_eval/src/val.rs b/source/compiler/qsc_eval/src/val.rs index 0597719cca..b1c392d2a8 100644 --- a/source/compiler/qsc_eval/src/val.rs +++ b/source/compiler/qsc_eval/src/val.rs @@ -236,6 +236,7 @@ pub enum VarTy { Boolean, Integer, Double, + Qubit, } impl Display for VarTy { @@ -244,6 +245,7 @@ impl Display for VarTy { Self::Boolean => write!(f, "Boolean"), Self::Integer => write!(f, "Integer"), Self::Double => write!(f, "Double"), + Self::Qubit => write!(f, "Qubit"), } } } diff --git a/source/compiler/qsc_partial_eval/src/lib.rs b/source/compiler/qsc_partial_eval/src/lib.rs index 6a13b0d987..d4894e93a9 100644 --- a/source/compiler/qsc_partial_eval/src/lib.rs +++ b/source/compiler/qsc_partial_eval/src/lib.rs @@ -1155,6 +1155,13 @@ impl<'a> PartialEvaluator<'a> { bin_op_expr_span, ) } + VarTy::Qubit => Err(Error::Unexpected( + format!( + "unsupported LHS variable type {} in binary operation", + lhs_eval_var.ty + ), + bin_op_expr_span, + )), } } @@ -1540,6 +1547,23 @@ impl<'a> PartialEvaluator<'a> { self.check_unresolved_call_capabilities(call_expr_id, callee_expr_id, &call_scope)?; self.assign_current_dbg_location(call_expr_id); + if store_item_id.package == PackageId::CORE + && callable_decl.name.name.as_ref() == "ReleaseQubitArray" + { + // This is a special case, where we must statically releaes the given qubits rather than call into the stdlib, which may try + // to unroll the loop over the qubits to be released. Instead, iterate over the qubits here and release them directly. + let Value::Array(qubit_vals) = args_value else { + return Err(Error::Unexpected( + "expected an array of qubits as argument to ReleaseQubitArray".to_string(), + args_span, + )); + }; + for qubit_val in qubit_vals.iter().cloned() { + self.release_qubit(qubit_val, args_span)?; + } + return Ok(EvalControlFlow::Continue(Value::unit())); + } + // We generate instructions differently depending on whether we are calling an intrinsic or a specialization // with an implementation. let value = match spec_decl { @@ -1748,7 +1772,7 @@ impl<'a> PartialEvaluator<'a> { "__quantum__rt__qubit_allocate" | "__quantum__rt__qubit_borrow" => { Ok(self.allocate_qubit()) } - "__quantum__rt__qubit_release" => Ok(self.release_qubit(args_value)), + "__quantum__rt__qubit_release" => self.release_qubit(args_value, args_span), "PermuteLabels" => { if self.eval_context.is_currently_evaluating_any_branch() { // If we are in a dynamic branch anywhere up the call stack, we cannot support relabel, @@ -1859,6 +1883,13 @@ impl<'a> PartialEvaluator<'a> { let ret_val = match output_var { None => Value::unit(), Some(output_var) => { + if output_var.ty == rir::Ty::Prim(rir::Prim::Qubit) { + // We don't actually accept custom intrinsics that return qubits, so emit an error here. + return Err(Error::UnsupportedCustomIntrinsicType( + callable_decl.output.to_string(), + callee_expr_span, + )); + } let rir_var = map_rir_var_to_eval_var(output_var).map_err(|()| { Error::UnsupportedCustomIntrinsicType( callable_decl.output.to_string(), @@ -3096,12 +3127,17 @@ impl<'a> PartialEvaluator<'a> { result_value } - fn release_qubit(&mut self, args_value: Value) -> Value { - let qubit = args_value.unwrap_qubit(); + fn release_qubit(&mut self, args_value: Value, arg_span: PackageSpan) -> Result { + let Value::Qubit(qubit) = args_value else { + return Err(Error::Unimplemented( + "release release of dynamic qubit variable".to_string(), + arg_span, + )); + }; self.resource_manager.release_qubit(&qubit); // The value of a qubit release is unit. - Value::unit() + Ok(Value::unit()) } fn resolve_args( @@ -4216,6 +4252,7 @@ fn map_eval_var_type_to_rir_type(var_ty: VarTy) -> rir::Ty { VarTy::Boolean => rir::Ty::Prim(rir::Prim::Boolean), VarTy::Integer => rir::Ty::Prim(rir::Prim::Integer), VarTy::Double => rir::Ty::Prim(rir::Prim::Double), + VarTy::Qubit => rir::Ty::Prim(rir::Prim::Qubit), } } @@ -4251,6 +4288,7 @@ fn map_rir_type_to_eval_var_type(ty: rir::Ty) -> Result { rir::Ty::Prim(rir::Prim::Boolean) => Ok(VarTy::Boolean), rir::Ty::Prim(rir::Prim::Integer) => Ok(VarTy::Integer), rir::Ty::Prim(rir::Prim::Double) => Ok(VarTy::Double), + rir::Ty::Prim(rir::Prim::Qubit) => Ok(VarTy::Qubit), _ => Err(()), } } @@ -4260,6 +4298,7 @@ fn try_get_eval_var_type(value: &Value) -> Option { Value::Bool(_) => Some(VarTy::Boolean), Value::Int(_) => Some(VarTy::Integer), Value::Double(_) => Some(VarTy::Double), + Value::Qubit(_) => Some(VarTy::Qubit), Value::Var(var) => Some(var.ty), _ => None, } diff --git a/source/compiler/qsc_partial_eval/src/tests/arrays.rs b/source/compiler/qsc_partial_eval/src/tests/arrays.rs index a06035e6b4..eb97ae137e 100644 --- a/source/compiler/qsc_partial_eval/src/tests/arrays.rs +++ b/source/compiler/qsc_partial_eval/src/tests/arrays.rs @@ -1096,9 +1096,6 @@ fn result_array_index_range_returns_length_as_end() { Variable(1, Integer) = Store Integer(1) Call id(2), args( Qubit(1), Result(1), ) Variable(1, Integer) = Store Integer(2) - Variable(2, Integer) = Store Integer(0) - Variable(2, Integer) = Store Integer(1) - Variable(2, Integer) = Store Integer(2) Call id(3), args( Integer(1), Tag(0, 3), ) Return config: Config: diff --git a/source/compiler/qsc_partial_eval/src/tests/debug_metadata.rs b/source/compiler/qsc_partial_eval/src/tests/debug_metadata.rs index 14e49a8f3a..3cdf6f9f17 100644 --- a/source/compiler/qsc_partial_eval/src/tests/debug_metadata.rs +++ b/source/compiler/qsc_partial_eval/src/tests/debug_metadata.rs @@ -268,10 +268,6 @@ fn nested_classical_for_loop() { Call id(2), args( Qubit(2), ) !dbg dbg_location=35 Variable(4, Integer) = Store Integer(3) Variable(1, Integer) = Store Integer(3) - Variable(5, Integer) = Store Integer(0) - Variable(5, Integer) = Store Integer(1) - Variable(5, Integer) = Store Integer(2) - Variable(5, Integer) = Store Integer(3) Call id(3), args( Integer(0), Tag(0, 3), ) Return diff --git a/source/compiler/qsc_partial_eval/src/tests/loops.rs b/source/compiler/qsc_partial_eval/src/tests/loops.rs index 169b6e7623..db07f4d246 100644 --- a/source/compiler/qsc_partial_eval/src/tests/loops.rs +++ b/source/compiler/qsc_partial_eval/src/tests/loops.rs @@ -700,7 +700,6 @@ fn for_loop_over_arrays_of_tuples_unrolled() { "#]].assert_eq(&program.to_string()); } -// For now, loops over qubits are unrolled since we don't support qubit variables. #[test] fn for_loop_over_qubits() { let program = get_rir_program_with_capabilities( @@ -761,24 +760,28 @@ fn for_loop_over_qubits() { Variable(0, Integer) = Store Integer(2) Variable(0, Integer) = Store Integer(3) Variable(1, Integer) = Store Integer(0) - Call id(2), args( Qubit(0), ) - Variable(1, Integer) = Store Integer(1) - Call id(2), args( Qubit(1), ) - Variable(1, Integer) = Store Integer(2) - Call id(2), args( Qubit(2), ) - Variable(1, Integer) = Store Integer(3) - Variable(2, Integer) = Store Integer(0) - Variable(2, Integer) = Store Integer(1) - Variable(2, Integer) = Store Integer(2) - Variable(2, Integer) = Store Integer(3) + Jump(1) + Block 1: Block: + Variable(2, Boolean) = Icmp Slt, Variable(1, Integer), Integer(3) + Branch Variable(2, Boolean), 3, 2 + Block 2: Block: Call id(3), args( Integer(0), Tag(0, 3), ) Return + Block 3: Block: + Variable(3, Qubit) = Index Array(0), Variable(1, Integer) + Variable(4, Qubit) = Store Variable(3, Qubit) + Call id(2), args( Variable(4, Qubit), ) + Variable(5, Integer) = Add Variable(1, Integer), Integer(1) + Variable(1, Integer) = Store Variable(5, Integer) + Jump(1) config: Config: capabilities: TargetCapabilityFlags(Adaptive | IntegerComputations | FloatingPointComputations | BackwardsBranching | StaticSizedArrays) num_qubits: 3 num_results: 0 tags: [0]: 0_t + array_literals: + [0]: [Qubit(0), Qubit(1), Qubit(2)] "#]].assert_eq(&program.to_string()); } @@ -829,10 +832,6 @@ fn for_loop_over_qubits_unrolled() { Variable(1, Integer) = Store Integer(2) Call id(2), args( Qubit(2), ) Variable(1, Integer) = Store Integer(3) - Variable(2, Integer) = Store Integer(0) - Variable(2, Integer) = Store Integer(1) - Variable(2, Integer) = Store Integer(2) - Variable(2, Integer) = Store Integer(3) Call id(3), args( Integer(0), Tag(0, 3), ) Return"#]], ); @@ -1596,9 +1595,6 @@ fn result_array_index_range_in_for_loop_unrolled() { Block 3: Block: Variable(3, Integer) = Store Integer(2) Variable(9, Integer) = Store Variable(2, Integer) - Variable(10, Integer) = Store Integer(0) - Variable(10, Integer) = Store Integer(1) - Variable(10, Integer) = Store Integer(2) Call id(4), args( Variable(9, Integer), Tag(0, 3), ) Return Block 4: Block: diff --git a/source/compiler/qsc_partial_eval/src/tests/qubits.rs b/source/compiler/qsc_partial_eval/src/tests/qubits.rs index ef69e66e23..fae82b7398 100644 --- a/source/compiler/qsc_partial_eval/src/tests/qubits.rs +++ b/source/compiler/qsc_partial_eval/src/tests/qubits.rs @@ -303,10 +303,6 @@ fn qubit_array_allocation_and_access() { Call id(2), args( Qubit(0), ) Call id(2), args( Qubit(1), ) Call id(2), args( Qubit(2), ) - Variable(1, Integer) = Store Integer(0) - Variable(1, Integer) = Store Integer(1) - Variable(1, Integer) = Store Integer(2) - Variable(1, Integer) = Store Integer(3) Call id(3), args( Integer(0), Tag(0, 3), ) Return"#]], ); diff --git a/source/compiler/qsc_rca/src/lib.rs b/source/compiler/qsc_rca/src/lib.rs index 9782edef7a..0dee514c99 100644 --- a/source/compiler/qsc_rca/src/lib.rs +++ b/source/compiler/qsc_rca/src/lib.rs @@ -703,7 +703,7 @@ impl RuntimeFeatureFlags { capabilities |= TargetCapabilityFlags::FloatingPointComputations; } if self.contains(RuntimeFeatureFlags::UseOfDynamicQubit) { - capabilities |= TargetCapabilityFlags::HigherLevelConstructs; + capabilities |= TargetCapabilityFlags::StaticSizedArrays; } if self.contains(RuntimeFeatureFlags::UseOfDynamicBigInt) { capabilities |= TargetCapabilityFlags::HigherLevelConstructs; diff --git a/source/pip/tests-integration/resources/adaptive_ri/output/ArithmeticOps.ll b/source/pip/tests-integration/resources/adaptive_ri/output/ArithmeticOps.ll index bc3eec21ac..ab57a86bb7 100644 --- a/source/pip/tests-integration/resources/adaptive_ri/output/ArithmeticOps.ll +++ b/source/pip/tests-integration/resources/adaptive_ri/output/ArithmeticOps.ll @@ -25,72 +25,72 @@ block_0: block_1: br label %block_2 block_2: - %var_39 = phi i64 [1, %block_0], [3, %block_1] - %var_38 = phi i64 [10, %block_0], [8, %block_1] - %var_37 = phi i64 [0, %block_0], [5, %block_1] - %var_36 = phi i64 [0, %block_0], [1, %block_1] + %var_38 = phi i64 [1, %block_0], [3, %block_1] + %var_37 = phi i64 [10, %block_0], [8, %block_1] + %var_36 = phi i64 [0, %block_0], [5, %block_1] + %var_35 = phi i64 [0, %block_0], [1, %block_1] %var_10 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) br i1 %var_10, label %block_3, label %block_4 block_3: - %var_12 = add i64 %var_36, 1 - %var_13 = add i64 %var_37, 5 - %var_14 = sub i64 %var_38, 2 - %var_15 = mul i64 %var_39, 3 + %var_12 = add i64 %var_35, 1 + %var_13 = add i64 %var_36, 5 + %var_14 = sub i64 %var_37, 2 + %var_15 = mul i64 %var_38, 3 br label %block_4 block_4: - %var_43 = phi i64 [%var_39, %block_2], [%var_15, %block_3] - %var_42 = phi i64 [%var_38, %block_2], [%var_14, %block_3] - %var_41 = phi i64 [%var_37, %block_2], [%var_13, %block_3] - %var_40 = phi i64 [%var_36, %block_2], [%var_12, %block_3] + %var_42 = phi i64 [%var_38, %block_2], [%var_15, %block_3] + %var_41 = phi i64 [%var_37, %block_2], [%var_14, %block_3] + %var_40 = phi i64 [%var_36, %block_2], [%var_13, %block_3] + %var_39 = phi i64 [%var_35, %block_2], [%var_12, %block_3] %var_16 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 2 to %Result*)) br i1 %var_16, label %block_5, label %block_6 block_5: - %var_18 = add i64 %var_40, 1 - %var_19 = add i64 %var_41, 5 - %var_20 = sub i64 %var_42, 2 - %var_21 = mul i64 %var_43, 3 + %var_18 = add i64 %var_39, 1 + %var_19 = add i64 %var_40, 5 + %var_20 = sub i64 %var_41, 2 + %var_21 = mul i64 %var_42, 3 br label %block_6 block_6: - %var_47 = phi i64 [%var_43, %block_4], [%var_21, %block_5] - %var_46 = phi i64 [%var_42, %block_4], [%var_20, %block_5] - %var_45 = phi i64 [%var_41, %block_4], [%var_19, %block_5] - %var_44 = phi i64 [%var_40, %block_4], [%var_18, %block_5] + %var_46 = phi i64 [%var_42, %block_4], [%var_21, %block_5] + %var_45 = phi i64 [%var_41, %block_4], [%var_20, %block_5] + %var_44 = phi i64 [%var_40, %block_4], [%var_19, %block_5] + %var_43 = phi i64 [%var_39, %block_4], [%var_18, %block_5] %var_22 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 3 to %Result*)) br i1 %var_22, label %block_7, label %block_8 block_7: - %var_24 = add i64 %var_44, 1 - %var_25 = add i64 %var_45, 5 - %var_26 = sub i64 %var_46, 2 - %var_27 = mul i64 %var_47, 3 + %var_24 = add i64 %var_43, 1 + %var_25 = add i64 %var_44, 5 + %var_26 = sub i64 %var_45, 2 + %var_27 = mul i64 %var_46, 3 br label %block_8 block_8: - %var_51 = phi i64 [%var_47, %block_6], [%var_27, %block_7] - %var_50 = phi i64 [%var_46, %block_6], [%var_26, %block_7] - %var_49 = phi i64 [%var_45, %block_6], [%var_25, %block_7] - %var_48 = phi i64 [%var_44, %block_6], [%var_24, %block_7] + %var_50 = phi i64 [%var_46, %block_6], [%var_27, %block_7] + %var_49 = phi i64 [%var_45, %block_6], [%var_26, %block_7] + %var_48 = phi i64 [%var_44, %block_6], [%var_25, %block_7] + %var_47 = phi i64 [%var_43, %block_6], [%var_24, %block_7] %var_28 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 4 to %Result*)) br i1 %var_28, label %block_9, label %block_10 block_9: - %var_30 = add i64 %var_48, 1 - %var_31 = add i64 %var_49, 5 - %var_32 = sub i64 %var_50, 2 - %var_33 = mul i64 %var_51, 3 + %var_30 = add i64 %var_47, 1 + %var_31 = add i64 %var_48, 5 + %var_32 = sub i64 %var_49, 2 + %var_33 = mul i64 %var_50, 3 br label %block_10 block_10: - %var_55 = phi i64 [%var_51, %block_8], [%var_33, %block_9] - %var_54 = phi i64 [%var_50, %block_8], [%var_32, %block_9] - %var_53 = phi i64 [%var_49, %block_8], [%var_31, %block_9] - %var_52 = phi i64 [%var_48, %block_8], [%var_30, %block_9] + %var_54 = phi i64 [%var_50, %block_8], [%var_33, %block_9] + %var_53 = phi i64 [%var_49, %block_8], [%var_32, %block_9] + %var_52 = phi i64 [%var_48, %block_8], [%var_31, %block_9] + %var_51 = phi i64 [%var_47, %block_8], [%var_30, %block_9] call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 3 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__rt__tuple_record_output(i64 4, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_52, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_53, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @2, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_54, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @3, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_55, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @4, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_51, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_52, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @2, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_53, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @3, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_54, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @4, i64 0, i64 0)) ret i64 0 } diff --git a/source/pip/tests-integration/resources/adaptive_ri/output/NestedBranching.ll b/source/pip/tests-integration/resources/adaptive_ri/output/NestedBranching.ll index 81bbd02262..449a6b8d63 100644 --- a/source/pip/tests-integration/resources/adaptive_ri/output/NestedBranching.ll +++ b/source/pip/tests-integration/resources/adaptive_ri/output/NestedBranching.ll @@ -44,11 +44,11 @@ block_4: %var_24 = icmp eq i1 %var_23, false br label %block_6 block_5: - %var_81 = phi i1 [false, %block_1], [%var_9, %block_3] - br i1 %var_81, label %block_7, label %block_8 + %var_79 = phi i1 [false, %block_1], [%var_9, %block_3] + br i1 %var_79, label %block_7, label %block_8 block_6: - %var_82 = phi i1 [false, %block_2], [%var_24, %block_4] - br i1 %var_82, label %block_9, label %block_10 + %var_80 = phi i1 [false, %block_2], [%var_24, %block_4] + br i1 %var_80, label %block_9, label %block_10 block_7: br label %block_31 block_8: @@ -68,11 +68,11 @@ block_12: %var_28 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 2 to %Result*)) br label %block_14 block_13: - %var_83 = phi i1 [false, %block_8], [%var_13, %block_11] - br i1 %var_83, label %block_15, label %block_16 + %var_81 = phi i1 [false, %block_8], [%var_13, %block_11] + br i1 %var_81, label %block_15, label %block_16 block_14: - %var_84 = phi i1 [false, %block_10], [%var_28, %block_12] - br i1 %var_84, label %block_17, label %block_18 + %var_82 = phi i1 [false, %block_10], [%var_28, %block_12] + br i1 %var_82, label %block_17, label %block_18 block_15: br label %block_29 block_16: @@ -92,11 +92,11 @@ block_20: %var_34 = icmp eq i1 %var_33, false br label %block_22 block_21: - %var_85 = phi i1 [false, %block_16], [%var_19, %block_19] - br i1 %var_85, label %block_23, label %block_24 + %var_83 = phi i1 [false, %block_16], [%var_19, %block_19] + br i1 %var_83, label %block_23, label %block_24 block_22: - %var_86 = phi i1 [false, %block_18], [%var_34, %block_20] - br i1 %var_86, label %block_25, label %block_26 + %var_84 = phi i1 [false, %block_18], [%var_34, %block_20] + br i1 %var_84, label %block_25, label %block_26 block_23: br label %block_27 block_24: @@ -106,25 +106,25 @@ block_25: block_26: br label %block_28 block_27: - %var_87 = phi i64 [2, %block_23], [3, %block_24] + %var_85 = phi i64 [2, %block_23], [3, %block_24] br label %block_29 block_28: - %var_88 = phi i64 [6, %block_25], [7, %block_26] + %var_86 = phi i64 [6, %block_25], [7, %block_26] br label %block_30 block_29: - %var_89 = phi i64 [1, %block_15], [%var_87, %block_27] + %var_87 = phi i64 [1, %block_15], [%var_85, %block_27] br label %block_31 block_30: - %var_90 = phi i64 [5, %block_17], [%var_88, %block_28] + %var_88 = phi i64 [5, %block_17], [%var_86, %block_28] br label %block_32 block_31: - %var_91 = phi i64 [0, %block_7], [%var_89, %block_29] + %var_89 = phi i64 [0, %block_7], [%var_87, %block_29] br label %block_33 block_32: - %var_92 = phi i64 [4, %block_9], [%var_90, %block_30] + %var_90 = phi i64 [4, %block_9], [%var_88, %block_30] br label %block_33 block_33: - %var_93 = phi i64 [%var_91, %block_31], [%var_92, %block_32] + %var_91 = phi i64 [%var_89, %block_31], [%var_90, %block_32] call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 2 to %Qubit*)) @@ -173,8 +173,8 @@ block_42: call void @__quantum__qis__z__body(%Qubit* inttoptr (i64 7 to %Qubit*)) br label %block_45 block_43: - %var_94 = phi i1 [false, %block_35], [%var_51, %block_38] - br i1 %var_94, label %block_46, label %block_47 + %var_92 = phi i1 [false, %block_35], [%var_51, %block_38] + br i1 %var_92, label %block_46, label %block_47 block_44: br label %block_48 block_45: @@ -215,8 +215,8 @@ block_55: call void @__quantum__qis__z__body(%Qubit* inttoptr (i64 7 to %Qubit*)) br label %block_58 block_56: - %var_95 = phi i1 [false, %block_47], [%var_63, %block_51] - br i1 %var_95, label %block_59, label %block_60 + %var_93 = phi i1 [false, %block_47], [%var_63, %block_51] + br i1 %var_93, label %block_59, label %block_60 block_57: br label %block_61 block_58: @@ -304,7 +304,7 @@ block_82: call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 0 to %Result*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @3, i64 0, i64 0)) call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 1 to %Result*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @4, i64 0, i64 0)) call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 2 to %Result*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @5, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_93, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @6, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_91, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @6, i64 0, i64 0)) call void @__quantum__rt__tuple_record_output(i64 2, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @7, i64 0, i64 0)) call void @__quantum__rt__array_record_output(i64 4, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @8, i64 0, i64 0)) call void @__quantum__rt__result_record_output(%Result* inttoptr (i64 3 to %Result*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @9, i64 0, i64 0)) diff --git a/source/pip/tests-integration/resources/adaptive_ri/output/SwitchHandling.ll b/source/pip/tests-integration/resources/adaptive_ri/output/SwitchHandling.ll index be3f64cf1f..43257dc4d2 100644 --- a/source/pip/tests-integration/resources/adaptive_ri/output/SwitchHandling.ll +++ b/source/pip/tests-integration/resources/adaptive_ri/output/SwitchHandling.ll @@ -15,29 +15,29 @@ block_0: block_1: br label %block_2 block_2: - %var_16 = phi i64 [0, %block_0], [1, %block_1] - %var_7 = shl i64 %var_16, 1 + %var_15 = phi i64 [0, %block_0], [1, %block_1] + %var_7 = shl i64 %var_15, 1 %var_8 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) br i1 %var_8, label %block_3, label %block_4 block_3: %var_10 = add i64 %var_7, 1 br label %block_4 block_4: - %var_17 = phi i64 [%var_7, %block_2], [%var_10, %block_3] + %var_16 = phi i64 [%var_7, %block_2], [%var_10, %block_3] call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 1 to %Qubit*)) - %var_12 = icmp eq i64 %var_17, 0 + %var_12 = icmp eq i64 %var_16, 0 br i1 %var_12, label %block_5, label %block_6 block_5: br label %block_13 block_6: - %var_13 = icmp eq i64 %var_17, 1 + %var_13 = icmp eq i64 %var_16, 1 br i1 %var_13, label %block_7, label %block_8 block_7: call void @__quantum__qis__ry__body(double 3.141592653589793, %Qubit* inttoptr (i64 2 to %Qubit*)) br label %block_12 block_8: - %var_14 = icmp eq i64 %var_17, 2 + %var_14 = icmp eq i64 %var_16, 2 br i1 %var_14, label %block_9, label %block_10 block_9: call void @__quantum__qis__rz__body(double 3.141592653589793, %Qubit* inttoptr (i64 2 to %Qubit*)) diff --git a/source/pip/tests-integration/resources/adaptive_ri/output/ThreeQubitRepetitionCode.ll b/source/pip/tests-integration/resources/adaptive_ri/output/ThreeQubitRepetitionCode.ll index 6b979bd12f..e1feee9db4 100644 --- a/source/pip/tests-integration/resources/adaptive_ri/output/ThreeQubitRepetitionCode.ll +++ b/source/pip/tests-integration/resources/adaptive_ri/output/ThreeQubitRepetitionCode.ll @@ -30,14 +30,14 @@ block_0: call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 0 to %Result*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 1 to %Result*)) - %var_11 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 0 to %Result*)) - br i1 %var_11, label %block_1, label %block_2 + %var_10 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 0 to %Result*)) + br i1 %var_10, label %block_1, label %block_2 block_1: - %var_13 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) - br i1 %var_13, label %block_3, label %block_4 + %var_12 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) + br i1 %var_12, label %block_3, label %block_4 block_2: - %var_15 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) - br i1 %var_15, label %block_5, label %block_6 + %var_14 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 1 to %Result*)) + br i1 %var_14, label %block_5, label %block_6 block_3: call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 1 to %Qubit*)) br label %block_7 @@ -52,15 +52,15 @@ block_6: block_7: br label %block_9 block_8: - %var_87 = phi i1 [true, %block_5], [false, %block_6] + %var_81 = phi i1 [true, %block_5], [false, %block_6] br label %block_9 block_9: - %var_88 = phi i1 [true, %block_7], [%var_87, %block_8] - br i1 %var_88, label %block_10, label %block_11 + %var_82 = phi i1 [true, %block_7], [%var_81, %block_8] + br i1 %var_82, label %block_10, label %block_11 block_10: br label %block_11 block_11: - %var_89 = phi i64 [0, %block_9], [1, %block_10] + %var_83 = phi i64 [0, %block_9], [1, %block_10] call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 2 to %Qubit*)) @@ -79,14 +79,14 @@ block_11: call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 2 to %Result*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 3 to %Result*)) - %var_26 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 2 to %Result*)) - br i1 %var_26, label %block_12, label %block_13 + %var_24 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 2 to %Result*)) + br i1 %var_24, label %block_12, label %block_13 block_12: - %var_28 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 3 to %Result*)) - br i1 %var_28, label %block_14, label %block_15 + %var_26 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 3 to %Result*)) + br i1 %var_26, label %block_14, label %block_15 block_13: - %var_30 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 3 to %Result*)) - br i1 %var_30, label %block_16, label %block_17 + %var_28 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 3 to %Result*)) + br i1 %var_28, label %block_16, label %block_17 block_14: call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 1 to %Qubit*)) br label %block_18 @@ -101,16 +101,16 @@ block_17: block_18: br label %block_20 block_19: - %var_90 = phi i1 [true, %block_16], [false, %block_17] + %var_84 = phi i1 [true, %block_16], [false, %block_17] br label %block_20 block_20: - %var_91 = phi i1 [true, %block_18], [%var_90, %block_19] - br i1 %var_91, label %block_21, label %block_22 + %var_85 = phi i1 [true, %block_18], [%var_84, %block_19] + br i1 %var_85, label %block_21, label %block_22 block_21: - %var_33 = add i64 %var_89, 1 + %var_31 = add i64 %var_83, 1 br label %block_22 block_22: - %var_92 = phi i64 [%var_89, %block_20], [%var_33, %block_21] + %var_86 = phi i64 [%var_83, %block_20], [%var_31, %block_21] call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 2 to %Qubit*)) @@ -129,14 +129,14 @@ block_22: call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 4 to %Result*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 5 to %Result*)) - %var_42 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 4 to %Result*)) - br i1 %var_42, label %block_23, label %block_24 + %var_39 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 4 to %Result*)) + br i1 %var_39, label %block_23, label %block_24 block_23: - %var_44 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 5 to %Result*)) - br i1 %var_44, label %block_25, label %block_26 + %var_41 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 5 to %Result*)) + br i1 %var_41, label %block_25, label %block_26 block_24: - %var_46 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 5 to %Result*)) - br i1 %var_46, label %block_27, label %block_28 + %var_43 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 5 to %Result*)) + br i1 %var_43, label %block_27, label %block_28 block_25: call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 1 to %Qubit*)) br label %block_29 @@ -151,16 +151,16 @@ block_28: block_29: br label %block_31 block_30: - %var_93 = phi i1 [true, %block_27], [false, %block_28] + %var_87 = phi i1 [true, %block_27], [false, %block_28] br label %block_31 block_31: - %var_94 = phi i1 [true, %block_29], [%var_93, %block_30] - br i1 %var_94, label %block_32, label %block_33 + %var_88 = phi i1 [true, %block_29], [%var_87, %block_30] + br i1 %var_88, label %block_32, label %block_33 block_32: - %var_49 = add i64 %var_92, 1 + %var_46 = add i64 %var_86, 1 br label %block_33 block_33: - %var_95 = phi i64 [%var_92, %block_31], [%var_49, %block_32] + %var_89 = phi i64 [%var_86, %block_31], [%var_46, %block_32] call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 2 to %Qubit*)) @@ -179,14 +179,14 @@ block_33: call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 6 to %Result*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 7 to %Result*)) - %var_58 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 6 to %Result*)) - br i1 %var_58, label %block_34, label %block_35 + %var_54 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 6 to %Result*)) + br i1 %var_54, label %block_34, label %block_35 block_34: - %var_60 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 7 to %Result*)) - br i1 %var_60, label %block_36, label %block_37 + %var_56 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 7 to %Result*)) + br i1 %var_56, label %block_36, label %block_37 block_35: - %var_62 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 7 to %Result*)) - br i1 %var_62, label %block_38, label %block_39 + %var_58 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 7 to %Result*)) + br i1 %var_58, label %block_38, label %block_39 block_36: call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 1 to %Qubit*)) br label %block_40 @@ -201,16 +201,16 @@ block_39: block_40: br label %block_42 block_41: - %var_96 = phi i1 [true, %block_38], [false, %block_39] + %var_90 = phi i1 [true, %block_38], [false, %block_39] br label %block_42 block_42: - %var_97 = phi i1 [true, %block_40], [%var_96, %block_41] - br i1 %var_97, label %block_43, label %block_44 + %var_91 = phi i1 [true, %block_40], [%var_90, %block_41] + br i1 %var_91, label %block_43, label %block_44 block_43: - %var_65 = add i64 %var_95, 1 + %var_61 = add i64 %var_89, 1 br label %block_44 block_44: - %var_98 = phi i64 [%var_95, %block_42], [%var_65, %block_43] + %var_92 = phi i64 [%var_89, %block_42], [%var_61, %block_43] call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__rx__body(double 1.5707963267948966, %Qubit* inttoptr (i64 2 to %Qubit*)) @@ -229,14 +229,14 @@ block_44: call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 2 to %Qubit*), %Qubit* inttoptr (i64 4 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 3 to %Qubit*), %Result* inttoptr (i64 8 to %Result*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 4 to %Qubit*), %Result* inttoptr (i64 9 to %Result*)) - %var_74 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 8 to %Result*)) - br i1 %var_74, label %block_45, label %block_46 + %var_69 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 8 to %Result*)) + br i1 %var_69, label %block_45, label %block_46 block_45: - %var_76 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 9 to %Result*)) - br i1 %var_76, label %block_47, label %block_48 + %var_71 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 9 to %Result*)) + br i1 %var_71, label %block_47, label %block_48 block_46: - %var_78 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 9 to %Result*)) - br i1 %var_78, label %block_49, label %block_50 + %var_73 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 9 to %Result*)) + br i1 %var_73, label %block_49, label %block_50 block_47: call void @__quantum__qis__x__body(%Qubit* inttoptr (i64 1 to %Qubit*)) br label %block_51 @@ -251,26 +251,26 @@ block_50: block_51: br label %block_53 block_52: - %var_99 = phi i1 [true, %block_49], [false, %block_50] + %var_93 = phi i1 [true, %block_49], [false, %block_50] br label %block_53 block_53: - %var_100 = phi i1 [true, %block_51], [%var_99, %block_52] - br i1 %var_100, label %block_54, label %block_55 + %var_94 = phi i1 [true, %block_51], [%var_93, %block_52] + br i1 %var_94, label %block_54, label %block_55 block_54: - %var_81 = add i64 %var_98, 1 + %var_76 = add i64 %var_92, 1 br label %block_55 block_55: - %var_101 = phi i64 [%var_98, %block_53], [%var_81, %block_54] + %var_95 = phi i64 [%var_92, %block_53], [%var_76, %block_54] call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__qis__cx__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__h__body(%Qubit* inttoptr (i64 0 to %Qubit*)) call void @__quantum__qis__mresetz__body(%Qubit* inttoptr (i64 0 to %Qubit*), %Result* inttoptr (i64 10 to %Result*)) - %var_82 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 10 to %Result*)) + %var_77 = call i1 @__quantum__rt__read_result(%Result* inttoptr (i64 10 to %Result*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 1 to %Qubit*)) call void @__quantum__qis__reset__body(%Qubit* inttoptr (i64 2 to %Qubit*)) call void @__quantum__rt__tuple_record_output(i64 2, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @0, i64 0, i64 0)) - call void @__quantum__rt__bool_record_output(i1 %var_82, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0)) - call void @__quantum__rt__int_record_output(i64 %var_101, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @2, i64 0, i64 0)) + call void @__quantum__rt__bool_record_output(i1 %var_77, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @1, i64 0, i64 0)) + call void @__quantum__rt__int_record_output(i64 %var_95, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @2, i64 0, i64 0)) ret i64 0 } diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/ArithmeticOps.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/ArithmeticOps.ll index c9c84d5ad5..6a71213f17 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/ArithmeticOps.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/ArithmeticOps.ll @@ -3,6 +3,7 @@ @2 = internal constant [6 x i8] c"2_t1i\00" @3 = internal constant [6 x i8] c"3_t2i\00" @4 = internal constant [6 x i8] c"4_t3i\00" +@array0 = internal constant [5 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: @@ -10,120 +11,142 @@ block_0: %var_1 = alloca i64 %var_2 = alloca i64 %var_3 = alloca i64 + %var_5 = alloca i64 + %var_42 = alloca i64 call void @__quantum__rt__initialize(ptr null) store i64 0, ptr %var_0 store i64 0, ptr %var_1 store i64 10, ptr %var_2 store i64 1, ptr %var_3 - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 4 to ptr)) + store i64 0, ptr %var_5 + br label %block_1 +block_1: + %var_52 = load i64, ptr %var_5 + %var_6 = icmp slt i64 %var_52, 5 + br i1 %var_6, label %block_2, label %block_3 +block_2: + %var_102 = load i64, ptr %var_5 + %var_7 = getelementptr ptr, ptr @array0, i64 %var_102 + %var_103 = load ptr, ptr %var_7 + call void @__quantum__qis__x__body(ptr %var_103) + %var_9 = add i64 %var_102, 1 + store i64 %var_9, ptr %var_5 + br label %block_1 +block_3: call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 4 to ptr)) - %var_8 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) - br i1 %var_8, label %block_1, label %block_2 -block_1: + %var_12 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) + br i1 %var_12, label %block_4, label %block_5 +block_4: + %var_94 = load i64, ptr %var_0 + %var_14 = add i64 %var_94, 1 + store i64 %var_14, ptr %var_0 + %var_96 = load i64, ptr %var_1 + %var_15 = add i64 %var_96, 5 + store i64 %var_15, ptr %var_1 + %var_98 = load i64, ptr %var_2 + %var_16 = sub i64 %var_98, 2 + store i64 %var_16, ptr %var_2 + %var_100 = load i64, ptr %var_3 + %var_17 = mul i64 %var_100, 3 + store i64 %var_17, ptr %var_3 + br label %block_5 +block_5: + %var_18 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + br i1 %var_18, label %block_6, label %block_7 +block_6: + %var_86 = load i64, ptr %var_0 + %var_20 = add i64 %var_86, 1 + store i64 %var_20, ptr %var_0 + %var_88 = load i64, ptr %var_1 + %var_21 = add i64 %var_88, 5 + store i64 %var_21, ptr %var_1 + %var_90 = load i64, ptr %var_2 + %var_22 = sub i64 %var_90, 2 + store i64 %var_22, ptr %var_2 + %var_92 = load i64, ptr %var_3 + %var_23 = mul i64 %var_92, 3 + store i64 %var_23, ptr %var_3 + br label %block_7 +block_7: + %var_24 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) + br i1 %var_24, label %block_8, label %block_9 +block_8: %var_78 = load i64, ptr %var_0 - %var_10 = add i64 %var_78, 1 - store i64 %var_10, ptr %var_0 + %var_26 = add i64 %var_78, 1 + store i64 %var_26, ptr %var_0 %var_80 = load i64, ptr %var_1 - %var_11 = add i64 %var_80, 5 - store i64 %var_11, ptr %var_1 + %var_27 = add i64 %var_80, 5 + store i64 %var_27, ptr %var_1 %var_82 = load i64, ptr %var_2 - %var_12 = sub i64 %var_82, 2 - store i64 %var_12, ptr %var_2 + %var_28 = sub i64 %var_82, 2 + store i64 %var_28, ptr %var_2 %var_84 = load i64, ptr %var_3 - %var_13 = mul i64 %var_84, 3 - store i64 %var_13, ptr %var_3 - br label %block_2 -block_2: - %var_14 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - br i1 %var_14, label %block_3, label %block_4 -block_3: + %var_29 = mul i64 %var_84, 3 + store i64 %var_29, ptr %var_3 + br label %block_9 +block_9: + %var_30 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) + br i1 %var_30, label %block_10, label %block_11 +block_10: %var_70 = load i64, ptr %var_0 - %var_16 = add i64 %var_70, 1 - store i64 %var_16, ptr %var_0 + %var_32 = add i64 %var_70, 1 + store i64 %var_32, ptr %var_0 %var_72 = load i64, ptr %var_1 - %var_17 = add i64 %var_72, 5 - store i64 %var_17, ptr %var_1 + %var_33 = add i64 %var_72, 5 + store i64 %var_33, ptr %var_1 %var_74 = load i64, ptr %var_2 - %var_18 = sub i64 %var_74, 2 - store i64 %var_18, ptr %var_2 + %var_34 = sub i64 %var_74, 2 + store i64 %var_34, ptr %var_2 %var_76 = load i64, ptr %var_3 - %var_19 = mul i64 %var_76, 3 - store i64 %var_19, ptr %var_3 - br label %block_4 -block_4: - %var_20 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) - br i1 %var_20, label %block_5, label %block_6 -block_5: + %var_35 = mul i64 %var_76, 3 + store i64 %var_35, ptr %var_3 + br label %block_11 +block_11: + %var_36 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) + br i1 %var_36, label %block_12, label %block_13 +block_12: %var_62 = load i64, ptr %var_0 - %var_22 = add i64 %var_62, 1 - store i64 %var_22, ptr %var_0 + %var_38 = add i64 %var_62, 1 + store i64 %var_38, ptr %var_0 %var_64 = load i64, ptr %var_1 - %var_23 = add i64 %var_64, 5 - store i64 %var_23, ptr %var_1 + %var_39 = add i64 %var_64, 5 + store i64 %var_39, ptr %var_1 %var_66 = load i64, ptr %var_2 - %var_24 = sub i64 %var_66, 2 - store i64 %var_24, ptr %var_2 + %var_40 = sub i64 %var_66, 2 + store i64 %var_40, ptr %var_2 %var_68 = load i64, ptr %var_3 - %var_25 = mul i64 %var_68, 3 - store i64 %var_25, ptr %var_3 - br label %block_6 -block_6: - %var_26 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) - br i1 %var_26, label %block_7, label %block_8 -block_7: - %var_54 = load i64, ptr %var_0 - %var_28 = add i64 %var_54, 1 - store i64 %var_28, ptr %var_0 - %var_56 = load i64, ptr %var_1 - %var_29 = add i64 %var_56, 5 - store i64 %var_29, ptr %var_1 - %var_58 = load i64, ptr %var_2 - %var_30 = sub i64 %var_58, 2 - store i64 %var_30, ptr %var_2 - %var_60 = load i64, ptr %var_3 - %var_31 = mul i64 %var_60, 3 - store i64 %var_31, ptr %var_3 - br label %block_8 -block_8: - %var_32 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - br i1 %var_32, label %block_9, label %block_10 -block_9: - %var_46 = load i64, ptr %var_0 - %var_34 = add i64 %var_46, 1 - store i64 %var_34, ptr %var_0 - %var_48 = load i64, ptr %var_1 - %var_35 = add i64 %var_48, 5 - store i64 %var_35, ptr %var_1 - %var_50 = load i64, ptr %var_2 - %var_36 = sub i64 %var_50, 2 - store i64 %var_36, ptr %var_2 - %var_52 = load i64, ptr %var_3 - %var_37 = mul i64 %var_52, 3 - store i64 %var_37, ptr %var_3 - br label %block_10 -block_10: - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) + %var_41 = mul i64 %var_68, 3 + store i64 %var_41, ptr %var_3 + br label %block_13 +block_13: + store i64 0, ptr %var_42 + br label %block_14 +block_14: + %var_54 = load i64, ptr %var_42 + %var_43 = icmp slt i64 %var_54, 5 + br i1 %var_43, label %block_15, label %block_16 +block_15: + %var_59 = load i64, ptr %var_42 + %var_44 = getelementptr ptr, ptr @array0, i64 %var_59 + %var_60 = load ptr, ptr %var_44 + call void @__quantum__qis__reset__body(ptr %var_60) + %var_46 = add i64 %var_59, 1 + store i64 %var_46, ptr %var_42 + br label %block_14 +block_16: call void @__quantum__rt__tuple_record_output(i64 4, ptr @0) - %var_42 = load i64, ptr %var_0 - call void @__quantum__rt__int_record_output(i64 %var_42, ptr @1) - %var_43 = load i64, ptr %var_1 - call void @__quantum__rt__int_record_output(i64 %var_43, ptr @2) - %var_44 = load i64, ptr %var_2 - call void @__quantum__rt__int_record_output(i64 %var_44, ptr @3) - %var_45 = load i64, ptr %var_3 - call void @__quantum__rt__int_record_output(i64 %var_45, ptr @4) + %var_55 = load i64, ptr %var_0 + call void @__quantum__rt__int_record_output(i64 %var_55, ptr @1) + %var_56 = load i64, ptr %var_1 + call void @__quantum__rt__int_record_output(i64 %var_56, ptr @2) + %var_57 = load i64, ptr %var_2 + call void @__quantum__rt__int_record_output(i64 %var_57, ptr @3) + %var_58 = load i64, ptr %var_3 + call void @__quantum__rt__int_record_output(i64 %var_58, ptr @4) ret i64 0 } diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/ConstantFolding.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/ConstantFolding.ll index 0f7edbef37..a46b46a957 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/ConstantFolding.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/ConstantFolding.ll @@ -3,43 +3,88 @@ @2 = internal constant [6 x i8] c"2_a1r\00" @3 = internal constant [6 x i8] c"3_a2r\00" @4 = internal constant [6 x i8] c"4_a3r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array1 = internal constant [3 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array2 = internal constant [1 x ptr] [ptr inttoptr (i64 3 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: %var_1 = alloca i64 %var_3 = alloca i1 + %var_4 = alloca i64 + %var_13 = alloca i64 + %var_18 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) store i64 1, ptr %var_1 br label %block_1 block_1: - %var_7 = load i64, ptr %var_1 - %var_2 = icmp sle i64 %var_7, 9 + %var_24 = load i64, ptr %var_1 + %var_2 = icmp sle i64 %var_24, 9 store i1 true, ptr %var_3 br i1 %var_2, label %block_2, label %block_3 block_2: - %var_10 = load i1, ptr %var_3 - br i1 %var_10, label %block_4, label %block_5 + %var_27 = load i1, ptr %var_3 + br i1 %var_27, label %block_4, label %block_5 block_3: store i1 false, ptr %var_3 br label %block_2 block_4: - call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 2 to ptr)) - %var_11 = load i64, ptr %var_1 - %var_5 = add i64 %var_11, 1 - store i64 %var_5, ptr %var_1 - br label %block_1 + store i64 0, ptr %var_4 + br label %block_6 block_5: call void @__quantum__qis__rx__body(double 3.141592653589793, ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_13 + br label %block_7 +block_6: + %var_39 = load i64, ptr %var_4 + %var_5 = icmp slt i64 %var_39, 2 + br i1 %var_5, label %block_8, label %block_9 +block_7: + %var_29 = load i64, ptr %var_13 + %var_14 = icmp slt i64 %var_29, 3 + br i1 %var_14, label %block_10, label %block_11 +block_8: + %var_42 = load i64, ptr %var_4 + %var_6 = getelementptr ptr, ptr @array0, i64 %var_42 + %var_43 = load ptr, ptr %var_6 + call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr %var_43) + %var_8 = add i64 %var_42, 1 + store i64 %var_8, ptr %var_4 + br label %block_6 +block_9: + %var_40 = load i64, ptr %var_1 + %var_9 = add i64 %var_40, 1 + store i64 %var_9, ptr %var_1 + br label %block_1 +block_10: + %var_35 = load i64, ptr %var_13 + %var_15 = getelementptr ptr, ptr @array1, i64 %var_35 + %var_36 = load ptr, ptr %var_15 + call void @__quantum__qis__reset__body(ptr %var_36) + %var_17 = add i64 %var_35, 1 + store i64 %var_17, ptr %var_13 + br label %block_7 +block_11: + store i64 0, ptr %var_18 + br label %block_12 +block_12: + %var_31 = load i64, ptr %var_18 + %var_19 = icmp slt i64 %var_31, 1 + br i1 %var_19, label %block_13, label %block_14 +block_13: + %var_32 = load i64, ptr %var_18 + %var_20 = getelementptr ptr, ptr @array2, i64 %var_32 + %var_33 = load ptr, ptr %var_20 + call void @__quantum__qis__reset__body(ptr %var_33) + %var_22 = add i64 %var_32, 1 + store i64 %var_22, ptr %var_18 + br label %block_12 +block_14: call void @__quantum__rt__array_record_output(i64 4, ptr @0) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @1) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 1 to ptr), ptr @2) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/DeutschJozsaNISQ.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/DeutschJozsaNISQ.ll index 9e66d28f7e..be3fa73dc3 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/DeutschJozsaNISQ.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/DeutschJozsaNISQ.ll @@ -9,49 +9,122 @@ @8 = internal constant [8 x i8] c"8_t1a1r\00" @9 = internal constant [8 x i8] c"9_t1a2r\00" @10 = internal constant [9 x i8] c"10_t1a3r\00" +@array0 = internal constant [4 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_1 = alloca i64 + %var_6 = alloca i64 + %var_12 = alloca i64 + %var_18 = alloca i64 + %var_23 = alloca i64 + %var_29 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__x__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_1 + br label %block_1 +block_1: + %var_35 = load i64, ptr %var_1 + %var_2 = icmp slt i64 %var_35, 4 + br i1 %var_2, label %block_2, label %block_3 +block_2: + %var_61 = load i64, ptr %var_1 + %var_3 = getelementptr ptr, ptr @array0, i64 %var_61 + %var_62 = load ptr, ptr %var_3 + call void @__quantum__qis__h__body(ptr %var_62) + %var_5 = add i64 %var_61, 1 + store i64 %var_5, ptr %var_1 + br label %block_1 +block_3: call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) + store i64 3, ptr %var_6 + br label %block_4 +block_4: + %var_37 = load i64, ptr %var_6 + %var_7 = icmp sge i64 %var_37, 0 + br i1 %var_7, label %block_5, label %block_6 +block_5: + %var_58 = load i64, ptr %var_6 + %var_8 = getelementptr ptr, ptr @array0, i64 %var_58 + %var_59 = load ptr, ptr %var_8 + call void @__quantum__qis__h__body(ptr %var_59) + %var_10 = add i64 %var_58, -1 + store i64 %var_10, ptr %var_6 + br label %block_4 +block_6: call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_12 + br label %block_7 +block_7: + %var_39 = load i64, ptr %var_12 + %var_13 = icmp slt i64 %var_39, 4 + br i1 %var_13, label %block_8, label %block_9 +block_8: + %var_55 = load i64, ptr %var_12 + %var_14 = getelementptr ptr, ptr @array0, i64 %var_55 + %var_56 = load ptr, ptr %var_14 + call void @__quantum__qis__reset__body(ptr %var_56) + %var_16 = add i64 %var_55, 1 + store i64 %var_16, ptr %var_12 + br label %block_7 +block_9: call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__x__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_18 + br label %block_10 +block_10: + %var_41 = load i64, ptr %var_18 + %var_19 = icmp slt i64 %var_41, 4 + br i1 %var_19, label %block_11, label %block_12 +block_11: + %var_52 = load i64, ptr %var_18 + %var_20 = getelementptr ptr, ptr @array0, i64 %var_52 + %var_53 = load ptr, ptr %var_20 + call void @__quantum__qis__h__body(ptr %var_53) + %var_22 = add i64 %var_52, 1 + store i64 %var_22, ptr %var_18 + br label %block_10 +block_12: call void @__quantum__qis__x__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) + store i64 3, ptr %var_23 + br label %block_13 +block_13: + %var_43 = load i64, ptr %var_23 + %var_24 = icmp sge i64 %var_43, 0 + br i1 %var_24, label %block_14, label %block_15 +block_14: + %var_49 = load i64, ptr %var_23 + %var_25 = getelementptr ptr, ptr @array0, i64 %var_49 + %var_50 = load ptr, ptr %var_25 + call void @__quantum__qis__h__body(ptr %var_50) + %var_27 = add i64 %var_49, -1 + store i64 %var_27, ptr %var_23 + br label %block_13 +block_15: call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 6 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_29 + br label %block_16 +block_16: + %var_45 = load i64, ptr %var_29 + %var_30 = icmp slt i64 %var_45, 4 + br i1 %var_30, label %block_17, label %block_18 +block_17: + %var_46 = load i64, ptr %var_29 + %var_31 = getelementptr ptr, ptr @array0, i64 %var_46 + %var_47 = load ptr, ptr %var_31 + call void @__quantum__qis__reset__body(ptr %var_47) + %var_33 = add i64 %var_46, 1 + store i64 %var_33, ptr %var_29 + br label %block_16 +block_18: call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) call void @__quantum__rt__array_record_output(i64 4, ptr @1) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/Functors.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/Functors.ll index 42f5728042..af64c6bba1 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/Functors.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/Functors.ll @@ -8,9 +8,21 @@ @7 = internal constant [6 x i8] c"7_t2a\00" @8 = internal constant [8 x i8] c"8_t2a0r\00" @9 = internal constant [8 x i8] c"9_t2a1r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)] +@array1 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] +@array2 = internal constant [2 x ptr] [ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)] +@array3 = internal constant [2 x ptr] [ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 7 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_3 = alloca i64 + %var_8 = alloca i64 + %var_14 = alloca i64 + %var_19 = alloca i64 + %var_27 = alloca i64 + %var_32 = alloca i64 + %var_37 = alloca i64 + %var_42 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) @@ -18,8 +30,21 @@ block_0: call void @__quantum__qis__z__body(ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_3 + br label %block_1 +block_1: + %var_48 = load i64, ptr %var_3 + %var_4 = icmp slt i64 %var_48, 2 + br i1 %var_4, label %block_2, label %block_3 +block_2: + %var_84 = load i64, ptr %var_3 + %var_5 = getelementptr ptr, ptr @array0, i64 %var_84 + %var_85 = load ptr, ptr %var_5 + call void @__quantum__qis__x__body(ptr %var_85) + %var_7 = add i64 %var_84, 1 + store i64 %var_7, ptr %var_3 + br label %block_1 +block_3: call void @__quantum__qis__ccx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__s__body(ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) @@ -31,10 +56,36 @@ block_0: call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__ccx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) + store i64 1, ptr %var_8 + br label %block_4 +block_4: + %var_50 = load i64, ptr %var_8 + %var_9 = icmp sge i64 %var_50, 0 + br i1 %var_9, label %block_5, label %block_6 +block_5: + %var_81 = load i64, ptr %var_8 + %var_10 = getelementptr ptr, ptr @array0, i64 %var_81 + %var_82 = load ptr, ptr %var_10 + call void @__quantum__qis__x__body(ptr %var_82) + %var_12 = add i64 %var_81, -1 + store i64 %var_12, ptr %var_8 + br label %block_4 +block_6: + store i64 0, ptr %var_14 + br label %block_7 +block_7: + %var_52 = load i64, ptr %var_14 + %var_15 = icmp slt i64 %var_52, 2 + br i1 %var_15, label %block_8, label %block_9 +block_8: + %var_78 = load i64, ptr %var_14 + %var_16 = getelementptr ptr, ptr @array0, i64 %var_78 + %var_79 = load ptr, ptr %var_16 + call void @__quantum__qis__x__body(ptr %var_79) + %var_18 = add i64 %var_78, 1 + store i64 %var_18, ptr %var_14 + br label %block_7 +block_9: call void @__quantum__qis__ccx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 6 to ptr)) call void @__quantum__qis__s__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 7 to ptr)) @@ -57,22 +108,87 @@ block_0: call void @__quantum__qis__h__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__s__adj(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__ccx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 6 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) + store i64 1, ptr %var_19 + br label %block_10 +block_10: + %var_54 = load i64, ptr %var_19 + %var_20 = icmp sge i64 %var_54, 0 + br i1 %var_20, label %block_11, label %block_12 +block_11: + %var_75 = load i64, ptr %var_19 + %var_21 = getelementptr ptr, ptr @array0, i64 %var_75 + %var_76 = load ptr, ptr %var_21 + call void @__quantum__qis__x__body(ptr %var_76) + %var_23 = add i64 %var_75, -1 + store i64 %var_23, ptr %var_19 + br label %block_10 +block_12: call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 6 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 7 to ptr)) + store i64 0, ptr %var_27 + br label %block_13 +block_13: + %var_56 = load i64, ptr %var_27 + %var_28 = icmp slt i64 %var_56, 2 + br i1 %var_28, label %block_14, label %block_15 +block_14: + %var_72 = load i64, ptr %var_27 + %var_29 = getelementptr ptr, ptr @array0, i64 %var_72 + %var_73 = load ptr, ptr %var_29 + call void @__quantum__qis__reset__body(ptr %var_73) + %var_31 = add i64 %var_72, 1 + store i64 %var_31, ptr %var_27 + br label %block_13 +block_15: + store i64 0, ptr %var_32 + br label %block_16 +block_16: + %var_58 = load i64, ptr %var_32 + %var_33 = icmp slt i64 %var_58, 2 + br i1 %var_33, label %block_17, label %block_18 +block_17: + %var_69 = load i64, ptr %var_32 + %var_34 = getelementptr ptr, ptr @array1, i64 %var_69 + %var_70 = load ptr, ptr %var_34 + call void @__quantum__qis__reset__body(ptr %var_70) + %var_36 = add i64 %var_69, 1 + store i64 %var_36, ptr %var_32 + br label %block_16 +block_18: + store i64 0, ptr %var_37 + br label %block_19 +block_19: + %var_60 = load i64, ptr %var_37 + %var_38 = icmp slt i64 %var_60, 2 + br i1 %var_38, label %block_20, label %block_21 +block_20: + %var_66 = load i64, ptr %var_37 + %var_39 = getelementptr ptr, ptr @array2, i64 %var_66 + %var_67 = load ptr, ptr %var_39 + call void @__quantum__qis__reset__body(ptr %var_67) + %var_41 = add i64 %var_66, 1 + store i64 %var_41, ptr %var_37 + br label %block_19 +block_21: + store i64 0, ptr %var_42 + br label %block_22 +block_22: + %var_62 = load i64, ptr %var_42 + %var_43 = icmp slt i64 %var_62, 2 + br i1 %var_43, label %block_23, label %block_24 +block_23: + %var_63 = load i64, ptr %var_42 + %var_44 = getelementptr ptr, ptr @array3, i64 %var_63 + %var_64 = load ptr, ptr %var_44 + call void @__quantum__qis__reset__body(ptr %var_64) + %var_46 = add i64 %var_63, 1 + store i64 %var_46, ptr %var_42 + br label %block_22 +block_24: call void @__quantum__rt__tuple_record_output(i64 3, ptr @0) call void @__quantum__rt__array_record_output(i64 2, ptr @1) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @2) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/HiddenShiftNISQ.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/HiddenShiftNISQ.ll index 004d20bc58..0d65fb3bc8 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/HiddenShiftNISQ.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/HiddenShiftNISQ.ll @@ -5,9 +5,22 @@ @4 = internal constant [6 x i8] c"4_a3r\00" @5 = internal constant [6 x i8] c"5_a4r\00" @6 = internal constant [6 x i8] c"6_a5r\00" +@array0 = internal constant [6 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)] +@array1 = internal constant [3 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array2 = internal constant [3 x ptr] [ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_2 = alloca i64 + %var_3 = alloca i64 + %var_6 = alloca ptr + %var_12 = alloca i64 + %var_14 = alloca i1 + %var_18 = alloca i64 + %var_19 = alloca i64 + %var_22 = alloca ptr + %var_29 = alloca i64 + %var_31 = alloca i1 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) @@ -15,22 +28,122 @@ block_0: call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 5 to ptr)) + store i64 33, ptr %var_2 + store i64 0, ptr %var_3 + br label %block_1 +block_1: + %var_37 = load i64, ptr %var_3 + %var_4 = icmp slt i64 %var_37, 6 + br i1 %var_4, label %block_2, label %block_3 +block_2: + %var_70 = load i64, ptr %var_3 + %var_5 = getelementptr ptr, ptr @array0, i64 %var_70 + %var_71 = load ptr, ptr %var_5 + store ptr %var_71, ptr %var_6 + %var_73 = load i64, ptr %var_2 + %var_7 = and i64 %var_73, 1 + %var_8 = icmp ne i64 %var_7, 0 + br i1 %var_8, label %block_4, label %block_6 +block_3: + %var_38 = load i64, ptr %var_2 + %var_11 = icmp eq i64 %var_38, 0 + store i64 0, ptr %var_12 + br label %block_5 +block_4: + %var_78 = load ptr, ptr %var_6 + call void @__quantum__qis__x__body(ptr %var_78) + br label %block_6 +block_5: + %var_40 = load i64, ptr %var_12 + %var_13 = icmp sle i64 %var_40, 2 + store i1 true, ptr %var_14 + br i1 %var_13, label %block_7, label %block_8 +block_6: + %var_74 = load i64, ptr %var_2 + %var_9 = ashr i64 %var_74, 1 + store i64 %var_9, ptr %var_2 + %var_76 = load i64, ptr %var_3 + %var_10 = add i64 %var_76, 1 + store i64 %var_10, ptr %var_3 + br label %block_1 +block_7: + %var_43 = load i1, ptr %var_14 + br i1 %var_43, label %block_9, label %block_10 +block_8: + store i1 false, ptr %var_14 + br label %block_7 +block_9: + %var_66 = load i64, ptr %var_12 + %var_15 = getelementptr ptr, ptr @array1, i64 %var_66 + %var_67 = load ptr, ptr %var_15 + %var_16 = getelementptr ptr, ptr @array2, i64 %var_66 + %var_68 = load ptr, ptr %var_16 + call void @__quantum__qis__cz__body(ptr %var_67, ptr %var_68) + %var_17 = add i64 %var_66, 1 + store i64 %var_17, ptr %var_12 + br label %block_5 +block_10: + store i64 33, ptr %var_18 + store i64 0, ptr %var_19 + br label %block_11 +block_11: + %var_46 = load i64, ptr %var_19 + %var_20 = icmp slt i64 %var_46, 6 + br i1 %var_20, label %block_12, label %block_13 +block_12: + %var_57 = load i64, ptr %var_19 + %var_21 = getelementptr ptr, ptr @array0, i64 %var_57 + %var_58 = load ptr, ptr %var_21 + store ptr %var_58, ptr %var_22 + %var_60 = load i64, ptr %var_18 + %var_23 = and i64 %var_60, 1 + %var_24 = icmp ne i64 %var_23, 0 + br i1 %var_24, label %block_14, label %block_16 +block_13: + %var_47 = load i64, ptr %var_18 + %var_27 = icmp eq i64 %var_47, 0 call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__cz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 5 to ptr)) + store i64 0, ptr %var_29 + br label %block_15 +block_14: + %var_65 = load ptr, ptr %var_22 + call void @__quantum__qis__x__body(ptr %var_65) + br label %block_16 +block_15: + %var_49 = load i64, ptr %var_29 + %var_30 = icmp sle i64 %var_49, 2 + store i1 true, ptr %var_31 + br i1 %var_30, label %block_17, label %block_18 +block_16: + %var_61 = load i64, ptr %var_18 + %var_25 = ashr i64 %var_61, 1 + store i64 %var_25, ptr %var_18 + %var_63 = load i64, ptr %var_19 + %var_26 = add i64 %var_63, 1 + store i64 %var_26, ptr %var_19 + br label %block_11 +block_17: + %var_52 = load i1, ptr %var_31 + br i1 %var_52, label %block_19, label %block_20 +block_18: + store i1 false, ptr %var_31 + br label %block_17 +block_19: + %var_53 = load i64, ptr %var_29 + %var_32 = getelementptr ptr, ptr @array1, i64 %var_53 + %var_54 = load ptr, ptr %var_32 + %var_33 = getelementptr ptr, ptr @array2, i64 %var_53 + %var_55 = load ptr, ptr %var_33 + call void @__quantum__qis__cz__body(ptr %var_54, ptr %var_55) + %var_34 = add i64 %var_53, 1 + store i64 %var_34, ptr %var_29 + br label %block_15 +block_20: call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 3 to ptr)) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCCNOT.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCCNOT.ll index c3cbb3657c..d3ef8a95b0 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCCNOT.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCCNOT.ll @@ -11,34 +11,76 @@ @10 = internal constant [9 x i8] c"10_t2a0r\00" @11 = internal constant [9 x i8] c"11_t2a1r\00" @12 = internal constant [9 x i8] c"12_t2a2r\00" +@array0 = internal constant [3 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array1 = internal constant [3 x ptr] [ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)] +@array2 = internal constant [3 x ptr] [ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 8 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_2 = alloca i64 + %var_9 = alloca i64 + %var_16 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__ccx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) + store i64 0, ptr %var_2 + br label %block_1 +block_1: + %var_22 = load i64, ptr %var_2 + %var_3 = icmp slt i64 %var_22, 3 + br i1 %var_3, label %block_2, label %block_3 +block_2: + %var_33 = load i64, ptr %var_2 + %var_4 = getelementptr ptr, ptr @array0, i64 %var_33 + %var_34 = load ptr, ptr %var_4 + call void @__quantum__qis__reset__body(ptr %var_34) + %var_6 = add i64 %var_33, 1 + store i64 %var_6, ptr %var_2 + br label %block_1 +block_3: call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__ccx__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 5 to ptr)) + store i64 0, ptr %var_9 + br label %block_4 +block_4: + %var_24 = load i64, ptr %var_9 + %var_10 = icmp slt i64 %var_24, 3 + br i1 %var_10, label %block_5, label %block_6 +block_5: + %var_30 = load i64, ptr %var_9 + %var_11 = getelementptr ptr, ptr @array1, i64 %var_30 + %var_31 = load ptr, ptr %var_11 + call void @__quantum__qis__reset__body(ptr %var_31) + %var_13 = add i64 %var_30, 1 + store i64 %var_13, ptr %var_9 + br label %block_4 +block_6: call void @__quantum__qis__x__body(ptr inttoptr (i64 6 to ptr)) call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__ccx__body(ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 8 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 6 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 8 to ptr), ptr inttoptr (i64 8 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 6 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 8 to ptr)) + store i64 0, ptr %var_16 + br label %block_7 +block_7: + %var_26 = load i64, ptr %var_16 + %var_17 = icmp slt i64 %var_26, 3 + br i1 %var_17, label %block_8, label %block_9 +block_8: + %var_27 = load i64, ptr %var_16 + %var_18 = getelementptr ptr, ptr @array2, i64 %var_27 + %var_28 = load ptr, ptr %var_18 + call void @__quantum__qis__reset__body(ptr %var_28) + %var_20 = add i64 %var_27, 1 + store i64 %var_20, ptr %var_16 + br label %block_7 +block_9: call void @__quantum__rt__tuple_record_output(i64 3, ptr @0) call void @__quantum__rt__array_record_output(i64 3, ptr @1) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @2) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCNOT.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCNOT.ll index 286d489abe..cdf1204b0a 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCNOT.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicCNOT.ll @@ -5,21 +5,51 @@ @4 = internal constant [6 x i8] c"4_t1a\00" @5 = internal constant [8 x i8] c"5_t1a0r\00" @6 = internal constant [8 x i8] c"6_t1a1r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] +@array1 = internal constant [2 x ptr] [ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_2 = alloca i64 + %var_9 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) + store i64 0, ptr %var_2 + br label %block_1 +block_1: + %var_15 = load i64, ptr %var_2 + %var_3 = icmp slt i64 %var_15, 2 + br i1 %var_3, label %block_2, label %block_3 +block_2: + %var_21 = load i64, ptr %var_2 + %var_4 = getelementptr ptr, ptr @array0, i64 %var_21 + %var_22 = load ptr, ptr %var_4 + call void @__quantum__qis__reset__body(ptr %var_22) + %var_6 = add i64 %var_21, 1 + store i64 %var_6, ptr %var_2 + br label %block_1 +block_3: call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) + store i64 0, ptr %var_9 + br label %block_4 +block_4: + %var_17 = load i64, ptr %var_9 + %var_10 = icmp slt i64 %var_17, 2 + br i1 %var_10, label %block_5, label %block_6 +block_5: + %var_18 = load i64, ptr %var_9 + %var_11 = getelementptr ptr, ptr @array1, i64 %var_18 + %var_19 = load ptr, ptr %var_11 + call void @__quantum__qis__reset__body(ptr %var_19) + %var_13 = add i64 %var_18, 1 + store i64 %var_13, ptr %var_9 + br label %block_4 +block_6: call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) call void @__quantum__rt__array_record_output(i64 2, ptr @1) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @2) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicRotationsWithPeriod.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicRotationsWithPeriod.ll index c1b4f252a7..056f5a4763 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicRotationsWithPeriod.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/IntrinsicRotationsWithPeriod.ll @@ -8,47 +8,90 @@ @7 = internal constant [6 x i8] c"7_t2a\00" @8 = internal constant [8 x i8] c"8_t2a0r\00" @9 = internal constant [8 x i8] c"9_t2a1r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] +@array1 = internal constant [2 x ptr] [ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)] +@array2 = internal constant [2 x ptr] [ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: - %var_6 = alloca i64 - %var_8 = alloca i1 + %var_3 = alloca i64 + %var_8 = alloca i64 + %var_13 = alloca i64 + %var_18 = alloca i64 + %var_20 = alloca i1 call void @__quantum__rt__initialize(ptr null) - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__y__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__y__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__z__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__z__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__h__body(ptr inttoptr (i64 5 to ptr)) - store i64 1, ptr %var_6 + store i64 0, ptr %var_3 br label %block_1 block_1: - %var_11 = load i64, ptr %var_6 - %var_7 = icmp sle i64 %var_11, 8 - store i1 true, ptr %var_8 - br i1 %var_7, label %block_2, label %block_3 + %var_23 = load i64, ptr %var_3 + %var_4 = icmp slt i64 %var_23, 2 + br i1 %var_4, label %block_2, label %block_3 block_2: - %var_14 = load i1, ptr %var_8 - br i1 %var_14, label %block_4, label %block_5 + %var_41 = load i64, ptr %var_3 + %var_5 = getelementptr ptr, ptr @array0, i64 %var_41 + %var_42 = load ptr, ptr %var_5 + call void @__quantum__qis__x__body(ptr %var_42) + %var_7 = add i64 %var_41, 1 + store i64 %var_7, ptr %var_3 + br label %block_1 block_3: - store i1 false, ptr %var_8 - br label %block_2 + store i64 0, ptr %var_8 + br label %block_4 block_4: + %var_25 = load i64, ptr %var_8 + %var_9 = icmp slt i64 %var_25, 2 + br i1 %var_9, label %block_5, label %block_6 +block_5: + %var_38 = load i64, ptr %var_8 + %var_10 = getelementptr ptr, ptr @array1, i64 %var_38 + %var_39 = load ptr, ptr %var_10 + call void @__quantum__qis__y__body(ptr %var_39) + %var_12 = add i64 %var_38, 1 + store i64 %var_12, ptr %var_8 + br label %block_4 +block_6: + store i64 0, ptr %var_13 + br label %block_7 +block_7: + %var_27 = load i64, ptr %var_13 + %var_14 = icmp slt i64 %var_27, 2 + br i1 %var_14, label %block_8, label %block_9 +block_8: + %var_35 = load i64, ptr %var_13 + %var_15 = getelementptr ptr, ptr @array2, i64 %var_35 + %var_36 = load ptr, ptr %var_15 + call void @__quantum__qis__h__body(ptr %var_36) + call void @__quantum__qis__z__body(ptr %var_36) + call void @__quantum__qis__h__body(ptr %var_36) + %var_17 = add i64 %var_35, 1 + store i64 %var_17, ptr %var_13 + br label %block_7 +block_9: + store i64 1, ptr %var_18 + br label %block_10 +block_10: + %var_29 = load i64, ptr %var_18 + %var_19 = icmp sle i64 %var_29, 8 + store i1 true, ptr %var_20 + br i1 %var_19, label %block_11, label %block_12 +block_11: + %var_32 = load i1, ptr %var_20 + br i1 %var_32, label %block_13, label %block_14 +block_12: + store i1 false, ptr %var_20 + br label %block_11 +block_13: call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__ry__body(double 1.5707963267948966, ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__ry__body(double 1.5707963267948966, ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__rz__body(double 1.5707963267948966, ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__rz__body(double 1.5707963267948966, ptr inttoptr (i64 5 to ptr)) - %var_15 = load i64, ptr %var_6 - %var_9 = add i64 %var_15, 1 - store i64 %var_9, ptr %var_6 - br label %block_1 -block_5: + %var_33 = load i64, ptr %var_18 + %var_21 = add i64 %var_33, 1 + store i64 %var_21, ptr %var_18 + br label %block_10 +block_14: call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/NestedBranching.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/NestedBranching.ll index 6127a52e2d..258fbe6ea0 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/NestedBranching.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/NestedBranching.ll @@ -12,6 +12,8 @@ @11 = internal constant [11 x i8] c"11_t1t0a2r\00" @12 = internal constant [11 x i8] c"12_t1t0a3r\00" @13 = internal constant [9 x i8] c"13_t1t1b\00" +@array0 = internal constant [3 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array1 = internal constant [4 x ptr] [ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 6 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: @@ -22,8 +24,13 @@ block_0: %var_22 = alloca i1 %var_27 = alloca i1 %var_32 = alloca i1 - %var_50 = alloca i1 + %var_35 = alloca i64 + %var_41 = alloca i64 + %var_42 = alloca i64 + %var_45 = alloca ptr %var_61 = alloca i1 + %var_72 = alloca i1 + %var_87 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) @@ -55,289 +62,338 @@ block_4: store i1 %var_24, ptr %var_22 br label %block_6 block_5: - %var_100 = load i1, ptr %var_7 - br i1 %var_100, label %block_7, label %block_8 + %var_137 = load i1, ptr %var_7 + br i1 %var_137, label %block_7, label %block_8 block_6: - %var_80 = load i1, ptr %var_22 - br i1 %var_80, label %block_9, label %block_10 + %var_95 = load i1, ptr %var_22 + br i1 %var_95, label %block_9, label %block_10 block_7: store i64 0, ptr %var_2 - br label %block_31 + br label %block_11 block_8: %var_10 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) %var_11 = icmp eq i1 %var_10, false store i1 false, ptr %var_12 - br i1 %var_11, label %block_11, label %block_13 + br i1 %var_11, label %block_12, label %block_15 block_9: store i64 4, ptr %var_2 - br label %block_32 + br label %block_13 block_10: %var_25 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) %var_26 = icmp eq i1 %var_25, false store i1 false, ptr %var_27 - br i1 %var_26, label %block_12, label %block_14 + br i1 %var_26, label %block_14, label %block_17 block_11: + br label %block_16 +block_12: %var_13 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) store i1 %var_13, ptr %var_12 - br label %block_13 -block_12: - %var_28 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) - store i1 %var_28, ptr %var_27 - br label %block_14 + br label %block_15 block_13: - %var_102 = load i1, ptr %var_12 - br i1 %var_102, label %block_15, label %block_16 + br label %block_16 block_14: - %var_82 = load i1, ptr %var_27 - br i1 %var_82, label %block_17, label %block_18 + %var_28 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) + store i1 %var_28, ptr %var_27 + br label %block_17 block_15: - store i64 1, ptr %var_2 - br label %block_29 + %var_139 = load i1, ptr %var_12 + br i1 %var_139, label %block_18, label %block_19 block_16: - %var_15 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - store i1 false, ptr %var_17 - br i1 %var_15, label %block_19, label %block_21 + store i64 0, ptr %var_35 + br label %block_20 block_17: - store i64 5, ptr %var_2 - br label %block_30 + %var_97 = load i1, ptr %var_27 + br i1 %var_97, label %block_21, label %block_22 block_18: - %var_30 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - store i1 false, ptr %var_32 - br i1 %var_30, label %block_20, label %block_22 + store i64 1, ptr %var_2 + br label %block_23 block_19: - %var_18 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) - %var_19 = icmp eq i1 %var_18, false - store i1 %var_19, ptr %var_17 - br label %block_21 + %var_15 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + store i1 false, ptr %var_17 + br i1 %var_15, label %block_24, label %block_29 block_20: - %var_33 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) - %var_34 = icmp eq i1 %var_33, false - store i1 %var_34, ptr %var_32 - br label %block_22 + %var_102 = load i64, ptr %var_35 + %var_36 = icmp slt i64 %var_102, 3 + br i1 %var_36, label %block_25, label %block_26 block_21: - %var_104 = load i1, ptr %var_17 - br i1 %var_104, label %block_23, label %block_24 + store i64 5, ptr %var_2 + br label %block_27 block_22: - %var_84 = load i1, ptr %var_32 - br i1 %var_84, label %block_25, label %block_26 + %var_30 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + store i1 false, ptr %var_32 + br i1 %var_30, label %block_28, label %block_31 block_23: - store i64 2, ptr %var_2 - br label %block_27 + br label %block_11 block_24: - store i64 3, ptr %var_2 - br label %block_27 + %var_18 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) + %var_19 = icmp eq i1 %var_18, false + store i1 %var_19, ptr %var_17 + br label %block_29 block_25: - store i64 6, ptr %var_2 - br label %block_28 + %var_127 = load i64, ptr %var_35 + %var_37 = getelementptr ptr, ptr @array0, i64 %var_127 + %var_128 = load ptr, ptr %var_37 + call void @__quantum__qis__reset__body(ptr %var_128) + %var_39 = add i64 %var_127, 1 + store i64 %var_39, ptr %var_35 + br label %block_20 block_26: - store i64 7, ptr %var_2 - br label %block_28 + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + store i64 7, ptr %var_41 + store i64 0, ptr %var_42 + br label %block_30 block_27: - br label %block_29 + br label %block_13 block_28: - br label %block_30 -block_29: + %var_33 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) + %var_34 = icmp eq i1 %var_33, false + store i1 %var_34, ptr %var_32 br label %block_31 +block_29: + %var_141 = load i1, ptr %var_17 + br i1 %var_141, label %block_32, label %block_33 block_30: - br label %block_32 + %var_105 = load i64, ptr %var_42 + %var_43 = icmp slt i64 %var_105, 4 + br i1 %var_43, label %block_34, label %block_35 block_31: - br label %block_33 + %var_99 = load i1, ptr %var_32 + br i1 %var_99, label %block_36, label %block_37 block_32: - br label %block_33 + store i64 2, ptr %var_2 + br label %block_38 block_33: - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 5 to ptr)) + store i64 3, ptr %var_2 + br label %block_38 +block_34: + %var_118 = load i64, ptr %var_42 + %var_44 = getelementptr ptr, ptr @array1, i64 %var_118 + %var_119 = load ptr, ptr %var_44 + store ptr %var_119, ptr %var_45 + %var_121 = load i64, ptr %var_41 + %var_46 = and i64 %var_121, 1 + %var_47 = icmp eq i64 %var_46, 1 + br i1 %var_47, label %block_39, label %block_43 +block_35: call void @__quantum__qis__m__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 5 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 6 to ptr)) - %var_40 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) - %var_41 = icmp eq i1 %var_40, false - br i1 %var_41, label %block_34, label %block_35 -block_34: - %var_42 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - %var_43 = icmp eq i1 %var_42, false - br i1 %var_43, label %block_36, label %block_37 -block_35: - %var_48 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) - %var_49 = icmp eq i1 %var_48, false - store i1 false, ptr %var_50 - br i1 %var_49, label %block_38, label %block_43 + %var_51 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) + %var_52 = icmp eq i1 %var_51, false + br i1 %var_52, label %block_40, label %block_41 block_36: - %var_44 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_45 = icmp eq i1 %var_44, false - br i1 %var_45, label %block_39, label %block_40 + store i64 6, ptr %var_2 + br label %block_42 block_37: - %var_46 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_47 = icmp eq i1 %var_46, false - br i1 %var_47, label %block_41, label %block_42 + store i64 7, ptr %var_2 + br label %block_42 block_38: - %var_51 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - store i1 %var_51, ptr %var_50 - br label %block_43 + br label %block_23 block_39: - br label %block_44 + %var_126 = load ptr, ptr %var_45 + call void @__quantum__qis__x__body(ptr %var_126) + br label %block_43 block_40: - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - br label %block_44 -block_41: - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - br label %block_45 -block_42: - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - br label %block_45 -block_43: - %var_87 = load i1, ptr %var_50 - br i1 %var_87, label %block_46, label %block_47 -block_44: - br label %block_48 -block_45: - br label %block_48 -block_46: %var_53 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) %var_54 = icmp eq i1 %var_53, false - br i1 %var_54, label %block_49, label %block_50 -block_47: + br i1 %var_54, label %block_44, label %block_45 +block_41: %var_59 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) + %var_60 = icmp eq i1 %var_59, false store i1 false, ptr %var_61 - br i1 %var_59, label %block_51, label %block_56 -block_48: - br label %block_82 -block_49: + br i1 %var_60, label %block_46, label %block_51 +block_42: + br label %block_27 +block_43: + %var_122 = load i64, ptr %var_41 + %var_48 = ashr i64 %var_122, 1 + store i64 %var_48, ptr %var_41 + %var_124 = load i64, ptr %var_42 + %var_49 = add i64 %var_124, 1 + store i64 %var_49, ptr %var_42 + br label %block_30 +block_44: %var_55 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) %var_56 = icmp eq i1 %var_55, false - br i1 %var_56, label %block_52, label %block_53 -block_50: + br i1 %var_56, label %block_47, label %block_48 +block_45: %var_57 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) %var_58 = icmp eq i1 %var_57, false - br i1 %var_58, label %block_54, label %block_55 -block_51: + br i1 %var_58, label %block_49, label %block_50 +block_46: %var_62 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - %var_63 = icmp eq i1 %var_62, false - store i1 %var_63, ptr %var_61 - br label %block_56 -block_52: - br label %block_57 -block_53: + store i1 %var_62, ptr %var_61 + br label %block_51 +block_47: + br label %block_52 +block_48: call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - br label %block_57 -block_54: + br label %block_52 +block_49: call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - br label %block_58 -block_55: + br label %block_53 +block_50: call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - br label %block_58 + br label %block_53 +block_51: + %var_107 = load i1, ptr %var_61 + br i1 %var_107, label %block_54, label %block_55 +block_52: + br label %block_56 +block_53: + br label %block_56 +block_54: + %var_64 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) + %var_65 = icmp eq i1 %var_64, false + br i1 %var_65, label %block_57, label %block_58 +block_55: + %var_70 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) + store i1 false, ptr %var_72 + br i1 %var_70, label %block_59, label %block_65 block_56: - %var_89 = load i1, ptr %var_61 - br i1 %var_89, label %block_59, label %block_60 + br label %block_60 block_57: - br label %block_61 + %var_66 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_67 = icmp eq i1 %var_66, false + br i1 %var_67, label %block_61, label %block_62 block_58: - br label %block_61 + %var_68 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_69 = icmp eq i1 %var_68, false + br i1 %var_69, label %block_63, label %block_64 block_59: - %var_64 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - %var_65 = icmp eq i1 %var_64, false - br i1 %var_65, label %block_62, label %block_63 + %var_73 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) + %var_74 = icmp eq i1 %var_73, false + store i1 %var_74, ptr %var_72 + br label %block_65 block_60: - %var_70 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) - %var_71 = icmp eq i1 %var_70, false - br i1 %var_71, label %block_64, label %block_65 + store i64 0, ptr %var_87 + br label %block_66 block_61: - br label %block_81 + br label %block_67 block_62: - %var_66 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_67 = icmp eq i1 %var_66, false - br i1 %var_67, label %block_66, label %block_67 + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + br label %block_67 block_63: - %var_68 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_69 = icmp eq i1 %var_68, false - br i1 %var_69, label %block_68, label %block_69 + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + br label %block_68 block_64: - %var_72 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_73 = icmp eq i1 %var_72, false - br i1 %var_73, label %block_70, label %block_71 + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + br label %block_68 block_65: - %var_74 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) - %var_75 = icmp eq i1 %var_74, false - br i1 %var_75, label %block_72, label %block_73 + %var_109 = load i1, ptr %var_72 + br i1 %var_109, label %block_69, label %block_70 block_66: - br label %block_74 + %var_111 = load i64, ptr %var_87 + %var_88 = icmp slt i64 %var_111, 4 + br i1 %var_88, label %block_71, label %block_72 block_67: - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - br label %block_74 + br label %block_73 block_68: - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - br label %block_75 + br label %block_73 block_69: - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - br label %block_75 + %var_75 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) + %var_76 = icmp eq i1 %var_75, false + br i1 %var_76, label %block_74, label %block_75 block_70: - br label %block_76 + %var_81 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 4 to ptr)) + %var_82 = icmp eq i1 %var_81, false + br i1 %var_82, label %block_76, label %block_77 block_71: - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - br label %block_76 + %var_113 = load i64, ptr %var_87 + %var_89 = getelementptr ptr, ptr @array1, i64 %var_113 + %var_114 = load ptr, ptr %var_89 + call void @__quantum__qis__reset__body(ptr %var_114) + %var_91 = add i64 %var_113, 1 + store i64 %var_91, ptr %var_87 + br label %block_66 block_72: - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) - br label %block_77 -block_73: - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) - br label %block_77 -block_74: - br label %block_78 -block_75: - br label %block_78 -block_76: - br label %block_79 -block_77: - br label %block_79 -block_78: - br label %block_80 -block_79: - br label %block_80 -block_80: - br label %block_81 -block_81: - br label %block_82 -block_82: - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 6 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 7 to ptr)) - %var_77 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 7 to ptr)) + %var_92 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 7 to ptr)) call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) call void @__quantum__rt__tuple_record_output(i64 2, ptr @1) call void @__quantum__rt__array_record_output(i64 3, ptr @2) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @3) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 1 to ptr), ptr @4) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 2 to ptr), ptr @5) - %var_90 = load i64, ptr %var_2 - call void @__quantum__rt__int_record_output(i64 %var_90, ptr @6) + %var_112 = load i64, ptr %var_2 + call void @__quantum__rt__int_record_output(i64 %var_112, ptr @6) call void @__quantum__rt__tuple_record_output(i64 2, ptr @7) call void @__quantum__rt__array_record_output(i64 4, ptr @8) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 3 to ptr), ptr @9) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 4 to ptr), ptr @10) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 5 to ptr), ptr @11) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 6 to ptr), ptr @12) - call void @__quantum__rt__bool_record_output(i1 %var_77, ptr @13) + call void @__quantum__rt__bool_record_output(i1 %var_92, ptr @13) ret i64 0 +block_73: + br label %block_78 +block_74: + %var_77 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_78 = icmp eq i1 %var_77, false + br i1 %var_78, label %block_79, label %block_80 +block_75: + %var_79 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_80 = icmp eq i1 %var_79, false + br i1 %var_80, label %block_81, label %block_82 +block_76: + %var_83 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_84 = icmp eq i1 %var_83, false + br i1 %var_84, label %block_83, label %block_84 +block_77: + %var_85 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 5 to ptr)) + %var_86 = icmp eq i1 %var_85, false + br i1 %var_86, label %block_85, label %block_86 +block_78: + br label %block_60 +block_79: + br label %block_87 +block_80: + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + br label %block_87 +block_81: + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + br label %block_88 +block_82: + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + br label %block_88 +block_83: + br label %block_89 +block_84: + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) + br label %block_89 +block_85: + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__y__body(ptr inttoptr (i64 7 to ptr)) + br label %block_90 +block_86: + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + call void @__quantum__qis__z__body(ptr inttoptr (i64 7 to ptr)) + br label %block_90 +block_87: + br label %block_91 +block_88: + br label %block_91 +block_89: + br label %block_92 +block_90: + br label %block_92 +block_91: + br label %block_93 +block_92: + br label %block_93 +block_93: + br label %block_78 } declare void @__quantum__rt__initialize(ptr) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/RUS.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/RUS.ll index ec5b579896..4ea4a01861 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/RUS.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/RUS.ll @@ -1,16 +1,18 @@ @0 = internal constant [4 x i8] c"0_a\00" @1 = internal constant [6 x i8] c"1_a0r\00" @2 = internal constant [6 x i8] c"2_a1r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: %var_1 = alloca i1 + %var_6 = alloca i64 call void @__quantum__rt__initialize(ptr null) store i1 true, ptr %var_1 br label %block_1 block_1: - %var_7 = load i1, ptr %var_1 - br i1 %var_7, label %block_2, label %block_3 + %var_12 = load i1, ptr %var_1 + br i1 %var_12, label %block_2, label %block_3 block_2: call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) @@ -20,8 +22,8 @@ block_2: %var_4 = icmp eq i1 %var_3, false %var_5 = xor i1 %var_4, true store i1 %var_5, ptr %var_1 - %var_9 = load i1, ptr %var_1 - br i1 %var_9, label %block_4, label %block_5 + %var_14 = load i1, ptr %var_1 + br i1 %var_14, label %block_4, label %block_5 block_3: call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)) @@ -30,11 +32,24 @@ block_3: call void @__quantum__rt__result_record_output(ptr inttoptr (i64 2 to ptr), ptr @2) ret i64 0 block_4: - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - br label %block_5 + store i64 0, ptr %var_6 + br label %block_6 block_5: br label %block_1 +block_6: + %var_16 = load i64, ptr %var_6 + %var_7 = icmp slt i64 %var_16, 2 + br i1 %var_7, label %block_7, label %block_8 +block_7: + %var_17 = load i64, ptr %var_6 + %var_8 = getelementptr ptr, ptr @array0, i64 %var_17 + %var_18 = load ptr, ptr %var_8 + call void @__quantum__qis__reset__body(ptr %var_18) + %var_10 = add i64 %var_17, 1 + store i64 %var_10, ptr %var_6 + br label %block_6 +block_8: + br label %block_5 } declare void @__quantum__rt__initialize(ptr) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/SampleTeleport.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/SampleTeleport.ll index 4a07c88276..6e2d097f01 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/SampleTeleport.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/SampleTeleport.ll @@ -1,7 +1,9 @@ @0 = internal constant [4 x i8] c"0_r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_5 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) @@ -26,8 +28,21 @@ block_4: call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) + store i64 0, ptr %var_5 + br label %block_5 +block_5: + %var_11 = load i64, ptr %var_5 + %var_6 = icmp slt i64 %var_11, 2 + br i1 %var_6, label %block_6, label %block_7 +block_6: + %var_12 = load i64, ptr %var_5 + %var_7 = getelementptr ptr, ptr @array0, i64 %var_12 + %var_13 = load ptr, ptr %var_7 + call void @__quantum__qis__reset__body(ptr %var_13) + %var_9 = add i64 %var_12, 1 + store i64 %var_9, ptr %var_5 + br label %block_5 +block_7: call void @__quantum__rt__result_record_output(ptr inttoptr (i64 2 to ptr), ptr @0) ret i64 0 } diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/Slicing.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/Slicing.ll index a5aa49581d..022f211fb9 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/Slicing.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/Slicing.ll @@ -4,30 +4,48 @@ @3 = internal constant [6 x i8] c"3_a2r\00" @4 = internal constant [6 x i8] c"4_a3r\00" @5 = internal constant [6 x i8] c"5_a4r\00" +@array0 = internal constant [10 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 8 to ptr), ptr inttoptr (i64 9 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_1 = alloca i64 + %var_6 = alloca i64 call void @__quantum__rt__initialize(ptr null) - call void @__quantum__qis__x__body(ptr inttoptr (i64 9 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 8 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 6 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 5 to ptr)) + store i64 9, ptr %var_1 + br label %block_1 +block_1: + %var_12 = load i64, ptr %var_1 + %var_2 = icmp sge i64 %var_12, 5 + br i1 %var_2, label %block_2, label %block_3 +block_2: + %var_18 = load i64, ptr %var_1 + %var_3 = getelementptr ptr, ptr @array0, i64 %var_18 + %var_19 = load ptr, ptr %var_3 + call void @__quantum__qis__x__body(ptr %var_19) + %var_4 = add i64 %var_18, -1 + store i64 %var_4, ptr %var_1 + br label %block_1 +block_3: call void @__quantum__qis__m__body(ptr inttoptr (i64 5 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 6 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 7 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 8 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 9 to ptr), ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 4 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 5 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 6 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 7 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 8 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 9 to ptr)) + store i64 0, ptr %var_6 + br label %block_4 +block_4: + %var_14 = load i64, ptr %var_6 + %var_7 = icmp slt i64 %var_14, 10 + br i1 %var_7, label %block_5, label %block_6 +block_5: + %var_15 = load i64, ptr %var_6 + %var_8 = getelementptr ptr, ptr @array0, i64 %var_15 + %var_16 = load ptr, ptr %var_8 + call void @__quantum__qis__reset__body(ptr %var_16) + %var_10 = add i64 %var_15, 1 + store i64 %var_10, ptr %var_6 + br label %block_4 +block_6: call void @__quantum__rt__array_record_output(i64 5, ptr @0) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @1) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 1 to ptr), ptr @2) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/SuperdenseCoding.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/SuperdenseCoding.ll index e632bd350c..3f5901ee54 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/SuperdenseCoding.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/SuperdenseCoding.ll @@ -5,11 +5,15 @@ @4 = internal constant [6 x i8] c"4_t1t\00" @5 = internal constant [8 x i8] c"5_t1t0b\00" @6 = internal constant [8 x i8] c"6_t1t1b\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: %var_3 = alloca i1 %var_7 = alloca i1 + %var_16 = alloca i1 + %var_17 = alloca i1 + %var_18 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) @@ -21,14 +25,14 @@ block_0: call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 1 to ptr)) %var_4 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) store i1 %var_4, ptr %var_7 - %var_16 = load i1, ptr %var_3 - br i1 %var_16, label %block_1, label %block_2 + %var_25 = load i1, ptr %var_3 + br i1 %var_25, label %block_1, label %block_2 block_1: call void @__quantum__qis__z__body(ptr inttoptr (i64 0 to ptr)) br label %block_2 block_2: - %var_17 = load i1, ptr %var_7 - br i1 %var_17, label %block_3, label %block_4 + %var_26 = load i1, ptr %var_7 + br i1 %var_26, label %block_3, label %block_4 block_3: call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) br label %block_4 @@ -45,17 +49,34 @@ block_4: call void @__quantum__qis__h__body(ptr inttoptr (i64 2 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 3 to ptr)) %var_13 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 3 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) + store i1 %var_9, ptr %var_16 + store i1 %var_13, ptr %var_17 + store i64 0, ptr %var_18 + br label %block_5 +block_5: + %var_30 = load i64, ptr %var_18 + %var_19 = icmp slt i64 %var_30, 2 + br i1 %var_19, label %block_6, label %block_7 +block_6: + %var_35 = load i64, ptr %var_18 + %var_20 = getelementptr ptr, ptr @array0, i64 %var_35 + %var_36 = load ptr, ptr %var_20 + call void @__quantum__qis__reset__body(ptr %var_36) + %var_22 = add i64 %var_35, 1 + store i64 %var_22, ptr %var_18 + br label %block_5 +block_7: call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) call void @__quantum__rt__tuple_record_output(i64 2, ptr @1) - %var_18 = load i1, ptr %var_3 - call void @__quantum__rt__bool_record_output(i1 %var_18, ptr @2) - %var_19 = load i1, ptr %var_7 - call void @__quantum__rt__bool_record_output(i1 %var_19, ptr @3) + %var_31 = load i1, ptr %var_3 + call void @__quantum__rt__bool_record_output(i1 %var_31, ptr @2) + %var_32 = load i1, ptr %var_7 + call void @__quantum__rt__bool_record_output(i1 %var_32, ptr @3) call void @__quantum__rt__tuple_record_output(i64 2, ptr @4) - call void @__quantum__rt__bool_record_output(i1 %var_9, ptr @5) - call void @__quantum__rt__bool_record_output(i1 %var_13, ptr @6) + %var_33 = load i1, ptr %var_16 + call void @__quantum__rt__bool_record_output(i1 %var_33, ptr @5) + %var_34 = load i1, ptr %var_17 + call void @__quantum__rt__bool_record_output(i1 %var_34, ptr @6) ret i64 0 } diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/SwitchHandling.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/SwitchHandling.ll index c0c031303e..688c300c4e 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/SwitchHandling.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/SwitchHandling.ll @@ -1,66 +1,95 @@ @0 = internal constant [4 x i8] c"0_r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: - %var_2 = alloca i64 + %var_1 = alloca i64 + %var_6 = alloca i64 + %var_16 = alloca i64 call void @__quantum__rt__initialize(ptr null) - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) - store i64 0, ptr %var_2 - call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) - store i64 0, ptr %var_2 - %var_5 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) - br i1 %var_5, label %block_1, label %block_2 + store i64 0, ptr %var_1 + br label %block_1 block_1: - %var_25 = load i64, ptr %var_2 - %var_7 = add i64 %var_25, 1 - store i64 %var_7, ptr %var_2 - br label %block_2 + %var_25 = load i64, ptr %var_1 + %var_2 = icmp slt i64 %var_25, 2 + br i1 %var_2, label %block_2, label %block_3 block_2: - %var_18 = load i64, ptr %var_2 - %var_8 = shl i64 %var_18, 1 - store i64 %var_8, ptr %var_2 - %var_9 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - br i1 %var_9, label %block_3, label %block_4 + %var_42 = load i64, ptr %var_1 + %var_3 = getelementptr ptr, ptr @array0, i64 %var_42 + %var_43 = load ptr, ptr %var_3 + call void @__quantum__qis__x__body(ptr %var_43) + %var_5 = add i64 %var_42, 1 + store i64 %var_5, ptr %var_1 + br label %block_1 block_3: - %var_23 = load i64, ptr %var_2 - %var_11 = add i64 %var_23, 1 - store i64 %var_11, ptr %var_2 - br label %block_4 + store i64 0, ptr %var_6 + call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 0 to ptr)) + call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 1 to ptr)) + store i64 0, ptr %var_6 + %var_9 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) + br i1 %var_9, label %block_4, label %block_5 block_4: - call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - %var_20 = load i64, ptr %var_2 - %var_13 = icmp eq i64 %var_20, 0 - br i1 %var_13, label %block_5, label %block_6 + %var_40 = load i64, ptr %var_6 + %var_11 = add i64 %var_40, 1 + store i64 %var_11, ptr %var_6 + br label %block_5 block_5: - br label %block_13 + %var_28 = load i64, ptr %var_6 + %var_12 = shl i64 %var_28, 1 + store i64 %var_12, ptr %var_6 + %var_13 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + br i1 %var_13, label %block_6, label %block_7 block_6: - %var_21 = load i64, ptr %var_2 - %var_14 = icmp eq i64 %var_21, 1 - br i1 %var_14, label %block_7, label %block_8 + %var_38 = load i64, ptr %var_6 + %var_15 = add i64 %var_38, 1 + store i64 %var_15, ptr %var_6 + br label %block_7 block_7: - call void @__quantum__qis__ry__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) - br label %block_12 + store i64 0, ptr %var_16 + br label %block_8 block_8: - %var_22 = load i64, ptr %var_2 - %var_15 = icmp eq i64 %var_22, 2 - br i1 %var_15, label %block_9, label %block_10 + %var_31 = load i64, ptr %var_16 + %var_17 = icmp slt i64 %var_31, 2 + br i1 %var_17, label %block_9, label %block_10 block_9: - call void @__quantum__qis__rz__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) - br label %block_11 + %var_35 = load i64, ptr %var_16 + %var_18 = getelementptr ptr, ptr @array0, i64 %var_35 + %var_36 = load ptr, ptr %var_18 + call void @__quantum__qis__reset__body(ptr %var_36) + %var_20 = add i64 %var_35, 1 + store i64 %var_20, ptr %var_16 + br label %block_8 block_10: - call void @__quantum__qis__rx__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) - br label %block_11 + %var_32 = load i64, ptr %var_6 + %var_21 = icmp eq i64 %var_32, 0 + br i1 %var_21, label %block_11, label %block_12 block_11: - br label %block_12 -block_12: br label %block_13 +block_12: + %var_33 = load i64, ptr %var_6 + %var_22 = icmp eq i64 %var_33, 1 + br i1 %var_22, label %block_14, label %block_15 block_13: call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 2 to ptr)) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 2 to ptr), ptr @0) ret i64 0 +block_14: + call void @__quantum__qis__ry__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) + br label %block_16 +block_15: + %var_34 = load i64, ptr %var_6 + %var_23 = icmp eq i64 %var_34, 2 + br i1 %var_23, label %block_17, label %block_18 +block_16: + br label %block_13 +block_17: + call void @__quantum__qis__rz__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) + br label %block_19 +block_18: + call void @__quantum__qis__rx__body(double 3.141592653589793, ptr inttoptr (i64 2 to ptr)) + br label %block_19 +block_19: + br label %block_16 } declare void @__quantum__rt__initialize(ptr) diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/ThreeQubitRepetitionCode.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/ThreeQubitRepetitionCode.ll index dc985de3e3..330e33d208 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/ThreeQubitRepetitionCode.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/ThreeQubitRepetitionCode.ll @@ -1,6 +1,8 @@ @0 = internal constant [4 x i8] c"0_t\00" @1 = internal constant [6 x i8] c"1_t0b\00" @2 = internal constant [6 x i8] c"2_t1i\00" +@array0 = internal constant [3 x ptr] [ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] +@array1 = internal constant [2 x ptr] [ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: @@ -9,7 +11,10 @@ block_0: %var_4 = alloca i1 %var_5 = alloca i64 %var_7 = alloca i1 - %var_12 = alloca i1 + %var_8 = alloca i64 + %var_15 = alloca i1 + %var_27 = alloca i1 + %var_28 = alloca i64 call void @__quantum__rt__initialize(ptr null) call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__z__body(ptr inttoptr (i64 0 to ptr)) @@ -19,13 +24,13 @@ block_0: store i64 1, ptr %var_2 br label %block_1 block_1: - %var_25 = load i64, ptr %var_2 - %var_3 = icmp sle i64 %var_25, 5 + %var_35 = load i64, ptr %var_2 + %var_3 = icmp sle i64 %var_35, 5 store i1 true, ptr %var_4 br i1 %var_3, label %block_2, label %block_3 block_2: - %var_28 = load i1, ptr %var_4 - br i1 %var_28, label %block_4, label %block_5 + %var_38 = load i1, ptr %var_4 + br i1 %var_38, label %block_4, label %block_5 block_3: store i1 false, ptr %var_4 br label %block_2 @@ -37,77 +42,104 @@ block_5: call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__h__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 2 to ptr)) - %var_22 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) - call void @__quantum__rt__bool_record_output(i1 %var_22, ptr @1) - %var_29 = load i64, ptr %var_1 - call void @__quantum__rt__int_record_output(i64 %var_29, ptr @2) - ret i64 0 + %var_25 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 2 to ptr)) + store i1 %var_25, ptr %var_27 + store i64 0, ptr %var_28 + br label %block_7 block_6: - %var_31 = load i64, ptr %var_5 - %var_6 = icmp sle i64 %var_31, 4 + %var_48 = load i64, ptr %var_5 + %var_6 = icmp sle i64 %var_48, 4 store i1 true, ptr %var_7 - br i1 %var_6, label %block_7, label %block_8 + br i1 %var_6, label %block_8, label %block_9 block_7: - %var_34 = load i1, ptr %var_7 - br i1 %var_34, label %block_9, label %block_10 + %var_41 = load i64, ptr %var_28 + %var_29 = icmp slt i64 %var_41, 2 + br i1 %var_29, label %block_10, label %block_11 block_8: - store i1 false, ptr %var_7 - br label %block_7 + %var_51 = load i1, ptr %var_7 + br i1 %var_51, label %block_12, label %block_13 block_9: - call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr inttoptr (i64 2 to ptr)) - %var_42 = load i64, ptr %var_5 - %var_9 = add i64 %var_42, 1 - store i64 %var_9, ptr %var_5 - br label %block_6 + store i1 false, ptr %var_7 + br label %block_8 block_10: + %var_44 = load i64, ptr %var_28 + %var_30 = getelementptr ptr, ptr @array1, i64 %var_44 + %var_45 = load ptr, ptr %var_30 + call void @__quantum__qis__reset__body(ptr %var_45) + %var_32 = add i64 %var_44, 1 + store i64 %var_32, ptr %var_28 + br label %block_7 +block_11: + call void @__quantum__rt__tuple_record_output(i64 2, ptr @0) + %var_42 = load i1, ptr %var_27 + call void @__quantum__rt__bool_record_output(i1 %var_42, ptr @1) + %var_43 = load i64, ptr %var_1 + call void @__quantum__rt__int_record_output(i64 %var_43, ptr @2) + ret i64 0 +block_12: + store i64 0, ptr %var_8 + br label %block_14 +block_13: call void @__quantum__qis__cx__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 3 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__cx__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 4 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 3 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__mresetz__body(ptr inttoptr (i64 4 to ptr), ptr inttoptr (i64 1 to ptr)) - store i1 true, ptr %var_12 - %var_13 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) - br i1 %var_13, label %block_11, label %block_12 -block_11: - %var_15 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - br i1 %var_15, label %block_13, label %block_14 -block_12: - %var_17 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) - br i1 %var_17, label %block_15, label %block_16 -block_13: - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) - br label %block_17 + store i1 true, ptr %var_15 + %var_16 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 0 to ptr)) + br i1 %var_16, label %block_15, label %block_16 block_14: - call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) - br label %block_17 + %var_60 = load i64, ptr %var_8 + %var_9 = icmp slt i64 %var_60, 3 + br i1 %var_9, label %block_17, label %block_18 block_15: - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - br label %block_18 + %var_18 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + br i1 %var_18, label %block_19, label %block_20 block_16: - store i1 false, ptr %var_12 - br label %block_18 + %var_20 = call i1 @__quantum__rt__read_result(ptr inttoptr (i64 1 to ptr)) + br i1 %var_20, label %block_21, label %block_22 block_17: - br label %block_19 + %var_63 = load i64, ptr %var_8 + %var_10 = getelementptr ptr, ptr @array0, i64 %var_63 + %var_64 = load ptr, ptr %var_10 + call void @__quantum__qis__rx__body(double 1.5707963267948966, ptr %var_64) + %var_12 = add i64 %var_63, 1 + store i64 %var_12, ptr %var_8 + br label %block_14 block_18: - br label %block_19 + %var_61 = load i64, ptr %var_5 + %var_13 = add i64 %var_61, 1 + store i64 %var_13, ptr %var_5 + br label %block_6 block_19: - %var_37 = load i1, ptr %var_12 - br i1 %var_37, label %block_20, label %block_21 + call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) + br label %block_23 block_20: - %var_40 = load i64, ptr %var_1 - %var_20 = add i64 %var_40, 1 - store i64 %var_20, ptr %var_1 - br label %block_21 + call void @__quantum__qis__x__body(ptr inttoptr (i64 0 to ptr)) + br label %block_23 block_21: - %var_38 = load i64, ptr %var_2 - %var_21 = add i64 %var_38, 1 - store i64 %var_21, ptr %var_2 + call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) + br label %block_24 +block_22: + store i1 false, ptr %var_15 + br label %block_24 +block_23: + br label %block_25 +block_24: + br label %block_25 +block_25: + %var_54 = load i1, ptr %var_15 + br i1 %var_54, label %block_26, label %block_27 +block_26: + %var_57 = load i64, ptr %var_1 + %var_23 = add i64 %var_57, 1 + store i64 %var_23, ptr %var_1 + br label %block_27 +block_27: + %var_55 = load i64, ptr %var_2 + %var_24 = add i64 %var_55, 1 + store i64 %var_24, ptr %var_2 br label %block_1 } diff --git a/source/pip/tests-integration/resources/adaptive_rifla/output/WithinApply.ll b/source/pip/tests-integration/resources/adaptive_rifla/output/WithinApply.ll index 63fea7a987..8415910335 100644 --- a/source/pip/tests-integration/resources/adaptive_rifla/output/WithinApply.ll +++ b/source/pip/tests-integration/resources/adaptive_rifla/output/WithinApply.ll @@ -2,20 +2,63 @@ @1 = internal constant [6 x i8] c"1_a0r\00" @2 = internal constant [6 x i8] c"2_a1r\00" @3 = internal constant [6 x i8] c"3_a2r\00" +@array0 = internal constant [2 x ptr] [ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr)] define i64 @ENTRYPOINT__main() #0 { block_0: + %var_1 = alloca i64 + %var_6 = alloca i64 + %var_12 = alloca i64 call void @__quantum__rt__initialize(ptr null) - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) + store i64 0, ptr %var_1 + br label %block_1 +block_1: + %var_18 = load i64, ptr %var_1 + %var_2 = icmp slt i64 %var_18, 2 + br i1 %var_2, label %block_2, label %block_3 +block_2: + %var_29 = load i64, ptr %var_1 + %var_3 = getelementptr ptr, ptr @array0, i64 %var_29 + %var_30 = load ptr, ptr %var_3 + call void @__quantum__qis__x__body(ptr %var_30) + %var_5 = add i64 %var_29, 1 + store i64 %var_5, ptr %var_1 + br label %block_1 +block_3: call void @__quantum__qis__ccx__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 0 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr)) + store i64 1, ptr %var_6 + br label %block_4 +block_4: + %var_20 = load i64, ptr %var_6 + %var_7 = icmp sge i64 %var_20, 0 + br i1 %var_7, label %block_5, label %block_6 +block_5: + %var_26 = load i64, ptr %var_6 + %var_8 = getelementptr ptr, ptr @array0, i64 %var_26 + %var_27 = load ptr, ptr %var_8 + call void @__quantum__qis__x__body(ptr %var_27) + %var_10 = add i64 %var_26, -1 + store i64 %var_10, ptr %var_6 + br label %block_4 +block_6: call void @__quantum__qis__m__body(ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 0 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 2 to ptr), ptr inttoptr (i64 1 to ptr)) call void @__quantum__qis__m__body(ptr inttoptr (i64 0 to ptr), ptr inttoptr (i64 2 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 1 to ptr)) - call void @__quantum__qis__reset__body(ptr inttoptr (i64 2 to ptr)) + store i64 0, ptr %var_12 + br label %block_7 +block_7: + %var_22 = load i64, ptr %var_12 + %var_13 = icmp slt i64 %var_22, 2 + br i1 %var_13, label %block_8, label %block_9 +block_8: + %var_23 = load i64, ptr %var_12 + %var_14 = getelementptr ptr, ptr @array0, i64 %var_23 + %var_24 = load ptr, ptr %var_14 + call void @__quantum__qis__reset__body(ptr %var_24) + %var_16 = add i64 %var_23, 1 + store i64 %var_16, ptr %var_12 + br label %block_7 +block_9: call void @__quantum__qis__reset__body(ptr inttoptr (i64 0 to ptr)) call void @__quantum__rt__array_record_output(i64 3, ptr @0) call void @__quantum__rt__result_record_output(ptr inttoptr (i64 0 to ptr), ptr @1) diff --git a/source/samples_test/src/tests/algorithms.rs b/source/samples_test/src/tests/algorithms.rs index 16b5dfd23d..3a43ba5332 100644 --- a/source/samples_test/src/tests/algorithms.rs +++ b/source/samples_test/src/tests/algorithms.rs @@ -9,7 +9,7 @@ use expect_test::{Expect, expect}; pub const BERNSTEINVAZIRANI_EXPECT: Expect = expect!["[127, 238, 512]"]; pub const BERNSTEINVAZIRANI_EXPECT_DEBUG: Expect = expect!["[127, 238, 512]"]; pub const BERNSTEINVAZIRANI_EXPECT_CIRCUIT: Expect = expect!["generated circuit of length 29822"]; -pub const BERNSTEINVAZIRANI_EXPECT_QIR: Expect = expect!["generated QIR of length 20277"]; +pub const BERNSTEINVAZIRANI_EXPECT_QIR: Expect = expect!["generated QIR of length 20273"]; pub const BERNSTEINVAZIRANINISQ_EXPECT: Expect = expect!["[One, Zero, One, Zero, One]"]; pub const BERNSTEINVAZIRANINISQ_EXPECT_DEBUG: Expect = expect!["[One, Zero, One, Zero, One]"]; pub const BERNSTEINVAZIRANINISQ_EXPECT_CIRCUIT: Expect = @@ -259,4 +259,4 @@ pub const THREEQUBITREPETITIONCODE_EXPECT: Expect = expect!["(true, 0)"]; pub const THREEQUBITREPETITIONCODE_EXPECT_DEBUG: Expect = expect!["(true, 0)"]; pub const THREEQUBITREPETITIONCODE_EXPECT_CIRCUIT: Expect = expect!["generated circuit of length 51203"]; -pub const THREEQUBITREPETITIONCODE_EXPECT_QIR: Expect = expect!["generated QIR of length 18117"]; +pub const THREEQUBITREPETITIONCODE_EXPECT_QIR: Expect = expect!["generated QIR of length 18113"];