Skip to content

opt(interpreter): use feed_direct() in compute_block_gas_costs()#813

Open
liuyiyi185 wants to merge 1 commit into
jarchain:masterfrom
liuyiyi185:opt/feed-direct-gas
Open

opt(interpreter): use feed_direct() in compute_block_gas_costs()#813
liuyiyi185 wants to merge 1 commit into
jarchain:masterfrom
liuyiyi185:opt/feed-direct-gas

Conversation

@liuyiyi185
Copy link
Copy Markdown

Summary

Replace the ast_cost_from_raw() + sim.feed(&fc) path in
compute_block_gas_costs() with a direct sim.feed_direct() fast path
for ~90% of instructions.

Changes

  • Before: Every instruction went through ast_cost_from_raw() (which
    constructs a FastCost struct with bitmask arithmetic, trailing_zeros
    extraction, etc.) and then sim.feed(&fc).
  • After: ~90% of instructions (loads, stores, ALU ops, immediates,
    context-free terminators) call sim.feed_direct(cycles, slots, src1, src2, dst)
    directly with raw register nibbles - no struct allocation, no bitmask ops.
    Only instructions that genuinely require context-dependent cost computation
    (ecalli 10, load_imm_jump 80, conditional branches 181..=255, and
    unrecognised opcodes) fall back to the full ast_cost_from_raw() + eed().

Performance Impact

  • Eliminates FastCost struct construction for the common-case path
  • Reduces memory pressure in compute_block_gas_costs() hot loop
  • No allocations changed in the runtime interpreter - this only affects the
    one-time pre-decode path, but also hits Interpreter::predecode() used
    by CODE cap construction

Testing

  • All existing interpreter tests pass (cargo test -p javm)
  • Gas cost calculations remain identical: eed_direct() is already verified
    to produce the same result as eed(&FastCost{...}) by the
    eed_matches_feed_direct proptest in gas_sim.rs

Related

Closes #812 - optimize javm interpreter performance (#400)

Fast path for ~90% of instructions (loads, stores, ALU, immediates,
terminators) via GasSimulator::feed_direct(), which takes register indices
directly and avoids constructing a FastCost struct.

Only instructions requiring context-dependent cost computation (ecalli,
load_imm_jump, conditional branches 181..=255, and unrecognised opcodes)
fall back to fast_cost_from_raw() + feed().

Closes jarchain#812
@github-actions
Copy link
Copy Markdown
Contributor

Genesis Review

Comparison targets:

How to review

Post a comment with the following format (rank from best to worst):

/review
difficulty: <commit1>, <commit2>, ..., <commitN>, currentPR
novelty: <commit1>, <commit2>, ..., <commitN>, currentPR
design: <commit1>, <commit2>, ..., <commitN>, currentPR
verdict: merge

Use the short commit hashes above and currentPR for this PR.
Each line ranks all comparison targets + this PR from best to worst.

To meta-review another reviewer's comment, react with 👍 or 👎.

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