
    X-Ph                        d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddZ G d de          ZdS )a  Bool 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
BasicBlockBranchGotoRegisterUnreachable)LowLevelIRBuilder)CompilerOptions)IRTransformfnr   optionsr   returnNonec                    i i }i } j         D ]}t          |j                  D ]\  }}|                                D ]3}t	          |t
                    r                    |d          dz   |<   4|dk    rCt	          |t                    r.t	          |j        t
                    r|||j        <   |||j        <    fd|D              j         D ]}t          |j                  D ]v\  }}t	          |t                    r\|j
        v rS|j        |dz            }t	          |t                    r|j        ||j
                 u s                    |j
                   wt          d |          }	t          |	fd|                                D                       }
|
                     j                    |	j          _         d S )Nr      c                Z    h | ]'}                     |d           dk    |j        v%|(S )r   r   )getarg_regs).0rcountsr   s     `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/transform/flag_elimination.py	<setcomp>z&do_flag_elimination.<locals>.<setcomp>5   sD     ! ! !vzz!Q//144"+9M9M9M9M9M    c                $    i | ]\  }}|v 	||S  r   )r   xy
candidatess      r   
<dictcomp>z'do_flag_elimination.<locals>.<dictcomp>D   s$    GGG41aqJ!Qr   )blocks	enumerateopssources
isinstancer	   r   r   valuer   destr   labelremover   FlagEliminationTransformitemstransform_blocks)r   r   brancheslabelsblockiopsrcnext_opbuilder	transformr!   r   s   `          @@r   do_flag_eliminationr8   &   s   "$F')H)+F ) )uy)) 	) 	)EArzz|| 9 9c8,, 9"(**S!"4"4q"8F3KAvv*R00vZ(5S5Sv%'"#(rx 	)! ! ! ! !! ! !J
  / /uy)) 	/ 	/EAr"f%% /"'Z*?*?)AE*"7D11 /gmvbg6V6V%%bg...	/  g..G(GGGG8>>#3#3GGG I ry)))BIIIr   c                  8     e Zd Zd fdZdd
ZddZddZ xZS )r,   r6   r   
branch_mapdict[Register, Branch]r   r   c                    t                                          |           || _        t          |                                          | _        d S N)super__init__r:   setvaluesr/   )selfr6   r:   	__class__s      r   r?   z!FlagEliminationTransform.__init__K   sA    !!!$J--//00r   r3   r   c                6   | j                             |j                  }|rbt          |j        |j        |j        |j        |j        |j	                  }|j
        |_
        |j        |_        |                     |           d S |                     |           d S )N)rare)r:   r   r)   r   r4   truefalser3   linerE   negatedtraceback_entryadd)rB   r3   
old_branch
new_branchs       r   visit_assignz%FlagEliminationTransform.visit_assignP   s    _((11
 	   _  J ",!3J)3)CJ&HHZ     HHRLLLLLr   r   c                D    | j                             |j                   d S r=   )r6   gotor*   rB   r3   s     r   
visit_gotoz#FlagEliminationTransform.visit_gotoc   s     "(#####r   r   c                    || j         v r#|                     t                                 d S |                     |           d S r=   )r/   rK   r
   rQ   s     r   visit_branchz%FlagEliminationTransform.visit_branchg   s>    HH[]]#####HHRLLLLLr   )r6   r   r:   r;   r   r   )r3   r   r   r   )r3   r   r   r   )r3   r   r   r   )__name__
__module____qualname__r?   rN   rR   rT   __classcell__)rC   s   @r   r,   r,   J   sy        1 1 1 1 1 1
   &$ $ $ $       r   r,   N)r   r   r   r   r   r   )__doc__
__future__r   mypyc.ir.func_irr   mypyc.ir.opsr   r   r   r   r	   r
   mypyc.irbuild.ll_builderr   mypyc.optionsr   mypyc.transform.ir_transformr   r8   r,   r   r   r   <module>r`      s    8 # " " " " " # # # # # # P P P P P P P P P P P P P P P P 6 6 6 6 6 6 ) ) ) ) ) ) 4 4 4 4 4 4! ! ! !H" " " " "{ " " " " "r   