Skip to content

fix(ssa): Do not check ArrayGet/Set as unreachable for Brillig#9376

Merged
vezenovm merged 15 commits intomasterfrom
mv/gate-dummy-array-for-unreachable-array-get-set
Aug 1, 2025
Merged

fix(ssa): Do not check ArrayGet/Set as unreachable for Brillig#9376
vezenovm merged 15 commits intomasterfrom
mv/gate-dummy-array-for-unreachable-array-get-set

Conversation

@vezenovm
Copy link
Contributor

@vezenovm vezenovm commented Aug 1, 2025

Description

Problem*

Resolves a panic ( Assertion failed: Bit size for lhs 16 does not match op bit size 32) from a Noir sync that is currently blocking any more syncs.

Summary*

It looks like the Aztec end-to-end tests pass with the an ACIR runtime gate just on Instruction::ArrayGet/Instruction::ArraySet. I thought the core issue is most likely with the dummy array (thinking it was due to some mismatched types but I have not found the exact issue there yet). However, gating just the dummy array logic was not enough to fix the Brillig panic. Gating the entire array get/set check was the only thing that removed the panic.

However, we can do a hot fix here by only allowing this optimization for ACIR.

I only gated Instruction::ArrayGet and Instruction::ArraySet in case we still wanted to mark unreachable instructions for failing constrains in Brillig. Looking back at the history of when this pass was created it does look like it was mainly made to avoid ACIR compilation errors. So perhaps for the sake of simplicity it would be better to simply gate the entire pass to only be performed on ACIR.

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 requested review from a team and asterite August 1, 2025 16:54
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: f8790f7 Previous: 9797518 Ratio
test_report_AztecProtocol_aztec-packages_noir-projects_aztec-nr 4 s 3 s 1.33
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_reset-kernel-lib 2 s 1 s 2

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

CC: @TomAFrench

@vezenovm vezenovm marked this pull request as draft August 1, 2025 17:06
@vezenovm vezenovm marked this pull request as ready for review August 1, 2025 17:07
@vezenovm vezenovm changed the title fix(ssa): Do not use ACIR predicates when marking unreachable instructions for Brillig fix(ssa): Do not check Array Get/Set as unreachable for Brillig Aug 1, 2025
Copy link
Collaborator

@asterite asterite left a comment

Choose a reason for hiding this comment

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

Looks good!

I do wonder if the context.dfg.runtime().is_acir() check should be done depending on the side_effects_var value, but if all tests passes and there are no big regressions it probably means that gating it in all cases is probably fine.

@vezenovm
Copy link
Contributor Author

vezenovm commented Aug 1, 2025

I do wonder if the context.dfg.runtime().is_acir() check should be done depending on the side_effects_var value, but if all tests passes and there are no big regressions it probably means that gating it in all cases is probably fine.

Do you think it may be cleaner to just run this optimization on ACIR entirely? It looks like this pass was originally made for that runtime either way? I guess it does provide benefits for Brillig compilation where we potentially don't have to pass over many unreachable instructions.

@asterite
Copy link
Collaborator

asterite commented Aug 1, 2025

Do you think it may be cleaner to just run this optimization on ACIR entirely? It looks like this pass was originally made for that runtime either way?

The pass was originally made to solve this issue: #8774

In there there's an always-failing constraint and later there's a load from a value that can't exist becase it's from an array_get from an empty array. There was an alternative fix at that time (#8943) but I thought it would be more correct to remove any instructions after an always-failing one and end the block with unreachable.

I don't know if that same code would fail in brillig, I'll check it now, but if not then we could gate it just to ACIR, though I feel that this is a good thing to do in general as it removes redundant instructions.

@vezenovm
Copy link
Contributor Author

vezenovm commented Aug 1, 2025

though I feel that this is a good thing to do in general as it removes redundant instructions.

Yes I agree. I'll try to keep what we can for Brillig then.

EDIT: We no longer get the Aztec end to end tests failure when gating just ArrayGet/Set

@vezenovm vezenovm enabled auto-merge August 1, 2025 17:24
@vezenovm vezenovm changed the title fix(ssa): Do not check Array Get/Set as unreachable for Brillig fix(ssa): Do not check ArrayGet/Set as unreachable for Brillig Aug 1, 2025
@vezenovm vezenovm added this pull request to the merge queue Aug 1, 2025
@vezenovm vezenovm removed this pull request from the merge queue due to a manual request Aug 1, 2025
@vezenovm vezenovm added this pull request to the merge queue Aug 1, 2025
Merged via the queue into master with commit 2d3a304 Aug 1, 2025
103 checks passed
@vezenovm vezenovm deleted the mv/gate-dummy-array-for-unreachable-array-get-set branch August 1, 2025 18:22
github-merge-queue bot pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Aug 4, 2025
Automated pull of nightly from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
fix: forbid self-referencing type aliases
(noir-lang/noir#9103)
chore: add a mem2reg test for when all references need to be invalidated
(noir-lang/noir#9377)
fix(ssa): Do not check ArrayGet/Set as unreachable for Brillig
(noir-lang/noir#9376)
chore: use SSA parser in all mem2reg tests
(noir-lang/noir#9372)
fix: trait where clause check fixes
(noir-lang/noir#9369)
fix: Correct doc comments for SSA passes
(noir-lang/noir#9371)
fix: prevent `SignedField::from(i128::MIN)` from crashing
(noir-lang/noir#9366)
fix: allow constants in the type-system to be negative
(noir-lang/noir#9360)
feat: show circuit output as a value of the program's return type
(noir-lang/noir#9364)
feat: add `FunctionDefinition::visibility`
(noir-lang/noir#9363)
chore(docs): Add example for `$crate` in docs
(noir-lang/noir#9361)
fix: Prevent accidental tuple sharing in comptime code
(noir-lang/noir#9313)
fix: perserve purities after SSA normalization
(noir-lang/noir#9355)
fix: modulo overflow in comptime
(noir-lang/noir#9348)
fix: handle short-syntax for trait constraints on trait generics
(noir-lang/noir#9167)
chore: enhance trait constraint comment
(noir-lang/noir#9358)
fix: replace implicitly added named generics with fresh type vars in
check_trait_impl_where_clause_matches_trait_where_clause
(noir-lang/noir#9352)
fix: push definition trait constraints after trait item constraint
(noir-lang/noir#9354)
chore(ci): Update status of noir_json_parser
(noir-lang/noir#9351)
fix(ssa): Keep reference count increments for array set values
(noir-lang/noir#9344)
chore: remove unused `compile_workspace`
(noir-lang/noir#9353)
chore: try printing byte arrays as strings in the SSA interpreter
(noir-lang/noir#9346)
feat(lsp): allow opening noir stdlib files
(noir-lang/noir#9339)
fix: do u128 operations with u128, not i128
(noir-lang/noir#9345)
chore(acir): ACIR parser error handling for blackbox inputs/outputs
(noir-lang/noir#9342)
fix: prevent invalid types in test/fuzz functions
(noir-lang/noir#9343)
chore(lsp): avoid redundant type checking
(noir-lang/noir#9337)
feat(acir): Parse ACIR memory and call opcodes
(noir-lang/noir#9331)
fix(ssa_gen): Add constraint on slice length before popping
(noir-lang/noir#9323)
chore: impl for u16 conversions
(noir-lang/noir#9314)
fix: substitute bindings in type before canonicalization
(noir-lang/noir#9328)
fix(ssa_interpreter): `push_back` and `pop_back` to slices with padding
(noir-lang/noir#9320)
fix: wildcard type should be allowed in lambda parameter types
(noir-lang/noir#9325)
chore: graceful handling of SIGPIPE
(noir-lang/noir#9075)
feat: return unsolvable opcode from `CircuitSimulator`
(noir-lang/noir#8943)
fix: allow nested fmtstr (noir-lang/noir#9309)
feat: Initial ACIR parser (arithmetic exprs and black box functions)
(noir-lang/noir#9316)
fix(mem2reg): Register aliases when the `IfElse` result in a reference
(noir-lang/noir#9305)
fix: Make Ssa-gen use existing reference when compiling `&mut
foo.bar.baz` (noir-lang/noir#9307)
fix: top-level item in dependency isn't always visible
(noir-lang/noir#9295)
fix(ssa-interpreter): Return error if slice length is 0 during popping
(noir-lang/noir#9308)
chore: Release Noir(1.0.0-beta.9)
(noir-lang/noir#9184)
chore(LSP): simplify code lens request handling
(noir-lang/noir#9279)
chore: add regression tests for #6383
(noir-lang/noir#9302)
fix: disallow `_` in signatures and struct members
(noir-lang/noir#9301)
fix: check associated types after validating where clause when looking
up trait impls, plus some unification fixes
(noir-lang/noir#9265)
chore: Add fmtstr to coercions list
(noir-lang/noir#9300)
chore: Add a helper function `fmtstr::as_quoted_str`
(noir-lang/noir#9293)
chore(docs): Copy Type Coercions docs into v1.0.0-beta.8 versioned docs
(noir-lang/noir#9298)
feat: only inject "out of bounds" checks in brillig
(noir-lang/noir#9200)
END_COMMIT_OVERRIDE

---------

Co-authored-by: AztecBot <tech@aztecprotocol.com>
Co-authored-by: Maxim Vezenov <mvezenov@gmail.com>
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.

2 participants