@@ -20,7 +20,6 @@ use crate::ssa::ir::{
20
20
value:: { Value , ValueId } ,
21
21
} ;
22
22
use acvm:: acir:: brillig:: { MemoryAddress , ValueOrArray } ;
23
- use acvm:: brillig_vm:: MEMORY_ADDRESSING_BIT_SIZE ;
24
23
use acvm:: { FieldElement , acir:: AcirField } ;
25
24
use fxhash:: { FxHashMap as HashMap , FxHashSet as HashSet } ;
26
25
use iter_extended:: vecmap;
@@ -872,65 +871,40 @@ impl<'block, Registers: RegisterAllocator> BrilligBlock<'block, Registers> {
872
871
. store_instruction ( array_or_vector. extract_register ( ) , rc_register) ;
873
872
self . brillig_context . deallocate_register ( rc_register) ;
874
873
}
875
- Instruction :: DecrementRc { value, original } => {
874
+ Instruction :: DecrementRc { value } => {
876
875
let array_or_vector = self . convert_ssa_value ( * value, dfg) ;
877
- let orig_array_or_vector = self . convert_ssa_value ( * original, dfg) ;
878
-
879
876
let array_register = array_or_vector. extract_register ( ) ;
880
- let orig_array_register = orig_array_or_vector. extract_register ( ) ;
881
-
882
- let codegen_dec_rc = |ctx : & mut BrilligContext < FieldElement , Registers > | {
883
- let rc_register = ctx. allocate_register ( ) ;
884
-
885
- ctx. load_instruction ( rc_register, array_register) ;
886
-
887
- ctx. codegen_usize_op_in_place ( rc_register, BrilligBinaryOp :: Sub , 1 ) ;
888
-
889
- // Check that the refcount didn't go below 1. If we allow it to underflow
890
- // and become 0 or usize::MAX, and then return to 1, then it will indicate
891
- // an array as mutable when it probably shouldn't be.
892
- if ctx. enable_debug_assertions ( ) {
893
- let min_addr = ReservedRegisters :: usize_one ( ) ;
894
- let condition = SingleAddrVariable :: new ( ctx. allocate_register ( ) , 1 ) ;
895
- ctx. memory_op_instruction (
896
- min_addr,
897
- rc_register,
898
- condition. address ,
899
- BrilligBinaryOp :: LessThanEquals ,
900
- ) ;
901
- ctx. codegen_constrain (
902
- condition,
903
- Some ( "array ref-count went to zero" . to_owned ( ) ) ,
904
- ) ;
905
- ctx. deallocate_single_addr ( condition) ;
906
- }
907
877
908
- ctx. store_instruction ( array_register, rc_register) ;
909
- ctx. deallocate_register ( rc_register) ;
910
- } ;
878
+ let rc_register = self . brillig_context . allocate_register ( ) ;
879
+ self . brillig_context . load_instruction ( rc_register, array_register) ;
911
880
912
- if array_register == orig_array_register {
913
- codegen_dec_rc ( self . brillig_context ) ;
914
- } else {
915
- // Check if the current and original register point at the same memory.
916
- // If they don't, it means that an array-copy procedure has created a
917
- // new array, which includes decrementing the RC of the original,
918
- // which means we don't have to do the decrement here.
881
+ // Check that the refcount isn't already 0 before we decrement. If we allow it to underflow
882
+ // and become usize::MAX, and then return to 1, then it will indicate
883
+ // an array as mutable when it probably shouldn't be.
884
+ if self . brillig_context . enable_debug_assertions ( ) {
885
+ let min_addr = ReservedRegisters :: usize_one ( ) ;
919
886
let condition =
920
887
SingleAddrVariable :: new ( self . brillig_context . allocate_register ( ) , 1 ) ;
921
- // We will use a binary op to interpret the pointer as a number.
922
- let bit_size : u32 = MEMORY_ADDRESSING_BIT_SIZE . into ( ) ;
923
- let array_var = SingleAddrVariable :: new ( array_register , bit_size ) ;
924
- let orig_array_var = SingleAddrVariable :: new ( orig_array_register , bit_size ) ;
925
- self . brillig_context . binary_instruction (
926
- array_var ,
927
- orig_array_var ,
888
+ self . brillig_context . memory_op_instruction (
889
+ min_addr ,
890
+ rc_register ,
891
+ condition . address ,
892
+ BrilligBinaryOp :: LessThan ,
893
+ ) ;
894
+ self . brillig_context . codegen_constrain (
928
895
condition,
929
- BrilligBinaryOp :: Equals ,
896
+ Some ( "array ref-count underflow detected" . to_owned ( ) ) ,
930
897
) ;
931
- self . brillig_context . codegen_if ( condition. address , codegen_dec_rc) ;
932
898
self . brillig_context . deallocate_single_addr ( condition) ;
933
899
}
900
+
901
+ self . brillig_context . codegen_usize_op_in_place (
902
+ rc_register,
903
+ BrilligBinaryOp :: Sub ,
904
+ 1 ,
905
+ ) ;
906
+ self . brillig_context . store_instruction ( array_register, rc_register) ;
907
+ self . brillig_context . deallocate_register ( rc_register) ;
934
908
}
935
909
Instruction :: EnableSideEffectsIf { .. } => {
936
910
unreachable ! ( "enable_side_effects not supported by brillig" )
0 commit comments