Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Re-open #3258 #3410

Merged
merged 98 commits into from
Nov 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
c2f2f62
enabled dynamic indices on nested arrays
vezenovm Sep 14, 2023
45b3787
remove debug
vezenovm Sep 14, 2023
7ccf8e9
working non-homogenous arr accesses for block params
vezenovm Sep 15, 2023
d5d16d7
add array_set, broken, need to maintain structure from SSA for accura…
vezenovm Sep 19, 2023
ec54e01
merge conflcits w/ master
vezenovm Sep 19, 2023
e2eff9b
working non-homogenous arrays using internal type element size array,…
vezenovm Sep 19, 2023
219c8f2
cleanup lots of debug and move const index access into its own method
vezenovm Sep 19, 2023
3195325
updating array_get and array_set to reduce repeated code
vezenovm Sep 19, 2023
8fb3bb1
restrict dynamic indices for non-homogenous slices
vezenovm Sep 19, 2023
469c333
cleanup array_get_value
vezenovm Sep 19, 2023
0648142
add internal_memory_blocks map
vezenovm Sep 19, 2023
b99f0e2
do not make separate bool for handle_constant_index
vezenovm Sep 20, 2023
5784170
fetch dummy value with predicate index
vezenovm Sep 20, 2023
05f35c6
flatten the index once for both array_set and array_get, do not modif…
vezenovm Sep 20, 2023
f2dd702
remove first_elem param
vezenovm Sep 21, 2023
490f5af
initial slice changes with fetch flat size from SSA values, need to g…
vezenovm Sep 25, 2023
0037867
merge master
vezenovm Sep 25, 2023
3636bc6
initial working nested dynamic slices
vezenovm Sep 28, 2023
31e7bc2
cleanup and fmt
vezenovm Sep 28, 2023
4354b76
cargo clippy and fmt
vezenovm Sep 28, 2023
87e8314
merge conflicts w/ master
vezenovm Sep 28, 2023
658d234
remove boolean AcirType
vezenovm Sep 28, 2023
408ac2c
remove deaad code not in master
vezenovm Sep 28, 2023
22ce20c
better solution for fetching nested slice with multiple slice mergesr
vezenovm Sep 28, 2023
686640e
bring back assert in nested_array_dynamic
vezenovm Sep 28, 2023
626616b
add assert to nested_slice_dynamic test
vezenovm Sep 28, 2023
f60183c
cleanup w/ copy_dynamic_array method
vezenovm Sep 28, 2023
be5dc79
starting test for slices in struct fields
vezenovm Sep 29, 2023
a7fde3e
more initial debugging for adding slices to struct fields
vezenovm Oct 2, 2023
d1c9192
basic slice struct fields working, but broken for struct fields of di…
vezenovm Oct 3, 2023
6ab1212
got old nested array and slice working with new acir, basic array get…
vezenovm Oct 4, 2023
d5911b8
merged w/ master, and working old nested arr/slice tests, array_set f…
vezenovm Oct 4, 2023
b9c6a0a
heavy debugging work to get flattening with slice of slices working
vezenovm Oct 5, 2023
11f7dc8
working slice field in a struct
vezenovm Oct 5, 2023
7f4c822
little test func for flattened slice size of res
vezenovm Oct 5, 2023
d97b965
merge conflicts w/ master
vezenovm Oct 9, 2023
20f61a5
Merge branch 'master' into mv/slice-struct-fields
vezenovm Oct 11, 2023
37a0f0f
merge conflicts w/ master
vezenovm Oct 16, 2023
1e0bd3f
update slice struct fields to use map of slice sizes in ACIR gen
vezenovm Oct 17, 2023
3b08844
clean up dbgs and old debug in acvm
vezenovm Oct 17, 2023
9086383
cleanup
vezenovm Oct 17, 2023
f1c707c
comments update
vezenovm Oct 17, 2023
9108769
check if we have side effects enabeld when flattening index
vezenovm Oct 17, 2023
589185c
Merge branch 'master' into mv/slice-struct-fields
vezenovm Oct 17, 2023
4209388
cleanup
vezenovm Oct 17, 2023
2949302
add TODOs to value merger
vezenovm Oct 17, 2023
ce13374
fill internal slices pass
vezenovm Oct 23, 2023
554b8a9
cleanup
vezenovm Oct 23, 2023
c2d7ce7
cleanup
vezenovm Oct 23, 2023
27e0835
fix up acir gen to not use value ids with slice values
vezenovm Oct 23, 2023
1456af9
Merge branch 'master' into mv/slice-struct-fields
vezenovm Oct 23, 2023
77b394e
fix for terminator in fill internal slices path
vezenovm Oct 23, 2023
3850cf1
Update compiler/noirc_evaluator/src/ssa/opt/fill_internal_slices.rs
TomAFrench Oct 23, 2023
db60a52
working nested array get/set w/ no regressions
vezenovm Oct 25, 2023
8cc5993
Merge branch 'mv/fill-slices-pass' into mv/fill-slices-pass-dbg
vezenovm Oct 25, 2023
a8d0431
working basic slice intrinsics on nested slices
vezenovm Oct 26, 2023
f9b8544
debugging changes for no regressions and changes to ACIR gen
vezenovm Oct 26, 2023
00a2f47
remove gate regression to get slice push back working for nested slices
vezenovm Oct 26, 2023
43f11e5
PR comment on removing from slice
vezenovm Oct 26, 2023
0d39a6b
improve fill internal slices pass
vezenovm Oct 27, 2023
6beabc2
cargo fmt
vezenovm Oct 27, 2023
42c0547
included simple unit test to fill internal slices pass
vezenovm Oct 30, 2023
5236691
cleanup
vezenovm Oct 30, 2023
c31906d
missed cargo fmt
vezenovm Oct 30, 2023
72a8a2a
spell check
vezenovm Oct 30, 2023
f231731
remove broken push back
vezenovm Oct 30, 2023
3b664a4
Update compiler/noirc_evaluator/src/ssa/opt/fill_internal_slices.rs
vezenovm Oct 31, 2023
e58dbba
Merge branch 'master' into mv/slice-struct-fields
TomAFrench Oct 31, 2023
0036938
Merge branch 'mv/slice-struct-fields' into mv/fill-slices-pass
TomAFrench Oct 31, 2023
b48fb85
chore: nargo fmt
TomAFrench Oct 31, 2023
f30062e
Update compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs
vezenovm Oct 31, 2023
4612c96
Update compiler/noirc_evaluator/src/ssa/opt/fill_internal_slices.rs
vezenovm Oct 31, 2023
b59f8ce
Update compiler/noirc_evaluator/src/ssa/opt/fill_internal_slices.rs
vezenovm Oct 31, 2023
711a3ff
Update compiler/noirc_evaluator/src/ssa/opt/fill_internal_slices.rs
vezenovm Oct 31, 2023
2a84478
flip order of test data for readability
vezenovm Oct 31, 2023
0bafe8d
format
vezenovm Oct 31, 2023
a4ef11b
reduce nesting in attach_slice_dummies
vezenovm Oct 31, 2023
dd3baec
feat(slices): Fill slice internal dummy data initial pass (#3258)
vezenovm Oct 31, 2023
3b30290
simplify predicate logic when fetching flattened index
vezenovm Nov 1, 2023
4926713
Update compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs
vezenovm Nov 1, 2023
24bfae9
use ok_or_else on store value slice sizes
vezenovm Nov 1, 2023
a8dae7a
reduce nesting from compute_slice_sizes in acir gen
vezenovm Nov 1, 2023
d558647
Merge branch 'master' into mv/slice-struct-fields
vezenovm Nov 1, 2023
ed372cc
Merge branch 'master' into mv/slice-struct-fields
jfecher Nov 1, 2023
ff280cb
Merge branch 'master' into mv/slice-struct-fields
vezenovm Nov 2, 2023
402f421
revert merge of 3258
vezenovm Nov 2, 2023
7ce4b52
merge in mv/slice-struct-fields
vezenovm Nov 2, 2023
5286fd1
use slice not mutable vec for array_get_value
vezenovm Nov 2, 2023
96805de
comment out failing constraints fixed by fill internal slices pass
vezenovm Nov 2, 2023
284e762
Merge branch 'mv/slice-struct-fields' into mv/fill-slices-pass
vezenovm Nov 2, 2023
c7649d3
Update compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs
vezenovm Nov 3, 2023
bf0aa94
wrap parent_array in Some
vezenovm Nov 3, 2023
2528f3d
Update compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs
vezenovm Nov 3, 2023
38669e9
add comments for slize sizes
vezenovm Nov 3, 2023
2b446a1
remove catch all for contains_slice_element
vezenovm Nov 3, 2023
33beadf
Merge branch 'master' into mv/slice-struct-fields
vezenovm Nov 3, 2023
750f2ad
Merge branch 'mv/slice-struct-fields' into mv/fill-slices-pass
vezenovm Nov 3, 2023
1577442
merge conflicts after #3187 merged w/ master
vezenovm Nov 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions compiler/noirc_evaluator/src/ssa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ use std::{
ops::Range,
};

use crate::errors::{RuntimeError, SsaReport};
use crate::{
brillig::Brillig,
errors::{RuntimeError, SsaReport},
};
use acvm::acir::{
circuit::{Circuit, PublicInputs},
native_types::Witness,
Expand Down Expand Up @@ -42,7 +45,8 @@ pub(crate) fn optimize_into_acir(
print_brillig_trace: bool,
) -> Result<GeneratedAcir, RuntimeError> {
let abi_distinctness = program.return_distinctness;
let ssa = SsaBuilder::new(program, print_ssa_passes)?

let ssa_builder = SsaBuilder::new(program, print_ssa_passes)?
.run_pass(Ssa::defunctionalize, "After Defunctionalization:")
.run_pass(Ssa::inline_functions, "After Inlining:")
// Run mem2reg with the CFG separated into blocks
Expand All @@ -59,10 +63,17 @@ pub(crate) fn optimize_into_acir(
// Run mem2reg once more with the flattened CFG to catch any remaining loads/stores
.run_pass(Ssa::mem2reg, "After Mem2Reg:")
.run_pass(Ssa::fold_constants, "After Constant Folding:")
.run_pass(Ssa::dead_instruction_elimination, "After Dead Instruction Elimination:")
.run_pass(Ssa::dead_instruction_elimination, "After Dead Instruction Elimination:");

let brillig = ssa_builder.to_brillig(print_brillig_trace);

// Split off any passes the are not necessary for Brillig generation but are necessary for ACIR generation.
// We only need to fill out nested slices as we need to have a known length when dealing with memory operations
// in ACIR gen while this is not necessary in the Brillig IR.
let ssa = ssa_builder
.run_pass(Ssa::fill_internal_slices, "After Fill Internal Slice Dummy Data:")
.finish();

let brillig = ssa.to_brillig(print_brillig_trace);
let last_array_uses = ssa.find_last_array_uses();
ssa.into_acir(brillig, abi_distinctness, &last_array_uses)
}
Expand Down Expand Up @@ -156,6 +167,10 @@ impl SsaBuilder {
Ok(self.print(msg))
}

fn to_brillig(&self, print_brillig_trace: bool) -> Brillig {
self.ssa.to_brillig(print_brillig_trace)
}

fn print(self, msg: &str) -> Self {
if self.print_ssa_passes {
println!("{msg}\n{}", self.ssa);
Expand Down
85 changes: 62 additions & 23 deletions compiler/noirc_evaluator/src/ssa/acir_gen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,9 @@ impl Context {
let rhs_var = read_from_index(rhs_block_id, i)?;
Ok((lhs_var, rhs_var))
}),
_ => unreachable!("ICE: lhs and rhs should be of the same type"),
_ => {
unreachable!("ICE: lhs and rhs should be of the same type")
}
}
}

Expand Down Expand Up @@ -502,7 +504,7 @@ impl Context {
self.initialize_array(block_id, len, Some(output.clone()))?;
}
AcirValue::DynamicArray(_) => {
unreachable!("The output from an intrinsic call is expected to be a single value or an array but got {output:?}");
// Do nothing as a dynamic array returned from a slice intrinsic should already be initialized
}
AcirValue::Var(_, _) => {
// Do nothing
Expand Down Expand Up @@ -1018,7 +1020,8 @@ impl Context {
}
}

let element_type_sizes = self.init_element_type_sizes_array(&array_typ, array_id, dfg)?;
let element_type_sizes =
self.init_element_type_sizes_array(&array_typ, array_id, None, dfg)?;
let result_value = AcirValue::DynamicArray(AcirDynamicArray {
block_id: result_block_id,
len: array_len,
Expand Down Expand Up @@ -1105,6 +1108,7 @@ impl Context {
&mut self,
array_typ: &Type,
array_id: ValueId,
array_acir_value: Option<AcirValue>,
dfg: &DataFlowGraph,
) -> Result<BlockId, RuntimeError> {
let element_type_sizes = self.internal_block_id(&array_id);
Expand Down Expand Up @@ -1132,7 +1136,11 @@ impl Context {
Value::Instruction { .. } | Value::Param { .. } => {
// An instruction representing the slice means it has been processed previously during ACIR gen.
// Use the previously defined result of an array operation to fetch the internal type information.
let array_acir_value = self.convert_value(array_id, dfg);
let array_acir_value = if let Some(array_acir_value) = array_acir_value {
array_acir_value
} else {
self.convert_value(array_id, dfg)
};
match array_acir_value {
AcirValue::DynamicArray(AcirDynamicArray {
element_type_sizes: inner_elem_type_sizes,
Expand Down Expand Up @@ -1274,7 +1282,8 @@ impl Context {
var_index: AcirVar,
dfg: &DataFlowGraph,
) -> Result<AcirVar, RuntimeError> {
let element_type_sizes = self.init_element_type_sizes_array(array_typ, array_id, dfg)?;
let element_type_sizes =
self.init_element_type_sizes_array(array_typ, array_id, None, dfg)?;

let predicate_index =
self.acir_context.mul_var(var_index, self.current_side_effects_enabled_var)?;
Expand Down Expand Up @@ -1728,26 +1737,50 @@ impl Context {
}
Intrinsic::SlicePushBack => {
let slice_length = self.convert_value(arguments[0], dfg).into_var()?;
let (array_id, array_typ, _) =
self.check_array_is_initialized(arguments[1], dfg)?;
let slice = self.convert_value(arguments[1], dfg);
// TODO(#2461): make sure that we have handled nested struct inputs
let element = self.convert_value(arguments[2], dfg);

// TODO(#3364): make sure that we have handled nested struct inputs
let element = self.convert_value(arguments[2], dfg);
let one = self.acir_context.add_constant(FieldElement::one());
let new_slice_length = self.acir_context.add_var(slice_length, one)?;

// We attach the element no matter what in case len == capacity, as otherwise we
// may get an out of bounds error.
let mut new_slice = Vector::new();
self.slice_intrinsic_input(&mut new_slice, slice)?;
new_slice.push_back(element);

Ok(vec![
AcirValue::Var(new_slice_length, AcirType::field()),
AcirValue::Array(new_slice),
])
self.slice_intrinsic_input(&mut new_slice, slice.clone())?;
new_slice.push_back(element.clone());

// TODO(#3364): This works for non-nested outputs
let len = Self::flattened_value_size(&slice);
let new_elem_size = Self::flattened_value_size(&element);
let new_slice_val = AcirValue::Array(new_slice);
let result_block_id = self.block_id(&result_ids[1]);
self.initialize_array(
result_block_id,
len + new_elem_size,
Some(new_slice_val.clone()),
)?;
let mut var_index = slice_length;
self.array_set_value(element, result_block_id, &mut var_index)?;

let result = AcirValue::DynamicArray(AcirDynamicArray {
block_id: result_block_id,
len: len + new_elem_size,
element_type_sizes: self.init_element_type_sizes_array(
&array_typ,
array_id,
Some(new_slice_val),
dfg,
)?,
});
Ok(vec![AcirValue::Var(new_slice_length, AcirType::field()), result])
}
Intrinsic::SlicePushFront => {
let slice_length = self.convert_value(arguments[0], dfg).into_var()?;
let slice = self.convert_value(arguments[1], dfg);
// TODO(#2461): make sure that we have handled nested struct inputs
let slice: AcirValue = self.convert_value(arguments[1], dfg);
// TODO(#3364): make sure that we have handled nested struct inputs
let element = self.convert_value(arguments[2], dfg);

let one = self.acir_context.add_constant(FieldElement::one());
Expand All @@ -1769,12 +1802,18 @@ impl Context {
let one = self.acir_context.add_constant(FieldElement::one());
let new_slice_length = self.acir_context.sub_var(slice_length, one)?;

let (_, _, block_id) = self.check_array_is_initialized(arguments[1], dfg)?;
let mut var_index = new_slice_length;
let elem = self.array_get_value(
&dfg.type_of_value(result_ids[2]),
block_id,
&mut var_index,
&[],
)?;

// TODO(#3364): make sure that we have handled nested struct inputs
let mut new_slice = Vector::new();
self.slice_intrinsic_input(&mut new_slice, slice)?;
// TODO(#2461): make sure that we have handled nested struct inputs
let elem = new_slice
.pop_back()
.expect("There are no elements in this slice to be removed");

Ok(vec![
AcirValue::Var(new_slice_length, AcirType::field()),
Expand All @@ -1791,7 +1830,7 @@ impl Context {

let mut new_slice = Vector::new();
self.slice_intrinsic_input(&mut new_slice, slice)?;
// TODO(#2461): make sure that we have handled nested struct inputs
// TODO(#3364): make sure that we have handled nested struct inputs
let elem = new_slice
.pop_front()
.expect("There are no elements in this slice to be removed");
Expand Down Expand Up @@ -1831,7 +1870,7 @@ impl Context {
// they are attempting to insert at too large of an index.
// This check prevents a panic inside of the im::Vector insert method.
if index <= new_slice.len() {
// TODO(#2461): make sure that we have handled nested struct inputs
// TODO(#3364): make sure that we have handled nested struct inputs
new_slice.insert(index, element);
}

Expand Down Expand Up @@ -1869,7 +1908,7 @@ impl Context {
// they are attempting to remove at too large of an index.
// This check prevents a panic inside of the im::Vector remove method.
let removed_elem = if index < new_slice.len() {
// TODO(#2461): make sure that we have handled nested struct inputs
// TODO(#3364): make sure that we have handled nested struct inputs
new_slice.remove(index)
} else {
// This is a dummy value which should never be used if the appropriate
Expand Down
Loading
Loading