o
    ØÝ2gÔL  ã                   @  s:  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mZ ddl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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; G dd„ dƒZ<dHdd„Z=dIdd„Z>dJdd„Z?edƒZ@eeeeAf e
e@ f ZBG dd„ dee@ ƒZCee
e@ e
e@ f ZDG dd„ de.eDe@  ƒZEG dd„ deEe; ƒZFdKd d!„ZG	"dLdMd'd(„ZHG d)d*„ d*eEe; ƒZIdNd,d-„ZJG d.d/„ d/eEe; ƒZKdKd0d1„ZLdOd4d5„ZMG d6d7„ d7eEe; ƒZNdPd8d9„ZOdZPd:ZQ	;dQdRdFdG„ZRd;S )SzData-flow analyses.é    )Úannotations)Úabstractmethod)ÚDictÚGenericÚIterableÚIteratorÚSetÚTupleÚTypeVar)Ú
all_values),ÚAssignÚAssignMultiÚ
BasicBlockÚBoxÚBranchÚCallÚCallCÚCastÚComparisonOpÚ	ControlOpÚExtendÚFloatÚFloatComparisonOpÚFloatNegÚFloatOpÚGetAttrÚGetElementPtrÚGotoÚ
InitStaticÚIntegerÚIntOpÚ	KeepAliveÚLoadAddressÚLoadErrorValueÚ
LoadGlobalÚLoadLiteralÚLoadMemÚ
LoadStaticÚ
MethodCallÚOpÚ	OpVisitorÚPrimitiveOpÚRaiseStandardErrorÚ
RegisterOpÚReturnÚSetAttrÚSetMemÚTruncateÚTupleGetÚTupleSetÚUnborrowÚUnboxÚUnreachableÚValuec                   @  s$   e Zd ZdZdd	d
„Zddd„ZdS )ÚCFGzyControl-flow graph.

    Node 0 is always assumed to be the entry point. There must be a
    non-empty set of exits.
    Úsuccú"dict[BasicBlock, list[BasicBlock]]ÚpredÚexitsúset[BasicBlock]ÚreturnÚNonec                 C  s   |sJ ‚|| _ || _|| _d S ©N)r9   r;   r<   )Úselfr9   r;   r<   © rB   úO/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/analysis/dataflow.pyÚ__init__@   s   
zCFG.__init__Ústrc                 C  s,   t | jdd„ d}d|› d| j› d| j› S )Nc                 S  s
   t | jƒS r@   )ÚintÚlabel)ÚerB   rB   rC   Ú<lambda>L   s   
 zCFG.__str__.<locals>.<lambda>)Úkeyzexits: z
succ: z
pred: )Úsortedr<   r9   r;   )rA   r<   rB   rB   rC   Ú__str__K   s   zCFG.__str__N)r9   r:   r;   r:   r<   r=   r>   r?   ©r>   rE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   rL   rB   rB   rB   rC   r8   9   s    
r8   Úblocksúlist[BasicBlock]r>   c           
      C  sÀ   i }i }t ƒ }| D ];}tdd„ |jdd… D ƒƒrJ dƒ‚t|j ¡ ƒ}|s+| |¡ |g| D ]}|jr;| |j¡ q0|||< g ||< q	| 	¡ D ]\}}|D ]	}	||	  |¡ qOqIt
|||ƒS )z¡Calculate basic block control-flow graph.

    The result is a dictionary like this:

         basic block index -> (successors blocks, predecesssor blocks)
    c                 s  s    | ]}t |tƒV  qd S r@   )Ú
isinstancer   )Ú.0ÚoprB   rB   rC   Ú	<genexpr>[   s   € 

ÿzget_cfg.<locals>.<genexpr>Néÿÿÿÿz-Control-flow ops must be at the end of blocks)ÚsetÚanyÚopsÚlistÚ
terminatorÚtargetsÚaddÚerror_handlerÚappendÚitemsr8   )
rR   Úsucc_mapÚpred_mapr<   Úblockr9   Úerror_pointÚprevÚnxtrG   rB   rB   rC   Úget_cfgP   s.   
ÿþ
€
ÿri   rG   r   c                 C  s.   t | jƒdkrt| jd tƒr| jd j} | S )Né   rX   )Úlenr[   rT   r   rG   )rG   rB   rB   rC   Úget_real_target{   s   rl   r?   c                 C  s˜   d}|rJ| D ]}t |j ¡ ƒD ]\}}|j |t|ƒ¡ qqd}t| ƒ}|  ¡ }|  ¡  t |ƒD ]\}}|dks=|j| rC|  	|¡ q0d}q0|sdS dS )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)
Ú	enumerater]   r^   Ú
set_targetrl   ri   ÚcopyÚclearr;   ra   )rR   Úchangedre   ÚiÚtgtÚcfgÚorig_blocksrB   rB   rC   Úcleanup_cfg   s   ÿñrv   ÚTc                   @  s    e Zd Zddd„Zdd	d
„ZdS )ÚAnalysisResultÚbeforeúAnalysisDict[T]Úafterr>   r?   c                 C  s   || _ || _d S r@   ©ry   r{   )rA   ry   r{   rB   rB   rC   rD   ¢   s   
zAnalysisResult.__init__rE   c                 C  s   d| j › d| j› dS )Nzbefore: z
after: Ú
r|   )rA   rB   rB   rC   rL   ¦   s   zAnalysisResult.__str__N)ry   rz   r{   rz   r>   r?   rM   )rN   rO   rP   rD   rL   rB   rB   rB   rC   rx   ¡   s    
rx   c                   @  sp  e Zd Zdkdd„Zedldd	„ƒZedmdd„ƒZedndd„ƒZedodd„ƒZdpdd„Z	dqdd„Z
drdd„Zdsdd„Zdtd d!„Zdud#d$„Zdvd&d'„Zdwd)d*„Zdxd,d-„Zdyd/d0„Zdzd2d3„Zd{d5d6„Zd|d8d9„Zd}d;d<„Zd~d>d?„ZddAdB„Zd€dDdE„ZddGdH„Zd‚dJdK„ZdƒdMdN„Zd„dPdQ„Zd…dSdT„Zd†dVdW„Zd‡dYdZ„Z dˆd\d]„Z!d‰d_d`„Z"dŠdbdc„Z#d‹dedf„Z$dŒdhdi„Z%djS )ÚBaseAnalysisVisitorrV   r   r>   úGenAndKill[T]c                 C  ó   t ƒ t ƒ fS r@   ©rY   ©rA   rV   rB   rB   rC   Ú
visit_goto®   ó   zBaseAnalysisVisitor.visit_gotor-   c                 C  ó   t ‚r@   ©ÚNotImplementedErrorr‚   rB   rB   rC   Úvisit_register_op±   ó   z%BaseAnalysisVisitor.visit_register_opr   c                 C  r…   r@   r†   r‚   rB   rB   rC   Úvisit_assignµ   r‰   z BaseAnalysisVisitor.visit_assignr   c                 C  r…   r@   r†   r‚   rB   rB   rC   Úvisit_assign_multi¹   r‰   z&BaseAnalysisVisitor.visit_assign_multir0   c                 C  r…   r@   r†   r‚   rB   rB   rC   Úvisit_set_mem½   r‰   z!BaseAnalysisVisitor.visit_set_memr   c                 C  ó
   |   |¡S r@   ©rˆ   r‚   rB   rB   rC   Ú
visit_callÁ   ó   
zBaseAnalysisVisitor.visit_callr(   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_method_callÄ   r   z%BaseAnalysisVisitor.visit_method_callr#   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_error_valueÇ   r   z*BaseAnalysisVisitor.visit_load_error_valuer%   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_literalÊ   r   z&BaseAnalysisVisitor.visit_load_literalr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_get_attrÍ   r   z"BaseAnalysisVisitor.visit_get_attrr/   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_set_attrÐ   r   z"BaseAnalysisVisitor.visit_set_attrr'   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_staticÓ   r   z%BaseAnalysisVisitor.visit_load_staticr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_init_staticÖ   r   z%BaseAnalysisVisitor.visit_init_staticr2   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_tuple_getÙ   r   z#BaseAnalysisVisitor.visit_tuple_getr3   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_tuple_setÜ   r   z#BaseAnalysisVisitor.visit_tuple_setr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Ú	visit_boxß   r   zBaseAnalysisVisitor.visit_boxr5   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_unboxâ   r   zBaseAnalysisVisitor.visit_unboxr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Ú
visit_castå   r   zBaseAnalysisVisitor.visit_castr,   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_raise_standard_errorè   r   z.BaseAnalysisVisitor.visit_raise_standard_errorr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_call_cë   r   z BaseAnalysisVisitor.visit_call_cr+   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_primitive_opî   r   z&BaseAnalysisVisitor.visit_primitive_opr1   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_truncateñ   r   z"BaseAnalysisVisitor.visit_truncater   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_extendô   r   z BaseAnalysisVisitor.visit_extendr$   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_global÷   r   z%BaseAnalysisVisitor.visit_load_globalr    c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_int_opú   r   z BaseAnalysisVisitor.visit_int_opr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_float_opý   r   z"BaseAnalysisVisitor.visit_float_opr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_float_neg   r   z#BaseAnalysisVisitor.visit_float_negr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_comparison_op  r   z'BaseAnalysisVisitor.visit_comparison_opr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_float_comparison_op  r   z-BaseAnalysisVisitor.visit_float_comparison_opr&   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_mem	  r   z"BaseAnalysisVisitor.visit_load_memr   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_get_element_ptr  r   z)BaseAnalysisVisitor.visit_get_element_ptrr"   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_load_address  r   z&BaseAnalysisVisitor.visit_load_addressr!   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_keep_alive  r   z$BaseAnalysisVisitor.visit_keep_aliver4   c                 C  r   r@   rŽ   r‚   rB   rB   rC   Úvisit_unborrow  r   z"BaseAnalysisVisitor.visit_unborrowN)rV   r   r>   r   )rV   r-   r>   r   )rV   r   r>   r   )rV   r   r>   r   )rV   r0   r>   r   )rV   r   r>   r   )rV   r(   r>   r   )rV   r#   r>   r   )rV   r%   r>   r   )rV   r   r>   r   )rV   r/   r>   r   )rV   r'   r>   r   )rV   r   r>   r   )rV   r2   r>   r   )rV   r3   r>   r   )rV   r   r>   r   )rV   r5   r>   r   )rV   r   r>   r   )rV   r,   r>   r   )rV   r   r>   r   )rV   r+   r>   r   )rV   r1   r>   r   )rV   r   r>   r   )rV   r$   r>   r   )rV   r    r>   r   )rV   r   r>   r   )rV   r   r>   r   )rV   r   r>   r   )rV   r   r>   r   )rV   r&   r>   r   )rV   r   r>   r   )rV   r"   r>   r   )rV   r!   r>   r   )rV   r4   r>   r   )&rN   rO   rP   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¬   rB   rB   rB   rC   r~   ­   sN    




























r~   c                   @  sb   e Zd ZdZd!d"dd„Zd#dd„Zd$dd„Zd%dd„Zd&dd„Zd'dd„Z	d(dd„Z
d)dd„Zd S )*Ú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.
    FÚstrict_errorsÚboolr>   r?   c                 C  ó
   || _ d S r@   ©r®   )rA   r®   rB   rB   rC   rD   )  r   zDefinedVisitor.__init__rV   r   úGenAndKill[Value]c                 C  r€   r@   r   r‚   rB   rB   rC   Úvisit_branch,  r„   zDefinedVisitor.visit_branchr.   c                 C  r€   r@   r   r‚   rB   rB   rC   Úvisit_return/  r„   zDefinedVisitor.visit_returnr6   c                 C  r€   r@   r   r‚   rB   rB   rC   Úvisit_unreachable2  r„   z DefinedVisitor.visit_unreachabler-   c                 C  r€   r@   r   r‚   rB   rB   rC   rˆ   5  r„   z DefinedVisitor.visit_register_opr   c                 C  s6   t |jtƒr|jjs| jrtƒ |jhfS |jhtƒ fS r@   )rT   Úsrcr#   Ú	undefinesr®   rY   Údestr‚   rB   rB   rC   rŠ   8  s   zDefinedVisitor.visit_assignr   c                 C  r€   r@   r   r‚   rB   rB   rC   r‹   ?  s   z!DefinedVisitor.visit_assign_multir0   c                 C  r€   r@   r   r‚   rB   rB   rC   rŒ   C  r„   zDefinedVisitor.visit_set_memN©F)r®   r¯   r>   r?   ©rV   r   r>   r²   ©rV   r.   r>   r²   ©rV   r6   r>   r²   ©rV   r-   r>   r²   ©rV   r   r>   r²   ©rV   r   r>   r²   ©rV   r0   r>   r²   )rN   rO   rP   rQ   rD   r³   r´   rµ   rˆ   rŠ   r‹   rŒ   rB   rB   rB   rC   r­     s    





r­   rt   Úinitial_definedú
set[Value]úAnalysisResult[Value]c                 C  s   t | |tƒ |dtd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©rR   rt   Úgen_and_killÚinitialÚbackwardÚkind)Úrun_analysisr­   ÚMAYBE_ANALYSIS)rR   rt   rÁ   rB   rB   rC   Úanalyze_maybe_defined_regsG  s   úrË   FÚregsúIterable[Value]r®   r¯   c              	   C  s    t | |t|d|dtt|ƒd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©rR   rt   rÅ   rÆ   rÇ   rÈ   Úuniverse)rÉ   r­   ÚMUST_ANALYSISrY   )rR   rt   rÁ   rÌ   r®   rB   rB   rC   Úanalyze_must_defined_regsX  s   ùrÑ   c                   @  s\   e Zd Zddd„Zd d
d„Zd!dd„Zd"dd„Zd#dd„Zd$dd„Zd%dd„Z	d&dd„Z
dS )'ÚBorrowedArgumentsVisitorÚargsrÂ   r>   r?   c                 C  r°   r@   )rÓ   )rA   rÓ   rB   rB   rC   rD   t  r   z!BorrowedArgumentsVisitor.__init__rV   r   r²   c                 C  r€   r@   r   r‚   rB   rB   rC   r³   w  r„   z%BorrowedArgumentsVisitor.visit_branchr.   c                 C  r€   r@   r   r‚   rB   rB   rC   r´   z  r„   z%BorrowedArgumentsVisitor.visit_returnr6   c                 C  r€   r@   r   r‚   rB   rB   rC   rµ   }  r„   z*BorrowedArgumentsVisitor.visit_unreachabler-   c                 C  r€   r@   r   r‚   rB   rB   rC   rˆ   €  r„   z*BorrowedArgumentsVisitor.visit_register_opr   c                 C  s&   |j | jv rtƒ |j hfS tƒ tƒ fS r@   )r¸   rÓ   rY   r‚   rB   rB   rC   rŠ   ƒ  s   z%BorrowedArgumentsVisitor.visit_assignr   c                 C  r€   r@   r   r‚   rB   rB   rC   r‹   ˆ  r„   z+BorrowedArgumentsVisitor.visit_assign_multir0   c                 C  r€   r@   r   r‚   rB   rB   rC   rŒ   ‹  r„   z&BorrowedArgumentsVisitor.visit_set_memN)rÓ   rÂ   r>   r?   rº   r»   r¼   r½   r¾   r¿   rÀ   )rN   rO   rP   rD   r³   r´   rµ   rˆ   rŠ   r‹   rŒ   rB   rB   rB   rC   rÒ   s  s    






rÒ   Úborrowedc              	   C  s   t | |t|ƒ|dt|d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Ð   )rR   rt   rÔ   rB   rB   rC   Úanalyze_borrowed_arguments  s   ùrÕ   c                   @  óR   e Zd Zddd„Zddd	„Zddd„Zddd„Zddd„Zddd„Zd dd„Z	dS )!ÚUndefinedVisitorrV   r   r>   r²   c                 C  r€   r@   r   r‚   rB   rB   rC   r³   ¢  r„   zUndefinedVisitor.visit_branchr.   c                 C  r€   r@   r   r‚   rB   rB   rC   r´   ¥  r„   zUndefinedVisitor.visit_returnr6   c                 C  r€   r@   r   r‚   rB   rB   rC   rµ   ¨  r„   z"UndefinedVisitor.visit_unreachabler-   c                 C  s   t ƒ |js	|hfS t ƒ fS r@   )rY   Úis_voidr‚   rB   rB   rC   rˆ   «  s   z"UndefinedVisitor.visit_register_opr   c                 C  ó   t ƒ |jhfS r@   ©rY   r¸   r‚   rB   rB   rC   rŠ   ®  ó   zUndefinedVisitor.visit_assignr   c                 C  rÙ   r@   rÚ   r‚   rB   rB   rC   r‹   ±  rÛ   z#UndefinedVisitor.visit_assign_multir0   c                 C  r€   r@   r   r‚   rB   rB   rC   rŒ   ´  r„   zUndefinedVisitor.visit_set_memNrº   r»   r¼   r½   r¾   r¿   rÀ   ©
rN   rO   rP   r³   r´   rµ   rˆ   rŠ   r‹   rŒ   rB   rB   rB   rC   r×   ¡  s    





r×   c                 C  s(   t tg | ƒƒ| }t| |tƒ |dtdS )zéCalculate potentially undefined registers at each CFG location.

    A register is undefined if there is some path from initial block
    where it has an undefined value.

    Function arguments are assumed to be always defined.
    FrÄ   )rY   r   rÉ   r×   rÊ   )rR   rt   rÁ   Úinitial_undefinedrB   rB   rC   Úanalyze_undefined_regs¸  s   
úrÞ   rV   r)   c                 C  s0   t ƒ }|  ¡ D ]}t|ttfƒs| |¡ q|S r@   )rY   ÚsourcesrT   r   r   r_   )rV   ÚresultÚsourcerB   rB   rC   Únon_trivial_sourcesÍ  s   
€râ   c                   @  rÖ   )!ÚLivenessVisitorrV   r   r>   r²   c                 C  ó   t |ƒtƒ fS r@   ©râ   rY   r‚   rB   rB   rC   r³   Ö  rÛ   zLivenessVisitor.visit_branchr.   c                 C  s*   t |jttfƒs|jhtƒ fS tƒ tƒ fS r@   )rT   Úvaluer   r   rY   r‚   rB   rB   rC   r´   Ù  s   zLivenessVisitor.visit_returnr6   c                 C  r€   r@   r   r‚   rB   rB   rC   rµ   ß  r„   z!LivenessVisitor.visit_unreachabler-   c                 C  s"   t |ƒ}|js||hfS |tƒ fS r@   )râ   rØ   rY   )rA   rV   ÚgenrB   rB   rC   rˆ   â  s   

z!LivenessVisitor.visit_register_opr   c                 C  ó   t |ƒ|jhfS r@   ©râ   r¸   r‚   rB   rB   rC   rŠ   é  ó   zLivenessVisitor.visit_assignr   c                 C  rè   r@   ré   r‚   rB   rB   rC   r‹   ì  rê   z"LivenessVisitor.visit_assign_multir0   c                 C  rä   r@   rå   r‚   rB   rB   rC   rŒ   ï  rÛ   zLivenessVisitor.visit_set_memNrº   r»   r¼   r½   r¾   r¿   rÀ   rÜ   rB   rB   rB   rC   rã   Õ  s    





rã   c                 C  s   t | |tƒ tƒ dtd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É   rã   rY   rÊ   )rR   rt   rB   rB   rC   Úanalyze_live_regsó  s   úrë   rj   NrÅ   úOpVisitor[GenAndKill[T]]rÆ   úset[T]rÈ   rF   rÇ   rÏ   úset[T] | NoneúAnalysisResult[T]c                  C  s~  i }i }| D ]3}	t ƒ }
t ƒ }|	j}|rtt|ƒƒ}|D ]}| |¡\}}|
| |B }
|| |B }q|
||	< |||	< qt| ƒ}|sG|ddd… }t |ƒ}i }i }| D ]%}	|tkrbt ƒ ||	< t ƒ ||	< qQ|dusjJ dƒ‚t |ƒ||	< t |ƒ||	< qQ|r€|j}|j}n|j}|j}|rô| ¡ }| 	|¡ || rÁd}|| D ]}|du r¨t || ƒ}q›|tkr³||| O }q›||| M }q›|dusÀJ ‚nt |ƒ}|||< |||  || B }||| krî|| D ]}||vrí| 
|¡ | |¡ qÝ|||< |sˆi }i }| D ]7}	|	}|| }t|	jƒ}|rtt|ƒƒ}|D ]\}}||||f< | |¡\}}|| |B }||||f< qqú|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)
    NrX   z,Universe must be defined for a must analysis)rY   r[   r\   ÚreversedÚacceptrÊ   r9   r;   ÚpopÚremovera   r_   rm   rx   ) rR   rt   rÅ   rÆ   rÈ   rÇ   rÏ   Ú	block_genÚ
block_killre   rç   Úkillr[   rV   ÚopgenÚopkillÚworklistÚworksetry   r{   rd   rc   rG   Ú
new_beforer;   Ú	new_afterr9   Ú	op_beforeÚop_afterÚcurÚops_enumÚidxrB   rB   rC   rÉ     s   




€ê
ü

rÉ   )rR   rS   r>   r8   )rG   r   r>   r   )rR   rS   r>   r?   )rR   rS   rt   r8   rÁ   rÂ   r>   rÃ   r¹   )rR   rS   rt   r8   rÁ   rÂ   rÌ   rÍ   r®   r¯   r>   rÃ   )rR   rS   rt   r8   rÔ   rÂ   r>   rÃ   )rV   r)   r>   rÂ   )rR   rS   rt   r8   r>   rÃ   r@   )rR   rS   rt   r8   rÅ   rì   rÆ   rí   rÈ   rF   rÇ   r¯   rÏ   rî   r>   rï   )SrQ   Ú
__future__r   Úabcr   Útypingr   r   r   r   r   r	   r
   Úmypyc.ir.func_irr   Ú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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   ri   rl   rv   rw   rF   ÚAnalysisDictrx   Ú
GenAndKillr~   r­   rË   rÑ   rÒ   rÕ   r×   rÞ   râ   rã   rë   rÐ   rÊ   rÉ   rB   rB   rB   rC   Ú<module>   s<    $¸0

+
	l
.û




ù