Skip to content

feat: codegen drop optimizations & pre-halt cleanup elimination#69

Merged
brockelmore merged 12 commits intomainfrom
brock/drop-optimizations
Mar 10, 2026
Merged

feat: codegen drop optimizations & pre-halt cleanup elimination#69
brockelmore merged 12 commits intomainfrom
brock/drop-optimizations

Conversation

@brockelmore
Copy link
Collaborator

Summary

  • Pre-halt stack cleanup elimination: Skip SWAP+POP chains before RETURN/REVERT/STOP since the EVM discards the stack. Three-pronged: LetBind halting_context check, compile_drop dead-code check, and post-assembly peephole pass (eliminate_pre_halt_cleanup) with fallthrough detection and redundant DUP1 removal.
  • Jump threading: Thread JUMP→JUMP chains to final target, eliminating trampolines.
  • Dead label elimination: Remove unreferenced labels after jump threading.
  • Revert(0,0) trampoline: Shared revert trampoline for overflow checks, reducing code duplication.
  • Branch-aware memory region sharing: Mutually exclusive if-branches reuse the same memory slots.
  • CalldataLoad CSE, dead store elimination, halting context drop skip, IsZero cancellation: Various codegen optimizations.
  • Improved drop placement: Better variable lifetime tracking and drop insertion.
  • Bug fixes: remaining_reads consume, asm arg order, InlineAsm traversal, free fn inlining, full_math test un-ignored.

Test plan

  • All codegen tests pass (cargo test --lib --tests -p edge-codegen)
  • All EVM tests pass (cargo test --lib --tests -p edge-evm-tests)
  • All E2E tests pass (just e2e)
  • Gas snapshot updated with improvements across many test cases

🤖 Generated with Claude Code

brockelmore and others added 8 commits March 9, 2026 12:10
…e fn inlining

- Add `remaining_reads` last-use DUP elision with `in_dead_code` guard
  and MAX protection in branches to prevent consume in unreachable code
- Fix `expr_definitely_halts` to check Concat both sides, LetBind init,
  and VarStore values
- Reverse inline asm input order at IR lowering so first arg ends up on
  TOS (fixes non-commutative ops like MULMOD)
- Add InlineAsm arms to monomorphize_rec, substitute_args,
  rename_locals_rec, and collect_letbind_names (args inside asm blocks
  were not being substituted during inlining)
- Reverse chain order in optimize_program to free_functions.chain(internal)
  so internal function bodies (value-only) take priority over free function
  bodies (with MSTORE/RETURN epilogue)
- Add tighten_drops pass in var_opt
- Add e2e tests for inlined halt regression and full_math (ignored)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Arg DUP depth 0 crash was caused by the same InlineAsm traversal
bug fixed in the previous commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sZero cancel

- CalldataLoad forwarding rules in storage.egg: forward through SStore,
  TStore, MStore, MStore8, Log since calldata is immutable
- CalldataLoad CSE pass in var_opt: hoist repeated CalldataLoad(offset)
  into LetBind variables at function entry
- Dead store elimination in var_opt: remove VarStore(x, val) when x
  hasn't been read since its last write (LetBind init or prior VarStore)
- Halting context optimization in expr_compiler: skip SWAP+POP cleanup
  for stack-var Drops when the code is about to RETURN/REVERT, since
  the EVM stack will be discarded anyway
- IsZero double-negation cancellation in compile_if: if(IsZero(inner))
  compiles to just JUMPI without an extra IsZero
- Raise stack var limit from 10 to 14, read_count limit from 8 to 16
- Add gas_used field to CallResult for gas tracking
- Add full_math slow path regression test (MAX*2/MAX=2)
- Broad gas improvements across all contracts (up to 39% reduction)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…anches

Replace the flat bump allocator in mem_region.rs with a scope-tree
that models control-flow mutual exclusivity. MemRegions in different
branches of If nodes now share the same base offset since only one
branch executes per call.

Key changes:
- RegionScope enum: Sequential (non-overlapping), Exclusive (shared
  base), Leaf (single region)
- collect_region_scopes builds scope tree mirroring IR control flow
- assign_scoped_offsets uses max(branch_sizes) for Exclusive nodes
  instead of sum, and deduplicates shared Rc region nodes
- simplify_scope flattens empty/trivial scope tree nodes

test_arrays high-water: 24128 → 192 bytes (99% reduction)
Gas improvements across all contracts with memory allocations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Shared revert(0,0) trampoline: all `revert(0, 0)` calls now emit
  JUMP to a single trampoline instead of inline Push0+Push0+Revert.
  Kept separate from overflow_revert (future Panic(type) support).
- Jump threading in assembler: when Label(X) is followed by JumpTo(Y),
  rewrite all references to X to target Y directly. Iterates to fixed
  point for chains.
- Dead label elimination: after threading, remove Label(X) + JumpTo(Y)
  sequences where X is no longer referenced by any jump.
- Pretty-asm: show JUMPDEST opcode and byte offset on label lines.

test_arrays: 14 inline revert sequences → 2 trampolines (39 bytes saved)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…uctions

Skip stack cleanup (SWAP+POP chains) when the continuation is guaranteed
to halt via RETURN/REVERT/STOP, since the EVM discards the stack anyway.

Three-pronged approach:
1. LetBind cleanup checks halting_context flag before emitting SWAP+POP
2. compile_drop checks in_dead_code to skip drops after RETURN
3. Post-assembly peephole (eliminate_pre_halt_cleanup) removes SWAP+POP
   chains in blocks that halt, jump-to-halt, or fall through to halting
   labels — also removes redundant DUP1 before terminal sequences

Also: skip doc tests in `just e2e` to avoid test failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@netlify
Copy link

netlify bot commented Mar 10, 2026

Deploy Preview for edgelang ready!

Name Link
🔨 Latest commit 2e90789
🔍 Latest deploy log https://app.netlify.com/projects/edgelang/deploys/69b0594943661400084425b7
😎 Deploy Preview https://deploy-preview-69--edgelang.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

brockelmore and others added 3 commits March 10, 2026 08:12
Fix doc_markdown (backtick identifiers), match_same_arms, collapsible_if,
needless_range_loop, redundant_clone, implicit_clone, unnecessary_map_or,
and if_same_then_else warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… iteration

Three improvements to DSE:

1. Nested LetBind forwarding: when lowering creates
   `LetBind(a, 0, LetBind(b, 0, ...Concat(VarStore(a, val), ...)))`,
   the VarStore for outer variables is buried in the innermost body.
   New `forward_through_nested_letbinds` walks the chain and forwards
   values that don't reference mutable sibling variables.

2. Fixed-point iteration: `dead_store_elim_program` now loops until
   no changes, allowing cascading forwarding (e.g. twos depends on
   neg_denom, d depends on twos — each iteration forwards one layer).

3. Full tree recursion: `dead_store_elim_rec` now recurses into
   VarStore, Bop, Uop, Top, Get, ReturnOp, Revert nodes so DSE
   reaches LetBinds nested inside these expressions (critical for O1+
   where egglog places LetBinds inside VarStore values).

Also fixes a latent bug in flat DSE where forwarding a value that
references outer mutable variables would read stale init values.
Added `body_mutable_vars` safety check to prevent this.

Enables DSE at O0 (was previously skipped). Results on full_math.edge:
- O0: 9 → 5 zero-init LetBinds
- O1: 24 → 12 zero-init LetBinds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a Python script that compares two gas snapshot CSVs and outputs a
markdown table sorted by largest O3 percentage decrease. CI runs it
after acceptance tests on PRs and posts/updates a comment with the diff.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Repository owner deleted a comment from github-actions bot Mar 10, 2026
@brockelmore brockelmore force-pushed the brock/drop-optimizations branch from ce59cf2 to 2e90789 Compare March 10, 2026 17:47
@brockelmore
Copy link
Collaborator Author

initial testing on FullMath from uni-v3 translated to solidity ^0.8.0 and edge:

we beat their mulDiv by 177 gas in the slow path and 233 in the fast path

@github-actions
Copy link

Gas Snapshot Diff

New tests (3)

Test O0 O1 O2 O3
test_full_math::mul_div(uint256,uint256,uint256) 1842 1842 1842 1842
test_inlined_halt::compute(uint256,uint256,uint256) 726 726 726 726
test_inlined_halt::wrapper(uint256,uint256,uint256) 726 726 726 726

Changed (123) | Unchanged (17)

Test O0 O1 O2 O3
test_generics::test_turbofish_identity() -93 (-47.4%) -93 (-47.4%) -93 (-47.4%) -93 (-47.4%)
test_trait_bounds::test_multiple_bounds() -93 (-43.1%) -92 (-44.2%) -92 (-44.2%) -92 (-44.2%)
test_trait_bounds::test_bound_other() -93 (-42.9%) -92 (-44.0%) -92 (-44.0%) -92 (-44.0%)
test_generics::test_max() -105 (-37.1%) -99 (-39.1%) -99 (-39.1%) -99 (-39.1%)
test_generics::test_turbofish_max() -105 (-36.8%) -99 (-38.8%) -99 (-38.8%) -99 (-38.8%)
test_default_methods::test_full_override() -75 (-31.8%) -74 (-33.2%) -73 (-38.6%) -73 (-38.6%)
test_generics::test_identity() -97 (-38.5%) -97 (-38.5%) -97 (-38.5%) -97 (-38.5%)
test_default_methods::test_override_method() -75 (-26.5%) -74 (-27.4%) -73 (-38.4%) -73 (-38.4%)
test_trait_bounds::test_extract_other_method() -100 (-27.9%) -99 (-28.6%) -98 (-36.8%) -98 (-36.8%)
test_trait_bounds::test_extract_wrapper() -100 (-35.5%) -99 (-36.8%) -98 (-36.8%) -98 (-36.8%)
test_generics::test_result_err() -82 (-35.0%) -81 (-35.5%) -81 (-36.8%) -81 (-36.8%)
test_trait_bounds::test_scale_wrapper() -100 (-27.8%) -99 (-28.5%) -98 (-36.7%) -98 (-36.7%)
test_traits::test_double_method() -69 (-25.0%) -68 (-25.9%) -67 (-36.6%) -67 (-36.6%)
test_arrays::element_access() -132 (-36.9%) -120 (-36.6%) -120 (-36.6%) -120 (-36.6%)
test_generics::test_min() -108 (-33.4%) -102 (-36.0%) -102 (-36.0%) -102 (-36.0%)
test_trait_bounds::test_bound_satisfied() -61 (-38.9%) -54 (-36.0%) -54 (-36.0%) -54 (-36.0%)
test_generics::test_option_some() -91 (-34.5%) -90 (-34.9%) -90 (-34.9%) -90 (-34.9%)
test_trait_bounds::test_scale_other() -103 (-22.2%) -102 (-22.6%) -101 (-34.4%) -101 (-34.4%)
test_trait_bounds::test_extract_wrapper_method() -103 (-33.1%) -102 (-34.2%) -101 (-34.2%) -101 (-34.2%)
test_trait_bounds::test_type_bound() -97 (-32.0%) -96 (-34.3%) -95 (-33.2%) -95 (-33.2%)
test_packed_structs::packed_rgb_g() -60 (-25.0%) -59 (-30.1%) -58 (-33.1%) -58 (-33.1%)
test_trait_bounds::test_extract_other() -106 (-25.4%) -105 (-26.0%) -104 (-32.1%) -104 (-32.1%)
test_trait_bounds::test_multiple_bounds_other() -105 (-31.5%) -104 (-32.0%) -104 (-32.0%) -104 (-32.0%)
test_default_methods::test_partial_override_chain() -86 (-20.2%) -85 (-20.6%) -79 (-32.0%) -79 (-32.0%)
test_default_methods::test_required_method_call() -81 (-30.8%) -80 (-32.0%) -79 (-32.0%) -79 (-32.0%)
test_default_methods::test_chained_default() -91 (-21.0%) -90 (-21.4%) -79 (-31.9%) -79 (-31.9%)
test_default_methods::test_default_method() -83 (-24.1%) -83 (-25.0%) -78 (-31.8%) -78 (-31.8%)
test_generics::test_entry_key() -98 (-30.4%) -96 (-31.7%) -96 (-31.7%) -96 (-31.7%)
test_generics::test_entry_value() -98 (-30.2%) -95 (-31.2%) -95 (-31.6%) -95 (-31.6%)
test_generics::test_option_none() -94 (-30.6%) -94 (-30.6%) -94 (-31.4%) -94 (-31.4%)
test_trait_bounds::test_type_bound_other() -100 (-30.0%) -99 (-31.9%) -98 (-31.0%) -98 (-31.0%)
test_traits::test_triple() -75 (-22.5%) -74 (-23.1%) -73 (-30.4%) -73 (-30.4%)
test_traits::test_double_then_triple() -75 (-18.1%) -74 (-18.5%) -73 (-30.3%) -73 (-30.3%)
test_traits::test_double() -72 (-21.8%) -72 (-22.6%) -72 (-30.0%) -72 (-30.0%)
test_default_methods::test_chained_default_call() -94 (-20.3%) -93 (-20.7%) -82 (-29.7%) -82 (-29.7%)
test_default_methods::test_default_method_call() -89 (-23.6%) -88 (-24.2%) -82 (-29.7%) -82 (-29.7%)
test_default_methods::test_override_method_call() -84 (-22.7%) -83 (-23.2%) -82 (-29.6%) -82 (-29.6%)
test_generics::test_result_ok() -100 (-28.7%) -99 (-28.9%) -99 (-29.6%) -99 (-29.6%)
test_packed_structs::packed_field_sum() -68 (-17.3%) -67 (-23.2%) -64 (-27.6%) -64 (-27.6%)
test_packed_structs::packed_pair_a() -66 (-23.7%) -65 (-26.3%) -64 (-27.6%) -64 (-27.6%)
test_arrays::slice_sum() -140 (-27.5%) -121 (-27.6%) -121 (-27.6%) -121 (-27.6%)
test_packed_structs::packed_rgb_b() -66 (-22.6%) -65 (-26.2%) -64 (-27.5%) -64 (-27.5%)
test_packed_structs::packed_two_structs() -57 (-16.9%) -56 (-24.9%) -56 (-27.5%) -56 (-27.5%)
test_packed_structs::packed_rgb_r() -63 (-21.5%) -63 (-25.2%) -63 (-27.4%) -63 (-27.4%)
test_default_methods::test_required_method() -52 (-35.1%) -39 (-28.9%) -36 (-27.3%) -36 (-27.3%)
test_inline_asm::asm_add() -39 (-26.2%) -39 (-26.2%) -39 (-26.2%) -39 (-26.2%)
test_inline_asm::asm_mul_add() -41 (-25.9%) -41 (-25.9%) -41 (-25.9%) -41 (-25.9%)
test_traits::test_eq_overload() -72 (-23.4%) -71 (-25.2%) -71 (-25.4%) -71 (-25.4%)
test_packed_transient::write_subfield_preserves() -59 (-13.8%) -58 (-19.3%) -55 (-24.4%) -55 (-24.4%)
test_traits::test_triple_method() -63 (-28.8%) -62 (-30.1%) -30 (-23.8%) -30 (-23.8%)
test_inline_asm::asm_hex_literal() -47 (-23.4%) -47 (-23.4%) -47 (-23.4%) -47 (-23.4%)
test_traits::test_add_overload() -63 (-22.4%) -62 (-25.6%) -63 (-23.3%) -63 (-23.3%)
test_inline_asm::asm_caller() -47 (-23.3%) -47 (-23.3%) -47 (-23.3%) -47 (-23.3%)
test_enums2::result_ok_value() -33 (-21.7%) -32 (-21.9%) -32 (-23.2%) -32 (-23.2%)
test_inline_asm::asm_local_var() -47 (-22.6%) -47 (-22.6%) -47 (-22.6%) -47 (-22.6%)
test_inline_asm::asm_computed_local() -47 (-19.3%) -47 (-22.4%) -47 (-22.4%) -47 (-22.4%)
test_packed_transient::store_and_read_g() -64 (-18.6%) -63 (-20.6%) -61 (-21.6%) -61 (-21.6%)
test_packed_transient::store_and_read_r() -60 (-17.5%) -60 (-19.7%) -60 (-21.3%) -60 (-21.3%)
test_packed_transient::store_and_read_b() -70 (-17.6%) -69 (-19.3%) -67 (-19.7%) -67 (-19.7%)
test_packed_transient::store_and_read_sum() -72 (-14.7%) -71 (-17.8%) -67 (-19.7%) -67 (-19.7%)
test_packed_transient::store_pair_read_b() -70 (-18.5%) -69 (-19.6%) -67 (-19.7%) -67 (-19.7%)
test_packed_transient::store_pair_read_a() -70 (-18.1%) -69 (-19.2%) -67 (-19.6%) -67 (-19.6%)
test_impl::test_counter_get() -30 (-18.6%) -29 (-19.6%) -28 (-19.3%) -28 (-19.3%)
test_impl::test_counter_add() -36 (-16.1%) -35 (-16.6%) -34 (-19.2%) -34 (-19.2%)
test_packed_transient::write_subfield_r() -73 (-14.6%) -72 (-17.2%) -70 (-18.9%) -70 (-18.9%)
test_packed_structs::packed_pair_b() -54 (-34.2%) -30 (-23.8%) -21 (-17.9%) -21 (-17.9%)
test_structs::point_sum() -23 (-14.6%) -20 (-15.0%) -20 (-15.4%) -20 (-15.4%)
test_enums2::result_err_value() -39 (-14.5%) -38 (-14.4%) -38 (-14.9%) -38 (-14.9%)
test_structs::two_structs() -31 (-12.1%) -29 (-13.4%) -29 (-13.6%) -29 (-13.6%)
test_arrays::sum_array() -139 (-12.0%) -143 (-12.7%) -143 (-12.7%) -143 (-12.7%)
test_supertraits::test_extended_method_call() -21 (-8.2%) -20 (-8.3%) -19 (-11.7%) -19 (-11.7%)
test_unsafe_arith::test_sub_underflow() -14 (-11.5%) -14 (-11.5%) -14 (-11.5%) -14 (-11.5%)
test_impl::test_point_x() -22 (-11.3%) -20 (-11.4%) -20 (-11.4%) -20 (-11.4%)
test_unsafe_arith::test_mul_overflow() -17 (-9.4%) -17 (-9.8%) -17 (-9.8%) -17 (-9.8%)
test_transient::get_tval2() -26 (-11.4%) -20 (-8.7%) -20 (-8.7%) -20 (-8.7%)
test_transient::get_tval() -30 (-10.6%) -24 (-8.5%) -24 (-8.5%) -24 (-8.5%)
test_enums2::direction_north() -13 (-7.9%) -11 (-7.9%) -11 (-7.9%) -11 (-7.9%)
test_unsafe_arith::test_unsafe_mul() -8 (-6.7%) -8 (-7.1%) -8 (-7.1%) -8 (-7.1%)
test_structs::point_y() -13 (-6.9%) -10 (-6.0%) -10 (-6.1%) -10 (-6.1%)
test_supertraits::test_extended_method() -9 (-4.2%) -8 (-3.9%) -7 (-5.7%) -7 (-5.7%)
test_arrays::get(uint256) -131 (-5.6%) -125 (-5.4%) -125 (-5.4%) -125 (-5.4%)
test_impl::test_point_scale() -14 (-4.0%) -11 (-3.3%) -11 (-4.4%) -11 (-4.4%)
test_inline::triple_val() -11 (-4.3%) -5 (-4.4%) -5 (-4.4%) -5 (-4.4%)
test_mappings::counter_get(address) -124 (-5.1%) -103 (-4.3%) -103 (-4.3%) -103 (-4.3%)
test_mappings::nested_get(address,address) -127 (-4.9%) -109 (-4.3%) -109 (-4.3%) -109 (-4.3%)
test_mappings::map_get(address) -118 (-5.0%) -97 (-4.1%) -97 (-4.1%) -97 (-4.1%)
test_unsafe_arith::test_unsafe_sub() -5 (-3.0%) -5 (-3.1%) -5 (-3.1%) -5 (-3.1%)
test_enums2::direction_west() -5 (-2.3%) -3 (-2.5%) -3 (-2.5%) -3 (-2.5%)
test_mappings::map_add(address,uint256) -128 (-2.3%) -112 (-2.1%) -112 (-2.1%) -112 (-2.1%)
test_inline::inline_in_loop() -17 (-1.6%) -11 (-1.3%) -11 (-1.3%) -11 (-1.3%)
test_inline::weighted_sum_val() -28 (-6.3%) -2 (-1.2%) -2 (-1.2%) -2 (-1.2%)
test_transient::get_counter() -32 (-1.4%) -26 (-1.1%) -26 (-1.1%) -26 (-1.1%)
test_loop_storage::get_total() -30 (-1.3%) -15 (-0.7%) -15 (-0.7%) -15 (-0.7%)
test_arrays::set(uint256,uint256) -150 (-0.7%) -147 (-0.7%) -147 (-0.7%) -147 (-0.7%)
test_mappings::nested_set(address,address,uint256) -131 (-0.6%) -115 (-0.5%) -115 (-0.5%) -115 (-0.5%)
test_mappings::map_set(address,uint256) -131 (-0.6%) -113 (-0.5%) -113 (-0.5%) -113 (-0.5%)
test_loop_storage::get_count() -26 (-1.2%) -11 (-0.5%) -11 (-0.5%) -11 (-0.5%)
test_loop_storage::get_last_val() -26 (-1.2%) -11 (-0.5%) -11 (-0.5%) -11 (-0.5%)
test_mappings::counter_inc(address) -128 (-0.6%) -109 (-0.5%) -109 (-0.5%) -109 (-0.5%)
test_loop_storage::reset() -33 (-0.7%) -15 (-0.3%) -15 (-0.3%) -15 (-0.3%)
test_packed_storage::write_subfield_r() -73 (-0.3%) -72 (-0.3%) -70 (-0.3%) -70 (-0.3%)
test_packed_storage::store_and_read_b() -70 (-0.3%) -69 (-0.3%) -67 (-0.3%) -67 (-0.3%)
test_packed_storage::store_and_read_sum() -72 (-0.3%) -71 (-0.3%) -67 (-0.3%) -67 (-0.3%)
test_packed_storage::store_pair_read_b() -70 (-0.3%) -69 (-0.3%) -67 (-0.3%) -67 (-0.3%)
test_packed_storage::store_pair_read_a() -70 (-0.3%) -69 (-0.3%) -67 (-0.3%) -67 (-0.3%)
test_packed_storage::store_and_read_g() -64 (-0.3%) -63 (-0.3%) -61 (-0.3%) -61 (-0.3%)
test_packed_storage::store_and_read_r() -60 (-0.3%) -60 (-0.3%) -60 (-0.3%) -60 (-0.3%)
test_packed_storage::write_subfield_preserves() -59 (-0.3%) -58 (-0.3%) -55 (-0.2%) -55 (-0.2%)
test_mappings::two_keys(address,address,uint256,uint256) -122 (-0.3%) -109 (-0.2%) -109 (-0.2%) -109 (-0.2%)
test_mappings::nested_two_spenders(address,address,address,uint256,uint256) -116 (-0.3%) -106 (-0.2%) -106 (-0.2%) -106 (-0.2%)
test_transient::set_both(uint256,uint256) -33 (-0.1%) -30 (-0.1%) -30 (-0.1%) -30 (-0.1%)
test_transient::inc_counter() -21 (-0.1%) -15 (-0.1%) -15 (-0.1%) -15 (-0.1%)
test_loop_storage::count_up(uint256) -30 (-0.1%) -15 (-0.1%) -15 (-0.1%) -15 (-0.1%)
test_loop_storage::accumulate(uint256) -30 (-0.1%) -15 (-0.1%) -15 (-0.1%) -15 (-0.1%)
test_loop_storage::read_write_loop(uint256) -33 (-0.1%) -18 (-0.0%) -18 (-0.0%) -18 (-0.0%)
test_inline::inline_in_branch(uint256) -48 (-13.6%) 0 (0.0%) 0 (0.0%) 0 (0.0%)
test_logs::emit_two_indexed(address,address,uint256) -10 (-0.0%) +1 (+0.0%) +1 (+0.0%) +1 (+0.0%)
test_logs::emit_one_indexed(uint256,uint256) -7 (-0.0%) +7 (+0.0%) +7 (+0.0%) +7 (+0.0%)
test_logs::emit_three_indexed(uint256,uint256,uint256) -2 (-0.0%) +9 (+0.0%) +9 (+0.0%) +9 (+0.0%)
test_logs::emit_no_indexed(uint256) -2 (-0.0%) +15 (+0.1%) +15 (+0.1%) +15 (+0.1%)
test_logs::get_marker() -11 (-0.5%) +7 (+0.3%) +7 (+0.3%) +7 (+0.3%)
test_inline::add_offset_val() -41 (-16.4%) +1 (+0.9%) +1 (+0.9%) +1 (+0.9%)
test_inline::double_val() 0 (0.0%) +6 (+4.7%) +6 (+4.7%) +6 (+4.7%)
TOTAL -7986 (-1.2%) -7321 (-1.1%) -7180 (-1.1%) -7180 (-1.1%)

Regressions at O3 (7)

Test O3
test_logs::emit_two_indexed(address,address,uint256) +1 (+0.0%)
test_logs::emit_one_indexed(uint256,uint256) +7 (+0.0%)
test_logs::emit_three_indexed(uint256,uint256,uint256) +9 (+0.0%)
test_logs::emit_no_indexed(uint256) +15 (+0.1%)
test_logs::get_marker() +7 (+0.3%)
test_inline::add_offset_val() +1 (+0.9%)
test_inline::double_val() +6 (+4.7%)

@brockelmore brockelmore merged commit d3eab41 into main Mar 10, 2026
13 checks passed
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.

1 participant