fix(inlining): Use centralized CallGraph structure for inline info computation #8489
fix(inlining): Use centralized CallGraph structure for inline info computation #8489TomAFrench merged 15 commits intomasterfrom
Conversation
Changes to Brillig bytecode sizes
🧾 Summary (10% most significant diffs)
Full diff report 👇
|
Changes to number of Brillig opcodes executed
🧾 Summary (10% most significant diffs)
Full diff report 👇
|
Investigating these bytecode size increases. As this PR fixes a bug where we were not marking mutually recursive functions accurately I could see that we were inlining a mutually recursive function somewhere we should not have been. The large snapshots diffs look to largely be a renumbering of indices and debug symbol changes. Looking into these changes as well. |
The 50k lines snapshot diff was due to a bug with mislabelling inline targets. Fixed in 6d4a7f1 |
This is due to the bug mislabelling mutually recursive functions that this PR fixes. We have the following insertion method in Details
// Insert key-value entry. In case key was already present, value is overridden.
// docs:start:insert
pub unconstrained fn insert<H>(&mut self, key: K, value: V)
where
K: Eq + Hash,
B: BuildHasher<H>,
H: Hasher,
{
// docs:end:insert
self.try_resize();
let hash = self.hash(key);
for attempt in 0..self._table.len() {
let index = self.quadratic_probe(hash, attempt as u32);
let mut slot = self._table[index];
let mut insert = false;
// Either marked as deleted or has unset key-value.
if slot.is_available() {
insert = true;
self._len += 1;
} else {
let (current_key, _) = slot.key_value_unchecked();
if current_key == key {
insert = true;
}
}
if insert {
slot.set(key, value);
self._table[index] = slot;
break;
}
}
}
unconstrained fn try_resize<H>(&mut self)
where
B: BuildHasher<H>,
K: Eq + Hash,
H: Hasher,
{
if self.len() + 1 >= self.capacity() / 2 {
let capacity = self.capacity() * 2;
let mut new_map = UHashMap::with_hasher_and_capacity(self._build_hasher, capacity);
for entry in self.entries() {
new_map.insert(entry.0, entry.1);
}
*self = new_map;
}
}It is obvious that
Thus, on |
There was a problem hiding this comment.
ACVM Benchmarks
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
purely_sequential_opcodes |
273006 ns/iter (± 227) |
267707 ns/iter (± 2096) |
1.02 |
perfectly_parallel_opcodes |
243354 ns/iter (± 5653) |
239218 ns/iter (± 4787) |
1.02 |
perfectly_parallel_batch_inversion_opcodes |
3241633 ns/iter (± 45270) |
3589293 ns/iter (± 3094) |
0.90 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Compilation Time
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
2.38 s |
2.29 s |
1.04 |
private-kernel-reset |
6.992 s |
6.44 s |
1.09 |
private-kernel-tail |
1.058 s |
1.124 s |
0.94 |
rollup-base-private |
16.04 s |
16.3 s |
0.98 |
rollup-base-public |
12.74 s |
12.84 s |
0.99 |
rollup-block-root-empty |
1.344 s |
1.31 s |
1.03 |
rollup-block-root-single-tx |
134 s |
128 s |
1.05 |
rollup-block-root |
130 s |
124 s |
1.05 |
rollup-merge |
1.248 s |
1.104 s |
1.13 |
rollup-root |
1.632 s |
1.644 s |
0.99 |
semaphore-depth-10 |
0.875 s |
0.821 s |
1.07 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Artifact Size
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
1127.1 KB |
1127.1 KB |
1 |
private-kernel-reset |
2051 KB |
2051 KB |
1 |
private-kernel-tail |
583.1 KB |
583.1 KB |
1 |
rollup-base-private |
5123.2 KB |
5123.2 KB |
1 |
rollup-base-public |
3941.9 KB |
3941.9 KB |
1 |
rollup-block-root-empty |
256.8 KB |
256.8 KB |
1 |
rollup-block-root-single-tx |
25679 KB |
25679 KB |
1 |
rollup-block-root |
25706.2 KB |
25706.2 KB |
1 |
rollup-merge |
181.7 KB |
181.7 KB |
1 |
rollup-root |
473.4 KB |
473.4 KB |
1 |
semaphore-depth-10 |
636.4 KB |
636.4 KB |
1 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Execution Time
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
0.028 s |
0.028 s |
1 |
private-kernel-reset |
0.16 s |
0.159 s |
1.01 |
private-kernel-tail |
0.011 s |
0.011 s |
1 |
rollup-base-private |
0.306 s |
0.306 s |
1 |
rollup-base-public |
0.196 s |
0.192 s |
1.02 |
rollup-block-root |
11.2 s |
11 s |
1.02 |
rollup-merge |
0.004 s |
0.004 s |
1 |
rollup-root |
0.014 s |
0.013 s |
1.08 |
semaphore-depth-10 |
0.021 s |
0.019 s |
1.11 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Test Suite Duration
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
test_report_AztecProtocol_aztec-packages_noir-projects_aztec-nr |
66 s |
66 s |
1 |
test_report_AztecProtocol_aztec-packages_noir-projects_noir-contracts |
98 s |
97 s |
1.01 |
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_blob |
42 s |
43 s |
0.98 |
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_private-kernel-lib |
189 s |
196 s |
0.96 |
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_rollup-lib |
193 s |
192 s |
1.01 |
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_types |
61 s |
60 s |
1.02 |
test_report_noir-lang_noir-bignum_ |
416 s |
405 s |
1.03 |
test_report_noir-lang_noir_bigcurve_ |
238 s |
229 s |
1.04 |
test_report_noir-lang_sha512_ |
29 s |
28 s |
1.04 |
test_report_zkpassport_noir_rsa_ |
22 s |
24 s |
0.92 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Compilation Memory
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
313.29 MB |
313.29 MB |
1 |
private-kernel-reset |
569.09 MB |
569.09 MB |
1 |
private-kernel-tail |
228.21 MB |
228.21 MB |
1 |
rollup-base-private |
1440 MB |
1440 MB |
1 |
rollup-base-public |
1460 MB |
1460 MB |
1 |
rollup-block-root-empty |
398.67 MB |
398.67 MB |
1 |
rollup-block-root-single-tx |
7890 MB |
7890 MB |
1 |
rollup-block-root |
7900 MB |
7900 MB |
1 |
rollup-merge |
380.73 MB |
380.74 MB |
1.00 |
rollup-root |
441.65 MB |
441.66 MB |
1.00 |
semaphore_depth_10 |
126.94 MB |
126.94 MB |
1 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
Execution Memory
Details
| Benchmark suite | Current: 980fd23 | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
238.07 MB |
238.07 MB |
1 |
private-kernel-reset |
260.32 MB |
260.32 MB |
1 |
private-kernel-tail |
213.56 MB |
213.56 MB |
1 |
rollup-base-private |
544.98 MB |
544.98 MB |
1 |
rollup-base-public |
537.43 MB |
537.43 MB |
1 |
rollup-block-root |
1440 MB |
1440 MB |
1 |
rollup-merge |
366.5 MB |
366.5 MB |
1 |
rollup-root |
372.43 MB |
372.43 MB |
1 |
semaphore_depth_10 |
91.5 MB |
91.5 MB |
1 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'Test Suite Duration'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.
| Benchmark suite | Current: cc33b16 | Previous: 8cf48fc | Ratio |
|---|---|---|---|
test_report_noir-lang_noir_bigcurve_ |
287 s |
223 s |
1.29 |
This comment was automatically generated by workflow using github-action-benchmark.
CC: @TomAFrench
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'Compilation Time'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.
| Benchmark suite | Current: 46e472c | Previous: f4078e1 | Ratio |
|---|---|---|---|
private-kernel-inner |
3.022 s |
2.29 s |
1.32 |
rollup-block-root-empty |
1.83 s |
1.31 s |
1.40 |
This comment was automatically generated by workflow using github-action-benchmark.
CC: @TomAFrench
Automated pull of nightly from the [noir](https://github.com/noir-lang/noir) programming language, a dependency of Aztec. BEGIN_COMMIT_OVERRIDE fix(licm): Account for nested loops being control dependent when analyzing outer loops (noir-lang/noir#8593) chore(refactor): Switch unreachable function removal to use centralized call graph (noir-lang/noir#8578) chore(test): Allow lambdas in fuzzing (noir-lang/noir#8584) chore: use insta for execution_success stdout (noir-lang/noir#8576) chore: use generator instead of zero for ec-add predicate (noir-lang/noir#8552) fix: use predicate expression as binary result (noir-lang/noir#8583) fix(ssa): Do not generate apply functions when no lambda variants exist (noir-lang/noir#8573) chore: put `nargo expand` snapshosts in the same directory (noir-lang/noir#8577) chore: Use FxHashMap for TypeBindings (noir-lang/noir#8574) chore(experimental): use larger stack size for parsing (noir-lang/noir#8347) chore: use insta snapshots for compile_failure stderr (noir-lang/noir#8569) chore(inlining): Mark functions with <= 10 instructions and no control flow as inline always (noir-lang/noir#8533) chore(ssa): Add weighted edges to call graph, move callers and callees methods to call graph (noir-lang/noir#8513) fix(frontend): Override to allow empty array input (noir-lang/noir#8568) fix: avoid logging all unused params in DIE pass (noir-lang/noir#8566) chore: bump external pinned commits (noir-lang/noir#8562) chore(deps): bump base-x from 3.0.9 to 3.0.11 (noir-lang/noir#8555) chore(fuzz): Call function pointers (noir-lang/noir#8531) feat: C++ codegen for msgpack (noir-lang/noir#7716) feat(performance): brillig array set optimization (noir-lang/noir#8550) chore(fuzz): AST fuzzer to use function valued arguments (Part 1) (noir-lang/noir#8514) fix(licm): Check whether the loop is executed when hoisting with a predicate (noir-lang/noir#8546) feat: Implement $crate (noir-lang/noir#8537) fix: add offset to ArrayGet (noir-lang/noir#8536) chore: remove some unused enum variants and functions (noir-lang/noir#8538) fix: disallow `()` in entry points (noir-lang/noir#8529) chore: Remove println in ssa interpreter (noir-lang/noir#8528) fix: don't overflow when casting signed value to u128 (noir-lang/noir#8526) chore(performance): Enable hoisting pure with predicate calls (noir-lang/noir#8522) feat(fuzz): AST fuzzing with SSA interpreter (noir-lang/noir#8436) chore: Add u1 ops to interpreter, convert Value panics to errors (noir-lang/noir#8469) chore: Release Noir(1.0.0-beta.6) (noir-lang/noir#8438) chore(fuzz): AST generator to add `ctx_limit` to all functions (noir-lang/noir#8507) fix(inlining): Use centralized CallGraph structure for inline info computation (noir-lang/noir#8489) fix: remove private builtins from `Field` impl (noir-lang/noir#8496) feat: primitive types are no longer keywords (noir-lang/noir#8470) fix: parenthesized pattern, and correct 1-element tuple printing (noir-lang/noir#8482) fix: fix visibility of methods in `std::meta` (noir-lang/noir#8497) fix: Change `can_be_main` to be recursive (noir-lang/noir#8501) chore: add SSA interpreter test for higher order functions (noir-lang/noir#8486) fix(frontend)!: Ban zero sized arrays and strings as program input (noir-lang/noir#8491) fix!: remove `to_be_radix` and `to_le_radix` from stdlib interface (noir-lang/noir#8495) END_COMMIT_OVERRIDE --------- Co-authored-by: AztecBot <tech@aztecprotocol.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com>
Automated pull of nightly from the [noir](https://github.com/noir-lang/noir) programming language, a dependency of Aztec. BEGIN_COMMIT_OVERRIDE fix(licm): Account for nested loops being control dependent when analyzing outer loops (noir-lang/noir#8593) chore(refactor): Switch unreachable function removal to use centralized call graph (noir-lang/noir#8578) chore(test): Allow lambdas in fuzzing (noir-lang/noir#8584) chore: use insta for execution_success stdout (noir-lang/noir#8576) chore: use generator instead of zero for ec-add predicate (noir-lang/noir#8552) fix: use predicate expression as binary result (noir-lang/noir#8583) fix(ssa): Do not generate apply functions when no lambda variants exist (noir-lang/noir#8573) chore: put `nargo expand` snapshosts in the same directory (noir-lang/noir#8577) chore: Use FxHashMap for TypeBindings (noir-lang/noir#8574) chore(experimental): use larger stack size for parsing (noir-lang/noir#8347) chore: use insta snapshots for compile_failure stderr (noir-lang/noir#8569) chore(inlining): Mark functions with <= 10 instructions and no control flow as inline always (noir-lang/noir#8533) chore(ssa): Add weighted edges to call graph, move callers and callees methods to call graph (noir-lang/noir#8513) fix(frontend): Override to allow empty array input (noir-lang/noir#8568) fix: avoid logging all unused params in DIE pass (noir-lang/noir#8566) chore: bump external pinned commits (noir-lang/noir#8562) chore(deps): bump base-x from 3.0.9 to 3.0.11 (noir-lang/noir#8555) chore(fuzz): Call function pointers (noir-lang/noir#8531) feat: C++ codegen for msgpack (noir-lang/noir#7716) feat(performance): brillig array set optimization (noir-lang/noir#8550) chore(fuzz): AST fuzzer to use function valued arguments (Part 1) (noir-lang/noir#8514) fix(licm): Check whether the loop is executed when hoisting with a predicate (noir-lang/noir#8546) feat: Implement $crate (noir-lang/noir#8537) fix: add offset to ArrayGet (noir-lang/noir#8536) chore: remove some unused enum variants and functions (noir-lang/noir#8538) fix: disallow `()` in entry points (noir-lang/noir#8529) chore: Remove println in ssa interpreter (noir-lang/noir#8528) fix: don't overflow when casting signed value to u128 (noir-lang/noir#8526) chore(performance): Enable hoisting pure with predicate calls (noir-lang/noir#8522) feat(fuzz): AST fuzzing with SSA interpreter (noir-lang/noir#8436) chore: Add u1 ops to interpreter, convert Value panics to errors (noir-lang/noir#8469) chore: Release Noir(1.0.0-beta.6) (noir-lang/noir#8438) chore(fuzz): AST generator to add `ctx_limit` to all functions (noir-lang/noir#8507) fix(inlining): Use centralized CallGraph structure for inline info computation (noir-lang/noir#8489) fix: remove private builtins from `Field` impl (noir-lang/noir#8496) feat: primitive types are no longer keywords (noir-lang/noir#8470) fix: parenthesized pattern, and correct 1-element tuple printing (noir-lang/noir#8482) fix: fix visibility of methods in `std::meta` (noir-lang/noir#8497) fix: Change `can_be_main` to be recursive (noir-lang/noir#8501) chore: add SSA interpreter test for higher order functions (noir-lang/noir#8486) fix(frontend)!: Ban zero sized arrays and strings as program input (noir-lang/noir#8491) fix!: remove `to_be_radix` and `to_le_radix` from stdlib interface (noir-lang/noir#8495) END_COMMIT_OVERRIDE --------- Co-authored-by: AztecBot <tech@aztecprotocol.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com>
Automated pull of nightly from the [noir](https://github.com/noir-lang/noir) programming language, a dependency of Aztec. BEGIN_COMMIT_OVERRIDE fix(licm): Account for nested loops being control dependent when analyzing outer loops (noir-lang/noir#8593) chore(refactor): Switch unreachable function removal to use centralized call graph (noir-lang/noir#8578) chore(test): Allow lambdas in fuzzing (noir-lang/noir#8584) chore: use insta for execution_success stdout (noir-lang/noir#8576) chore: use generator instead of zero for ec-add predicate (noir-lang/noir#8552) fix: use predicate expression as binary result (noir-lang/noir#8583) fix(ssa): Do not generate apply functions when no lambda variants exist (noir-lang/noir#8573) chore: put `nargo expand` snapshosts in the same directory (noir-lang/noir#8577) chore: Use FxHashMap for TypeBindings (noir-lang/noir#8574) chore(experimental): use larger stack size for parsing (noir-lang/noir#8347) chore: use insta snapshots for compile_failure stderr (noir-lang/noir#8569) chore(inlining): Mark functions with <= 10 instructions and no control flow as inline always (noir-lang/noir#8533) chore(ssa): Add weighted edges to call graph, move callers and callees methods to call graph (noir-lang/noir#8513) fix(frontend): Override to allow empty array input (noir-lang/noir#8568) fix: avoid logging all unused params in DIE pass (noir-lang/noir#8566) chore: bump external pinned commits (noir-lang/noir#8562) chore(deps): bump base-x from 3.0.9 to 3.0.11 (noir-lang/noir#8555) chore(fuzz): Call function pointers (noir-lang/noir#8531) feat: C++ codegen for msgpack (noir-lang/noir#7716) feat(performance): brillig array set optimization (noir-lang/noir#8550) chore(fuzz): AST fuzzer to use function valued arguments (Part 1) (noir-lang/noir#8514) fix(licm): Check whether the loop is executed when hoisting with a predicate (noir-lang/noir#8546) feat: Implement $crate (noir-lang/noir#8537) fix: add offset to ArrayGet (noir-lang/noir#8536) chore: remove some unused enum variants and functions (noir-lang/noir#8538) fix: disallow `()` in entry points (noir-lang/noir#8529) chore: Remove println in ssa interpreter (noir-lang/noir#8528) fix: don't overflow when casting signed value to u128 (noir-lang/noir#8526) chore(performance): Enable hoisting pure with predicate calls (noir-lang/noir#8522) feat(fuzz): AST fuzzing with SSA interpreter (noir-lang/noir#8436) chore: Add u1 ops to interpreter, convert Value panics to errors (noir-lang/noir#8469) chore: Release Noir(1.0.0-beta.6) (noir-lang/noir#8438) chore(fuzz): AST generator to add `ctx_limit` to all functions (noir-lang/noir#8507) fix(inlining): Use centralized CallGraph structure for inline info computation (noir-lang/noir#8489) fix: remove private builtins from `Field` impl (noir-lang/noir#8496) feat: primitive types are no longer keywords (noir-lang/noir#8470) fix: parenthesized pattern, and correct 1-element tuple printing (noir-lang/noir#8482) fix: fix visibility of methods in `std::meta` (noir-lang/noir#8497) fix: Change `can_be_main` to be recursive (noir-lang/noir#8501) chore: add SSA interpreter test for higher order functions (noir-lang/noir#8486) fix(frontend)!: Ban zero sized arrays and strings as program input (noir-lang/noir#8491) fix!: remove `to_be_radix` and `to_le_radix` from stdlib interface (noir-lang/noir#8495) END_COMMIT_OVERRIDE --------- Co-authored-by: AztecBot <tech@aztecprotocol.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com>
Description
Problem*
Resolves #8448
Summary*
Use the new
ir::call_graph::CallGraphstructure for computing the SSAInlineInfos.This was done as follows:
CallGraphpetgraph::algo::toposort.toposortrequires a graph without cycles. We could also useDfsPostOrderto do this but as we are already determining the graph cycles I chose to simply build a new acyclic graph.Additional Context
If curious about the bytecode size changes in
uhashmaplook at #8489 (comment) for more information. tldr; the bug this PR fixes causes the byte code size difference.Next steps: I am going to add weighted edges to the call graph as to be able to move
compute_callersandcompute_calleesinto theCallGraphimpl.Documentation*
Check one:
PR Checklist*
cargo fmton default settings.