Ë
    pPêjË  ã                  ó‚   — 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y)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)ÚIRTransformc           	     ó*  — i }i }i }| j                   D ]­  }t        |j                  «      D ]“  \  }}|j                  «       D ]+  }t	        |t
        «      sŒ|j                  |d«      dz   ||<   Œ- |dk(  sŒJt	        |t        «      sŒ[t	        |j                  t
        «      sŒv|||j                  <   |||j                  <   Œ• Œ¯ |D �	ch c])  }	|j                  |	d«      dk(  sŒ|	| j                  vsŒ(|	’Œ+ }
}	| j                   D ]˜  }t        |j                  «      D ]~  \  }}t	        |t        «      sŒ|j                  |
v sŒ&|j                  |dz      }t	        |t        «      r|j                  ||j                     u rŒd|
j                  |j                  «       Œ€ Œš t        d |«      }t!        ||j#                  «       D ��ci c]  \  }}||
v sŒ||“Œ c}}«      }|j%                  | j                   «       |j                   | _         y c c}	w c c}}w )Nr   é   )ÚblocksÚ	enumerateÚopsÚsourcesÚ
isinstancer	   Úgetr   ÚvalueÚarg_regsr   Údestr   ÚlabelÚremover   ÚFlagEliminationTransformÚitemsÚtransform_blocks)ÚfnÚoptionsÚcountsÚbranchesÚlabelsÚblockÚiÚopÚsrcÚrÚ
candidatesÚnext_opÚbuilderÚxÚyÚ	transforms                   úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypyc/transform/flag_elimination.pyÚdo_flag_eliminationr/   &   sÚ  € à"$€FØ')€HØ)+€FØ—‘ò )ˆÜ˜uŸy™yÓ)ò 	)‰EˆAˆrØ—z‘z“|ò 9�Ü˜c¤8Õ,Ø"(§*¡*¨S°!Ó"4°qÑ"8�F˜3’Kð9ð �A‹vœ* R¬Õ0´ZÀÇÁÌ(Õ5SØ%'�˜Ÿ™Ñ"Ø#(��r—x‘xÒ ñ	)ð)ð ö!Ø˜vŸz™z¨!¨QÓ/°1Ó4¸À"Ç+Á+Ò9MŠð!€Jð !ð
 —‘ò /ˆÜ˜uŸy™yÓ)ò 	/‰EˆAˆrÜ˜"œfÕ%¨"¯'©'°ZÒ*?ØŸ)™) A¨¡EÑ*�Ü" 7¬DÔ1°g·m±mÀvÈbÏgÉgÁÒ6Và×%Ñ% b§g¡gÕ.ñ	/ð/ô    gÓ.€GÜ(Ø 8§>¡>Ó#3×G™4˜1˜a°q¸J²�!�Q‘$ÓGó€Ið ×Ñ˜rŸy™yÔ)Ø—‘€B…Iùò%!ùó Hs   ÃH
Ã"H
Ã1H
ÇHÇHc                  ó8   ‡ — e Zd Zdˆ fd„Zdd„Zdd„Zdd„Zˆ xZS )	r   c                ón   •— t         ‰| �  |«       || _        t        |j	                  «       «      | _        y ©N)ÚsuperÚ__init__Ú
branch_mapÚsetÚvaluesr!   )Úselfr*   r5   Ú	__class__s      €r.   r4   z!FlagEliminationTransform.__init__K   s,   ø€ Ü‰Ñ˜Ô!Ø$ˆŒÜ˜J×-Ñ-Ó/Ó0ˆ�ó    c                óv  — | j                   j                  |j                  «      x}r�t        |j                  |j
                  |j                  |j                  |j                  |j                  ¬«      }|j                  |_
        |j                  |_        | j                  |«       y | j                  |«       y )N)Úrare)r5   r   r   r   r&   ÚtrueÚfalser%   Úliner<   ÚnegatedÚtraceback_entryÚadd)r8   r%   Ú
old_branchÚ
new_branchs       r.   Úvisit_assignz%FlagEliminationTransform.visit_assignP   s�   € ØŸ™×,Ñ,¨R¯W©WÓ5Ð5ˆ:Ð5ô  Ø—‘Ø—‘Ø× Ñ Ø—‘Ø—‘Ø—_‘_ôˆJð ",×!3Ñ!3ˆJÔØ)3×)CÑ)CˆJÔ&Ø�H‰H�ZÕ à�H‰H�R�Lr:   c                óN   — | j                   j                  |j                  «       y r2   )r*   Úgotor   ©r8   r%   s     r.   Ú
visit_gotoz#FlagEliminationTransform.visit_gotob   s   € à�‰×Ñ˜"Ÿ(™(Õ#r:   c                óv   — || j                   v r| j                  t        «       «       y | j                  |«       y r2   )r!   rB   r
   rH   s     r.   Úvisit_branchz%FlagEliminationTransform.visit_branchf   s'   € Ø�—‘Ñà�H‰H”[“]Õ#à�H‰H�R�Lr:   )r*   r   r5   zdict[Register, Branch]ÚreturnÚNone)r%   r   rL   rM   )r%   r   rL   rM   )r%   r   rL   rM   )Ú__name__Ú
__module__Ú__qualname__r4   rE   rI   rK   Ú__classcell__)r9   s   @r.   r   r   J   s   ø„ õ1ó
ó$$÷r:   r   N)r   r   r   r   rL   rM   )Ú__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   r/   r   © r:   r.   ú<module>rZ      s3   ðñõ8 #å #ß P× PÝ 6Ý )Ý 4ó!ôH!˜{õ !r:   