diff --git a/vyper/venom/__init__.py b/vyper/venom/__init__.py index 0b13d8a4ec..87cfb0ea2c 100644 --- a/vyper/venom/__init__.py +++ b/vyper/venom/__init__.py @@ -53,6 +53,60 @@ def generate_assembly_experimental( compiler = VenomCompiler(functions) return compiler.generate_evm(optimize == OptimizationLevel.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() + + # 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() + MemMergePass(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 @@ -130,7 +184,11 @@ 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]) + 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: