Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
79e46a6
refactor[venom]: decouple venom IR from legacy IRnode
charles-cooper Apr 21, 2026
fdff543
refactor: rename vyper/codegen to vyper/codegen_legacy, create vyper/…
charles-cooper Apr 21, 2026
e58877c
feat: make Venom the default codegen, add --legacy flag
charles-cooper Apr 21, 2026
0457ae7
feat: add legacy key to JSON compiler input API
charles-cooper Apr 21, 2026
0498268
refactor: rename experimental_codegen to legacy_codegen (inverted sem…
charles-cooper Apr 21, 2026
adb6101
chore: fix lint issues from codegen rename
charles-cooper Apr 21, 2026
87fa38b
fix[codegen_venom]: anchor settings before venom codegen
charles-cooper Apr 21, 2026
80c919d
fix: add legacy_codegen=True to legacy-specific tests
charles-cooper Apr 21, 2026
e898b67
Merge branch 'master' into feat/venom-default
charles-cooper May 14, 2026
6d15801
test: cover venom codegen in asm stability tests
charles-cooper May 14, 2026
7ae40b3
test: use compiler_settings for asm DCE pipeline
charles-cooper May 14, 2026
546dfe6
test: replace experimental_codegen fixture with legacy_codegen
charles-cooper May 14, 2026
af60879
chore: remove duplicate legacy jumptable utils
charles-cooper May 15, 2026
2992644
test: rely on venom defaults in venom tests
charles-cooper May 15, 2026
a653b93
Merge branch 'master' into feat/venom-default
HodanPlodky May 17, 2026
3d07b79
disable static asserts in the test for failures
HodanPlodky May 17, 2026
2e0a2f4
lint for test_convert
HodanPlodky May 17, 2026
9c42320
test for `--disable-static-exceptions` fix
HodanPlodky May 17, 2026
6c9cc55
used fixture and correct test
HodanPlodky May 18, 2026
930a886
fix the case for decimals and hex (to have parity with legacy)
HodanPlodky May 18, 2026
5769087
convert int->decimals negative clamp error
HodanPlodky May 18, 2026
c7c7c61
Revert "convert int->decimals negative clamp error" moved to different
HodanPlodky May 19, 2026
363cd88
Revert "fix the case for decimals and hex (to have parity with legacy)"
HodanPlodky May 19, 2026
e565d87
Merge branch 'master' into feat/venom-default
charles-cooper May 30, 2026
4644877
chore: keep legacy codegen default
charles-cooper May 30, 2026
e7e32d6
lint
charles-cooper May 30, 2026
e1d3b49
refactor: remove inline ABI utility imports
charles-cooper May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/scripts/measure_bytecode.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ def get_example_vy_filenames(limit: int | None = None):
return files[:limit] if limit else files


def compile_one(source_code: str, opt_level: OptimizationLevel, experimental: bool) -> tuple[int | None, str | None]:
def compile_one(source_code: str, opt_level: OptimizationLevel, legacy: bool) -> tuple[int | None, str | None]:
"""Compile with given settings. Returns (size, error)."""
try:
settings = Settings(experimental_codegen=experimental, optimize=opt_level)
settings = Settings(legacy_codegen=legacy, optimize=opt_level)
result = compiler.compile_code(source_code, settings=settings, output_formats=["bytecode"])
bytecode = result.get("bytecode", "")
size = (len(bytecode) - 2) // 2 if bytecode.startswith("0x") else len(bytecode) // 2
Expand All @@ -55,11 +55,11 @@ def measure_contract(filename: str) -> tuple[str, dict]:

results = {
"legacy": {
name: dict(zip(["size", "error"], compile_one(source_code, opt, False)))
name: dict(zip(["size", "error"], compile_one(source_code, opt, True)))
for name, opt in LEGACY_OPT_LEVELS.items()
},
"venom": {
name: dict(zip(["size", "error"], compile_one(source_code, opt, True)))
name: dict(zip(["size", "error"], compile_one(source_code, opt, False)))
for name, opt in VENOM_OPT_LEVELS.items()
},
}
Expand Down
20 changes: 10 additions & 10 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ jobs:
py${{ matrix.python-version[1] || '311' }}\
-opt-${{ matrix.opt-mode || 'gas' }}\
${{ matrix.debug && '-debug' || '' }}\
${{ matrix.experimental-codegen && '-experimental' || '' }}\
${{ matrix.legacy && '-legacy' || '' }}\
-${{ matrix.evm-version || 'prague' }}\
-${{ matrix.evm-backend || 'revm' }}"
strategy:
Expand All @@ -125,7 +125,7 @@ jobs:
opt-mode: [gas, none, codesize, O1, O2, O3]
debug: [true, false]
evm-version: [prague] # note: when upgrading, check the "include" section below for conflicting jobs
experimental-codegen: [false]
legacy: [false]
evm-backend: [revm]

# https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs#expanding-or-adding-matrix-configurations
Expand All @@ -152,18 +152,18 @@ jobs:
- evm-backend: py-evm
evm-version: prague

# test experimental pipeline
- experimental-codegen: true
# test legacy pipeline
- legacy: true
opt-mode: gas
- experimental-codegen: true
- legacy: true
opt-mode: none
- experimental-codegen: true
- legacy: true
opt-mode: codesize
- experimental-codegen: true
- legacy: true
opt-mode: O1
- experimental-codegen: true
- legacy: true
opt-mode: O2
- experimental-codegen: true
- legacy: true
opt-mode: O3

# run across other python versions. we don't really need to run all
Expand Down Expand Up @@ -202,7 +202,7 @@ jobs:
--evm-version ${{ matrix.evm-version || 'prague' }}
--evm-backend ${{ matrix.evm-backend || 'revm' }}
${{ matrix.debug && '--enable-compiler-debug-mode' || '' }}
${{ matrix.experimental-codegen && '--experimental-codegen' || '' }}
${{ matrix.legacy && '--legacy' || '' }}
--cov-config=setup.cfg
--cov=vyper
tests/
Expand Down
21 changes: 13 additions & 8 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from tests.exports import TestExporter
from tests.utils import working_directory
from vyper import compiler
from vyper.codegen.ir_node import IRnode
from vyper.codegen_legacy.ir_node import IRnode
from vyper.compiler import compile_code
from vyper.compiler.input_bundle import FilesystemInputBundle
from vyper.compiler.settings import OptimizationLevel, Settings, set_global_settings
Expand All @@ -44,7 +44,8 @@ def pytest_addoption(parser):
help="change optimization mode",
)
parser.addoption("--enable-compiler-debug-mode", action="store_true")
parser.addoption("--experimental-codegen", action="store_true")
parser.addoption("--experimental-codegen", action="store_true", default=True)

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.

Should be removed/deprecated, no ?

parser.addoption("--legacy", action="store_true", default=False)
parser.addoption("--tracing", action="store_true")
parser.addoption("--hevm", action="store_true")

Expand Down Expand Up @@ -88,9 +89,13 @@ def debug(pytestconfig):

@pytest.fixture(scope="session")
def experimental_codegen(pytestconfig):
ret = pytestconfig.getoption("experimental_codegen")
assert isinstance(ret, bool)
return ret
"""Returns True for venom codegen, False for legacy.
Kept as 'experimental_codegen' for backward compat in test markers."""
legacy = pytestconfig.getoption("legacy")
if legacy:
return False
# Venom is now the default
return True


@pytest.fixture(scope="session")
Expand Down Expand Up @@ -242,7 +247,7 @@ def compiler_settings(optimize, experimental_codegen, evm_version, debug):
settings = Settings(
optimize=optimize,
evm_version=evm_version,
experimental_codegen=experimental_codegen,
legacy_codegen=not experimental_codegen,
debug=debug,
)
set_global_settings(settings)
Expand Down Expand Up @@ -272,10 +277,10 @@ def fn(source_code, *args, **kwargs):
global _HEVM_MARKER
if hevm and _HEVM_MARKER is not None:
settings1 = copy.copy(compiler_settings)
settings1.experimental_codegen = False
settings1.legacy_codegen = True # legacy
settings1.optimize = OptimizationLevel.NONE
settings2 = copy.copy(compiler_settings)
settings2.experimental_codegen = True
settings2.legacy_codegen = False # venom
settings2.optimize = OptimizationLevel.NONE

bytecode1 = compile_code(
Expand Down
4 changes: 2 additions & 2 deletions tests/exports.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ It is based on `Settings.as_dict()`, except `enable_decimals` is always included
{
"optimize": <string>,
"evm_version": <string>,
"experimental_codegen": <bool>,
"legacy_codegen": <bool>,
"debug": <bool>,
"enable_decimals": <bool>,
"nonreentrancy_by_default": <bool>,
Expand All @@ -164,7 +164,7 @@ It is based on `Settings.as_dict()`, except `enable_decimals` is always included
|-------|------|-------------|
| `optimize` | `string` | Optimization level: `"none"`, `"gas"`, `"codesize"` |
| `evm_version` | `string` | Target EVM version: `"cancun"`, `"shanghai"`, `"prague"`, etc. |
| `experimental_codegen` | `bool` | Whether Venom (experimental codegen) is enabled |
| `legacy_codegen` | `bool` | Whether legacy IRnode codegen is used (default: False = Venom) |
| `debug` | `bool` | Whether debug mode is enabled |
| `enable_decimals` | `bool` | Whether decimal type is enabled |
| `nonreentrancy_by_default` | `bool` | Whether functions are non-reentrant by default |
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/builtins/codegen/test_abi_decode_fuzz.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from eth.codecs import abi

from tests.evm_backends.base_env import EvmError
from vyper.codegen.core import calculate_type_for_external_return, needs_external_call_wrap
from vyper.codegen_legacy.core import calculate_type_for_external_return, needs_external_call_wrap
from vyper.semantics.types import (
AddressT,
BoolT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
def no_inline_settings(compiler_settings):
"""Create settings with function inlining disabled (venom only)."""
settings = copy.copy(compiler_settings)
if settings.experimental_codegen:
if not settings.legacy_codegen:
settings.venom_flags = VenomOptimizationFlags(disable_inlining=True)
return settings

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
def no_inline_settings(compiler_settings):
"""Create settings with function inlining disabled (venom only)."""
settings = copy.copy(compiler_settings)
if settings.experimental_codegen:
if not settings.legacy_codegen:
settings.venom_flags = VenomOptimizationFlags(disable_inlining=True)
return settings

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
def no_inline_settings(compiler_settings):
"""Create settings with function inlining disabled (venom only)."""
settings = copy.copy(compiler_settings)
if settings.experimental_codegen:
if not settings.legacy_codegen:
settings.venom_flags = VenomOptimizationFlags(disable_inlining=True)
return settings

Expand Down
2 changes: 1 addition & 1 deletion tests/functional/codegen/test_selector_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from hypothesis import given, settings

import vyper.utils as utils
from vyper.codegen.jumptable_utils import (
from vyper.codegen_legacy.jumptable_utils import (
generate_dense_jumptable_info,
generate_sparse_jumptable_buckets,
)
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/codegen/test_selector_table_stability.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from vyper.codegen.jumptable_utils import generate_sparse_jumptable_buckets
from vyper.codegen_legacy.jumptable_utils import generate_sparse_jumptable_buckets
from vyper.compiler import compile_code
from vyper.compiler.settings import OptimizationLevel, Settings

Expand Down
2 changes: 1 addition & 1 deletion tests/functional/codegen/types/numbers/test_exponents.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from hypothesis import example, given, settings
from hypothesis import strategies as st

from vyper.codegen.arithmetic import calculate_largest_base, calculate_largest_power
from vyper.codegen_legacy.arithmetic import calculate_largest_base, calculate_largest_power
from vyper.compiler import compile_code
from vyper.exceptions import InvalidLiteral

Expand Down
2 changes: 1 addition & 1 deletion tests/functional/codegen/types/test_identifier_naming.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from vyper.ast.identifiers import RESERVED_KEYWORDS
from vyper.builtins.functions import BUILTIN_FUNCTIONS
from vyper.codegen.expr import ENVIRONMENT_VARIABLES
from vyper.codegen_legacy.expr import ENVIRONMENT_VARIABLES
from vyper.exceptions import NamespaceCollision, StructureException, SyntaxException
from vyper.semantics.types.primitives import AddressT

Expand Down
8 changes: 4 additions & 4 deletions tests/functional/venom/test_venom_repr.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def test_round_trip_examples(path: Path, debug, optimize, compiler_settings, req
"""
Check all examples round trip
"""
if not compiler_settings.experimental_codegen:
if not compiler_settings.legacy_codegen:

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.

Suggested change
if not compiler_settings.legacy_codegen:
if compiler_settings.legacy_codegen:

At least to correspond to the text

pytest.skip("tests n/a when venom is not enabled")

if debug and optimize == OptimizationLevel.CODESIZE:
Expand Down Expand Up @@ -76,7 +76,7 @@ def test_round_trip_sources(vyper_source, debug, optimize, compiler_settings, re
"""
Test vyper_sources round trip
"""
if not compiler_settings.experimental_codegen:
if not compiler_settings.legacy_codegen:

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.

Suggested change
if not compiler_settings.legacy_codegen:
if compiler_settings.legacy_codegen:

same as above

pytest.skip("tests n/a when venom is not enabled")

vyper_source = textwrap.dedent(vyper_source)
Expand Down Expand Up @@ -105,7 +105,7 @@ def _helper1(vyper_source, optimize, input_bundle=None):
"""
from vyper.compiler.settings import Settings

settings = Settings(experimental_codegen=True)
settings = Settings(legacy_codegen=False)
# note: compiling any later stage than ir_runtime like `asm` or
# `bytecode` modifies the ir_runtime data structure in place and results
# in normalization of the venom cfg (which breaks again make_ssa)
Expand Down Expand Up @@ -138,7 +138,7 @@ def _helper2(vyper_source, optimize, compiler_settings, input_bundle=None):
"""
settings = copy.copy(compiler_settings)
# bytecode equivalence only makes sense if we use venom pipeline
settings.experimental_codegen = True
settings.legacy_codegen = False

out = compile_code(
vyper_source, input_bundle=input_bundle, settings=settings, output_formats=["ir_runtime"]
Expand Down
8 changes: 4 additions & 4 deletions tests/unit/ast/test_pre_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,8 @@ def test_parse_pragmas(code, pre_parse_settings, compiler_data_settings, mock_ve
# None is sentinel here meaning that nothing changed
compiler_data_settings = pre_parse_settings

# experimental_codegen is False by default
compiler_data_settings.experimental_codegen = False
# legacy_codegen is False by default (venom is default)
compiler_data_settings.legacy_codegen = False

assert compiler_data.settings == compiler_data_settings

Expand All @@ -226,10 +226,10 @@ def test_parse_pragmas(code, pre_parse_settings, compiler_data_settings, mock_ve
def test_parse_venom_pragma(code):
pre_parser = PreParser(is_interface=False)
pre_parser.parse(code)
assert pre_parser.settings.experimental_codegen is True
assert pre_parser.settings.legacy_codegen is False # venom = not legacy

compiler_data = CompilerData(code)
assert compiler_data.settings.experimental_codegen is True
assert compiler_data.settings.legacy_codegen is False


invalid_pragmas = [
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/cli/vyper_json/test_compile_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ def test_compile_json_with_experimental_codegen():
expected = compiled[0][PurePath("foo.vy")]

settings = get_settings(code)
assert settings.experimental_codegen is True
assert settings.legacy_codegen is False # venom = not legacy
output_json = compile_json(code)
assert "venom" in output_json["contracts"]["foo.vy"]["foo"]
venom = output_json["contracts"]["foo.vy"]["foo"]["venom"]
Expand Down Expand Up @@ -455,7 +455,7 @@ def test_compile_json_without_experimental_codegen():
}

settings = get_settings(code)
assert settings.experimental_codegen is False
assert settings.legacy_codegen is True # legacy
output_json = compile_json(code)
assert "venom" not in output_json["contracts"]["foo.vy"]["foo"]

Expand Down
15 changes: 11 additions & 4 deletions tests/unit/cli/vyper_json/test_get_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,19 @@ def test_valid_evm(evm_version_str):
assert evm_version_str == get_evm_version({"settings": {"evmVersion": evm_version_str}})


def test_experimental_codegen_settings():
def test_codegen_settings():
input_json = {"settings": {}}
assert get_settings(input_json).experimental_codegen is None
assert get_settings(input_json).legacy_codegen is None

input_json = {"settings": {"legacyCodegen": True}}
assert get_settings(input_json).legacy_codegen is True

input_json = {"settings": {"legacyCodegen": False}}
assert get_settings(input_json).legacy_codegen is False

# deprecated: experimentalCodegen (inverted)
input_json = {"settings": {"experimentalCodegen": True}}
assert get_settings(input_json).experimental_codegen is True
assert get_settings(input_json).legacy_codegen is False # venom = not legacy

input_json = {"settings": {"experimentalCodegen": False}}
assert get_settings(input_json).experimental_codegen is False
assert get_settings(input_json).legacy_codegen is True # legacy
2 changes: 1 addition & 1 deletion tests/unit/compiler/ir/test_compile_ir.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pytest

from vyper.codegen.ir_node import IRnode
from vyper.codegen_legacy.ir_node import IRnode
from vyper.evm.opcodes import version_check
from vyper.ir import compile_ir
from vyper.ir.s_expressions import parse_s_exp
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/compiler/ir/test_optimize_ir.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pytest

from vyper.codegen.ir_node import IRnode
from vyper.codegen_legacy.ir_node import IRnode
from vyper.evm.opcodes import version_check
from vyper.exceptions import StaticAssertionException
from vyper.ir import optimizer
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/compiler/test_default_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from vyper.codegen import core
from vyper.codegen_legacy import core
from vyper.compiler.phases import CompilerData
from vyper.compiler.settings import OptimizationLevel, _is_debug_mode

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/compiler/test_symbol_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def baz(a: uint256) -> uint256:

def test_simple_map():
code = TEST_CODE
settings = Settings(experimental_codegen=True, optimize=OptimizationLevel.GAS)
settings = Settings(legacy_codegen=False, optimize=OptimizationLevel.GAS)
settings.venom_flags = VenomOptimizationFlags(disable_inlining=True)
output = compile_code(
code, output_formats=["symbol_map_runtime", "metadata"], settings=settings
Expand Down
Loading
Loading