NL i dZddlmZddlmZddlmZmZmZm Z m Z m Z ddl m Z ddlmZddlmZd dZGd d eZy ) aBool register elimination optimization. Example input: L1: r0 = f() b = r0 goto L3 L2: r1 = g() b = r1 goto L3 L3: if b goto L4 else goto L5 The register b is redundant and we replace the assignments with two copies of the branch in L3: L1: r0 = f() if r0 goto L4 else goto L5 L2: r1 = g() if r1 goto L4 else goto L5 This helps generate simpler IR for tagged integers comparisons, for example. ) annotations)FuncIR)Assign BasicBlockBranchGotoRegister Unreachable)LowLevelIRBuilder)CompilerOptions) IRTransformc *i}i}i}|jD]}t|jD]\}}|jD]+}t |t s|j |ddz||<-|dk(sJt |ts[t |jt sv|||j<|||j<|D chc])} |j | ddk(s| |jvs(| +} } |jD]}t|jD]~\}}t |ts|j| vs&|j|dz} t | tr| j||jurd| j|jtd|} t!| |j#D cic] \} }| | vs | |c}} }|j%|j| j|_ycc} wcc}} w)Nr)blocks enumerateopssources isinstancer getrvaluearg_regsrdestrlabelremover FlagEliminationTransformitemstransform_blocks)fnoptionscountsbrancheslabelsblockiopsrcr candidatesnext_opbuilderxy transforms f/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypyc/transform/flag_elimination.pydo_flag_eliminationr/&s"$F')H)+F)uyy) )EArzz| 9c8,"(**S!"4q"8F3K 9Av*R0Z(5S%'"#(rxx  ))!vzz!Q/14"++9M!J! /uyy) /EAr"f%"''Z*?))AE*"7D1gmmvbgg6V%%bgg.  // g.G(8>>#3G41aqJ!Q$GIryy)BI%!HsH "H 1H  H H c8eZdZdfd ZddZddZddZxZS) rcnt||||_t|j |_yN)super__init__ branch_mapsetvaluesr!)selfr*r5 __class__s r.r4z!FlagEliminationTransform.__init__Ks, !$J--/0 cv|jj|j}|rt|j|j |j |j|j|j}|j|_ |j|_ |j|y|j|y)N)rare) r5rrrr&truefalser%liner<negatedtraceback_entryadd)r8r% old_branch new_branchs r. visit_assignz%FlagEliminationTransform.visit_assignPs__((1     __ J",!3!3J )3)C)CJ & HHZ HHRLr:cN|jj|jyr2)r*gotorr8r%s r. visit_gotoz#FlagEliminationTransform.visit_gotocs "((#r:cv||jvr|jty|j|yr2)r!rBr rHs r. visit_branchz%FlagEliminationTransform.visit_branchgs'   HH[] # HHRLr:)r*r r5zdict[Register, Branch]returnNone)r%rrLrM)r%rrLrM)r%rrLrM)__name__ __module__ __qualname__r4rErIrK __classcell__)r9s@r.rrJs1 &$r:rN)rrrr rLrM)__doc__ __future__rmypyc.ir.func_irr mypyc.ir.opsrrrrr r mypyc.irbuild.ll_builderr mypyc.optionsr mypyc.transform.ir_transformr r/rr:r.rZs38##PP6)4!H"{"r: