Skip to content

fix(ssa): Recursive shared Brillig entry points #8099

Merged
vezenovm merged 13 commits intomasterfrom
mv/recursive-shared-brillig-entry-points-fix
Apr 22, 2025
Merged

fix(ssa): Recursive shared Brillig entry points #8099
vezenovm merged 13 commits intomasterfrom
mv/recursive-shared-brillig-entry-points-fix

Conversation

@vezenovm
Copy link
Contributor

@vezenovm vezenovm commented Apr 15, 2025

Description

Problem*

Resolves #8069

For more context surrounding what the Brillig entry point analysis pass is doing and why you can reference #7277 and the doc comments on the pass itself.

The current SSA for the new brillig_entry_points_regression_8069 test:

Details

After Array Set Optimizations (1):
acir(inline) impure fn main f0 {
  b0():
    v4 = call f1(u1 1, i8 1, u32 5) -> u1
    v5 = not v4
    enable_side_effects v5
    v8 = call f2(Field 1, u1 1, u32 5) -> [i8; 4]
    enable_side_effects u1 1
    return u1 0
}
brillig(inline) impure fn func_1 f1 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f2(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f1(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) impure fn func_2 f2 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f1(v1, i8 0, v7) -> u1
    v12 = call f2(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}

After Brillig Entry Point Analysis (1):
acir(inline) impure fn main f0 {
  b0():
    v4 = call f1(u1 1, i8 1, u32 5) -> u1
    v5 = not v4
    enable_side_effects v5
    v8 = call f2(Field 1, u1 1, u32 5) -> [i8; 4]
    enable_side_effects u1 1
    return u1 0
}
brillig(inline) impure fn func_1 f1 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f4(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f3(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) impure fn func_2 f2 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f1(v1, i8 0, v7) -> u1
    v12 = call f2(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}
brillig(inline) fn func_1 f3 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f4(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f3(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) fn func_2 f4 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f3(v1, i8 0, v7) -> u1
    v12 = call f4(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}
brillig(inline) fn func_1 f5 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f2(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f1(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) fn func_2 f6 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f1(v1, i8 0, v7) -> u1
    v12 = call f2(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}

We can see how the calls to f1 and f2 in f2 are never replaced with duplicated entry points.

We currently have a single mapping of old function ids to new function ids. This leads to IDs being muddled across entry points. We clone the functions and set-up the calls that needs updating in each function before actually performing the update. Thus, let's say we updated the function calls for f1, where the calls f1 and f2 map to f3 and f4 respectively. As the calls to update are already set-up, when we go to update the function calls for f2 (which should map to f5 and f6), we will resolve f2 to f3. The calls to update are set-up off the original Brillig entry points call graph, thus there will be no new functions to update for f3.

Summary*

This fix required a couple changes:

  1. We now resolve function IDs per entry point. The inner recursive calls in f1 and f2 now resolve to separate specialized entry points as expected. I have added the linked test in the issue under execution_success and a unit test to brillig_entry_points.rs
  2. We also now build our new functions map entirely with the original SSA. We previously would iterate through the Brillig entry points call graph, update call sites, and track the new functions mapping at the same time. Before updating the SSA we already have all this information (as we have already cloned the functions). We should be able to set up the calls to update a single time and the mapping of old functions to new before any updates occur. Only then we do we perform the appropriate updates to all the call sites by iterating calls_to_update.
  3. We go over the new functions mapping as there may be cloned functions whose call sites were not appropriately updated. Once again, the calls to update we build are only based upon the original SSA so cloned functions are not going to be included. We iterate over the cloned function call sites and use the new functions mapping to resolve the call sites in cloned functions.

New SSA after this PR:

Details

After Brillig Entry Point Analysis (1):
acir(inline) impure fn main f0 {
  b0():
    v4 = call f1(u1 1, i8 1, u32 5) -> u1
    v5 = not v4
    enable_side_effects v5
    v8 = call f2(Field 1, u1 1, u32 5) -> [i8; 4]
    enable_side_effects u1 1
    return u1 0
}
brillig(inline) impure fn func_1 f1 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f4(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f3(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) impure fn func_2 f2 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f5(v1, i8 0, v7) -> u1
    v12 = call f6(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}
brillig(inline) fn func_1 f3 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f4(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f3(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) fn func_2 f4 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f3(v1, i8 0, v7) -> u1
    v12 = call f4(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}
brillig(inline) fn func_1 f5 {
  b0(v0: u1, v1: i8, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    jmp b3(u1 0)
  b2():
    v7 = sub v2, u32 1
    v8 = cast v0 as Field
    v11 = call f6(v8, u1 0, v7) -> [i8; 4]
    v13 = array_get v11, index u32 3 -> i8
    v15 = call f5(u1 0, v13, v7) -> u1
    jmp b3(v15)
  b3(v3: u1):
    return v3
}
brillig(inline) fn func_2 f6 {
  b0(v0: Field, v1: u1, v2: u32):
    v5 = eq v2, u32 0
    jmpif v5 then: b1, else: b2
  b1():
    v17 = make_array [i8 6, i8 101, i8 92, i8 30] : [i8; 4]
    jmp b3(v17)
  b2():
    v7 = sub v2, u32 1
    v10 = call f5(v1, i8 0, v7) -> u1
    v12 = call f6(v0, v10, v7) -> [i8; 4]
    jmp b3(v12)
  b3(v3: [i8; 4]):
    return v3
}

Additional Context

Documentation*

Check one:

  • No documentation needed.
  • Documentation included in this PR.
  • [For Experimental Features] Documentation to be submitted in a separate PR.

PR Checklist*

  • I have tested the changes locally.
  • I have formatted the changes with Prettier and/or cargo fmt on default settings.

@vezenovm vezenovm marked this pull request as ready for review April 17, 2025 14:20
@vezenovm vezenovm requested a review from a team April 17, 2025 14:20
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 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: c1c2c63 Previous: 38070d0 Ratio
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_blob 53 s 40 s 1.32

This comment was automatically generated by workflow using github-action-benchmark.

CC: @TomAFrench

@vezenovm vezenovm requested a review from michaeljklein April 22, 2025 16:15
@vezenovm vezenovm enabled auto-merge April 22, 2025 16:44
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Execution Time'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.

Benchmark suite Current: 4745eca Previous: 20fdf4c Ratio
private-kernel-tail 0.021 s 0.017 s 1.24

This comment was automatically generated by workflow using github-action-benchmark.

CC: @TomAFrench

@vezenovm vezenovm added this pull request to the merge queue Apr 22, 2025
Merged via the queue into master with commit 797aea9 Apr 22, 2025
113 checks passed
@vezenovm vezenovm deleted the mv/recursive-shared-brillig-entry-points-fix branch April 22, 2025 17:16
github-merge-queue bot pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Apr 28, 2025
Automated pull of nightly from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
feat: let `nargo test` use the new greybox fuzzer
(noir-lang/noir#8234)
chore(docs): add fixed bugs to list
(noir-lang/noir#8201)
fix(parser): do not use `Ident::default()`
(noir-lang/noir#8224)
feat(fuzz): Add experimental comptime code generator
(noir-lang/noir#8207)
fix: let SSA parser parse calls to print
(noir-lang/noir#8232)
feat: added 1, -1 case for inversions in brillig
(noir-lang/noir#8225)
chore: clippy (noir-lang/noir#8220)
fix: don't take implicitly added named generics when checking where
clauses (noir-lang/noir#8184)
chore(docs): Defunctionalization and some minor cleanup
(noir-lang/noir#8217)
feat: add `--no-fuzz` and `--only-fuzz` to `nargo test`
(noir-lang/noir#8213)
chore: add regression test for panic encountered in bigcurve library.
(noir-lang/noir#8211)
fix: validate numeric types when passing them to a FunctionBuilder
(noir-lang/noir#8215)
chore: refactor constrainedness checks on trait impls
(noir-lang/noir#8170)
chore(test): Add smoke test for AST generation
(noir-lang/noir#8048)
chore: bump more dependencies
(noir-lang/noir#8208)
chore: Don't use `i1` in the AST fuzzer
(noir-lang/noir#8204)
fix: Do not panic if RHS constant in division has more bits than the
operand (noir-lang/noir#8197)
chore: bump cargo deps (noir-lang/noir#8205)
fix: Handle truncating constants to 128 bits
(noir-lang/noir#8180)
fix!: disallow the `i1` type
(noir-lang/noir#8172)
chore(fuzz): Make sure `main` makes at least one call
(noir-lang/noir#8202)
fix: Use `get_local_or_global_instruction` in
`try_optimize_array_set_from_previous_get`
(noir-lang/noir#8200)
fix: returns 0 for right shift overflow
(noir-lang/noir#8189)
feat: avoid overflow check when subtracting from a value that is the
maximum for its bitsize (noir-lang/noir#8190)
feat: optimize `checked_to_unchecked` to take into account
multiplications (noir-lang/noir#8188)
chore: document ssa `inline_simple_functions`
(noir-lang/noir#8169)
chore(docs): remove_unreachable SSA pass
(noir-lang/noir#8196)
chore: Change AST fuzzer recursion limit
(noir-lang/noir#8173)
chore(acir): Unify how we display witness indices
(noir-lang/noir#8192)
fix: Detect ABI change of fuzzing harnesses
(noir-lang/noir#8193)
chore(acir): Test that `BLACKBOX::RANGE` display the number of bits
(noir-lang/noir#8191)
fix(debugger): send idle at loop end + fix test
(noir-lang/noir#8187)
fix: Use `get_local_or_global_instruction` when simplifying `IfElse`
(noir-lang/noir#8185)
fix(parser): avoid using `Location::dummy()`
(noir-lang/noir#8178)
chore: Push a bug list (noir-lang/noir#8186)
feat(greybox_fuzzer): Should_fail and should_fail_with
(noir-lang/noir#8118)
chore: move unsigned overflow check from acir/brillig to ssa
(noir-lang/noir#8163)
feat: location tree for debug_info
(noir-lang/noir#7034)
fix: Use `IntegerConstant` for loop boundaries in `unrolling`
(noir-lang/noir#8094)
fix(ssa): Recursive shared Brillig entry points
(noir-lang/noir#8099)
chore: enable '--pedantic-solving' on more tests
(noir-lang/noir#7701)
chore(readme): Update `acvm-repo` READMEs
(noir-lang/noir#8150)
chore(test): add `test_programs` dir for expected-panic tests
(noir-lang/noir#8147)
chore(docs): minor updates in solidity doc
(noir-lang/noir#8160)
feat(debugger): debug test functions
(noir-lang/noir#7958)
chore: migrate recursive proof test to ultrahonk
(noir-lang/noir#8038)
chore: bump glob package (noir-lang/noir#8159)
chore: bump external pinned commits
(noir-lang/noir#8139)
chore(docs): patch web app tutorial in 1.0.0-beta3 versioned docs
(noir-lang/noir#8158)
END_COMMIT_OVERRIDE

---------

Co-authored-by: AztecBot <tech@aztecprotocol.com>
Co-authored-by: Ary Borenszweig <asterite@gmail.com>
Co-authored-by: TomAFrench <tom@tomfren.ch>
github-merge-queue bot pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Apr 28, 2025
Automated pull of nightly from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
feat: let `nargo test` use the new greybox fuzzer
(noir-lang/noir#8234)
chore(docs): add fixed bugs to list
(noir-lang/noir#8201)
fix(parser): do not use `Ident::default()`
(noir-lang/noir#8224)
feat(fuzz): Add experimental comptime code generator
(noir-lang/noir#8207)
fix: let SSA parser parse calls to print
(noir-lang/noir#8232)
feat: added 1, -1 case for inversions in brillig
(noir-lang/noir#8225)
chore: clippy (noir-lang/noir#8220)
fix: don't take implicitly added named generics when checking where
clauses (noir-lang/noir#8184)
chore(docs): Defunctionalization and some minor cleanup
(noir-lang/noir#8217)
feat: add `--no-fuzz` and `--only-fuzz` to `nargo test`
(noir-lang/noir#8213)
chore: add regression test for panic encountered in bigcurve library.
(noir-lang/noir#8211)
fix: validate numeric types when passing them to a FunctionBuilder
(noir-lang/noir#8215)
chore: refactor constrainedness checks on trait impls
(noir-lang/noir#8170)
chore(test): Add smoke test for AST generation
(noir-lang/noir#8048)
chore: bump more dependencies
(noir-lang/noir#8208)
chore: Don't use `i1` in the AST fuzzer
(noir-lang/noir#8204)
fix: Do not panic if RHS constant in division has more bits than the
operand (noir-lang/noir#8197)
chore: bump cargo deps (noir-lang/noir#8205)
fix: Handle truncating constants to 128 bits
(noir-lang/noir#8180)
fix!: disallow the `i1` type
(noir-lang/noir#8172)
chore(fuzz): Make sure `main` makes at least one call
(noir-lang/noir#8202)
fix: Use `get_local_or_global_instruction` in
`try_optimize_array_set_from_previous_get`
(noir-lang/noir#8200)
fix: returns 0 for right shift overflow
(noir-lang/noir#8189)
feat: avoid overflow check when subtracting from a value that is the
maximum for its bitsize (noir-lang/noir#8190)
feat: optimize `checked_to_unchecked` to take into account
multiplications (noir-lang/noir#8188)
chore: document ssa `inline_simple_functions`
(noir-lang/noir#8169)
chore(docs): remove_unreachable SSA pass
(noir-lang/noir#8196)
chore: Change AST fuzzer recursion limit
(noir-lang/noir#8173)
chore(acir): Unify how we display witness indices
(noir-lang/noir#8192)
fix: Detect ABI change of fuzzing harnesses
(noir-lang/noir#8193)
chore(acir): Test that `BLACKBOX::RANGE` display the number of bits
(noir-lang/noir#8191)
fix(debugger): send idle at loop end + fix test
(noir-lang/noir#8187)
fix: Use `get_local_or_global_instruction` when simplifying `IfElse`
(noir-lang/noir#8185)
fix(parser): avoid using `Location::dummy()`
(noir-lang/noir#8178)
chore: Push a bug list (noir-lang/noir#8186)
feat(greybox_fuzzer): Should_fail and should_fail_with
(noir-lang/noir#8118)
chore: move unsigned overflow check from acir/brillig to ssa
(noir-lang/noir#8163)
feat: location tree for debug_info
(noir-lang/noir#7034)
fix: Use `IntegerConstant` for loop boundaries in `unrolling`
(noir-lang/noir#8094)
fix(ssa): Recursive shared Brillig entry points
(noir-lang/noir#8099)
chore: enable '--pedantic-solving' on more tests
(noir-lang/noir#7701)
chore(readme): Update `acvm-repo` READMEs
(noir-lang/noir#8150)
chore(test): add `test_programs` dir for expected-panic tests
(noir-lang/noir#8147)
chore(docs): minor updates in solidity doc
(noir-lang/noir#8160)
feat(debugger): debug test functions
(noir-lang/noir#7958)
chore: migrate recursive proof test to ultrahonk
(noir-lang/noir#8038)
chore: bump glob package (noir-lang/noir#8159)
chore: bump external pinned commits
(noir-lang/noir#8139)
chore(docs): patch web app tutorial in 1.0.0-beta3 versioned docs
(noir-lang/noir#8158)
END_COMMIT_OVERRIDE

---------

Co-authored-by: AztecBot <tech@aztecprotocol.com>
Co-authored-by: Ary Borenszweig <asterite@gmail.com>
Co-authored-by: TomAFrench <tom@tomfren.ch>
github-merge-queue bot pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Apr 28, 2025
Automated pull of nightly from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
feat: let `nargo test` use the new greybox fuzzer
(noir-lang/noir#8234)
chore(docs): add fixed bugs to list
(noir-lang/noir#8201)
fix(parser): do not use `Ident::default()`
(noir-lang/noir#8224)
feat(fuzz): Add experimental comptime code generator
(noir-lang/noir#8207)
fix: let SSA parser parse calls to print
(noir-lang/noir#8232)
feat: added 1, -1 case for inversions in brillig
(noir-lang/noir#8225)
chore: clippy (noir-lang/noir#8220)
fix: don't take implicitly added named generics when checking where
clauses (noir-lang/noir#8184)
chore(docs): Defunctionalization and some minor cleanup
(noir-lang/noir#8217)
feat: add `--no-fuzz` and `--only-fuzz` to `nargo test`
(noir-lang/noir#8213)
chore: add regression test for panic encountered in bigcurve library.
(noir-lang/noir#8211)
fix: validate numeric types when passing them to a FunctionBuilder
(noir-lang/noir#8215)
chore: refactor constrainedness checks on trait impls
(noir-lang/noir#8170)
chore(test): Add smoke test for AST generation
(noir-lang/noir#8048)
chore: bump more dependencies
(noir-lang/noir#8208)
chore: Don't use `i1` in the AST fuzzer
(noir-lang/noir#8204)
fix: Do not panic if RHS constant in division has more bits than the
operand (noir-lang/noir#8197)
chore: bump cargo deps (noir-lang/noir#8205)
fix: Handle truncating constants to 128 bits
(noir-lang/noir#8180)
fix!: disallow the `i1` type
(noir-lang/noir#8172)
chore(fuzz): Make sure `main` makes at least one call
(noir-lang/noir#8202)
fix: Use `get_local_or_global_instruction` in
`try_optimize_array_set_from_previous_get`
(noir-lang/noir#8200)
fix: returns 0 for right shift overflow
(noir-lang/noir#8189)
feat: avoid overflow check when subtracting from a value that is the
maximum for its bitsize (noir-lang/noir#8190)
feat: optimize `checked_to_unchecked` to take into account
multiplications (noir-lang/noir#8188)
chore: document ssa `inline_simple_functions`
(noir-lang/noir#8169)
chore(docs): remove_unreachable SSA pass
(noir-lang/noir#8196)
chore: Change AST fuzzer recursion limit
(noir-lang/noir#8173)
chore(acir): Unify how we display witness indices
(noir-lang/noir#8192)
fix: Detect ABI change of fuzzing harnesses
(noir-lang/noir#8193)
chore(acir): Test that `BLACKBOX::RANGE` display the number of bits
(noir-lang/noir#8191)
fix(debugger): send idle at loop end + fix test
(noir-lang/noir#8187)
fix: Use `get_local_or_global_instruction` when simplifying `IfElse`
(noir-lang/noir#8185)
fix(parser): avoid using `Location::dummy()`
(noir-lang/noir#8178)
chore: Push a bug list (noir-lang/noir#8186)
feat(greybox_fuzzer): Should_fail and should_fail_with
(noir-lang/noir#8118)
chore: move unsigned overflow check from acir/brillig to ssa
(noir-lang/noir#8163)
feat: location tree for debug_info
(noir-lang/noir#7034)
fix: Use `IntegerConstant` for loop boundaries in `unrolling`
(noir-lang/noir#8094)
fix(ssa): Recursive shared Brillig entry points
(noir-lang/noir#8099)
chore: enable '--pedantic-solving' on more tests
(noir-lang/noir#7701)
chore(readme): Update `acvm-repo` READMEs
(noir-lang/noir#8150)
chore(test): add `test_programs` dir for expected-panic tests
(noir-lang/noir#8147)
chore(docs): minor updates in solidity doc
(noir-lang/noir#8160)
feat(debugger): debug test functions
(noir-lang/noir#7958)
chore: migrate recursive proof test to ultrahonk
(noir-lang/noir#8038)
chore: bump glob package (noir-lang/noir#8159)
chore: bump external pinned commits
(noir-lang/noir#8139)
chore(docs): patch web app tutorial in 1.0.0-beta3 versioned docs
(noir-lang/noir#8158)
END_COMMIT_OVERRIDE

---------

Co-authored-by: AztecBot <tech@aztecprotocol.com>
Co-authored-by: Ary Borenszweig <asterite@gmail.com>
Co-authored-by: TomAFrench <tom@tomfren.ch>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Compiler crash in brillig_globals: function has multiple entry points

2 participants