Skip to content

Commit

Permalink
Merge pull request #58 from HodanPlodky/feat/advanced-load-elimination
Browse files Browse the repository at this point in the history
fix[venom]: test fixes
  • Loading branch information
charles-cooper authored Jan 31, 2025
2 parents 2bf3d88 + f302804 commit 04915aa
Showing 1 changed file with 145 additions and 1 deletion.
146 changes: 145 additions & 1 deletion tests/unit/compiler/venom/test_load_elimination.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
from tests.venom_utils import assert_ctx_eq, parse_from_basic_block
from vyper.venom.analysis.analysis import IRAnalysesCache
from vyper.venom.passes.load_elimination import LoadElimination
from vyper.venom.passes.store_elimination import StoreElimination


def _check_pre_post(pre, post):
ctx = parse_from_basic_block(pre)

post_ctx = parse_from_basic_block(post)
for fn in post_ctx.functions.values():
ac = IRAnalysesCache(fn)
# this store elim is used for
# proper equivalence of the post
# and pre results
StoreElimination(ac, fn).run_pass()

for fn in ctx.functions.values():
ac = IRAnalysesCache(fn)
# store elim is needed for variable equivalence
StoreElimination(ac, fn).run_pass()
LoadElimination(ac, fn).run_pass()
# this store elim is used for
# proper equivalence of the post
# and pre results
StoreElimination(ac, fn).run_pass()

assert_ctx_eq(ctx, parse_from_basic_block(post))
assert_ctx_eq(ctx, post_ctx)


def _check_no_change(pre):
Expand Down Expand Up @@ -127,3 +142,132 @@ def test_store_load_barrier():
%4 = mload %ptr
"""
_check_no_change(pre)


def test_store_load_overlap_barrier():
"""
Check for barrier between store/load done
by overlap of the mstore and mload
"""

pre = """
main:
%ptr_mload = 10
%ptr_mstore = 20
%tmp01 = mload %ptr_mload
# barrier created with overlap
mstore %ptr_mstore, 11
%tmp02 = mload %ptr_mload
return %tmp01, %tmp02
"""

_check_no_change(pre)


def test_store_store_overlap_barrier():
"""
Check for barrier between store/load done
by overlap of the mstore and mload
"""

pre = """
main:
%ptr_mstore01 = 10
%ptr_mstore02 = 20
mstore %ptr_mstore01, 10
# barrier created with overlap
mstore %ptr_mstore02, 11
mstore %ptr_mstore01, 10
stop
"""

_check_no_change(pre)


def test_store_load_no_overlap_different_store():
"""
Check for barrier between store/load done
by overlap of the mstore and mload
"""

pre = """
main:
%ptr_mload = 10
%tmp01 = mload %ptr_mload
# this should not create barrier
sstore %ptr_mload, 11
%tmp02 = mload %ptr_mload
return %tmp01, %tmp02
"""

post = """
main:
%ptr_mload = 10
%tmp01 = mload %ptr_mload
# this should not create barrier
sstore %ptr_mload, 11
%tmp02 = %tmp01
return %tmp01, %tmp02
"""

_check_pre_post(pre, post)


def test_store_store_no_overlap():
"""
Test that if the mstores do not overlap it can still
eliminate any possible repeated mstores
"""

pre = """
main:
%ptr_mstore01 = 10
%ptr_mstore02 = 42
mstore %ptr_mstore01, 10
mstore %ptr_mstore02, 11
mstore %ptr_mstore01, 10
stop
"""

post = """
main:
%ptr_mstore01 = 10
%ptr_mstore02 = 42
mstore %ptr_mstore01, 10
mstore %ptr_mstore02, 11
nop
stop
"""

_check_pre_post(pre, post)


def test_store_store_unknown_ptr_barrier():
"""
Check for barrier between store/load done
by overlap of the mstore and mload
"""

pre = """
main:
%ptr_mstore01 = 10
%ptr_mstore02 = param
mstore %ptr_mstore01, 10
# barrier created with overlap
mstore %ptr_mstore02, 11
mstore %ptr_mstore01, 10
stop
"""

_check_no_change(pre)

0 comments on commit 04915aa

Please sign in to comment.