From 4d02f06d9398fbb52ae94716d940da85c00ad3fc Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Fri, 23 May 2025 12:10:56 +0300 Subject: [PATCH 1/3] draft: extract "stable" venom passes --- vyper/venom/__init__.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/vyper/venom/__init__.py b/vyper/venom/__init__.py index d894f5957e..ed06b0c71f 100644 --- a/vyper/venom/__init__.py +++ b/vyper/venom/__init__.py @@ -52,6 +52,38 @@ def generate_assembly_experimental( compiler = VenomCompiler(functions) return compiler.generate_evm(optimize == OptimizationLevel.NONE) +def _run_stable_passes(fn: IRFunction, optimize: OptimizationLevel, ac: IRAnalysesCache) -> None: + # Run passes on Venom IR + + FloatAllocas(ac, fn).run_pass() + + # required to fix dom tree + SimplifyCFGPass(ac, fn).run_pass() + + MakeSSA(ac, fn).run_pass() + PhiEliminationPass(ac, fn).run_pass() + + # run algebraic opts before mem2var to reduce some pointer arithmetic + AlgebraicOptimizationPass(ac, fn).run_pass() + AssignElimination(ac, fn).run_pass() + Mem2Var(ac, fn).run_pass() + MakeSSA(ac, fn).run_pass() + PhiEliminationPass(ac, fn).run_pass() + + SCCP(ac, fn).run_pass() + SimplifyCFGPass(ac, fn).run_pass() + + AssignElimination(ac, fn).run_pass() + RevertToAssert(ac, fn).run_pass() + SimplifyCFGPass(ac, fn).run_pass() + + LowerDloadPass(ac, fn).run_pass() + AssignElimination(ac, fn).run_pass() + RemoveUnusedVariablesPass(ac, fn).run_pass() + BranchOptimizationPass(ac, fn).run_pass() + + SingleUseExpansion(ac, fn).run_pass() + def _run_passes(fn: IRFunction, optimize: OptimizationLevel, ac: IRAnalysesCache) -> None: # Run passes on Venom IR @@ -122,7 +154,8 @@ def run_passes_on(ctx: IRContext, optimize: OptimizationLevel) -> None: ir_analyses[fn] = IRAnalysesCache(fn) for fn in ctx.functions.values(): - _run_passes(fn, optimize, ir_analyses[fn]) + #_run_passes(fn, optimize, ir_analyses[fn]) + _run_stable_passes(fn, optimize, ir_analyses[fn]) def generate_ir(ir: IRnode, settings: Settings) -> IRContext: From 5f2db3b1ebb782583973b984d001c43df217aa05 Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Fri, 23 May 2025 12:36:01 +0300 Subject: [PATCH 2/3] add -Onone passes --- vyper/venom/__init__.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/vyper/venom/__init__.py b/vyper/venom/__init__.py index ed06b0c71f..ba5aad50ad 100644 --- a/vyper/venom/__init__.py +++ b/vyper/venom/__init__.py @@ -52,7 +52,28 @@ def generate_assembly_experimental( compiler = VenomCompiler(functions) return compiler.generate_evm(optimize == OptimizationLevel.NONE) -def _run_stable_passes(fn: IRFunction, optimize: OptimizationLevel, ac: IRAnalysesCache) -> None: +# base passes that are run at -Onone. basically just well-formedness passes. +def _run_base_passes(fn: IRFunction, ac: IRAnalysesCache): + FloatAllocas(ac, fn).run_pass() + + # required to fix dom tree + SimplifyCFGPass(ac, fn).run_pass() + + MakeSSA(ac, fn).run_pass() + #AssignElimination(ac, fn).run_pass() + # mem2var makes a huge improvement, but it's not a "base" pass + #Mem2Var(ac, fn).run_pass() + #MakeSSA(ac, fn).run_pass() + SCCP(ac, fn).run_pass() # required otherwise we run out of stack + SimplifyCFGPass(ac, fn).run_pass() + + #AssignElimination(ac, fn).run_pass() + LowerDloadPass(ac, fn).run_pass() + RemoveUnusedVariablesPass(ac, fn).run_pass() # required otherwise we run out of stack + # well formedness + SingleUseExpansion(ac, fn).run_pass() + +def _run_stable_passes(fn: IRFunction, ac: IRAnalysesCache) -> None: # Run passes on Venom IR FloatAllocas(ac, fn).run_pass() @@ -155,7 +176,10 @@ def run_passes_on(ctx: IRContext, optimize: OptimizationLevel) -> None: for fn in ctx.functions.values(): #_run_passes(fn, optimize, ir_analyses[fn]) - _run_stable_passes(fn, optimize, ir_analyses[fn]) + if optimize == OptimizationLevel.NONE: + _run_base_passes(fn, ir_analyses[fn]) + else: + _run_stable_passes(fn, ir_analyses[fn]) def generate_ir(ir: IRnode, settings: Settings) -> IRContext: From 3984d78fe37e084385cc54a90798569ddf2abbbf Mon Sep 17 00:00:00 2001 From: Charles Cooper Date: Mon, 26 May 2025 15:23:56 +0200 Subject: [PATCH 3/3] mem merge pass --- vyper/venom/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/vyper/venom/__init__.py b/vyper/venom/__init__.py index 9f0f03e1d8..87cfb0ea2c 100644 --- a/vyper/venom/__init__.py +++ b/vyper/venom/__init__.py @@ -96,6 +96,7 @@ def _run_stable_passes(fn: IRFunction, ac: IRAnalysesCache) -> None: SimplifyCFGPass(ac, fn).run_pass() AssignElimination(ac, fn).run_pass() + MemMergePass(ac, fn).run_pass() RevertToAssert(ac, fn).run_pass() SimplifyCFGPass(ac, fn).run_pass()