Ë
    pPêjnU  ã                  ó  — U d Z ddlmZ ddlmZ ddlmZmZmZ	 ddl
mZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@  G d„ d«      ZAd	d
œd&d„ZBd'd„ZCd(d„ZD ed«      ZEeFeGeeHf   eIeE   f   ZJ G d„ deeE   «      ZKeGe	eE   e	eE   f   ZL eM«        eM«       fZNdeOd<    G d„ de1eLeE      «      ZP G d„ dePe@   «      ZQ	 	 	 	 	 	 	 	 d)d„ZR	 d*	 	 	 	 	 	 	 	 	 	 	 d+d„ZS G d„ dePe@   «      ZT	 	 	 	 	 	 	 	 d,d„ZU G d„ dePe@   «      ZVd-d„ZW G d„ d ePe@   «      ZXd.d!„ZY	 	 	 	 d/d"„ZZdZ[d#Z\	 d0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d%„Z]y$)2zData-flow analyses.é    )Úannotations)Úabstractmethod)ÚIterableÚIteratorÚSet)ÚAnyÚGenericÚTypeVar)2Ú	ERR_NEVERÚAssignÚAssignMultiÚ
BasicBlockÚBoxÚBranchÚCallÚCallCÚCastÚComparisonOpÚ	ControlOpÚDecRefÚExtendÚFloatÚFloatComparisonOpÚFloatNegÚFloatOpÚGetAttrÚ
GetElementÚGetElementPtrÚGotoÚIncRefÚ
InitStaticÚIntegerÚIntOpÚ	KeepAliveÚLoadAddressÚLoadErrorValueÚ
LoadGlobalÚLoadLiteralÚLoadMemÚ
LoadStaticÚ
MethodCallÚOpÚ	OpVisitorÚPrimitiveOpÚRaiseStandardErrorÚ
RegisterOpÚReturnÚSetAttrÚ
SetElementÚSetMemÚTruncateÚTupleGetÚTupleSetÚUnborrowÚUnboxÚUndefÚUnreachableÚValuec                  ó0   — e Zd ZdZ	 	 	 	 	 	 	 	 dd„Zdd„Zy)ÚCFGzyControl-flow graph.

    Node 0 is always assumed to be the entry point. There must be a
    non-empty set of exits.
    c                ó6   — |sJ ‚|| _         || _        || _        y ©N)ÚsuccÚpredÚexits)ÚselfrA   rB   rC   s       ú\/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypyc/analysis/dataflow.pyÚ__init__zCFG.__init__F   s    € ñ ˆˆuØˆŒ	ØˆŒ	Øˆ�
ó    c                óp   — t        | j                  d„ ¬«      }d|› d| j                  › d| j                  › �S )Nc                ó,   — t        | j                  «      S r@   )ÚintÚlabel)Úes    rE   ú<lambda>zCFG.__str__.<locals>.<lambda>R   s   € ´°Q·W±W³€ rG   )Úkeyzexits: z
succ: z
pred: )ÚsortedrC   rA   rB   )rD   rC   s     rE   Ú__str__zCFG.__str__Q   s4   € Ü�t—z‘zÑ'=Ô>ˆØ˜˜˜x¨¯	©	 {°(¸4¿9¹9¸+ÐFÐFrG   N)rA   ú"dict[BasicBlock, list[BasicBlock]]rB   rQ   rC   zset[BasicBlock]ÚreturnÚNone©rR   Ústr)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rF   rP   © rG   rE   r>   r>   ?   s8   „ ñð	à0ð	ð 1ð	ð ð		ð
 
ó	ôGrG   r>   F)Ú
use_yieldsc               ór  — i }i }t        «       }| D ]å  }t        d„ |j                  dd D «       «      rJ d«       ‚|rHt        |j                  t
        «      r.|j                  j                  r|j                  j                  g}n#t        |j                  j                  «       «      }|s|j                  |«       |g|z   D ]*  }|j                  sŒ|j                  |j                  «       Œ, |||<   g ||<   Œç |j                  «       D ]   \  }}	|	D ]  }
||
   j                  |«       Œ Œ" t        |||«      S )z‘Calculate basic block control-flow graph.

    If use_yields is set, then we treat returns inserted by yields as gotos
    instead of exits.
    c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr@   )Ú
isinstancer   )Ú.0Úops     rE   ú	<genexpr>zget_cfg.<locals>.<genexpr>`   s   è ø€ ò 
Ø*,ŒJ�rœ9×%ñ
ùs   ‚Néÿÿÿÿz-Control-flow ops must be at the end of blocks)ÚsetÚanyÚopsr^   Ú
terminatorr1   Úyield_targetÚlistÚtargetsÚaddÚerror_handlerÚappendÚitemsr>   )Úblocksr[   Úsucc_mapÚpred_maprC   ÚblockrA   Úerror_pointÚprevÚnxtrK   s              rE   Úget_cfgru   V   sG  € ð €HØ35€HÜ‹E€EØò ˆÜñ 
Ø05·	±	¸#¸2°ô
ô 
ð 	;à:ó	;ð 
ñ œ* U×%5Ñ%5´vÔ>À5×CSÑCS×C`ÒC`Ø×$Ñ$×1Ñ1Ð2‰Dä˜×(Ñ(×0Ñ0Ó2Ó3ˆDÙØ�I‰I�eÔð "˜7 T™>ò 	7ˆKØ×(Ó(Ø—‘˜K×5Ñ5Õ6ð	7ð ˆ�‰Øˆ�Šð;ð< —^‘^Ó%ò )‰	ˆˆcØò 	)ˆEØ�U‰O×"Ñ" 4Õ(ñ	)ð)ô ˆx˜ 5Ó)Ð)rG   c                ó¢   — t        | j                  «      dk(  r6t        | j                  d   t        «      r| j                  d   j                  } | S )Né   rb   )Úlenre   r^   r   rK   )rK   s    rE   Úget_real_targetry   ƒ   s;   € Ü
ˆ5�9‰9ƒ~˜Òœz¨%¯)©)°B©-¼Ô>Ø—	‘	˜"‘×#Ñ#ˆØ€LrG   c                ó’  — d}|rÃ| D ]R  }t        |j                  j                  «       «      D ]*  \  }}|j                  j                  |t	        |«      «       Œ, ŒT d}t        | «      }| j                  «       }| j                  «        t        |«      D ]-  \  }}|dk(  s|j                  |   r| j                  |«       Œ,d}Œ/ |rŒÂyy)zÄCleanup the control flow graph.

    This eliminates obviously dead basic blocks and eliminates blocks that contain
    nothing but a single jump.

    There is a lot more that could be done.
    TFr   N)
Ú	enumeraterf   ri   Ú
set_targetry   ru   ÚcopyÚclearrB   rl   )rn   Úchangedrq   ÚiÚtgtÚcfgÚorig_blockss          rE   Úcleanup_cfgr„   ‰   sÄ   € ð €GÙ
àò 	EˆEÜ# E×$4Ñ$4×$<Ñ$<Ó$>Ó?ò E‘��3Ø× Ñ ×+Ñ+¨A¬¸sÓ/CÕDñEð	Eð
 ˆÜ�f‹oˆØ—k‘k“mˆØ�‰ŒÜ! +Ó.ò 	‰HˆAˆuØ�AŠv˜Ÿ™ %šØ—‘˜eÕ$à‘ð		ô rG   ÚTc                  ó   — e Zd Zdd„Zdd„Zy)ÚAnalysisResultc                ó    — || _         || _        y r@   ©ÚbeforeÚafter)rD   rŠ   r‹   s      rE   rF   zAnalysisResult.__init__ª   s   € ØˆŒØˆ�
rG   c                ó<   — d| j                   › d| j                  › d�S )Nzbefore: z
after: ú
r‰   )rD   s    rE   rP   zAnalysisResult.__str__®   s   € Ø˜$Ÿ+™+˜ i°·
±
¨|¸2Ð>Ð>rG   N)rŠ   úAnalysisDict[T]r‹   rŽ   rR   rS   rT   )rV   rW   rX   rF   rP   rZ   rG   rE   r‡   r‡   ©   s   „ óô?rG   r‡   z%tuple[frozenset[Any], frozenset[Any]]Ú_EMPTYc                  ód  — e Zd Zd(d„Zed)d„«       Zed*d„«       Zed+d„«       Zed,d„«       Zd-d„Z	d.d„Z
d/d„Zd0d	„Zd1d
„Zd2d„Zd3d„Zd4d„Zd5d„Zd6d„Zd7d„Zd8d„Zd9d„Zd:d„Zd;d„Zd<d„Zd=d„Zd>d„Zd?d„Zd@d„ZdAd„ZdBd„ZdCd„ZdDd„Z dEd„Z!dFd„Z"dGd „Z#dHd!„Z$dId"„Z%dJd#„Z&dKd$„Z'dLd%„Z(dMd&„Z)y')NÚBaseAnalysisVisitorc                ó   — t         S r@   ©r�   ©rD   r`   s     rE   Ú
visit_gotozBaseAnalysisVisitor.visit_goto¸   ó   € ÜˆrG   c                ó   — t         ‚r@   ©ÚNotImplementedErrorr”   s     rE   Úvisit_register_opz%BaseAnalysisVisitor.visit_register_op»   ó   € ä!Ð!rG   c                ó   — t         ‚r@   r˜   r”   s     rE   Úvisit_assignz BaseAnalysisVisitor.visit_assign¿   r›   rG   c                ó   — t         ‚r@   r˜   r”   s     rE   Úvisit_assign_multiz&BaseAnalysisVisitor.visit_assign_multiÃ   r›   rG   c                ó   — t         ‚r@   r˜   r”   s     rE   Úvisit_set_memz!BaseAnalysisVisitor.visit_set_memÇ   r›   rG   c                ó$   — | j                  |«      S r@   ©rš   r”   s     rE   Úvisit_inc_refz!BaseAnalysisVisitor.visit_inc_refË   ó   € Ø×%Ñ% bÓ)Ð)rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_dec_refz!BaseAnalysisVisitor.visit_dec_refÎ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Ú
visit_callzBaseAnalysisVisitor.visit_callÑ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_method_callz%BaseAnalysisVisitor.visit_method_callÔ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_error_valuez*BaseAnalysisVisitor.visit_load_error_value×   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_literalz&BaseAnalysisVisitor.visit_load_literalÚ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_get_attrz"BaseAnalysisVisitor.visit_get_attrÝ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_set_attrz"BaseAnalysisVisitor.visit_set_attrà   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_staticz%BaseAnalysisVisitor.visit_load_staticã   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_init_staticz%BaseAnalysisVisitor.visit_init_staticæ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_tuple_getz#BaseAnalysisVisitor.visit_tuple_geté   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_tuple_setz#BaseAnalysisVisitor.visit_tuple_setì   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Ú	visit_boxzBaseAnalysisVisitor.visit_boxï   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_unboxzBaseAnalysisVisitor.visit_unboxò   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Ú
visit_castzBaseAnalysisVisitor.visit_castõ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_raise_standard_errorz.BaseAnalysisVisitor.visit_raise_standard_errorø   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_call_cz BaseAnalysisVisitor.visit_call_cû   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_primitive_opz&BaseAnalysisVisitor.visit_primitive_opþ   r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_truncatez"BaseAnalysisVisitor.visit_truncate  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_extendz BaseAnalysisVisitor.visit_extend  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_globalz%BaseAnalysisVisitor.visit_load_global  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_int_opz BaseAnalysisVisitor.visit_int_op
  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_float_opz"BaseAnalysisVisitor.visit_float_op  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_float_negz#BaseAnalysisVisitor.visit_float_neg  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_comparison_opz'BaseAnalysisVisitor.visit_comparison_op  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_float_comparison_opz-BaseAnalysisVisitor.visit_float_comparison_op  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_memz"BaseAnalysisVisitor.visit_load_mem  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_get_elementz%BaseAnalysisVisitor.visit_get_element  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_get_element_ptrz)BaseAnalysisVisitor.visit_get_element_ptr  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_set_elementz%BaseAnalysisVisitor.visit_set_element"  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_load_addressz&BaseAnalysisVisitor.visit_load_address%  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_keep_alivez$BaseAnalysisVisitor.visit_keep_alive(  r¥   rG   c                ó$   — | j                  |«      S r@   r£   r”   s     rE   Úvisit_unborrowz"BaseAnalysisVisitor.visit_unborrow+  r¥   rG   N)r`   r   rR   úGenAndKill[T])r`   r0   rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r4   rR   ræ   )r`   r    rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r+   rR   ræ   )r`   r&   rR   ræ   )r`   r(   rR   ræ   )r`   r   rR   ræ   )r`   r2   rR   ræ   )r`   r*   rR   ræ   )r`   r!   rR   ræ   )r`   r6   rR   ræ   )r`   r7   rR   ræ   )r`   r   rR   ræ   )r`   r9   rR   ræ   )r`   r   rR   ræ   )r`   r/   rR   ræ   )r`   r   rR   ræ   )r`   r.   rR   ræ   )r`   r5   rR   ræ   )r`   r   rR   ræ   )r`   r'   rR   ræ   )r`   r#   rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r)   rR   ræ   )r`   r   rR   ræ   )r`   r   rR   ræ   )r`   r3   rR   ræ   )r`   r%   rR   ræ   )r`   r$   rR   ræ   )r`   r8   rR   ræ   )*rV   rW   rX   r•   r   rš   r�   rŸ   r¡   r¤   r§   r©   r«   r­   r¯   r±   r³   rµ   r·   r¹   r»   r½   r¿   rÁ   rÃ   rÅ   rÇ   rÉ   rË   rÍ   rÏ   rÑ   rÓ   rÕ   r×   rÙ   rÛ   rÝ   rß   rá   rã   rå   rZ   rG   rE   r‘   r‘   ·   sü   „ óð ò"ó ð"ð ò"ó ð"ð ò"ó ð"ð ò"ó ð"ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ó*ô*rG   r‘   c                  óR   — e Zd ZdZddd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zy
)ÚDefinedVisitora  Visitor for finding defined registers.

    Note that this only deals with registers and not temporaries, on
    the assumption that we never access temporaries when they might be
    undefined.

    If strict_errors is True, then we regard any use of LoadErrorValue
    as making a register undefined. Otherwise we only do if
    `undefines` is set on the error value.

    This lets us only consider the things we care about during
    uninitialized variable checking while capturing all possibly
    undefined things for refcounting.
    c                ó   — || _         y r@   ©Ústrict_errors)rD   rë   s     rE   rF   zDefinedVisitor.__init__?  s
   € Ø*ˆÕrG   c                ó   — t         S r@   r“   r”   s     rE   Úvisit_branchzDefinedVisitor.visit_branchB  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   Úvisit_returnzDefinedVisitor.visit_returnE  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   Úvisit_unreachablez DefinedVisitor.visit_unreachableH  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rš   z DefinedVisitor.visit_register_opK  r–   rG   c                óÖ   — t        |j                  t        «      r9|j                  j                  s| j                  rt        «       |j                  hfS |j                  ht        «       fS r@   )r^   Úsrcr&   Ú	undefinesrë   rc   Údestr”   s     rE   r�   zDefinedVisitor.visit_assignN  sJ   € ä�b—f‘fœnÔ-°2·6±6×3CÒ3CÀt×GYÒGYÜ“5˜2Ÿ7™7˜)Ð#Ð#à—G‘G�9œc›eÐ#Ð#rG   c                ó   — t         S r@   r“   r”   s     rE   rŸ   z!DefinedVisitor.visit_assign_multiU  s   € äˆrG   c                ó   — t         S r@   r“   r”   s     rE   r¡   zDefinedVisitor.visit_set_memY  r–   rG   N©F)rë   ÚboolrR   rS   ©r`   r   rR   úGenAndKill[Value]©r`   r1   rR   rü   ©r`   r;   rR   rü   ©r`   r0   rR   rü   ©r`   r   rR   rü   ©r`   r   rR   rü   ©r`   r4   rR   rü   )rV   rW   rX   rY   rF   rí   rï   rñ   rš   r�   rŸ   r¡   rZ   rG   rE   rè   rè   /  s/   „ ñô+óóóóó$óôrG   rè   c                ó<   — t        | |t        «       |dt        ¬«      S )zšCalculate potentially defined registers at each CFG location.

    A register is defined if it has a value along some path from the initial location.
    F©rn   r‚   Úgen_and_killÚinitialÚbackwardÚkind)Úrun_analysisrè   ÚMAYBE_ANALYSIS)rn   r‚   Úinitial_defineds      rE   Úanalyze_maybe_defined_regsr  ]  s&   € ô ØØÜ#Ó%ØØÜôð rG   c                óT   — t        | |t        |¬«      |dt        t        |«      ¬«      S )aI  Calculate always defined registers at each CFG location.

    This analysis can work before exception insertion, since it is a
    sound assumption that registers defined in a block might not be
    initialized in its error handler.

    A register is defined if it has a value along all paths from the
    initial location.
    rê   F©rn   r‚   r  r  r  r  Úuniverse)r	  rè   ÚMUST_ANALYSISrc   )rn   r‚   r  Úregsrë   s        rE   Úanalyze_must_defined_regsr  n  s/   € ô  ØØÜ#°-Ô@ØØÜÜ�T“ôð rG   c                  óL   — e Zd Zd
d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
y	)ÚBorrowedArgumentsVisitorc                ó   — || _         y r@   )Úargs)rD   r  s     rE   rF   z!BorrowedArgumentsVisitor.__init__Š  s	   € Øˆ�	rG   c                ó   — t         S r@   r“   r”   s     rE   rí   z%BorrowedArgumentsVisitor.visit_branch�  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rï   z%BorrowedArgumentsVisitor.visit_return�  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rñ   z*BorrowedArgumentsVisitor.visit_unreachable“  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rš   z*BorrowedArgumentsVisitor.visit_register_op–  r–   rG   c                ól   — |j                   | j                  v rt        «       |j                   hfS t        S r@   )rö   r  rc   r�   r”   s     rE   r�   z%BorrowedArgumentsVisitor.visit_assign™  s*   € Ø�7‰7�d—i‘iÑÜ“5˜2Ÿ7™7˜)Ð#Ð#ÜˆrG   c                ó   — t         S r@   r“   r”   s     rE   rŸ   z+BorrowedArgumentsVisitor.visit_assign_multiž  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   r¡   z&BorrowedArgumentsVisitor.visit_set_mem¡  r–   rG   N)r  ú
set[Value]rR   rS   rû   rý   rþ   rÿ   r   r  r  )rV   rW   rX   rF   rí   rï   rñ   rš   r�   rŸ   r¡   rZ   rG   rE   r  r  ‰  s*   „ óóóóóóó
ôrG   r  c           	     ó@   — t        | |t        |«      |dt        |¬«      S )zˆCalculate arguments that can use references borrowed from the caller.

    When assigning to an argument, it no longer is borrowed.
    Fr  )r	  r  r  )rn   r‚   Úborroweds      rE   Úanalyze_borrowed_argumentsr!  ¥  s+   € ô ØØÜ-¨hÓ7ØØÜØôð rG   c                  óD   — e Zd Zd	d„Zd
d„Zdd„Zdd„Zdd„Zdd„Zdd„Z	y)ÚUndefinedVisitorc                ó   — t         S r@   r“   r”   s     rE   rí   zUndefinedVisitor.visit_branch¸  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rï   zUndefinedVisitor.visit_return»  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   rñ   z"UndefinedVisitor.visit_unreachable¾  r–   rG   c                óJ   — t        «       |j                  s|hfS t        «       fS r@   )rc   Úis_voidr”   s     rE   rš   z"UndefinedVisitor.visit_register_opÁ  s!   € Ü‹u "§*¢*�r�dÐ7Ð7´#³%Ð7Ð7rG   c                ó0   — t        «       |j                  hfS r@   ©rc   rö   r”   s     rE   r�   zUndefinedVisitor.visit_assignÄ  ó   € Ü‹u�r—w‘w�iÐÐrG   c                ó0   — t        «       |j                  hfS r@   r*  r”   s     rE   rŸ   z#UndefinedVisitor.visit_assign_multiÇ  r+  rG   c                ó   — t         S r@   r“   r”   s     rE   r¡   zUndefinedVisitor.visit_set_memÊ  r–   rG   Nrû   rý   rþ   rÿ   r   r  r  )
rV   rW   rX   rí   rï   rñ   rš   r�   rŸ   r¡   rZ   rG   rE   r#  r#  ·  s%   „ óóóó8ó ó ôrG   r#  c                óž   — t        «       }| j                  «       D ]/  }t        |t        t        t
        f«      rŒ|j                  |«       Œ1 |S r@   )rc   Úsourcesr^   r"   r   r:   rj   )r`   ÚresultÚsources      rE   Únon_trivial_sourcesr2  Î  sB   € Ü‹U€FØ—*‘*“,ò ˆÜ˜&¤7¬E´5Ð"9Õ:Ø�J‰J�vÕðð €MrG   c                  óT   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zy
)ÚLivenessVisitorc                ó,   — t        |«      t        «       fS r@   ©r2  rc   r”   s     rE   rí   zLivenessVisitor.visit_branch×  ó   € Ü" 2Ó&¬«Ð-Ð-rG   c                ó|   — t        |j                  t        t        f«      s|j                  ht	        «       fS t
        S r@   )r^   Úvaluer"   r   rc   r�   r”   s     rE   rï   zLivenessVisitor.visit_returnÚ  s-   € Ü˜"Ÿ(™(¤W¬eÐ$4Ô5Ø—H‘H�:œs›uÐ$Ð$äˆMrG   c                ó   — t         S r@   r“   r”   s     rE   rñ   z!LivenessVisitor.visit_unreachableà  r–   rG   c                óR   — t        |«      }|j                  s||hfS |t        «       fS r@   )r2  r(  rc   )rD   r`   Úgens      rE   rš   z!LivenessVisitor.visit_register_opã  s+   € Ü! "Ó%ˆØ�zŠzØ˜˜�9Ðàœ›�:ÐrG   c                ó2   — t        |«      |j                  hfS r@   ©r2  rö   r”   s     rE   r�   zLivenessVisitor.visit_assignê  ó   € Ü" 2Ó&¨¯©¨	Ð1Ð1rG   c                ó2   — t        |«      |j                  hfS r@   r>  r”   s     rE   rŸ   z"LivenessVisitor.visit_assign_multií  r?  rG   c                ó,   — t        |«      t        «       fS r@   r6  r”   s     rE   r¡   zLivenessVisitor.visit_set_memð  r7  rG   c                ó   — t         S r@   r“   r”   s     rE   r¤   zLivenessVisitor.visit_inc_refó  r–   rG   c                ó   — t         S r@   r“   r”   s     rE   r§   zLivenessVisitor.visit_dec_refö  r–   rG   Nrû   rý   rþ   rÿ   r   r  r  )r`   r    rR   rü   )r`   r   rR   rü   )rV   rW   rX   rí   rï   rñ   rš   r�   rŸ   r¡   r¤   r§   rZ   rG   rE   r4  r4  Ö  s/   „ ó.óóóó2ó2ó.óôrG   r4  c                óL   — t        | |t        «       t        «       dt        ¬«      S )zŸCalculate live registers at each CFG location.

    A register is live at a location if it can be read along some CFG path starting
    from the location.
    Tr  )r	  r4  rc   r
  )rn   r‚   s     rE   Úanalyze_live_regsrE  ú  s(   € ô ØØÜ$Ó&Ü“ØÜôð rG   c                ó¸  — t        «       }| D �ci c]  }|t        «       “Œ }}	 d}t        | «      D �]  }|j                  }t	        |t
        «      r|j                  �|j                  f}n|j                  «       }t        «       }|D ]  }|j                  ||   «       Œ t        |j                  «      D ]…  }	|j                  �At	        |	t        «      r1|	j                  t        k7  r|j                  ||j                     «       |	j                  |«      \  }
}|j                  |«       |j                  |
«       Œ‡ |||   k7  s�Œ|||<   d}�Œ |s|S �Œ3c c}w )a5  Calculate block-entry liveness before exception handling is inserted.

    Unlike get_cfg(), this models an error edge at each operation that can
    raise. This matters when an assignment later in the same block overwrites a
    value that the error handler can still read. Returns inserted for a yield
    are treated as edges to their continuation blocks.

    TODO: Unlike run_analysis(), this supports edges from the middle of basic
          blocks, so we reimplement data flow analysis here. Figure out a way
          to unify this with run_analysis().
    TF)r4  rc   Úreversedrf   r^   r1   rg   ri   Úupdatere   rk   r0   Ú
error_kindr   ÚacceptÚdifference_update)rn   Úvisitorrq   Úlive_inr   rf   Ú
successorsÚliveÚ	successorr`   r<  Úkills               rE   Ú&analyze_live_regs_with_exception_edgesrR  
  sT  € ô Ó€GØGMÖ,N¸e¨U´C³E©\Ð,N€GÐ,Nà
ØˆÜ˜fÓ%ó 	ˆEØ×)Ñ)ˆJÜ˜*¤fÔ-°*×2IÑ2IÐ2UØ(×5Ñ5Ð7‘
à'×/Ñ/Ó1�
ä"›uˆDØ'ò 0�	Ø—‘˜G IÑ.Õ/ð0ô ˜uŸy™yÓ)ò 	!�à×'Ñ'Ð3Ü" 2¤zÔ2ØŸ™¬Ò2à—K‘K ¨×(;Ñ(;Ñ <Ô=ØŸI™I gÓ.‘	��TØ×&Ñ& tÔ,Ø—‘˜CÕ ð	!ð �w˜u‘~Ô%Ø!%�˜‘Ø’ð1	ñ4 ØˆNñ; ùò -Os   �Erw   Nc                óø  — i }i }| D ]x  }	t        «       }
t        «       }|	j                  }|rt        t        |«      «      }|D ]1  }|j	                  |«      \  }}|r|
|z  }
|r
|
|z  }
||z  }|sŒ-||z  }Œ3 |
||	<   |||	<   Œz t        | «      }|s|j                  «        t        |«      }i }i }| D ]K  }	|t        k(  rt        «       ||	<   t        «       ||	<   Œ'|€J d«       ‚t        |«      ||	<   t        |«      ||	<   ŒM |r|j                  }|j                  }n|j                  }|j                  }|rÀ|j                  «       }|j                  |«       ||   r;d}||   D ]-  }|€t        ||   «      }Œ|t        k(  r	|||   z  }Œ&|||   z  }Œ/ |€J ‚t        |«      }|||<   |||   z
  ||   z  }|||   k7  r1||   D ])  }||vsŒ|j                  |«       |j                  |«       Œ+ |||<   |rŒÀi }i }| D ]n  }	|	}||   }t        |	j                  «      }|rt        t        |«      «      }|D ]5  \  }}||||f<   |j	                  |«      \  }}|r||z
  }|r||z  }||||f<   Œ7 Œp |r||}}t        ||«      S )aP  Run a general set-based data flow analysis.

    Args:
        blocks: All basic blocks
        cfg: Control-flow graph for the code
        gen_and_kill: Implementation of gen and kill functions for each op
        initial: Value of analysis for the entry points (for a forward analysis) or the
            exit points (for a backward analysis)
        kind: MUST_ANALYSIS or MAYBE_ANALYSIS
        backward: If False, the analysis is a forward analysis; it's backward otherwise
        universe: For a must analysis, the set of all possible values. This is the starting
            value for the work list algorithm, which will narrow this down until reaching a
            fixed point. For a maybe analysis the iteration always starts from an empty set
            and this argument is ignored.

    Return analysis results: (before, after)
    Nz,Universe must be defined for a must analysis)rc   re   rh   rG  rJ  Úreverser
  rA   rB   ÚpopÚremoverl   rj   r{   r‡   ) rn   r‚   r  r  r  r  r  Ú	block_genÚ
block_killrq   r<  rQ  re   r`   ÚopgenÚopkillÚworklistÚworksetrŠ   r‹   rp   ro   rK   Ú
new_beforerB   Ú	new_afterrA   Ú	op_beforeÚop_afterÚcurÚops_enumÚidxs                                    rE   r	  r	  @  s  € ð4 €IØ€Jð ò !ˆÜ“eˆÜ“uˆØ�i‰iˆÙÜ”x “}Ó%ˆCØò 
	ˆBØŸI™I lÓ3‰MˆE�6ÙØ�v‘�áØ�u‘�Ø˜‘�âØ˜‘‘ð
	ð ˆ	�%ÑØ ˆ
�5Òð'!ô, �F‹|€HÙØ×ÑÔÜ�(‹m€GØ')€FØ&(€EØò )ˆØ”>Ò!Ü›EˆF�5‰MÜ›5ˆE�%ŠLàÐ'ÐWÐ)WÓWÐ'Ü ›MˆF�5‰MÜ˜x›=ˆE�%ŠLð)ñ Ø—8‘8ˆØ—8‘8‰à—8‘8ˆØ—8‘8ˆñ Ø—‘“ˆØ�‰�uÔØ�EŠ?Ø(,ˆJØ  ™ò .�ØÐ%Ü!$ U¨4¡[Ó!1‘JØœ^Ò+Ø %¨¡+Ñ-‘Jà %¨¡+Ñ-‘Jð.ð Ð)Ð)Ð)ä˜W›ˆJØ"ˆˆu‰Ø *¨UÑ"3Ñ3°yÀÑ7GÑGˆ	Ø˜˜e™Ò$Ø  ™ò &�Ø˜wÒ&Ø—O‘O DÔ)Ø—K‘K Õ%ð&ð !ˆˆe‰ò- ð2 79€IØ57€HØò 'ˆØˆØ�U‰mˆÜ-6°u·y±yÓ-AˆÙÜ¤ X£Ó/ˆHØò 	'‰GˆC�Ø$'ˆI�e˜S�jÑ!ØŸI™I lÓ3‰MˆE�6ÙØ˜F‘l�ÙØ˜E‘k�Ø#&ˆH�U˜C�ZÒ ñ	'ð'ñ Ø'¨�)ˆä˜) XÓ.Ð.rG   )rn   úlist[BasicBlock]r[   rú   rR   r>   )rK   r   rR   r   )rn   rd  rR   rS   )rn   rd  r‚   r>   r  r  rR   úAnalysisResult[Value]rù   )rn   rd  r‚   r>   r  r  r  zIterable[Value]rë   rú   rR   re  )rn   rd  r‚   r>   r   r  rR   re  )r`   r,   rR   r  )rn   rd  r‚   r>   rR   re  )rn   rd  rR   zdict[BasicBlock, set[Value]]r@   )rn   rd  r‚   r>   r  zOpVisitor[GenAndKill[T]]r  zset[T]r  rJ   r  rú   r  zset[T] | NonerR   zAnalysisResult[T])^rY   Ú
__future__r   Úabcr   Úcollections.abcr   r   r   ÚAbstractSetÚtypingr   r	   r
   Úmypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r>   ru   ry   r„   r…   ÚdictÚtuplerJ   rc   ÚAnalysisDictr‡   Ú
GenAndKillÚ	frozensetr�   Ú__annotations__r‘   rè   r  r  r  r!  r#  r2  r4  rE  rR  r  r
  r	  rZ   rG   rE   ú<module>rr     s[  ðÚ å "å ß BÑ Bß (Ñ (÷3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷ 3÷lGñ Gð. =Bõ **óZóñ6 ˆCƒL€à�E˜* c˜/Ñ*¨C°©FÐ2Ñ3€ô?�W˜Q‘Zô ?ð �;˜q‘> ;¨q¡>Ð1Ñ2€
á1:³¹i»kÐ0J€Ð-Ó Jôu*˜) J¨q¡MÑ2ô u*ôp+Ð(¨Ñ/ô +ð\ØðØ#&ðØ9Cðàóð,  ðØðà	ðð  ðð ð	ð
 ðð óô6Ð2°5Ñ9ô ð8ØðØ#&ðØ2<ðàóô$Ð*¨5Ñ1ô ó.ô!Ð)¨%Ñ0ô !óHð .Øð.à!ó.ðd €Ø€ð #ðw/Øðw/à	ðw/ð +ðw/ð ð	w/ð
 ðw/ð ðw/ð ðw/ð ôw/rG   