From d35bed041f8f30a73a034ed7d34b43d96d1fbdbf Mon Sep 17 00:00:00 2001 From: Hodan Date: Wed, 29 Jan 2025 13:19:17 +0100 Subject: [PATCH] loops test and fixes --- .../test_common_subexpression_elimination.py | 32 +++++++++++++++++++ vyper/venom/analysis/available_expression.py | 6 ++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tests/unit/compiler/venom/test_common_subexpression_elimination.py b/tests/unit/compiler/venom/test_common_subexpression_elimination.py index a49515b7ed..22a0368ffe 100644 --- a/tests/unit/compiler/venom/test_common_subexpression_elimination.py +++ b/tests/unit/compiler/venom/test_common_subexpression_elimination.py @@ -319,3 +319,35 @@ def call(callname: str, i: int, var_name: str): """ _check_no_change(pre) + + +def test_common_subexpression_elimination_loop(): + pre = """ + main: + %par = param + %data0 = mload 0 + %add0 = add 1, %par + %mul0 = mul %add0, %data0 + jmp @loop + loop: + %data1 = mload 0 + %add1 = add 1, %par + %mul1 = mul %add1, %data1 + jmp @loop + """ + + post = """ + main: + %par = param + %data0 = mload 0 + %add0 = add 1, %par + %mul0 = mul %add0, %data0 + jmp @loop + loop: + %data1 = mload 0 + %add1 = %add0 + %mul1 = %mul0 + jmp @loop + """ + + _check_pre_post(pre, post) diff --git a/vyper/venom/analysis/available_expression.py b/vyper/venom/analysis/available_expression.py index 1c7bb9977a..b593ecdb70 100644 --- a/vyper/venom/analysis/available_expression.py +++ b/vyper/venom/analysis/available_expression.py @@ -221,10 +221,10 @@ def copy(self) -> "_AvailableExpression": return res @staticmethod - def intersection(*others: "_AvailableExpression"): + def intersection(*others: "_AvailableExpression | None"): if len(others) == 0: return _AvailableExpression() - tmp = list(others) + tmp = list(o for o in others if o is not None) res = tmp[0].copy() for item in tmp[1:]: buckets = res.buckets.keys() & item.buckets.keys() @@ -283,7 +283,7 @@ def _contains_msize(self) -> bool: def _handle_bb(self, bb: IRBasicBlock) -> bool: available_expr: _AvailableExpression = _AvailableExpression.intersection( - *(self.bb_outs.get(out_bb, _AvailableExpression()) for out_bb in bb.cfg_in) + *(self.bb_outs.get(out_bb, None) for out_bb in bb.cfg_in) ) change = False