Skip to content

fix[venom]: fix various well formedness issues - #5231

Closed
HodanPlodky wants to merge 33 commits into
vyperlang:masterfrom
HodanPlodky:fix/venom/pass-disable-testing-fixes
Closed

HodanPlodky wants to merge 33 commits into
vyperlang:masterfrom
HodanPlodky:fix/venom/pass-disable-testing-fixes

Conversation

@HodanPlodky

@HodanPlodky HodanPlodky commented Sep 1, 2026 •

Copy link
Copy Markdown
Collaborator

What I did

Implementation of the fixes that were shown by the #5219.

venom_to_assembly.py: There was dependency on liveness in the clean_stack_from_cfg_in. For the offset and phi instructions the output could have been in the stack even if was never used.

BranchOptimizationPass: In the case that the branch has a literal as a condition (this happens when SCCP is not run) this pass failed on assertion. If thats the case short circuit.

RemoveUnusedVariablesPass: The load instructions could be removed by this pass but did no invalidate their respective memalias analyses

FunctionInlinerPass: retpc_param should not be needed after if function inline. There was an error where because if was still there the label that does no longer exist was still referenced in the code.

How I did it

How to verify it

Commit message

Implementation of the fixes that were shown by the https://github.com/vyperlang/vyper/pull/5219. 

Description for the changelog

Cute Animal Picture

Put a link to a cute animal picture inside the parenthesis-->

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Gas Changes

No changes detected.

Summary

  • Total tests measured: 560
  • Changed: 0
  • Regressions (gas up): 0
  • Improvements (gas down): 0
  • New tests: 0
  • Deleted tests: 0
  • Newly failing: 0
  • Newly passing: 0

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

📊 Bytecode Size Changes (venom)

No changes detected.

Full bytecode sizes

Contract legacy-O2 legacy-Os -O2 -O3 -Os
curvefi/legacy/CurveStableSwapMetaNG.vy 24952 23578 19769 19059 18523
curvefi/amm/stableswap/meta_implementation/meta_implementation_v_700.vy 23610 22805 19565 18627 18314
curvefi/amm/stableswap/implementation/implementation_v_700.vy 24962 23769 19188 18363 18019
curvefi/legacy/CurveStableSwapNG.vy 24473 23298 18749 17981 17636
curvefi/amm/tricryptoswap/implementation/implementation_v_200.vy 20724 19959 17250 16689 16325
curvefi/amm/twocryptoswap/implementation/implementation_v_210.vy 17634 16894 14958 14376 14027
yearnfi/VaultV3.vy 19972 19063 14739 13818 13269
curvefi/legacy/CurveCryptoSwap2.vy 18947 18382 14619 14129 13954
yearnfi/VaultV2.vy 16676 15763 13258 12466 12049
curvefi/amm/stableswap/factory/factory_v_100.vy 14558 13978 11852 10780 10880
curvefi/gauge/child_gauge/implementation/implementation_v_110.vy 12338 11561 9781 9184 8795
curvefi/amm/stableswap/views/views_v_120.vy 12784 12368 9705 9059 9294
curvefi/gauge/child_gauge/implementation/implementation_v_100.vy 12017 11249 9514 8924 8538
curvefi/amm/tricryptoswap/math/math_v_200.vy 11189 11126 9029 8144 8170
curvefi/legacy/CurveCryptoMathOptimized3.vy 11188 11125 9028 8144 8170
curvefi/gauge/child_gauge/implementation/implementation_v_020.vy 10665 9947 8626 8100 7714
curvefi/registries/metaregistry/metaregistry_v_110.vy 7590 6732 6491 5710 5603
curvefi/helpers/router/router_v_110.vy 6717 6717 6251 5733 6035
curvefi/amm/tricryptoswap/views/views_v_200.vy 7821 7776 6111 5896 6045
curvefi/helpers/stable_swap_meta_zap/stable_swap_meta_zap_v_100.vy 7302 7067 5877 5350 5610
curvefi/amm/twocryptoswap/views/views_v_200.vy 6991 6946 5680 5479 5614
curvefi/registries/metaregistry/registry_handlers/stableswap/handler_v_110.vy 6633 6259 5533 4695 5238
curvefi/amm/twocryptoswap/math/math_v_210.vy 6800 6800 5506 5012 5039
curvefi/amm/twocryptoswap/factory/factory_v_200.vy 5540 5252 4617 3917 4047
curvefi/amm/tricryptoswap/factory/factory_v_200.vy 5246 5021 4483 3890 4020
curvefi/gauge/child_gauge/factory/factory_v_201.vy 4844 4547 3901 3675 3511
curvefi/registries/metaregistry/registry_handlers/tricryptoswap/handler_v_110.vy 4241 3939 3718 3334 3429
curvefi/registries/metaregistry/registry_handlers/twocryptoswap/handler_v_110.vy 4186 3884 3671 3251 3329
curvefi/gauge/child_gauge/factory/factory_v_100.vy 4183 3914 3408 3144 2971
yearnfi/VaultFactory.vy 3765 3617 2936 2158 2461
curvefi/registries/address_provider/address_provider_v_201.vy 2973 2782 2613 2440 2353
curvefi/helpers/rate_provider/rate_provider_v_101.vy 3260 3260 2535 2263 2296
curvefi/amm/stableswap/math/math_v_100.vy 3067 3046 2458 2253 2310
curvefi/helpers/rate_provider/rate_provider_v_100.vy 2847 2841 2273 1954 1974
curvefi/helpers/deposit_and_stake_zap/deposit_and_stake_zap_v_100.vy 2322 2316 1782 1611 1670
curvefi/governance/relayer/taiko/relayer_v_001.vy 2068 2064 1731 1510 1558
curvefi/governance/relayer/polygon_cdk/relayer_v_101.vy 1556 1523 1530 1324 1347
curvefi/governance/relayer/arb_orbit/relayer_v_101.vy 1266 1262 1242 1066 1115
curvefi/governance/relayer/op_stack/relayer_v_101.vy 1186 1182 1183 1014 1056
curvefi/governance/relayer/not_rollup/relayer_v_100.vy 1168 1153 1174 1011 1037
curvefi/governance/vault/vault_v_100.vy 964 941 862 823 839
curvefi/governance/relayer/relayer_v_100.vy 496 496 593 490 503
curvefi/governance/agent/agent_v_100.vy 541 541 430 402 406
curvefi/governance/agent/agent_v_101.vy 541 541 430 402 406

@HodanPlodky
HodanPlodky marked this pull request as ready for review September 3, 2026 12:04

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ba12d1bb46

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

# host's own reclaim governs the inlined data. Whether the
# host publishes is determined solely by the host's own
# terminators (plain `ret` is callee-save).
assert retpc_op in inst.operands, retpc_op

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve plain return-PC params during inlining

When a valid raw Venom callee uses a plain param as its return PC, retpc_op remains None, so every ret reaches this assertion and aborts compilation. FunctionCallLayout explicitly supports discovering plain return-PC params in raw IR, and the full pipeline runs this inliner before FmpLoweringPass; therefore changing the tests to retpc_param does not eliminate the accepted input path. Resolve the return-PC through the call layout or preserve the previous binding behavior instead of requiring the dedicated opcode here.

Useful? React with 👍 / 👎.

Comment thread vyper/venom/passes/function_inliner.py Outdated
param_idx = 0
for inst in bb.instructions:
if inst.is_param:
if inst.opcode == "retpc_param":

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

FunctionCallLayout.return_pc_param() which already resolves retpc properly, could we use that here instead of matching the opcode? Raw written venom with plain 'param" inlines correctly on master.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Used the FunctionCallLayout.retpc_param_opcode_inst since the retpc_param should exist in the inliner. And added the test to show the problematic case outside of the fuzz test in the other PR

@HodanPlodky HodanPlodky changed the title fix[venom]: pass disable testing fixes fix[venom]: Fixes for pass fuzzing test (https://github.com/vyperlang/vyper/pull/5219) Sep 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9e10c9eb83

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".


layout = FunctionCallLayout(func_copy)
retpc_inst = layout.retpc_param_opcode_inst
assert retpc_inst is not None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Allow inlining callees with no return-PC parameter

When valid raw Venom invokes a non-returning callee such as a parameterless function ending in stop or revert, its FunctionCallLayout legitimately has no return-PC parameter, yet a single call site selects it for inlining and this assertion aborts compilation. The calling-convention validator explicitly permits callees with no return instructions and expects zero invoke outputs, and the previous inliner could inline this shape because it never required a return-PC binding; only require/remove the parameter when one exists.

Useful? React with 👍 / 👎.

@HodanPlodky HodanPlodky changed the title fix[venom]: Fixes for pass fuzzing test (https://github.com/vyperlang/vyper/pull/5219) fix[venom]: fixes for pass fuzzing test (https://github.com/vyperlang/vyper/pull/5219) Sep 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5dc0451895

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +62 to +64
for space in self.invalidate_alias:
alias_analysis = mem_alias_type_factory(space)
self.analyses_cache.invalidate_analysis(alias_analysis)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Invalidate memory aliases after every IR deletion

When this pass removes only pure dead instructions, such as an unused add, invalidate_alias remains empty and a directly cached MemoryAliasAnalysis survives. However, that analysis retains the DFGAnalysis and BasePtrAnalysis instances invalidated above (DFG invalidation even deletes its internal maps), so a subsequent query such as pointer_uses_may_touch can crash or use stale facts. Preserve the previous unconditional memory-alias invalidation whenever the pass changes IR.

Useful? React with 👍 / 👎.

# host's own reclaim governs the inlined data. Whether the
# host publishes is determined solely by the host's own
# terminators (plain `ret` is callee-save).
assert retpc_op in inst.operands, retpc_op

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Resolve return-PC aliases before removing the parameter

When a callee declares %retpc = retpc_param but returns through an accepted alias such as %copy = %retpc; ret %copy, this assertion fails because it requires the original variable to occur directly in every return. FunctionCallLayout.param_for_alias and the calling-convention validator explicitly accept assign/phi aliases of the return PC, so valid raw Venom still aborts during inlining even though the dedicated opcode is present. Identify return operands through the layout or rewrite aliases before deleting the parameter.

Useful? React with 👍 / 👎.

# since they either bump or set only at the end of the function so the
# removal of the instruction will not effect other instructions.
# Other write effect should not be removed by this analysis
assert inst.get_write_effects() == EMPTY or inst.get_write_effects() == FMP

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Handle dead dload before asserting write effects

When RemoveUnusedVariablesPass is run before LowerDloadPass on valid raw Venom containing an unused %value = dload ..., the instruction is non-volatile and has no uses, but its declared write effect is MEMORY, so this new assertion aborts the pass. The pass previously removed this dead pseudo-load safely, and it has no ordering constraint requiring LowerDloadPass first; either retain that behavior or explicitly handle dload rather than asserting.

Useful? React with 👍 / 👎.

@charles-cooper charles-cooper changed the title fix[venom]: fixes for pass fuzzing test (https://github.com/vyperlang/vyper/pull/5219) fix[venom]: fix various well formedness issues Sep 7, 2026
@HodanPlodky HodanPlodky closed this Sep 9, 2026
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