Skip to content

perf(evm): resolve jump targets only when a compile needs them - #618

Closed
abmcar wants to merge 2 commits into
DTVMStack:mainfrom
abmcar:perf/evm-jump-targets-on-demand
Closed

abmcar wants to merge 2 commits into
DTVMStack:mainfrom
abmcar:perf/evm-jump-targets-on-demand

Conversation

@abmcar

@abmcar abmcar commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

1. Does this PR affect any open issues?(Y/N) and add issue references (e.g. "fix #123", "re #123".):

  • N
  • Y

2. What is the scope of this PR (e.g. component or file name):

  • buildBytecodeCache and the new resolveJumpTargets in src/evm/evm_cache.{h,cpp}
  • EVMModule::getBytecodeCacheForJIT in src/runtime/evm_module.{h,cpp}, and its two callers in src/compiler/evm_compiler.cpp and src/vm/dt_evmc_vm.cpp
  • docs/modules/evm/cache-build.md and a Light change document

Stacked on #616. The first commit of this PR is #616; only the second commit is new. I will rebase this branch when #616 lands.

3. Provide a description of the PR(e.g. more details, effects, motivations or doc link):

  • Affects user behaviors
  • Contains CI/CD configuration changes
  • Contains documentation changes
  • Contains experimental features
  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Other

buildBytecodeCache resolves the constant JUMP/JUMPI targets of every module with an abstract-stack pass. The resulting table, ResolvedJumpTargets, has two readers: buildCFGEdges in the SPP pipeline, and the JIT front end. A build without SPP returns from buildGasChunksSPP before buildCFGEdges, and the interpreter never reads the table. A module that is only interpreted therefore pays for a pass whose result nothing reads. That is every module in interpreter mode, and in profile-guided JIT mode every module until it is hot enough to be compiled.

This PR moves the pass to the point where a compile needs it:

  • buildBytecodeCache takes a ResolveJumpTargets argument. It defaults to true, so direct callers behave as before, and an SPP build resolves the targets regardless.
  • resolveJumpTargets() fills the table of a cache built without it, with the same result.
  • EVMModule builds a cache without SPP without the table. The new getBytecodeCacheForJIT() completes it, and EVMJITCompiler::compile() reads the cache through that accessor.
  • The profile-guided JIT trigger calls getBytecodeCacheForJIT() before it queues the background compile. The table is therefore filled on the thread that interprets the module, and the compile thread still only reads the cache.

Measured on main at e839f6b plus #616, Release build, on 338 mainnet contracts (5.1 MB of runtime bytecode):

Total over the 338 contracts with #616 this PR change
buildBytecodeCache without SPP 105.3 ms 71.7 ms −31.9%

Each value is the median of 30 in-process repetitions on one pinned core; the ranges are [104.0, 107.3] ms and [70.9, 79.9] ms.

Change document: docs/changes/2026-10-09-evm-jump-targets-on-demand/README.md

4. Are there any breaking changes?(Y/N) and describe the breaking changes(e.g. more details, motivations or doc link):

  • N
  • Y

EVMModule::getBytecodeCache() can now return a cache whose ResolvedJumpTargets is empty. The only reader outside the cache build, the JIT compiler, is moved to getBytecodeCacheForJIT() in this PR.

5. Are there test cases for these changes?(Y/N) select and add more details, references or doc links:

  • Unit test
  • Integration test
  • Benchmark (add benchmark stats below)
  • Manual test (add detailed scripts or steps below)
  • Other

New tests:

  • EVMCacheJumpTargets.DeferredResolutionMatchesEagerBuild: a build without the table leaves it empty and every other field equal to an eager build; resolveJumpTargets() then gives the eager table.
  • EVMCacheJumpTargets.SPPBuildAlwaysResolves: an SPP build resolves the targets even when asked not to.
  • EVMModuleBytecodeCache.JumpTargetsAreResolvedForTheJITOnly: a module loaded for profile-guided JIT has no jump targets in getBytecodeCache(), and getBytecodeCacheForJIT() fills them into the same cache object.

Equivalence on the 338 contracts:

  • Cache: the five other fields are identical with and without the table, and the table resolved later equals the one resolved up front (220,603 targets).
  • JIT code: each contract was loaded as profile-guided JIT loads it (no compile, cache without SPP) and then compiled synchronously. The JIT code bytes are identical whether the targets are resolved at load or on demand (338 of 338). Both behaviours ran in one binary, selected by a temporary environment switch, with address-space randomisation off.

Also checked on this branch:

  • ctest in a Release multipass build with DTVM_TEST_REVISION=Cancun: 14/14 with default arguments, and 14/14 with SPEC_TESTS_ARGS set as in the CI multipass job. This includes evmCacheTests (18 cases), evmDifferentialTests (80), evmInterpTests (275) and evmProfileGuidedJITTests (6), which exercises the trigger path.
  • tools/run_evm_tests.py -r build/dtvm --format evm: 209/209 with -m multipass --enable-evm-gas, and 209/209 with -m interpreter.
  • clang-format 15.0.7 with --dry-run -Werror on the changed files, and git diff --check.

Benchmark method: a temporary gtest case, not part of this PR, calls buildBytecodeCache on each of the 338 bytecode files with EnableSPP = false, once with and once without ResolveJumpTargets, and prints the totals.

6. Release note

Build the interpreter's EVM bytecode cache faster by resolving constant jump targets only when a module is JIT-compiled.

🤖 Generated with Claude Code

abmcar and others added 2 commits October 9, 2026 16:39
buildBytecodeCache called resolveJumpTargetsByAbstractStack twice in a row
with the same arguments: once inside the buildJumpDestMap profile region and
once right after it, clearing the first result in between. The function reads
only the bytecode, the jump-destination map and the metrics table, and writes
only Cache.ResolvedJumpTargets, so the second call rebuilt an identical map.
The duplicate dates from DTVMStack#462, whose comment already says the pass runs once.

Drop the second call. On 338 mainnet contracts (5.1 MB of bytecode) all six
cache fields are identical before and after, with EnableSPP off and on, and
the total cache build time falls from 135.3 ms to 104.9 ms (-22.5%) with SPP
off and from 147.0 ms to 114.8 ms (-21.9%) with SPP on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
buildBytecodeCache resolved the constant jump targets for every module. The
SPP pipeline reads them and so does the JIT front end, but a build without
SPP does not, and neither does the interpreter. Modules that are only
interpreted, in interpreter mode or in profile-guided JIT mode before they
are hot, paid for the abstract-stack pass and never used its result.

Let a build without SPP skip the pass, and add resolveJumpTargets() to run
it later with the same result. EVMModule builds its interpreter-side cache
without the table and completes it in getBytecodeCacheForJIT(), which the
compiler now calls. The profile-guided trigger calls it before it queues a
compile, on the thread that interprets the module, so the compile thread
still only reads the cache. SPP builds and direct callers of
buildBytecodeCache are unchanged.

On 338 mainnet contracts the interpreter-side cache build takes 71.7 ms
instead of 105.3 ms (-31.9%). The other five cache fields are identical,
the table resolved later equals the one resolved up front, and the JIT code
of a module loaded for profile-guided JIT and then compiled is
byte-identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 9, 2026 11:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown

⚡ Performance Regression Check Results

✅ Performance Check Passed (interpreter)

Performance Benchmark Results (threshold: 25%)

Benchmark Baseline (us) Current (us) Change Status
total/main/blake2b_huff/8415nulls 2.61 2.47 -5.6% PASS
total/main/blake2b_huff/empty 0.04 0.04 +7.0% PASS
total/main/blake2b_shifts/8415nulls 13.74 13.75 +0.1% PASS
total/main/sha1_divs/5311 7.90 7.92 +0.2% PASS
total/main/sha1_divs/empty 0.10 0.10 +1.2% PASS
total/main/sha1_shifts/5311 5.30 5.56 +4.9% PASS
total/main/sha1_shifts/empty 0.04 0.04 -0.4% PASS
total/main/snailtracer/benchmark 89.49 85.55 -4.4% PASS
total/main/structarray_alloc/nfts_rank 1.19 1.16 -3.0% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 -0.1% PASS
total/main/swap_math/received 0.01 0.01 +2.6% PASS
total/main/swap_math/spent 0.01 0.01 -1.1% PASS
total/main/weierstrudel/1 0.30 0.32 +5.7% PASS
total/main/weierstrudel/15 3.33 3.36 +0.8% PASS
total/micro/JUMPDEST_n0/empty 2.64 2.64 +0.1% PASS
total/micro/jump_around/empty 0.12 0.11 -4.2% PASS
total/micro/loop_with_many_jumpdests/empty 69.46 69.23 -0.3% PASS
total/micro/memory_grow_mload/by1 0.18 0.17 -5.5% PASS
total/micro/memory_grow_mload/by16 0.19 0.19 -0.3% PASS
total/micro/memory_grow_mload/by32 0.11 0.11 -0.7% PASS
total/micro/memory_grow_mload/nogrow 0.09 0.09 +1.3% PASS
total/micro/memory_grow_mstore/by1 0.18 0.19 +1.4% PASS
total/micro/memory_grow_mstore/by16 0.11 0.11 +0.7% PASS
total/micro/memory_grow_mstore/by32 0.22 0.23 +5.2% PASS
total/micro/memory_grow_mstore/nogrow 0.18 0.18 -3.1% PASS
total/micro/signextend/one 0.25 0.25 +0.4% PASS
total/micro/signextend/zero 0.46 0.46 -0.5% PASS
total/synth/ADD/b0 2.01 2.01 -0.0% PASS
total/synth/ADD/b1 2.74 2.74 +0.0% PASS
total/synth/ADDRESS/a0 6.18 6.32 +2.3% PASS
total/synth/ADDRESS/a1 5.20 5.19 -0.2% PASS
total/synth/AND/b0 2.16 2.16 -0.1% PASS
total/synth/AND/b1 2.30 2.44 +5.9% PASS
total/synth/BYTE/b0 6.15 6.13 -0.4% PASS
total/synth/BYTE/b1 8.45 8.56 +1.5% PASS
total/synth/CALLDATASIZE/a0 5.56 5.45 -1.9% PASS
total/synth/CALLDATASIZE/a1 3.46 3.51 +1.3% PASS
total/synth/CALLER/a0 6.05 6.05 -0.0% PASS
total/synth/CALLER/a1 6.33 6.43 +1.7% PASS
total/synth/CALLVALUE/a0 3.36 3.36 -0.2% PASS
total/synth/CALLVALUE/a1 5.93 6.24 +5.3% PASS
total/synth/CODESIZE/a0 6.04 5.99 -0.8% PASS
total/synth/CODESIZE/a1 6.03 6.74 +11.9% PASS
total/synth/DUP1/d0 1.71 1.67 -2.3% PASS
total/synth/DUP1/d1 2.01 2.03 +1.3% PASS
total/synth/DUP10/d0 1.70 1.64 -3.2% PASS
total/synth/DUP10/d1 1.95 1.99 +2.1% PASS
total/synth/DUP11/d0 1.23 1.01 -17.8% PASS
total/synth/DUP11/d1 1.95 2.02 +3.7% PASS
total/synth/DUP12/d0 1.70 1.78 +4.7% PASS
total/synth/DUP12/d1 1.17 1.23 +5.4% PASS
total/synth/DUP13/d0 1.68 1.73 +2.8% PASS
total/synth/DUP13/d1 1.92 1.89 -1.7% PASS
total/synth/DUP14/d0 1.02 1.23 +20.8% PASS
total/synth/DUP14/d1 1.98 1.99 +0.8% PASS
total/synth/DUP15/d0 1.66 1.78 +7.0% PASS
total/synth/DUP15/d1 1.17 1.23 +5.5% PASS
total/synth/DUP16/d0 1.68 1.72 +2.2% PASS
total/synth/DUP16/d1 1.91 1.91 +0.2% PASS
total/synth/DUP2/d0 1.23 1.23 +0.1% PASS
total/synth/DUP2/d1 1.92 1.99 +3.4% PASS
total/synth/DUP3/d0 1.67 1.67 +0.0% PASS
total/synth/DUP3/d1 1.17 1.23 +5.4% PASS
total/synth/DUP4/d0 1.79 1.65 -7.8% PASS
total/synth/DUP4/d1 2.00 1.95 -2.5% PASS
total/synth/DUP5/d0 1.23 1.23 +0.3% PASS
total/synth/DUP5/d1 1.94 2.06 +5.9% PASS
total/synth/DUP6/d0 1.71 1.66 -3.0% PASS
total/synth/DUP6/d1 1.23 1.23 -0.3% PASS
total/synth/DUP7/d0 1.77 1.72 -2.9% PASS
total/synth/DUP7/d1 1.84 1.99 +8.2% PASS
total/synth/DUP8/d0 1.23 1.23 -0.1% PASS
total/synth/DUP8/d1 1.89 1.94 +2.6% PASS
total/synth/DUP9/d0 1.68 1.68 -0.1% PASS
total/synth/DUP9/d1 1.24 1.23 -0.6% PASS
total/synth/EQ/b0 4.54 4.49 -1.1% PASS
total/synth/EQ/b1 4.99 4.94 -1.1% PASS
total/synth/GAS/a0 3.77 3.75 -0.4% PASS
total/synth/GAS/a1 6.82 7.23 +6.1% PASS
total/synth/GT/b0 4.81 4.83 +0.4% PASS
total/synth/GT/b1 4.93 4.88 -1.1% PASS
total/synth/ISZERO/u0 7.09 7.02 -1.1% PASS
total/synth/JUMPDEST/n0 2.64 2.64 -0.1% PASS
total/synth/LT/b0 4.81 4.79 -0.4% PASS
total/synth/LT/b1 4.26 4.25 -0.2% PASS
total/synth/MSIZE/a0 5.32 5.43 +2.1% PASS
total/synth/MSIZE/a1 5.71 5.75 +0.6% PASS
total/synth/MUL/b0 5.51 5.54 +0.6% PASS
total/synth/MUL/b1 5.25 5.22 -0.4% PASS
total/synth/NOT/u0 1.91 1.98 +3.7% PASS
total/synth/OR/b0 2.14 2.28 +6.8% PASS
total/synth/OR/b1 1.68 1.63 -2.5% PASS
total/synth/PC/a0 5.17 5.53 +7.0% PASS
total/synth/PC/a1 3.43 3.45 +0.5% PASS
total/synth/PUSH1/p0 1.90 1.79 -5.7% PASS
total/synth/PUSH1/p1 1.71 1.71 -0.0% PASS
total/synth/PUSH10/p0 1.91 1.84 -3.8% PASS
total/synth/PUSH10/p1 1.72 1.72 -0.3% PASS
total/synth/PUSH11/p0 1.77 1.78 +0.5% PASS
total/synth/PUSH11/p1 2.26 2.12 -6.5% PASS
total/synth/PUSH12/p0 1.25 1.24 -0.8% PASS
total/synth/PUSH12/p1 2.08 2.12 +2.1% PASS
total/synth/PUSH13/p0 1.81 1.76 -3.0% PASS
total/synth/PUSH13/p1 1.71 1.71 +0.0% PASS
total/synth/PUSH14/p0 2.00 1.98 -0.7% PASS
total/synth/PUSH14/p1 2.16 2.30 +6.1% PASS
total/synth/PUSH15/p0 1.25 1.24 -0.6% PASS
total/synth/PUSH15/p1 2.28 2.41 +6.1% PASS
total/synth/PUSH16/p0 1.83 1.84 +0.5% PASS
total/synth/PUSH16/p1 1.73 1.72 -0.9% PASS
total/synth/PUSH17/p0 1.92 1.87 -2.9% PASS
total/synth/PUSH17/p1 2.15 2.29 +6.8% PASS
total/synth/PUSH18/p0 1.24 1.24 -0.5% PASS
total/synth/PUSH18/p1 2.13 2.16 +1.3% PASS
total/synth/PUSH19/p0 1.80 1.93 +7.4% PASS
total/synth/PUSH19/p1 1.72 1.74 +1.3% PASS
total/synth/PUSH2/p0 1.72 1.76 +2.6% PASS
total/synth/PUSH2/p1 2.06 2.15 +4.4% PASS
total/synth/PUSH20/p0 1.86 1.80 -3.2% PASS
total/synth/PUSH20/p1 2.19 2.16 -1.3% PASS
total/synth/PUSH21/p0 1.24 1.22 -1.3% PASS
total/synth/PUSH21/p1 2.12 2.16 +1.7% PASS
total/synth/PUSH22/p0 1.84 1.85 +0.3% PASS
total/synth/PUSH22/p1 1.72 1.75 +1.7% PASS
total/synth/PUSH23/p0 1.78 1.90 +6.7% PASS
total/synth/PUSH23/p1 2.28 2.38 +4.6% PASS
total/synth/PUSH24/p0 1.24 1.23 -0.8% PASS
total/synth/PUSH24/p1 2.15 2.26 +5.1% PASS
total/synth/PUSH25/p0 1.78 1.79 +0.3% PASS
total/synth/PUSH25/p1 1.72 1.74 +1.4% PASS
total/synth/PUSH26/p0 1.79 1.78 -0.8% PASS
total/synth/PUSH26/p1 2.16 2.13 -1.3% PASS
total/synth/PUSH27/p0 1.25 1.25 -0.6% PASS
total/synth/PUSH27/p1 2.23 2.20 -1.1% PASS
total/synth/PUSH28/p0 1.80 1.79 -0.2% PASS
total/synth/PUSH28/p1 1.75 1.72 -1.4% PASS
total/synth/PUSH29/p0 1.93 1.80 -6.4% PASS
total/synth/PUSH29/p1 2.08 2.37 +13.8% PASS
total/synth/PUSH3/p0 1.24 1.24 -0.2% PASS
total/synth/PUSH3/p1 2.18 2.21 +1.3% PASS
total/synth/PUSH30/p0 1.29 1.29 -0.5% PASS
total/synth/PUSH30/p1 2.12 2.25 +6.1% PASS
total/synth/PUSH31/p0 1.83 1.79 -2.3% PASS
total/synth/PUSH31/p1 1.75 1.73 -1.3% PASS
total/synth/PUSH32/p0 1.76 1.92 +8.6% PASS
total/synth/PUSH32/p1 2.19 2.22 +1.2% PASS
total/synth/PUSH4/p0 1.78 1.78 +0.0% PASS
total/synth/PUSH4/p1 1.72 1.72 -0.4% PASS
total/synth/PUSH5/p0 1.78 1.75 -1.7% PASS
total/synth/PUSH5/p1 2.12 2.20 +4.3% PASS
total/synth/PUSH6/p0 1.25 1.24 -1.3% PASS
total/synth/PUSH6/p1 2.16 2.16 +0.1% PASS
total/synth/PUSH7/p0 1.78 1.76 -0.7% PASS
total/synth/PUSH7/p1 1.73 1.72 -0.7% PASS
total/synth/PUSH8/p0 1.79 1.86 +3.9% PASS
total/synth/PUSH8/p1 2.23 2.18 -2.3% PASS
total/synth/PUSH9/p0 1.24 1.24 -0.5% PASS
total/synth/PUSH9/p1 2.17 2.20 +1.6% PASS
total/synth/RETURNDATASIZE/a0 3.56 3.52 -1.2% PASS
total/synth/RETURNDATASIZE/a1 6.04 6.42 +6.3% PASS
total/synth/SAR/b0 3.94 3.95 +0.1% PASS
total/synth/SAR/b1 7.43 7.19 -3.3% PASS
total/synth/SGT/b0 3.62 3.63 +0.2% PASS
total/synth/SGT/b1 3.30 3.28 -0.7% PASS
total/synth/SHL/b0 3.76 3.79 +0.8% PASS
total/synth/SHL/b1 1.84 1.80 -1.8% PASS
total/synth/SHR/b0 3.75 3.79 +1.0% PASS
total/synth/SHR/b1 3.11 3.13 +0.6% PASS
total/synth/SIGNEXTEND/b0 3.44 3.25 -5.4% PASS
total/synth/SIGNEXTEND/b1 6.89 6.76 -1.9% PASS
total/synth/SLT/b0 3.42 3.42 -0.1% PASS
total/synth/SLT/b1 3.77 3.77 -0.1% PASS
total/synth/SUB/b0 2.57 2.54 -1.2% PASS
total/synth/SUB/b1 2.72 2.68 -1.3% PASS
total/synth/SWAP1/s0 1.55 1.51 -3.1% PASS
total/synth/SWAP10/s0 1.52 1.53 +0.2% PASS
total/synth/SWAP11/s0 2.77 2.72 -1.8% PASS
total/synth/SWAP12/s0 2.65 2.64 -0.3% PASS
total/synth/SWAP13/s0 1.53 1.53 -0.1% PASS
total/synth/SWAP14/s0 2.75 2.68 -2.5% PASS
total/synth/SWAP15/s0 2.74 2.66 -2.8% PASS
total/synth/SWAP16/s0 1.53 1.53 -0.0% PASS
total/synth/SWAP2/s0 2.69 2.68 -0.2% PASS
total/synth/SWAP3/s0 2.63 2.67 +1.5% PASS
total/synth/SWAP4/s0 1.51 1.51 -0.1% PASS
total/synth/SWAP5/s0 2.65 2.66 +0.7% PASS
total/synth/SWAP6/s0 2.64 2.73 +3.2% PASS
total/synth/SWAP7/s0 1.52 1.52 -0.0% PASS
total/synth/SWAP8/s0 2.69 2.68 -0.2% PASS
total/synth/SWAP9/s0 2.64 2.67 +1.1% PASS
total/synth/XOR/b0 1.99 2.01 +1.2% PASS
total/synth/XOR/b1 2.11 2.10 -0.3% PASS
total/synth/loop_v1 8.65 8.50 -1.7% PASS
total/synth/loop_v2 8.75 8.62 -1.5% PASS

Summary: 194 benchmarks, 0 regressions


✅ Performance Check Passed (multipass)

Performance Benchmark Results (threshold: 25%)

Benchmark Baseline (us) Current (us) Change Status
total/main/blake2b_huff/8415nulls 1.39 1.29 -7.3% PASS
total/main/blake2b_huff/empty 0.02 0.02 +0.5% PASS
total/main/blake2b_shifts/8415nulls 4.32 4.35 +0.8% PASS
total/main/sha1_divs/5311 0.84 0.84 +0.2% PASS
total/main/sha1_divs/empty 0.01 0.01 +0.0% PASS
total/main/sha1_shifts/5311 0.76 0.78 +3.0% PASS
total/main/sha1_shifts/empty 0.01 0.01 +0.3% PASS
total/main/snailtracer/benchmark 48.18 47.04 -2.4% PASS
total/main/structarray_alloc/nfts_rank 0.27 0.27 +0.1% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 +5.9% PASS
total/main/swap_math/received 0.01 0.01 +0.5% PASS
total/main/swap_math/spent 0.00 0.00 -1.1% PASS
total/main/weierstrudel/1 0.33 0.33 +1.1% PASS
total/main/weierstrudel/15 3.62 3.64 +0.6% PASS
total/micro/JUMPDEST_n0/empty 0.00 0.00 +0.5% PASS
total/micro/jump_around/empty 0.07 0.07 -1.8% PASS
total/micro/loop_with_many_jumpdests/empty 0.01 0.01 -2.6% PASS
total/micro/memory_grow_mload/by1 0.02 0.02 -7.9% PASS
total/micro/memory_grow_mload/by16 0.02 0.02 -8.7% PASS
total/micro/memory_grow_mload/by32 0.01 0.01 -0.6% PASS
total/micro/memory_grow_mload/nogrow 0.01 0.01 +1.6% PASS
total/micro/memory_grow_mstore/by1 0.02 0.02 -5.0% PASS
total/micro/memory_grow_mstore/by16 0.01 0.01 +0.7% PASS
total/micro/memory_grow_mstore/by32 0.02 0.02 -1.3% PASS
total/micro/memory_grow_mstore/nogrow 0.02 0.02 +1.2% PASS
total/micro/signextend/one 0.01 0.01 +0.2% PASS
total/micro/signextend/zero 0.01 0.01 -3.4% PASS
total/synth/ADD/b0 0.00 0.00 +0.6% PASS
total/synth/ADD/b1 0.00 0.00 -0.7% PASS
total/synth/ADDRESS/a0 0.22 0.22 -0.9% PASS
total/synth/ADDRESS/a1 0.15 0.15 +1.2% PASS
total/synth/AND/b0 0.00 0.00 +0.7% PASS
total/synth/AND/b1 0.00 0.00 -4.0% PASS
total/synth/BYTE/b0 0.00 0.00 +1.0% PASS
total/synth/BYTE/b1 0.00 0.00 -0.8% PASS
total/synth/CALLDATASIZE/a0 0.12 0.12 -0.3% PASS
total/synth/CALLDATASIZE/a1 0.07 0.07 +0.2% PASS
total/synth/CALLER/a0 0.23 0.23 -2.4% PASS
total/synth/CALLER/a1 0.23 0.25 +11.2% PASS
total/synth/CALLVALUE/a0 0.19 0.19 -0.3% PASS
total/synth/CALLVALUE/a1 0.33 0.29 -12.7% PASS
total/synth/CODESIZE/a0 0.12 0.12 -0.5% PASS
total/synth/CODESIZE/a1 0.12 0.12 -2.5% PASS
total/synth/DUP1/d0 0.00 0.00 -1.8% PASS
total/synth/DUP1/d1 0.00 0.00 -0.1% PASS
total/synth/DUP10/d0 0.00 0.00 -0.8% PASS
total/synth/DUP10/d1 0.00 0.00 +0.2% PASS
total/synth/DUP11/d0 0.00 0.00 -0.1% PASS
total/synth/DUP11/d1 0.00 0.00 -0.1% PASS
total/synth/DUP12/d0 0.00 0.00 -0.5% PASS
total/synth/DUP12/d1 0.00 0.00 -0.2% PASS
total/synth/DUP13/d0 0.00 0.00 +0.6% PASS
total/synth/DUP13/d1 0.00 0.00 -1.1% PASS
total/synth/DUP14/d0 0.00 0.00 +0.2% PASS
total/synth/DUP14/d1 0.00 0.00 +0.6% PASS
total/synth/DUP15/d0 0.00 0.00 -0.1% PASS
total/synth/DUP15/d1 0.00 0.00 +0.7% PASS
total/synth/DUP16/d0 0.00 0.00 -1.2% PASS
total/synth/DUP16/d1 0.00 0.00 +1.7% PASS
total/synth/DUP2/d0 0.00 0.00 +0.4% PASS
total/synth/DUP2/d1 0.00 0.00 +1.0% PASS
total/synth/DUP3/d0 0.00 0.00 -1.0% PASS
total/synth/DUP3/d1 0.00 0.00 +0.6% PASS
total/synth/DUP4/d0 0.00 0.00 -0.8% PASS
total/synth/DUP4/d1 0.00 0.00 -0.8% PASS
total/synth/DUP5/d0 0.00 0.00 +0.3% PASS
total/synth/DUP5/d1 0.00 0.00 +0.6% PASS
total/synth/DUP6/d0 0.00 0.00 -0.7% PASS
total/synth/DUP6/d1 0.00 0.00 +0.6% PASS
total/synth/DUP7/d0 0.00 0.00 +2.5% PASS
total/synth/DUP7/d1 0.00 0.00 -0.9% PASS
total/synth/DUP8/d0 0.00 0.00 +0.5% PASS
total/synth/DUP8/d1 0.00 0.00 +1.7% PASS
total/synth/DUP9/d0 0.00 0.00 -2.0% PASS
total/synth/DUP9/d1 0.00 0.00 +0.4% PASS
total/synth/EQ/b0 0.00 0.00 -1.1% PASS
total/synth/EQ/b1 0.00 0.00 +0.3% PASS
total/synth/GAS/a0 0.76 0.77 +0.2% PASS
total/synth/GAS/a1 0.93 0.92 -1.0% PASS
total/synth/GT/b0 0.00 0.00 -0.6% PASS
total/synth/GT/b1 0.00 0.00 -0.6% PASS
total/synth/ISZERO/u0 0.00 0.00 -0.5% PASS
total/synth/JUMPDEST/n0 0.00 0.00 +1.4% PASS
total/synth/LT/b0 0.00 0.00 +0.1% PASS
total/synth/LT/b1 0.00 0.00 +0.9% PASS
total/synth/MSIZE/a0 0.00 0.00 -0.6% PASS
total/synth/MSIZE/a1 0.00 0.00 +0.9% PASS
total/synth/MUL/b0 0.00 0.00 -1.0% PASS
total/synth/MUL/b1 0.00 0.00 +0.3% PASS
total/synth/NOT/u0 0.00 0.00 -0.2% PASS
total/synth/OR/b0 0.00 0.00 -1.3% PASS
total/synth/OR/b1 0.00 0.00 +0.6% PASS
total/synth/PC/a0 0.00 0.00 +0.2% PASS
total/synth/PC/a1 0.00 0.00 +0.4% PASS
total/synth/PUSH1/p0 0.00 0.00 +0.2% PASS
total/synth/PUSH1/p1 0.00 0.00 +0.4% PASS
total/synth/PUSH10/p0 0.00 0.00 +6.2% PASS
total/synth/PUSH10/p1 0.00 0.00 +1.7% PASS
total/synth/PUSH11/p0 0.00 0.00 +3.7% PASS
total/synth/PUSH11/p1 0.00 0.00 -1.5% PASS
total/synth/PUSH12/p0 0.00 0.00 -0.3% PASS
total/synth/PUSH12/p1 0.00 0.00 -1.4% PASS
total/synth/PUSH13/p0 0.00 0.00 -0.9% PASS
total/synth/PUSH13/p1 0.00 0.00 +1.1% PASS
total/synth/PUSH14/p0 0.00 0.00 +0.2% PASS
total/synth/PUSH14/p1 0.00 0.00 -1.3% PASS
total/synth/PUSH15/p0 0.00 0.00 +0.2% PASS
total/synth/PUSH15/p1 0.00 0.00 -2.5% PASS
total/synth/PUSH16/p0 0.00 0.00 +1.5% PASS
total/synth/PUSH16/p1 0.00 0.00 +0.0% PASS
total/synth/PUSH17/p0 0.00 0.00 -2.8% PASS
total/synth/PUSH17/p1 0.00 0.00 -1.1% PASS
total/synth/PUSH18/p0 0.00 0.00 +1.7% PASS
total/synth/PUSH18/p1 0.00 0.00 -0.1% PASS
total/synth/PUSH19/p0 0.00 0.00 +3.1% PASS
total/synth/PUSH19/p1 0.00 0.00 +0.7% PASS
total/synth/PUSH2/p0 0.00 0.00 +0.2% PASS
total/synth/PUSH2/p1 0.00 0.00 -0.8% PASS
total/synth/PUSH20/p0 0.00 0.00 +0.5% PASS
total/synth/PUSH20/p1 0.00 0.00 +0.6% PASS
total/synth/PUSH21/p0 0.00 0.00 +0.3% PASS
total/synth/PUSH21/p1 0.00 0.00 -6.8% PASS
total/synth/PUSH22/p0 1.78 1.71 -3.7% PASS
total/synth/PUSH22/p1 1.73 1.84 +6.4% PASS
total/synth/PUSH23/p0 1.69 1.71 +0.8% PASS
total/synth/PUSH23/p1 2.02 1.99 -1.2% PASS
total/synth/PUSH24/p0 1.24 1.44 +16.5% PASS
total/synth/PUSH24/p1 1.99 1.99 +0.2% PASS
total/synth/PUSH25/p0 1.69 1.73 +2.2% PASS
total/synth/PUSH25/p1 1.73 1.85 +7.1% PASS
total/synth/PUSH26/p0 1.73 1.69 -2.0% PASS
total/synth/PUSH26/p1 2.02 1.93 -4.2% PASS
total/synth/PUSH27/p0 1.25 1.44 +14.8% PASS
total/synth/PUSH27/p1 2.07 2.00 -3.5% PASS
total/synth/PUSH28/p0 1.73 1.75 +0.7% PASS
total/synth/PUSH28/p1 1.73 1.85 +6.6% PASS
total/synth/PUSH29/p0 1.72 1.88 +9.4% PASS
total/synth/PUSH29/p1 1.97 2.03 +2.8% PASS
total/synth/PUSH3/p0 0.00 0.00 +0.6% PASS
total/synth/PUSH3/p1 0.00 0.00 +0.7% PASS
total/synth/PUSH30/p0 1.31 1.48 +13.6% PASS
total/synth/PUSH30/p1 2.03 2.02 -0.6% PASS
total/synth/PUSH31/p0 1.72 1.71 -0.3% PASS
total/synth/PUSH31/p1 1.75 1.88 +7.3% PASS
total/synth/PUSH32/p0 1.69 1.76 +3.9% PASS
total/synth/PUSH32/p1 1.99 2.01 +1.1% PASS
total/synth/PUSH4/p0 0.00 0.00 -3.6% PASS
total/synth/PUSH4/p1 0.00 0.00 +0.8% PASS
total/synth/PUSH5/p0 0.00 0.00 +1.7% PASS
total/synth/PUSH5/p1 0.00 0.00 -4.8% PASS
total/synth/PUSH6/p0 0.00 0.00 +1.6% PASS
total/synth/PUSH6/p1 0.00 0.00 -2.1% PASS
total/synth/PUSH7/p0 0.00 0.00 +3.0% PASS
total/synth/PUSH7/p1 0.00 0.00 +0.3% PASS
total/synth/PUSH8/p0 0.00 0.00 -0.8% PASS
total/synth/PUSH8/p1 0.00 0.00 -1.7% PASS
total/synth/PUSH9/p0 0.00 0.00 +0.4% PASS
total/synth/PUSH9/p1 0.00 0.00 -5.6% PASS
total/synth/RETURNDATASIZE/a0 0.03 0.03 +0.5% PASS
total/synth/RETURNDATASIZE/a1 0.06 0.06 +7.9% PASS
total/synth/SAR/b0 0.00 0.00 -0.3% PASS
total/synth/SAR/b1 0.00 0.00 -0.4% PASS
total/synth/SGT/b0 0.00 0.00 -1.2% PASS
total/synth/SGT/b1 0.00 0.00 +0.5% PASS
total/synth/SHL/b0 0.00 0.00 -0.7% PASS
total/synth/SHL/b1 0.00 0.00 +0.4% PASS
total/synth/SHR/b0 0.00 0.00 -0.7% PASS
total/synth/SHR/b1 0.00 0.00 +1.4% PASS
total/synth/SIGNEXTEND/b0 0.00 0.00 +0.6% PASS
total/synth/SIGNEXTEND/b1 0.00 0.00 -1.1% PASS
total/synth/SLT/b0 0.00 0.00 +0.2% PASS
total/synth/SLT/b1 0.00 0.00 -0.7% PASS
total/synth/SUB/b0 0.00 0.00 -0.3% PASS
total/synth/SUB/b1 0.00 0.00 -2.2% PASS
total/synth/SWAP1/s0 0.00 0.00 +0.1% PASS
total/synth/SWAP10/s0 0.00 0.00 +0.7% PASS
total/synth/SWAP11/s0 0.00 0.00 -1.7% PASS
total/synth/SWAP12/s0 0.00 0.00 -2.3% PASS
total/synth/SWAP13/s0 0.00 0.00 -0.1% PASS
total/synth/SWAP14/s0 0.00 0.00 -1.3% PASS
total/synth/SWAP15/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP16/s0 0.00 0.00 -0.1% PASS
total/synth/SWAP2/s0 0.00 0.00 -0.5% PASS
total/synth/SWAP3/s0 0.00 0.00 -0.4% PASS
total/synth/SWAP4/s0 0.00 0.00 +0.6% PASS
total/synth/SWAP5/s0 0.00 0.00 +0.3% PASS
total/synth/SWAP6/s0 0.00 0.00 -0.6% PASS
total/synth/SWAP7/s0 0.00 0.00 +0.7% PASS
total/synth/SWAP8/s0 0.00 0.00 -0.5% PASS
total/synth/SWAP9/s0 0.00 0.00 +0.0% PASS
total/synth/XOR/b0 0.00 0.00 -1.2% PASS
total/synth/XOR/b1 0.00 0.00 -0.5% PASS
total/synth/loop_v1 8.29 8.23 -0.6% PASS
total/synth/loop_v2 8.51 8.29 -1.2% PASS

Summary: 194 benchmarks, 0 regressions


@abmcar

abmcar commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Closing: #615 reworks buildBytecodeCache and its signature, and this change would conflict with it.

@abmcar abmcar closed this Oct 11, 2026
@abmcar
abmcar deleted the perf/evm-jump-targets-on-demand branch October 11, 2026 07:06
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