Skip to content

ci(ci): cache baseline lib instead of baseline JSON - #506

Merged
zoowii merged 4 commits into
DTVMStack:mainfrom
abmcar:ci/perf-baseline-lib-cache
May 15, 2026
Merged

ci(ci): cache baseline lib instead of baseline JSON#506
zoowii merged 4 commits into
DTVMStack:mainfrom
abmcar:ci/perf-baseline-lib-cache

Conversation

@abmcar

@abmcar abmcar commented May 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Switch the Performance Regression Check job (.github/workflows/dtvm_evm_test_x86.yml) from caching the baseline benchmark output JSON to caching the built baseline libdtvmapi.so. Every PR then re-runs baseline benchmarks on the same runner that runs the PR benchmarks, eliminating cross-runner cache-stale noise.

Also fixes a separate cp build/lib/* bug in the same step that dereferenced the SONAME symlink chain and produced 3 full copies (~105 MB) of the .so plus any libgtest*.a matches. Replaced with cp "$(readlink -f build/lib/libdtvmapi.so)" /tmp/baseline_lib/libdtvmapi.so.

Full design doc: docs/changes/2026-05-15-perf-check-baseline-lib-cache/README.md (added in commit 190c0f9).

Motivation

PR #493 (perf-baseline-interpreter-c644fbecb1a49051a62c6fd8bd3f2d7bb807b514 cache hit) reported a cluster of synth-bench interpreter regressions:

Benchmark CI delta
synth/EQ/b1 +18.3%
synth/CALLER/a1 +16.0%
synth/ISZERO/u0 +15.7%
synth/LT/b1 +15.3%
synth/GT/b1 +15.2%
synth/ADDRESS/a1 +15.6%
synth/BYTE/b1 +13.7%

The PR's diff was 100% compiler-side (src/compiler/evm_frontend/* + src/action/evm_bytecode_visitor.h, where EVMByteCodeVisitor is only instantiated by evm_mir_compiler.cpp:97 and the interpreter never reaches it). Local same-machine A-B-A on those exact benches reported deltas inside the baseline self-drift band (≤ 0.6%). The CI deltas were cross-runner cache-stale measurements.

Root cause: the actions/cache@v4 step keyed /tmp/perf_baseline_${mode}.json on pull_request.base.sha, so two PRs with the same base.sha compared the current PR's freshly-run benchmark against a JSON the first PR's CI runner produced — ubuntu-latest runners are heterogeneous (different CPU steppings, neighbor load, thermal state), and synth microbenchmarks (1-10 µs scale) are exactly where cross-runner variance is largest.

The .ci/run_test_suite.sh:312-334 dispatcher already had the right code path — the elif [ -n "$BENCHMARK_BASELINE_LIB" ] branch builds the baseline lib once and benches it on the current runner. This PR makes the workflow always take that path by:

  1. Caching the built libdtvmapi.so instead of the bench output JSON.
  2. Dropping the BENCHMARK_BASELINE_CACHE env var so the bash dispatcher falls through to the elif branch on both cache-hit and cache-miss.

The cache is now content-deterministic for a given base.sha: two PRs hitting the same key restore byte-identical .so files and each runs its own baseline bench locally.

Verification

Tested on the personal fork (abmcar/DTVM) before opening here:

Cache-miss run (abmcar/DTVM run 25897744713, after re-running 3 transient spdlog-503 download failures):

  • Both Performance Regression Check (interpreter) and (multipass) reported Cache not found for input keys: perf-baseline-lib-<mode>-c644fbe...
  • Build baseline library step ran; /tmp/baseline_lib/ ended with a single SONAME-resolved real file
  • Bench step ran baseline bench + PR bench in sequence on the same runner
  • Cache saved at end of job
  • Both modes: Total benchmarks: 194 / Regressions (> 25%): 0 / RESULT: PASS

Cache-hit run (abmcar/DTVM run 25900131271, commit 8189d4d is a comment-only no-op bumping head.sha while base.sha stays at c644fbe):

  • Both perf-check matrix jobs reported Cache restored from key: perf-baseline-lib-<mode>-c644fbe...
  • Build baseline library step skipped (per if: cache-hit != 'true' evaluating false)
  • Bench step still ran baseline bench + PR bench (per the dispatcher's elif branch)
  • 11/11 non-Lint EVM jobs green on first try, no transient retries
  • Both modes again: Total benchmarks: 194 / Regressions (> 25%): 0 / RESULT: PASS

Cross-runner noise reduction (same synth benches that triggered this investigation, observed on the same-runner cache-miss run):

Benchmark Old CI delta Same-runner delta
synth/ADDRESS/a1 +15.6% −4.3%
synth/BYTE/b1 +13.7% +1.2%
synth/CALLER/a1 +16.0% +0.1%
synth/ISZERO/u0 +15.7% +0.6%
synth/LT/b1 +15.3% (within noise)
synth/GT/b1 +15.2% (within noise)
snailtracer/benchmark (macro) −1.1% +0.0%
blake2b_shifts/8415nulls (macro) −12.1% +0.2%

Only 1 micro-benchmark was filtered by the baseline < 5 µs gate, versus 25 in the cross-runner cache-stale comparison.

Trade-offs

  • Cache-hit runs now also do a baseline bench (~one additional bench pass per mode). Cache-miss runs are unchanged.
  • The cache key still includes ${matrix.mode} and ${base.sha}; the renamed key (perf-baseline-lib-...) orphans old perf-baseline-... entries, which expire under GitHub's 7-day LRU.
  • Container tag dtvmdev1/dtvm-dev-x64:main is not part of the cache key. If the container's compiler version changes, a cached .so could be from a different code-gen profile. This risk already existed with the JSON cache and is unchanged. Pinning the container by digest or adding it to the cache key is a separate hardening, out of scope here.

Test plan

  • YAML syntax (python3 -c "import yaml; yaml.safe_load(...)")
  • tools/format.sh check clean
  • Fork CI cache-miss run: both modes PASS
  • Fork CI cache-hit run: both modes PASS, Build baseline library correctly skipped
  • Cross-runner noise reduction empirically observed
  • CI green on this upstream PR

abmcar and others added 3 commits May 15, 2026 10:54
Change the Performance Regression Check job's cache from
`/tmp/perf_baseline_${mode}.json` (the benchmark output JSON, which encoded
*measurements* made on whatever runner first populated the cache for a given
base.sha) to `/tmp/baseline_lib` (the built baseline `libdtvmapi.so`, a
deterministic function of base.sha alone).

Effect: every PR perf-check job now re-runs baseline benchmarks on the same
ubuntu-latest runner that runs the PR benchmarks, eliminating cross-runner
cache-stale noise. The cache-miss path was already same-runner A-B
(`.ci/run_test_suite.sh:312-334` `elif [ -n "$BENCHMARK_BASELINE_LIB" ]`
branch); this change makes cache-hit follow the same dispatch by dropping
the BENCHMARK_BASELINE_CACHE export.

Empirical motivation (PR DTVMStack#493 commit 5c11550 interpreter perf-check, CI
cache hit on base.sha=c644fbe): CI reported +13-18% regressions on 7 synth
benchmarks; local same-machine A-B-A reported all deltas inside the
baseline self-drift band (max +0.6%). The PR's diff was 100% compiler-only,
no `src/evm/` files, so the CI deltas were entirely cross-runner noise.

Also fixes a separate bug in the baseline-build step: `cp build/lib/*`
dereferences the SONAME symlink chain (`libdtvmapi.so` -> `.0.1` -> `.0.1.0`)
producing 3 full copies (~105 MB) plus any libgtest*.a present, instead of
the single ~35 MB real file. Replaced with `cp "$(readlink -f
build/lib/libdtvmapi.so)" /tmp/baseline_lib/libdtvmapi.so`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add an in-source comment block in front of the perf-check Restore step so
the rationale is discoverable from the workflow file directly. The bench
JSON encodes runner-specific measurements; caching it across runners is
what produced PR DTVMStack#493's spurious +15% interpreter "regressions". Caching
the deterministic build output instead forces same-runner A-B comparison.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Promotes ~/changes/2026-05-15-perf-check-baseline-lib-cache/README.md into
the project's docs/changes/ tree as part of opening the upstream PR.

Empirical verification across two fork CI runs:
- 25897744713 (cache miss, after re-running 3 spdlog-503 transient failures):
  both perf-check matrix jobs build baseline lib, then run baseline + PR
  bench on the same runner. 11/11 jobs green. RESULT: PASS for both modes.
- 25900131271 (cache hit, same base.sha, no-op head bump): cache restored,
  Build-baseline-library step skipped, bench step still runs baseline + PR
  bench on the same runner via the dispatcher's elif branch. 11/11 jobs
  green on first try, no spdlog-503 retries. RESULT: PASS for both modes.

Cross-runner noise reduction observed on synth/ADDRESS|BYTE|CALLER|EQ|GT|LT|
ISZERO benches (PR DTVMStack#493 reported +13-18% all turned into <1% on
same-runner). Only 1 micro-benchmark filtered by the baseline<5us gate
versus 25 in the cross-runner cache-stale comparison.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 15, 2026 05:06

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.

Pull request overview

This PR updates the CI performance regression workflow to reduce cross-runner noise by caching a deterministic baseline artifact (the built libdtvmapi.so) rather than caching benchmark result JSON produced on a different runner. This ensures baseline and PR benchmarks are executed on the same runner while still avoiding rebuilding the baseline library on cache hits.

Changes:

  • Switch performance_regression_check cache from /tmp/perf_baseline_${mode}.json to /tmp/baseline_lib keyed by base.sha.
  • Fix baseline library staging to copy only the resolved real .so (avoid globbing/symlink dereference duplicates) and remove BENCHMARK_BASELINE_CACHE so the dispatcher always takes the baseline-lib benchmarking path.
  • Add a design/change doc describing the motivation, implementation, and validation runs.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
docs/changes/2026-05-15-perf-check-baseline-lib-cache/README.md Adds rationale/design notes for switching perf-check baseline caching from JSON results to a baseline shared library.
.github/workflows/dtvm_evm_test_x86.yml Updates perf regression job to cache baseline libdtvmapi.so and adjust the build/copy/env wiring to force same-runner baseline measurements.
Comments suppressed due to low confidence (1)

docs/changes/2026-05-15-perf-check-baseline-lib-cache/README.md:65

  • The “Touched files” bullet says only .github/workflows/dtvm_evm_test_x86.yml was touched, but this change is documented in docs/changes/.../README.md as well (this file). If the intent is “behavior-affecting files”, consider clarifying the wording to avoid a technically incorrect statement.
## Impact

- **Touched files**: `.github/workflows/dtvm_evm_test_x86.yml` only — `performance_regression_check` job.
- **Behavior change**: per-PR perf-check job wall-clock increases on cache-hit runs by the baseline-bench step (which under the old scheme was skipped); cache-miss runs are unchanged.
- **Cost / quota**: cache-hit runs now do both a baseline bench AND a PR bench on the same runner (cache-miss already does both, plus a baseline build). Both modes (`matrix.mode = {interpreter, multipass}`) run per PR. Empirically verified on fork CI runs `25897744713` (cache miss) and `25900131271` (cache hit) that all 11 non-Lint jobs go green; cache-hit runs spend longer than the old cache-hit scheme (which skipped baseline bench entirely) but shorter than cache-miss (which adds the baseline build on top). Acceptable under the public-repo GitHub Actions allowance for our PR volume.
- **No source-code change**, no test runner change, no `.ci/run_test_suite.sh` change. The `elif [ -n "$BENCHMARK_BASELINE_LIB" ]` path it routes to already exists and is exercised today on cache miss.
- **Downstream**: reviewers stop chasing false-positive interpreter regressions on PRs whose diff is compiler-only (and vice versa). Perf-check signal-to-noise increases without changing the threshold.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/changes/2026-05-15-perf-check-baseline-lib-cache/README.md Outdated
@github-actions

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.60 2.60 -0.0% PASS
total/main/blake2b_huff/empty 0.04 0.04 +0.2% PASS
total/main/blake2b_shifts/8415nulls 20.60 20.67 +0.3% PASS
total/main/sha1_divs/5311 8.59 8.61 +0.2% PASS
total/main/sha1_divs/empty 0.11 0.11 -0.1% PASS
total/main/sha1_shifts/5311 6.37 6.36 -0.2% PASS
total/main/sha1_shifts/empty 0.08 0.08 -0.0% PASS
total/main/snailtracer/benchmark 74.56 74.09 -0.6% PASS
total/main/structarray_alloc/nfts_rank 1.36 1.36 -0.3% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 +0.3% PASS
total/main/swap_math/received 0.01 0.01 +0.3% PASS
total/main/swap_math/spent 0.01 0.01 +0.2% PASS
total/main/weierstrudel/1 0.29 0.29 +0.0% PASS
total/main/weierstrudel/15 3.18 3.18 +0.1% PASS
total/micro/JUMPDEST_n0/empty 2.63 2.64 +0.0% PASS
total/micro/jump_around/empty 0.10 0.10 +0.9% PASS
total/micro/loop_with_many_jumpdests/empty 40.24 40.24 -0.0% PASS
total/micro/memory_grow_mload/by1 0.12 0.12 +1.4% PASS
total/micro/memory_grow_mload/by16 0.13 0.13 +3.3% PASS
total/micro/memory_grow_mload/by32 0.14 0.14 +0.9% PASS
total/micro/memory_grow_mload/nogrow 0.12 0.12 -1.7% PASS
total/micro/memory_grow_mstore/by1 0.13 0.13 +1.4% PASS
total/micro/memory_grow_mstore/by16 0.14 0.14 +0.1% PASS
total/micro/memory_grow_mstore/by32 0.15 0.15 +0.2% PASS
total/micro/memory_grow_mstore/nogrow 0.12 0.12 -2.7% PASS
total/micro/signextend/one 0.28 0.28 -0.0% PASS
total/micro/signextend/zero 0.28 0.28 -0.1% PASS
total/synth/ADD/b0 3.22 3.22 +0.1% PASS
total/synth/ADD/b1 3.70 3.56 -4.0% PASS
total/synth/ADDRESS/a0 4.81 4.81 +0.1% PASS
total/synth/ADDRESS/a1 5.35 5.11 -4.5% PASS
total/synth/AND/b0 3.10 2.99 -3.6% PASS
total/synth/AND/b1 3.68 3.49 -5.0% PASS
total/synth/BYTE/b0 6.09 6.09 -0.0% PASS
total/synth/BYTE/b1 5.15 5.11 -0.7% PASS
total/synth/CALLDATASIZE/a0 3.50 3.26 -6.8% PASS
total/synth/CALLDATASIZE/a1 3.57 3.36 -6.1% PASS
total/synth/CALLER/a0 4.81 4.82 +0.3% PASS
total/synth/CALLER/a1 5.34 5.35 +0.1% PASS
total/synth/CALLVALUE/a0 3.52 3.51 -0.3% PASS
total/synth/CALLVALUE/a1 3.63 3.53 -2.8% PASS
total/synth/CODESIZE/a0 3.75 3.88 +3.6% PASS
total/synth/CODESIZE/a1 3.88 4.01 +3.5% PASS
total/synth/DUP1/d0 1.39 1.39 +0.0% PASS
total/synth/DUP1/d1 1.52 1.76 +15.8% PASS
total/synth/DUP10/d0 1.39 1.39 -0.0% PASS
total/synth/DUP10/d1 1.50 1.64 +9.6% PASS
total/synth/DUP11/d0 1.15 1.15 -0.2% PASS
total/synth/DUP11/d1 1.74 1.73 -0.4% PASS
total/synth/DUP12/d0 1.15 1.39 +20.6% PASS
total/synth/DUP12/d1 1.74 1.74 -0.2% PASS
total/synth/DUP13/d0 1.16 1.39 +19.8% PASS
total/synth/DUP13/d1 1.50 1.60 +6.7% PASS
total/synth/DUP14/d0 1.39 1.39 +0.1% PASS
total/synth/DUP14/d1 1.50 1.71 +14.2% PASS
total/synth/DUP15/d0 1.39 1.39 +0.1% PASS
total/synth/DUP15/d1 1.50 1.50 -0.2% PASS
total/synth/DUP16/d0 1.15 1.30 +13.0% PASS
total/synth/DUP16/d1 1.74 1.73 -0.2% PASS
total/synth/DUP2/d0 1.39 1.39 +0.0% PASS
total/synth/DUP2/d1 1.74 1.50 -13.5% PASS
total/synth/DUP3/d0 1.15 1.39 +21.0% PASS
total/synth/DUP3/d1 1.50 1.55 +3.0% PASS
total/synth/DUP4/d0 1.15 1.39 +21.0% PASS
total/synth/DUP4/d1 1.50 1.73 +15.0% PASS
total/synth/DUP5/d0 1.39 1.39 -0.0% PASS
total/synth/DUP5/d1 1.50 1.73 +15.4% PASS
total/synth/DUP6/d0 1.39 1.15 -17.2% PASS
total/synth/DUP6/d1 1.74 1.49 -14.0% PASS
total/synth/DUP7/d0 1.39 1.15 -17.2% PASS
total/synth/DUP7/d1 1.74 1.70 -2.1% PASS
total/synth/DUP8/d0 1.15 1.39 +20.7% PASS
total/synth/DUP8/d1 1.50 1.61 +7.1% PASS
total/synth/DUP9/d0 1.39 1.39 -0.1% PASS
total/synth/DUP9/d1 1.74 1.74 -0.3% PASS
total/synth/EQ/b0 5.32 5.32 +0.1% PASS
total/synth/EQ/b1 5.62 5.63 +0.2% PASS
total/synth/GAS/a0 3.84 3.84 -0.0% PASS
total/synth/GAS/a1 3.79 3.99 +5.3% PASS
total/synth/GT/b0 5.39 5.39 +0.1% PASS
total/synth/GT/b1 5.37 5.36 -0.2% PASS
total/synth/ISZERO/u0 8.33 8.33 -0.0% PASS
total/synth/JUMPDEST/n0 2.64 2.64 +0.0% PASS
total/synth/LT/b0 5.39 5.39 -0.0% PASS
total/synth/LT/b1 5.37 5.35 -0.3% PASS
total/synth/MSIZE/a0 4.34 4.34 -0.1% PASS
total/synth/MSIZE/a1 4.87 4.63 -5.1% PASS
total/synth/MUL/b0 5.49 5.50 +0.0% PASS
total/synth/MUL/b1 5.93 5.94 +0.2% PASS
total/synth/NOT/u0 5.06 5.06 -0.1% PASS
total/synth/OR/b0 3.02 3.02 +0.0% PASS
total/synth/OR/b1 3.66 3.41 -7.0% PASS
total/synth/PC/a0 3.59 3.34 -6.7% PASS
total/synth/PC/a1 3.62 3.61 -0.3% PASS
total/synth/PUSH1/p0 1.39 1.39 +0.1% PASS
total/synth/PUSH1/p1 1.84 1.59 -13.6% PASS
total/synth/PUSH10/p0 1.40 1.40 -0.2% PASS
total/synth/PUSH10/p1 1.64 1.62 -1.2% PASS
total/synth/PUSH11/p0 1.40 1.37 -1.6% PASS
total/synth/PUSH11/p1 1.63 1.59 -2.4% PASS
total/synth/PUSH12/p0 1.40 1.39 -0.0% PASS
total/synth/PUSH12/p1 1.86 1.83 -1.4% PASS
total/synth/PUSH13/p0 1.40 1.40 +0.1% PASS
total/synth/PUSH13/p1 1.63 1.83 +12.3% PASS
total/synth/PUSH14/p0 1.43 1.42 -1.2% PASS
total/synth/PUSH14/p1 1.85 1.85 +0.1% PASS
total/synth/PUSH15/p0 1.40 1.40 -0.2% PASS
total/synth/PUSH15/p1 1.91 1.81 -5.4% PASS
total/synth/PUSH16/p0 1.40 1.40 -0.1% PASS
total/synth/PUSH16/p1 1.62 1.82 +12.1% PASS
total/synth/PUSH17/p0 1.40 1.40 +0.1% PASS
total/synth/PUSH17/p1 1.85 1.83 -0.9% PASS
total/synth/PUSH18/p0 1.39 1.40 +0.1% PASS
total/synth/PUSH18/p1 1.62 1.83 +12.9% PASS
total/synth/PUSH19/p0 1.40 1.40 +0.0% PASS
total/synth/PUSH19/p1 1.85 1.61 -12.7% PASS
total/synth/PUSH2/p0 1.39 1.39 +0.0% PASS
total/synth/PUSH2/p1 1.84 1.59 -13.5% PASS
total/synth/PUSH20/p0 1.40 1.39 -0.1% PASS
total/synth/PUSH20/p1 1.84 1.61 -12.8% PASS
total/synth/PUSH21/p0 1.40 1.40 +0.1% PASS
total/synth/PUSH21/p1 1.84 1.83 -0.8% PASS
total/synth/PUSH22/p0 1.40 1.38 -1.1% PASS
total/synth/PUSH22/p1 1.63 1.75 +6.8% PASS
total/synth/PUSH23/p0 1.39 1.40 +0.4% PASS
total/synth/PUSH23/p1 1.86 1.84 -1.0% PASS
total/synth/PUSH24/p0 1.40 1.40 -0.1% PASS
total/synth/PUSH24/p1 1.87 1.83 -1.9% PASS
total/synth/PUSH25/p0 1.40 1.40 +0.0% PASS
total/synth/PUSH25/p1 1.85 1.59 -13.6% PASS
total/synth/PUSH26/p0 1.40 1.35 -3.1% PASS
total/synth/PUSH26/p1 1.84 1.83 -0.7% PASS
total/synth/PUSH27/p0 1.40 1.40 -0.2% PASS
total/synth/PUSH27/p1 1.85 1.73 -6.5% PASS
total/synth/PUSH28/p0 1.40 1.40 -0.0% PASS
total/synth/PUSH28/p1 1.63 1.76 +7.6% PASS
total/synth/PUSH29/p0 1.40 1.40 +0.1% PASS
total/synth/PUSH29/p1 1.85 1.76 -4.5% PASS
total/synth/PUSH3/p0 1.39 1.40 +0.2% PASS
total/synth/PUSH3/p1 1.61 1.83 +13.7% PASS
total/synth/PUSH30/p0 1.50 1.43 -5.0% PASS
total/synth/PUSH30/p1 1.63 1.83 +12.3% PASS
total/synth/PUSH31/p0 1.40 1.40 -0.0% PASS
total/synth/PUSH31/p1 1.76 1.75 -0.6% PASS
total/synth/PUSH32/p0 1.40 1.40 -0.0% PASS
total/synth/PUSH32/p1 1.64 1.66 +1.6% PASS
total/synth/PUSH4/p0 1.40 1.40 +0.1% PASS
total/synth/PUSH4/p1 1.60 1.60 -0.4% PASS
total/synth/PUSH5/p0 1.40 1.40 +0.0% PASS
total/synth/PUSH5/p1 1.84 1.75 -4.9% PASS
total/synth/PUSH6/p0 1.39 1.39 -0.1% PASS
total/synth/PUSH6/p1 1.85 1.82 -1.6% PASS
total/synth/PUSH7/p0 1.40 1.39 -0.1% PASS
total/synth/PUSH7/p1 1.85 1.68 -9.2% PASS
total/synth/PUSH8/p0 1.39 1.39 +0.0% PASS
total/synth/PUSH8/p1 1.84 1.60 -13.2% PASS
total/synth/PUSH9/p0 1.40 1.40 -0.1% PASS
total/synth/PUSH9/p1 1.85 1.76 -4.8% PASS
total/synth/RETURNDATASIZE/a0 3.91 3.67 -6.2% PASS
total/synth/RETURNDATASIZE/a1 3.96 3.69 -6.6% PASS
total/synth/SAR/b0 3.92 3.92 -0.0% PASS
total/synth/SAR/b1 4.73 4.73 -0.1% PASS
total/synth/SGT/b0 4.60 4.60 +0.1% PASS
total/synth/SGT/b1 4.12 4.12 +0.0% PASS
total/synth/SHL/b0 3.59 3.59 +0.0% PASS
total/synth/SHL/b1 3.66 3.65 -0.2% PASS
total/synth/SHR/b0 3.47 3.46 -0.1% PASS
total/synth/SHR/b1 3.74 3.71 -0.9% PASS
total/synth/SIGNEXTEND/b0 3.43 3.43 +0.1% PASS
total/synth/SIGNEXTEND/b1 3.85 3.81 -0.8% PASS
total/synth/SLT/b0 4.28 4.28 +0.0% PASS
total/synth/SLT/b1 4.08 4.10 +0.4% PASS
total/synth/SUB/b0 3.22 3.22 -0.0% PASS
total/synth/SUB/b1 3.79 3.48 -8.1% PASS
total/synth/SWAP1/s0 3.70 3.44 -7.0% PASS
total/synth/SWAP10/s0 3.78 3.46 -8.4% PASS
total/synth/SWAP11/s0 3.78 3.46 -8.5% PASS
total/synth/SWAP12/s0 3.69 3.46 -6.3% PASS
total/synth/SWAP13/s0 3.78 3.46 -8.3% PASS
total/synth/SWAP14/s0 3.77 3.47 -8.1% PASS
total/synth/SWAP15/s0 4.07 3.74 -8.1% PASS
total/synth/SWAP16/s0 3.79 3.50 -7.7% PASS
total/synth/SWAP2/s0 3.82 3.44 -9.9% PASS
total/synth/SWAP3/s0 3.83 3.44 -10.2% PASS
total/synth/SWAP4/s0 3.72 3.45 -7.2% PASS
total/synth/SWAP5/s0 3.63 3.45 -4.9% PASS
total/synth/SWAP6/s0 3.69 3.45 -6.6% PASS
total/synth/SWAP7/s0 3.73 3.45 -7.4% PASS
total/synth/SWAP8/s0 3.66 3.46 -5.4% PASS
total/synth/SWAP9/s0 3.68 3.46 -6.1% PASS
total/synth/XOR/b0 3.10 3.10 -0.0% PASS
total/synth/XOR/b1 3.51 3.49 -0.5% PASS
total/synth/loop_v1 6.69 6.69 -0.0% PASS
total/synth/loop_v2 6.70 6.69 -0.2% 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 0.85 0.85 +0.2% PASS
total/main/blake2b_huff/empty 0.01 0.01 -0.2% PASS
total/main/blake2b_shifts/8415nulls 4.35 4.32 -0.8% PASS
total/main/sha1_divs/5311 0.59 0.59 -0.0% PASS
total/main/sha1_divs/empty 0.01 0.01 +0.2% PASS
total/main/sha1_shifts/5311 0.55 0.55 +0.1% PASS
total/main/sha1_shifts/empty 0.01 0.01 +0.2% PASS
total/main/snailtracer/benchmark 28.45 28.75 +1.1% PASS
total/main/structarray_alloc/nfts_rank 0.29 0.28 -0.2% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 +3.3% PASS
total/main/swap_math/received 0.00 0.00 +8.2% PASS
total/main/swap_math/spent 0.00 0.00 +1.6% PASS
total/main/weierstrudel/1 0.20 0.20 -0.0% PASS
total/main/weierstrudel/15 2.23 2.24 +0.3% PASS
total/micro/JUMPDEST_n0/empty 0.00 0.00 +0.2% PASS
total/micro/jump_around/empty 0.04 0.04 +0.1% PASS
total/micro/loop_with_many_jumpdests/empty 0.00 0.00 +0.2% PASS
total/micro/memory_grow_mload/by1 0.01 0.01 +2.1% PASS
total/micro/memory_grow_mload/by16 0.01 0.01 -1.6% PASS
total/micro/memory_grow_mload/by32 0.01 0.01 +1.8% PASS
total/micro/memory_grow_mload/nogrow 0.01 0.01 -0.1% PASS
total/micro/memory_grow_mstore/by1 0.01 0.01 +0.3% PASS
total/micro/memory_grow_mstore/by16 0.01 0.01 -0.3% PASS
total/micro/memory_grow_mstore/by32 0.01 0.01 +0.3% PASS
total/micro/memory_grow_mstore/nogrow 0.01 0.01 +1.0% PASS
total/micro/signextend/one 0.12 0.12 -0.1% PASS
total/micro/signextend/zero 0.12 0.12 +0.5% PASS
total/synth/ADD/b0 0.00 0.00 +0.4% PASS
total/synth/ADD/b1 0.00 0.00 -0.2% PASS
total/synth/ADDRESS/a0 0.15 0.15 +0.0% PASS
total/synth/ADDRESS/a1 0.15 0.15 +0.1% PASS
total/synth/AND/b0 0.00 0.00 -0.4% PASS
total/synth/AND/b1 0.00 0.00 +0.2% PASS
total/synth/BYTE/b0 0.00 0.00 +0.1% PASS
total/synth/BYTE/b1 0.00 0.00 -0.6% PASS
total/synth/CALLDATASIZE/a0 0.08 0.08 -0.1% PASS
total/synth/CALLDATASIZE/a1 0.08 0.08 -0.4% PASS
total/synth/CALLER/a0 0.23 0.23 -0.0% PASS
total/synth/CALLER/a1 0.23 0.23 +0.0% PASS
total/synth/CALLVALUE/a0 0.21 0.21 -0.1% PASS
total/synth/CALLVALUE/a1 0.21 0.21 -0.2% PASS
total/synth/CODESIZE/a0 0.08 0.08 +0.4% PASS
total/synth/CODESIZE/a1 0.08 0.08 -0.5% PASS
total/synth/DUP1/d0 0.00 0.00 +0.3% PASS
total/synth/DUP1/d1 0.00 0.00 -0.1% PASS
total/synth/DUP10/d0 0.00 0.00 +0.0% PASS
total/synth/DUP10/d1 0.00 0.00 +0.5% PASS
total/synth/DUP11/d0 0.00 0.00 +0.6% PASS
total/synth/DUP11/d1 0.00 0.00 +0.2% PASS
total/synth/DUP12/d0 0.00 0.00 +0.7% PASS
total/synth/DUP12/d1 0.00 0.00 -0.3% PASS
total/synth/DUP13/d0 0.00 0.00 -0.5% PASS
total/synth/DUP13/d1 0.00 0.00 +0.2% PASS
total/synth/DUP14/d0 0.00 0.00 +0.5% PASS
total/synth/DUP14/d1 0.00 0.00 -0.3% PASS
total/synth/DUP15/d0 0.00 0.00 -0.2% PASS
total/synth/DUP15/d1 0.00 0.00 +0.0% PASS
total/synth/DUP16/d0 0.00 0.00 +0.1% PASS
total/synth/DUP16/d1 0.00 0.00 -0.1% PASS
total/synth/DUP2/d0 0.00 0.00 -0.2% PASS
total/synth/DUP2/d1 0.00 0.00 -0.1% PASS
total/synth/DUP3/d0 0.00 0.00 -0.0% PASS
total/synth/DUP3/d1 0.00 0.00 +0.2% PASS
total/synth/DUP4/d0 0.00 0.00 +0.2% PASS
total/synth/DUP4/d1 0.00 0.00 +0.3% PASS
total/synth/DUP5/d0 0.00 0.00 -0.0% PASS
total/synth/DUP5/d1 0.00 0.00 -0.0% PASS
total/synth/DUP6/d0 0.00 0.00 +0.5% PASS
total/synth/DUP6/d1 0.00 0.00 -0.3% PASS
total/synth/DUP7/d0 0.00 0.00 -0.3% PASS
total/synth/DUP7/d1 0.00 0.00 +0.3% PASS
total/synth/DUP8/d0 0.00 0.00 -0.2% PASS
total/synth/DUP8/d1 0.00 0.00 +0.1% PASS
total/synth/DUP9/d0 0.00 0.00 +0.0% PASS
total/synth/DUP9/d1 0.00 0.00 +0.1% PASS
total/synth/EQ/b0 0.00 0.00 +0.3% PASS
total/synth/EQ/b1 0.00 0.00 -0.1% PASS
total/synth/GAS/a0 0.52 0.52 +0.1% PASS
total/synth/GAS/a1 0.52 0.52 -0.0% PASS
total/synth/GT/b0 0.00 0.00 -0.2% PASS
total/synth/GT/b1 0.00 0.00 -0.2% PASS
total/synth/ISZERO/u0 0.00 0.00 +0.6% PASS
total/synth/JUMPDEST/n0 0.00 0.00 -0.3% PASS
total/synth/LT/b0 0.00 0.00 +0.3% PASS
total/synth/LT/b1 0.00 0.00 -0.5% PASS
total/synth/MSIZE/a0 0.00 0.00 +0.5% PASS
total/synth/MSIZE/a1 0.00 0.00 +0.2% PASS
total/synth/MUL/b0 0.00 0.00 +0.2% PASS
total/synth/MUL/b1 0.00 0.00 +0.2% PASS
total/synth/NOT/u0 0.00 0.00 +0.0% PASS
total/synth/OR/b0 0.00 0.00 +0.2% PASS
total/synth/OR/b1 0.00 0.00 -0.1% PASS
total/synth/PC/a0 0.00 0.00 +0.2% PASS
total/synth/PC/a1 0.00 0.00 -0.0% PASS
total/synth/PUSH1/p0 0.00 0.00 +0.7% PASS
total/synth/PUSH1/p1 0.00 0.00 -0.3% PASS
total/synth/PUSH10/p0 0.00 0.00 +0.3% PASS
total/synth/PUSH10/p1 0.00 0.00 -0.4% PASS
total/synth/PUSH11/p0 0.00 0.00 -0.7% PASS
total/synth/PUSH11/p1 0.00 0.00 -4.9% PASS
total/synth/PUSH12/p0 0.00 0.00 -0.3% PASS
total/synth/PUSH12/p1 0.00 0.00 -4.7% PASS
total/synth/PUSH13/p0 0.00 0.00 -6.1% PASS
total/synth/PUSH13/p1 0.00 0.00 -6.3% PASS
total/synth/PUSH14/p0 0.00 0.00 -6.2% PASS
total/synth/PUSH14/p1 0.00 0.00 -2.4% PASS
total/synth/PUSH15/p0 0.00 0.00 -1.8% PASS
total/synth/PUSH15/p1 0.00 0.00 -1.5% PASS
total/synth/PUSH16/p0 0.00 0.00 -1.0% PASS
total/synth/PUSH16/p1 0.00 0.00 -9.3% PASS
total/synth/PUSH17/p0 0.00 0.00 -0.8% PASS
total/synth/PUSH17/p1 0.00 0.00 -1.6% PASS
total/synth/PUSH18/p0 0.00 0.00 -8.7% PASS
total/synth/PUSH18/p1 0.00 0.00 -7.8% PASS
total/synth/PUSH19/p0 0.00 0.00 +1.0% PASS
total/synth/PUSH19/p1 0.00 0.00 -8.2% PASS
total/synth/PUSH2/p0 0.00 0.00 -1.2% PASS
total/synth/PUSH2/p1 0.00 0.00 -0.8% PASS
total/synth/PUSH20/p0 0.00 0.00 +12.5% PASS
total/synth/PUSH20/p1 0.00 0.00 +12.7% PASS
total/synth/PUSH21/p0 0.00 0.00 +2.2% PASS
total/synth/PUSH21/p1 0.00 0.00 +9.9% PASS
total/synth/PUSH22/p0 1.44 1.35 -6.6% PASS
total/synth/PUSH22/p1 1.59 1.58 -1.0% PASS
total/synth/PUSH23/p0 1.44 1.37 -5.4% PASS
total/synth/PUSH23/p1 1.58 1.62 +2.7% PASS
total/synth/PUSH24/p0 1.46 1.37 -6.3% PASS
total/synth/PUSH24/p1 1.61 1.60 -0.4% PASS
total/synth/PUSH25/p0 1.45 1.38 -4.7% PASS
total/synth/PUSH25/p1 1.58 1.63 +2.8% PASS
total/synth/PUSH26/p0 1.45 1.39 -4.4% PASS
total/synth/PUSH26/p1 1.61 1.64 +2.2% PASS
total/synth/PUSH27/p0 1.45 1.38 -4.7% PASS
total/synth/PUSH27/p1 1.59 1.64 +2.8% PASS
total/synth/PUSH28/p0 1.45 1.39 -4.3% PASS
total/synth/PUSH28/p1 1.57 1.61 +2.6% PASS
total/synth/PUSH29/p0 1.46 1.38 -5.5% PASS
total/synth/PUSH29/p1 1.59 1.64 +3.3% PASS
total/synth/PUSH3/p0 0.00 0.00 -0.8% PASS
total/synth/PUSH3/p1 0.00 0.00 +1.2% PASS
total/synth/PUSH30/p0 1.44 1.35 -6.2% PASS
total/synth/PUSH30/p1 1.60 1.61 +0.4% PASS
total/synth/PUSH31/p0 1.45 1.38 -5.2% PASS
total/synth/PUSH31/p1 1.65 1.64 -0.7% PASS
total/synth/PUSH32/p0 1.46 1.38 -5.4% PASS
total/synth/PUSH32/p1 1.60 1.65 +3.3% PASS
total/synth/PUSH4/p0 0.00 0.00 -1.5% PASS
total/synth/PUSH4/p1 0.00 0.00 +0.2% PASS
total/synth/PUSH5/p0 0.00 0.00 -1.9% PASS
total/synth/PUSH5/p1 0.00 0.00 -0.4% PASS
total/synth/PUSH6/p0 0.00 0.00 +2.8% PASS
total/synth/PUSH6/p1 0.00 0.00 +0.6% PASS
total/synth/PUSH7/p0 0.00 0.00 +0.7% PASS
total/synth/PUSH7/p1 0.00 0.00 +0.0% PASS
total/synth/PUSH8/p0 0.00 0.00 +0.6% PASS
total/synth/PUSH8/p1 0.00 0.00 +0.2% PASS
total/synth/PUSH9/p0 0.00 0.00 -2.8% PASS
total/synth/PUSH9/p1 0.00 0.00 -0.3% PASS
total/synth/RETURNDATASIZE/a0 0.04 0.04 -0.5% PASS
total/synth/RETURNDATASIZE/a1 0.04 0.04 -0.1% PASS
total/synth/SAR/b0 0.00 0.00 -0.1% PASS
total/synth/SAR/b1 0.00 0.00 +0.1% PASS
total/synth/SGT/b0 0.00 0.00 +0.5% PASS
total/synth/SGT/b1 0.00 0.00 +0.3% PASS
total/synth/SHL/b0 0.00 0.00 -0.2% PASS
total/synth/SHL/b1 0.00 0.00 +0.6% PASS
total/synth/SHR/b0 0.00 0.00 +0.2% PASS
total/synth/SHR/b1 0.00 0.00 -0.5% PASS
total/synth/SIGNEXTEND/b0 0.00 0.00 -0.6% PASS
total/synth/SIGNEXTEND/b1 0.00 0.00 -0.2% PASS
total/synth/SLT/b0 0.00 0.00 +0.4% PASS
total/synth/SLT/b1 0.00 0.00 +0.5% PASS
total/synth/SUB/b0 0.00 0.00 -0.0% PASS
total/synth/SUB/b1 0.00 0.00 +0.2% PASS
total/synth/SWAP1/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP10/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP11/s0 0.00 0.00 -0.2% PASS
total/synth/SWAP12/s0 0.00 0.00 +0.6% PASS
total/synth/SWAP13/s0 0.00 0.00 +0.7% PASS
total/synth/SWAP14/s0 0.00 0.00 -0.4% PASS
total/synth/SWAP15/s0 0.00 0.00 +0.3% PASS
total/synth/SWAP16/s0 0.00 0.00 -0.1% PASS
total/synth/SWAP2/s0 0.00 0.00 +0.2% PASS
total/synth/SWAP3/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP4/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP5/s0 0.00 0.00 +0.1% PASS
total/synth/SWAP6/s0 0.00 0.00 +0.5% PASS
total/synth/SWAP7/s0 0.00 0.00 -0.0% PASS
total/synth/SWAP8/s0 0.00 0.00 +0.4% PASS
total/synth/SWAP9/s0 0.00 0.00 +0.5% PASS
total/synth/XOR/b0 0.00 0.00 +0.5% PASS
total/synth/XOR/b1 0.00 0.00 +0.8% PASS
total/synth/loop_v1 1.27 1.27 +0.3% PASS
total/synth/loop_v2 1.19 1.19 +0.2% PASS

Summary: 194 benchmarks, 0 regressions


Two wording fixes flagged by github-copilot[bot] review:
- L16 "The current job..." -> "The pre-PR job (on main):" so the
  YAML snippet reads correctly after merge/archive.
- L65 "Touched files: ... only" -> "Behavior-affecting files: ...
  only" + note that README.md itself ships in the same commit.

No content change beyond wording.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@zoowii
zoowii merged commit 8e57176 into DTVMStack:main May 15, 2026
5 checks passed
@abmcar
abmcar deleted the ci/perf-baseline-lib-cache branch May 17, 2026 04:09
ZR74 pushed a commit to ZR74/DTVM that referenced this pull request May 18, 2026
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
(cherry picked from commit 8e57176)
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.

3 participants