|
1 | 1 | use crate::brillig::brillig_ir::artifact::Label;
|
2 | 2 | use crate::brillig::brillig_ir::brillig_variable::{
|
3 |
| - BrilligArray, BrilligVariable, SingleAddrVariable, type_to_heap_value_type, |
| 3 | + BrilligArray, BrilligVariable, BrilligVector, SingleAddrVariable, type_to_heap_value_type, |
4 | 4 | };
|
5 | 5 |
|
6 | 6 | use crate::brillig::brillig_ir::registers::RegisterAllocator;
|
@@ -935,8 +935,64 @@ impl<'block, Registers: RegisterAllocator> BrilligBlock<'block, Registers> {
|
935 | 935 | Instruction::EnableSideEffectsIf { .. } => {
|
936 | 936 | unreachable!("enable_side_effects not supported by brillig")
|
937 | 937 | }
|
938 |
| - Instruction::IfElse { .. } => { |
939 |
| - unreachable!("IfElse instructions should not be possible in brillig") |
| 938 | + Instruction::IfElse { then_condition, then_value, else_condition: _, else_value } => { |
| 939 | + let then_condition = self.convert_ssa_single_addr_value(*then_condition, dfg); |
| 940 | + let then_value = self.convert_ssa_value(*then_value, dfg); |
| 941 | + let else_value = self.convert_ssa_value(*else_value, dfg); |
| 942 | + let result = self.variables.define_variable( |
| 943 | + self.function_context, |
| 944 | + self.brillig_context, |
| 945 | + dfg.instruction_results(instruction_id)[0], |
| 946 | + dfg, |
| 947 | + ); |
| 948 | + match (then_value, else_value) { |
| 949 | + ( |
| 950 | + BrilligVariable::SingleAddr(then_address), |
| 951 | + BrilligVariable::SingleAddr(else_address), |
| 952 | + ) => { |
| 953 | + self.brillig_context.conditional_move_instruction( |
| 954 | + then_condition, |
| 955 | + then_address, |
| 956 | + else_address, |
| 957 | + result.extract_single_addr(), |
| 958 | + ); |
| 959 | + } |
| 960 | + ( |
| 961 | + BrilligVariable::BrilligArray(then_array), |
| 962 | + BrilligVariable::BrilligArray(else_array), |
| 963 | + ) => { |
| 964 | + // Pointer to the array which result from the if-else |
| 965 | + let pointer = self.brillig_context.allocate_register(); |
| 966 | + self.brillig_context.conditional_move_instruction( |
| 967 | + then_condition, |
| 968 | + SingleAddrVariable::new_usize(then_array.pointer), |
| 969 | + SingleAddrVariable::new_usize(else_array.pointer), |
| 970 | + SingleAddrVariable::new_usize(pointer), |
| 971 | + ); |
| 972 | + let if_else_array = BrilligArray { pointer, size: then_array.size }; |
| 973 | + // Copy the if-else array to the result |
| 974 | + self.brillig_context |
| 975 | + .call_array_copy_procedure(if_else_array, result.extract_array()); |
| 976 | + } |
| 977 | + ( |
| 978 | + BrilligVariable::BrilligVector(then_vector), |
| 979 | + BrilligVariable::BrilligVector(else_vector), |
| 980 | + ) => { |
| 981 | + // Pointer to the vector which result from the if-else |
| 982 | + let pointer = self.brillig_context.allocate_register(); |
| 983 | + self.brillig_context.conditional_move_instruction( |
| 984 | + then_condition, |
| 985 | + SingleAddrVariable::new_usize(then_vector.pointer), |
| 986 | + SingleAddrVariable::new_usize(else_vector.pointer), |
| 987 | + SingleAddrVariable::new_usize(pointer), |
| 988 | + ); |
| 989 | + let if_else_vector = BrilligVector { pointer }; |
| 990 | + // Copy the if-else vector to the result |
| 991 | + self.brillig_context |
| 992 | + .call_vector_copy_procedure(if_else_vector, result.extract_vector()); |
| 993 | + } |
| 994 | + _ => unreachable!("ICE - then and else values must have the same type"), |
| 995 | + } |
940 | 996 | }
|
941 | 997 | Instruction::MakeArray { elements: array, typ } => {
|
942 | 998 | let value_id = dfg.instruction_results(instruction_id)[0];
|
|
0 commit comments