§
    ƒÛg»:  ã                   óŽ  — d Z ddlZddlZddlZddlmZ ddlmZ ddlm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  ej        e¦  «        Zd
„ Z G d„ d¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z" G d„ d¦  «        Z# G d„ de#¦  «        Z$ G d„ d¦  «        Z% G d„ de#¦  «        Z& G d „ d!e#¦  «        Z'd"„ Z(dS )#a  
Implement Dominance-Fronter-based SSA by Choi et al described in Inria SSA book

References:

- Static Single Assignment Book by Inria
  http://ssabook.gforge.inria.fr/latest/book.pdf
- Choi et al. Incremental computation of static single assignment form.
é    N)Úreduce)Úcopy)Úpformat)Údefaultdict)Úconfig)ÚirÚir_utilsÚerrors)Úcompute_cfg_from_blocksc                 ó8   — t          | j        ¦  «        | _        | S )znApply SSA reconstruction algorithm on the given IR.

    Produces minimal SSA using Choi et al algorithm.
    )Ú_run_ssaÚblocks)Úfunc_irs    úD/granary/edev/quantum/lib/python3.11/site-packages/numba/core/ssa.pyÚreconstruct_ssar      s   € õ
 ˜gœnÑ-Ô-€G„Nà€Nó    c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_CacheListVarsc                 ó   — i | _         d S ©N)Ú_saved©Úselfs    r   Ú__init__z_CacheListVars.__init__%   s   € ØˆŒˆˆr   c                 óz   — | j                              |¦  «        }|€|                     ¦   «         x| j         |<   }|S r   )r   ÚgetÚ	list_vars)r   ÚinstÚgots      r   r   z_CacheListVars.get(   s:   € ØŒk�oŠo˜dÑ#Ô#ˆØˆ;Ø&*§n¢nÑ&6Ô&6Ð6ˆDŒK˜Ñ Øˆ
r   N)Ú__name__Ú
__module__Ú__qualname__r   r   © r   r   r   r   $   s2   € € € € € ðð ð ðð ð ð ð r   r   c           	      ó´  — | si S t          | ¦  «        }t          |¦  «        }t          | ¦  «        }t          ¦   «         }|D ]l}t                               d|¦  «         t          | |¦  «        \  } }t                               dt          |¦  «        ¦  «         t          | |||||¦  «        } Œmt          | ¦  «        }||k    rt          j
        d¦  «        ‚| S )z7Run SSA reconstruction on IR blocks of a function.
    zFix SSA violator on var %szReplaced assignments: %szCFG mutated in SSA pass)r   Ú_iterated_domfrontsÚ_find_defs_violatorsr   Ú_loggerÚdebugÚ_fresh_varsr   Ú_fix_ssa_varsr
   ÚCompilerError)r   ÚcfgÚdf_plusÚ	violatorsÚcache_list_varsÚvarnameÚdefmapÚcfg_posts           r   r   r   /   sî   € ð ð àˆ	å
! &Ñ
)Ô
)€CÝ! #Ñ&Ô&€Gå$ VÑ,Ô,€Iå$Ñ&Ô&€Oð ð 0ð 0ˆÝ�ŠØ(¨'ñ	
ô 	
ð 	
õ
 % V¨WÑ5Ô5‰ˆ�Ý�ŠÐ0µ'¸&±/´/ÑBÔBÐBõ ˜v w°¸¸WØ.ñ0ô 0ˆˆõ
 ' vÑ.Ô.€HØ�3‚€ÝÔ"Ð#<Ñ=Ô=Ð=Ø€Mr   c                 ó8  — t          | ¦  «        }||d<   ||d<   t          t          ¦  «        x|d<   }||d<   t          ||¦  «        |d<   t	          | |t          |¦  «        ¦  «        }|                     ¦   «         D ]\  }	}
||	         }|
|j        z   |_        Œ|S )z=Rewrite all uses to ``varname`` given the definition map
    r0   r1   Úphimapr,   Úphi_locations)Ú_make_statesr   ÚlistÚ_compute_phi_locationsÚ_run_block_rewriteÚ_FixSSAVarsÚitemsÚbody)r   r0   r1   r,   r-   r/   Ústatesr4   Ú	newblocksÚlabelÚphilistÚcurblks               r   r*   r*   S   s­   € õ ˜&Ñ!Ô!€FØ€Fˆ9ÑØ€Fˆ8ÑÝ +­DÑ 1Ô 1Ð1€Fˆ8Ñ�vØ€Fˆ5�MÝ4°W¸fÑEÔE€Fˆ?ÑÝ" 6¨6µ;¸Ñ3OÔ3OÑPÔP€Ià Ÿ,š,™.œ.ð ,ð ,‰ˆˆwØ˜5Ô!ˆà ¤Ñ+ˆŒˆØÐr   c                 óJ  ‡— d„ |                       ¦   «                              ¦   «         D ¦   «         Šd}|rmd}‰                     ¦   «         D ]T\  }}t          t          j        ˆfd„|D ¦   «         t          ¦   «         ¦  «        }|                     |¦  «        r||z  }d}ŒU|°m‰S )z²Compute the iterated dominance frontiers (DF+ in literatures).

    Returns a dictionary which maps block label to the set of labels of its
    iterated dominance frontiers.
    c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r#   )Úset©Ú.0ÚkÚvss      r   ú
<dictcomp>z'_iterated_domfronts.<locals>.<dictcomp>k   s$   € ÐJÐJÐJ¡  2�•C˜‘G”GÐJÐJÐJr   TFc                 ó    •— g | ]
}‰|         ‘ŒS r#   r#   )rF   ÚvÚ	domfrontss     €r   ú
<listcomp>z'_iterated_domfronts.<locals>.<listcomp>p   s   ø€ Ð)CÐ)CÐ)C¸1¨)°A¬,Ð)CÐ)CÐ)Cr   )Údominance_frontierr;   r   ÚoperatorÚor_rD   Ú
difference)r,   Ú
keep_goingrG   rH   ÚinnerrL   s        @r   r%   r%   e   sÃ   ø€ ð KÐJ¨×)?Ò)?Ñ)AÔ)A×)GÒ)GÑ)IÔ)IÐJÑJÔJ€IØ€JØ
ð "Øˆ
Ø—_’_Ñ&Ô&ð 	"ð 	"‰EˆAˆrÝ�8œ<Ð)CÐ)CÐ)CÐ)CÀÐ)CÑ)CÔ)CÅSÁUÄUÑKÔKˆEØ×Ò Ñ#Ô#ð "Ø�e‘�Ø!�
øð ð "ð Ðr   c                 óp   — t          ¦   «         }|                     ¦   «         D ]\  }}|r|| |         z  }Œ|S r   )rD   r;   )Úiterated_dfr1   r5   ÚdeflabelÚdefstmtss        r   r8   r8   w   sG   € õ ‘E”E€MØ$Ÿlšl™nœnð 3ð 3Ñˆ�(Øð 	3Ø˜[¨Ô2Ñ2ˆMøØÐr   c                 óž   — t          | ¦  «        }||d<   t          t          ¦  «        x|d<   }t          | |t	          ¦   «         ¦  «        }||fS )z(Rewrite to put fresh variable names
    r0   r1   )r6   r   r7   r9   Ú_FreshVarHandler)r   r0   r=   r1   r>   s        r   r)   r)   ‚   sU   € õ ˜&Ñ!Ô!€FØ€Fˆ9ÑÝ +­DÑ 1Ô 1Ð1€Fˆ8Ñ�vÝ" 6¨6Õ3CÑ3EÔ3EÑFÔF€IØ�fÐÐr   c                 ó<   — |                       ¦   «         ^}}|j        S r   )ÚvaluesÚscope)r   ÚfirstÚ_s      r   Ú
_get_scoper_   Œ   s   € Ø—’‘”€I€EˆAØŒ;Ðr   c                 óD  — t          t          ¦  «        }t          | |t          ¦   «         ¦  «         t                               dt          |¦  «        ¦  «         d„ |                     ¦   «         D ¦   «         }t                               dt          |¦  «        ¦  «         |S )zm
    Returns
    -------
    res : Set[str]
        The SSA violators in a dictionary of variable names.
    zdefs %sc                 ó>   — h | ]\  }}t          |¦  «        d k    ¯|’ŒS )é   )ÚlenrE   s      r   ú	<setcomp>z'_find_defs_violators.<locals>.<setcomp>›   s'   € Ð<Ð<Ð<‘u�q˜"µ°B±´¸!²°�°°°r   zSSA violators %s)r   r7   Ú_run_block_analysisÚ_GatherDefsHandlerr'   r(   r   r;   )r   Údefsr.   s      r   r&   r&   ‘   s‚   € õ •tÑÔ€DÝ˜ Õ&8Ñ&:Ô&:Ñ;Ô;Ð;Ý‡M‚M�)�W T™]œ]Ñ+Ô+Ð+Ø<Ð< §
¢
¡¤Ð<Ñ<Ô<€IÝ‡M‚MÐ$¥g¨iÑ&8Ô&8Ñ9Ô9Ð9ØÐr   c                 ó˜   — |                       ¦   «         D ]4\  }}t                               d|¦  «         t          |||¦  «        D ]}ŒŒ5d S )Nz"==== SSA block analysis pass on %s)r;   r'   r(   Ú_run_ssa_block_pass)r   r=   Úhandlerr?   Úblkr^   s         r   re   re       s_   € Ø—l’l‘n”nð ð ‰
ˆˆsÝ�ŠÐ:¸EÑBÔBÐBÝ$ V¨S°'Ñ:Ô:ð 	ð 	ˆAØð	ðð r   c                 ó>  — i }|                       ¦   «         D ]…\  }}t                               d|¦  «         t          j        |j        |j        ¬¦  «        }g }||d<   ||d<   t          |||¦  «        D ]}|€J ‚|                     |¦  «         Œ||_	        |||<   Œ†|S )Nz!==== SSA block rewrite pass on %s)r\   Úlocr?   Úblock)
r;   r'   r(   r   ÚBlockr\   rm   ri   Úappendr<   )	r   r=   rj   r>   r?   rk   ÚnewblkÚnewbodyÚstmts	            r   r9   r9   §   s¼   € Ø€IØ—l’l‘n”nð "ð "‰
ˆˆsÝ�ŠÐ9¸5ÑAÔAÐAÝ” ¤	¨s¬wÐ7Ñ7Ô7ˆàˆØˆˆw‰Øˆˆw‰Ý'¨°°WÑ=Ô=ð 	!ð 	!ˆDØÐ#Ð#Ð#Ø�NŠN˜4Ñ Ô Ð Ð ØˆŒØ!ˆ	�%ÑÐØÐr   c                 ó<   — t          t          | ¦  «        ¬¦  «        S )N)r\   )Údictr_   )r   s    r   r6   r6   ¸   s$   € ÝÝ˜Ñ Ô ðñ ô ð r   c              #   ób  K  — t                                d|¦  «         |j        D ]‰}t                                d|¦  «         t          |t          j        ¦  «        r|                     | |¦  «        }n|                     | |¦  «        }||ur|�t                                d|¦  «         |V — ŒŠd S )Nz
Running %szon stmt: %szreplaced with: %s)r'   r(   r<   Ú
isinstancer   ÚAssignÚ	on_assignÚon_other)r=   rk   rj   rs   Úrets        r   ri   ri   ¾   s¶   è è € Ý‡M‚M�, Ñ(Ô(Ð(Ø”ð ð ˆÝ�Š�m TÑ*Ô*Ð*Ý�d�BœIÑ&Ô&ð 	1Ø×#Ò# F¨DÑ1Ô1ˆCˆCà×"Ò" 6¨4Ñ0Ô0ˆCØ�dˆ?ˆ?˜s˜Ý�MŠMÐ-¨sÑ3Ô3Ð3Øˆ	ˆ	ˆ	ˆ	ðð r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú_BaseHandlerzGA base handler for all the passes used here for the SSA algorithm.
    c                 ó   — dS )a’  
        Called when the pass sees an ``ir.Assign``.

        Subclasses should override this for custom behavior

        Parameters
        -----------
        states : dict
        assign : numba.ir.Assign

        Returns
        -------
        stmt : numba.ir.Assign or None
            For rewrite passes, the return value is used as the replacement
            for the given statement.
        Nr#   ©r   r=   Úassigns      r   ry   z_BaseHandler.on_assignÎ   ó   € € € r   c                 ó   — dS )a¥  
        Called when the pass sees an ``ir.Stmt`` that's not an assignment.

        Subclasses should override this for custom behavior

        Parameters
        -----------
        states : dict
        assign : numba.ir.Stmt

        Returns
        -------
        stmt : numba.ir.Stmt or None
            For rewrite passes, the return value is used as the replacement
            for the given statement.
        Nr#   ©r   r=   rs   s      r   rz   z_BaseHandler.on_otherà   r�   r   N©r    r!   r"   Ú__doc__ry   rz   r#   r   r   r}   r}   Ë   s<   € € € € € ðð ðð ð ð$ð ð ð ð r   r}   c                   ó   — e Zd ZdZd„ ZdS )rf   zEFind all defs

    ``states`` is a Mapping[str, List[ir.Assign]]
    c                 óP   — ||j         j                                      |¦  «         d S r   )ÚtargetÚnamerp   r   s      r   ry   z_GatherDefsHandler.on_assignø   s&   € ØˆvŒ}Ô!Ô"×)Ò)¨&Ñ1Ô1Ð1Ð1Ð1r   N)r    r!   r"   r…   ry   r#   r   r   rf   rf   ó   s-   € € € € € ðð ð2ð 2ð 2ð 2ð 2r   rf   c                   ó"   — e Zd Zd„ Zej        ZdS )ÚUndefinedVariablec                 ó    — t          d¦  «        ‚)NzNot intended for instantiation)ÚNotImplementedErrorr   s    r   r   zUndefinedVariable.__init__ý   s   € Ý!Ð"BÑCÔCÐCr   N)r    r!   r"   r   r   Ú	UNDEFINEDrˆ   r#   r   r   r‹   r‹   ü   s)   € € € € € ðDð Dð Dð Œ\€F€F€Fr   r‹   c                   ó   — e Zd ZdZd„ Zd„ ZdS )rY   z9Replaces assignment target with new fresh variables.
    c                 ó  — |j         j        |d         k    rô|d         }|d         }t          |¦  «        dk    ri|j         }t                               d|¦  «         |j        |j        vr8d|j        ›d�}t          j        t          j	        ||j
        ¬¦  «        ¦  «         n&|                     |j         j        |j
        ¬¦  «        }t          j        ||j        |j
        ¬	¦  «        }||d
                                       |¦  «         |S )Nr0   r\   r1   r   zfirst assign: %sz	variable z is not in scope.©rm   ©rˆ   Úvaluerm   r?   )rˆ   r‰   rc   r'   r(   Ú	localvarsÚwarningsÚwarnr
   ÚNumbaIRAssumptionWarningrm   Úredefiner   rx   r“   rp   )r   r=   r€   r\   r1   Ú	newtargetÚwmsgs          r   ry   z_FreshVarHandler.on_assign  s  € ØŒ=Ô ¨	Ô!2Ò2Ð2Ø˜7”OˆEØ˜HÔ%ˆFå�6‰{Œ{˜aÒÐØ"œM�	Ý—’Ð0°)Ñ<Ô<Ð<Ø”>¨¬Ð8Ð8ØJ y¤~ÐJÐJÐJ�DÝ”M¥&Ô"AÀ$Ø&,¤jð#2ñ #2ô #2ñ 3ô 3ð 3øð "ŸNšN¨6¬=Ô+=À6Ä:˜NÑNÔN�	Ý”YØ Ø”lØ”Jðñ ô ˆFð
 �6˜'”?Ô#×*Ò*¨6Ñ2Ô2Ð2Øˆr   c                 ó   — |S r   r#   rƒ   s      r   rz   z_FreshVarHandler.on_other  s   € Øˆr   Nr„   r#   r   r   rY   rY     s<   € € € € € ðð ðð ð ð,ð ð ð ð r   rY   c                   óD   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dd
„ZdS )r:   aF  Replace variable uses in IR nodes to the correct reaching variable
    and introduce Phi nodes if necessary. This class contains the core of
    the SSA reconstruction algorithm.

    See Ch 5 of the Inria SSA book for reference. The method names used here
    are similar to the names used in the pseudocode in the book.
    c                 ó   — || _         d S r   )Ú_cache_list_vars)r   r/   s     r   r   z_FixSSAVars.__init__)  s   € Ø /ˆÔÐÐr   c                 ó¶  — |j         }t          |t          j        ¦  «        r´|                      ||| j                             |j         ¦  «        ¦  «        }|�}|j        t          j        urj|d         |j        j	        k    rT|d         |j        i}t          |¦  «        }t          j        ||¦  «         t          j        |j        ||j        ¬¦  «        S nƒt          |t          j        ¦  «        ri|                      |||g¦  «        }|�O|j        t          j        ur<|d         |j        j	        k    r&t          j        |j        |j        |j        ¬¦  «        S |S )Nr0   r’   )r“   rw   r   ÚInstÚ_fix_varrž   r   rˆ   rŽ   r‰   r   r	   Úreplace_vars_innerrx   rm   ÚVar)r   r=   r€   ÚrhsÚnewdefÚreplmaps         r   ry   z_FixSSAVars.on_assign,  sP  € ØŒlˆÝ�c�2œ7Ñ#Ô#ð 	Ø—]’]Ø˜ Ô 5× 9Ò 9¸&¼,Ñ GÔ Gñô ˆFð Ð! f¤m½2¼<Ð&GÐ&GØ˜)Ô$¨¬Ô(:Ò:Ð:Ø% iÔ0°&´-Ð@�GÝ˜s™)œ)�CåÔ/°°WÑ=Ô=Ð=Ýœ9Ø%œ}Ø!Ø"œJðñ ô ð øõ
 ˜�RœVÑ$Ô$ð 		Ø—]’] 6¨6°C°5Ñ9Ô9ˆFàÐ! f¤m½2¼<Ð&GÐ&GØ˜)Ô$¨¬Ô(:Ò:Ð:Ýœ9Ø%œ}Ø$œmØ"œJðñ ô ð ð ˆr   c                 ó   — |                       ||| j                             |¦  «        ¦  «        }|�\|j        t          j        urI|d         |j        j        k    r3|d         |j        i}t          |¦  «        }t          j	        ||¦  «         |S )Nr0   )
r¡   rž   r   rˆ   r   rŽ   r‰   r   r	   Úreplace_vars_stmt)r   r=   rs   r¥   r¦   s        r   rz   z_FixSSAVars.on_otherK  sŒ   € Ø—’Ø�D˜$Ô/×3Ò3°DÑ9Ô9ñ
ô 
ˆð Ð &¤-µr´|Ð"CÐ"CØ�iÔ  F¤MÔ$6Ò6Ð6Ø! )Ô,¨f¬mÐ<�Ý˜D‘z”z�ÝÔ*¨4°Ñ9Ô9Ð9Øˆr   c                 ób   — d„ |D ¦   «         }|d         }||v r|                       ||¦  «        S dS )z0Fix all variable uses in ``used_vars``.
        c                 ó   — g | ]	}|j         ‘Œ
S r#   )r‰   )rF   rG   s     r   rM   z(_FixSSAVars._fix_var.<locals>.<listcomp>Y  s   € Ð.Ð.Ð.˜q�A”FÐ.Ð.Ð.r   r0   N)Ú	_find_def)r   r=   rs   Ú	used_varsÚvarnamesÚphivars         r   r¡   z_FixSSAVars._fix_varV  sH   € ð /Ð. IÐ.Ñ.Ô.ˆØ˜	Ô"ˆØ�XÐÐØ—>’> &¨$Ñ/Ô/Ð/ð Ðr   c                 ó”  — t                                d|d         |¦  «         d}|d         }|d         |         }|d         |         }|d         }|                      ||¦  «        }t          |¦  «        D ]2}	|                      |	||¬¦  «        }
|
|k     r|	} n|	|v r
|d	         } nŒ3|€|                      |||j        ¬
¦  «        }|S )z?Find definition of ``stmt`` for the statement ``stmt``
        zfind_def var=%r stmt=%sr0   Nr?   r1   r4   rn   )Ústopéÿÿÿÿr‘   )r'   r(   Ú_stmt_indexÚreversedÚ_find_def_from_toprm   )r   r=   rs   Úselected_defr?   Ú
local_defsÚ
local_phisrn   Úcur_posÚdefstmtÚdef_poss              r   r«   z_FixSSAVars._find_def^  s  € õ 	�ŠÐ/°¸	Ô1BÀDÑIÔIÐIØˆØ�w”ˆØ˜HÔ% eÔ,ˆ
Ø˜HÔ% eÔ,ˆ
Ø�w”ˆà×"Ò" 4¨Ñ/Ô/ˆÝ 
Ñ+Ô+ð 		ð 		ˆGà×&Ò& w°¸GÐ&ÑDÔDˆGØ˜Ò Ð Ø&�Ø�à˜JÐ&Ð&Ø)¨"œ~�Ø�ð 'ð ÐØ×2Ò2Ø˜ 4¤8ð 3ñ ô ˆLð Ðr   c                 óþ  — t                                d|¦  «         |d         }|d         }|d         }|d         }||v �rM|d         }|d         j        }|                     |d         |¬	¦  «        }	t	          j        |	t          j                             |¬	¦  «        |¬
¦  «        }
t                                d|
|¦  «         ||                              d|
¦  «         ||          	                    |
¦  «         | 
                    |¦  «        D ]{\  }}|                      |||¬	¦  «        }t                                d|¦  «         |
j        j         	                    |j        ¦  «         |
j        j         	                    |¦  «         Œ||
S |                     ¦   «         |         }||k    rt#          |d         |¦  «         t$          S t                                d||¦  «         |                      |||¬	¦  «        S )z—Find definition reaching block of ``label``.

        This method would look at all dominance frontiers.
        Insert phi node if necessary.
        zfind_def_from_top label %rr,   r1   r4   r5   r\   rn   r0   r‘   r’   zinsert phi node %s at %sr   zincoming_def %szidom %s from label %s)r'   r(   rm   r˜   r   rx   ÚExprÚphiÚinsertrp   ÚpredecessorsÚ_find_def_from_bottomr“   Úincoming_valuesrˆ   Úincoming_blocksÚimmediate_dominatorsÚ"_warn_about_uninitialized_variabler‹   )r   r=   r?   rm   r,   r1   r4   r5   r\   ÚfreshvarÚphinodeÚpredr^   Úincoming_defÚidoms                  r   r´   z_FixSSAVars._find_def_from_topz  sø  € õ 	�ŠÐ2°EÑ:Ô:Ð:Ø�UŒmˆØ˜Ô!ˆØ˜Ô!ˆØ˜Ô/ˆà�MÐ!Ñ!Ø˜7”OˆEØ˜”/Ô%ˆCà—~’~ f¨YÔ&7¸S�~ÑAÔAˆHå”iØÝ”g—k’k c�kÑ*Ô*Øðñ ô ˆGõ
 �MŠMÐ4°g¸uÑEÔEÐEØ�5ŒM× Ò   GÑ,Ô,Ð,Ø�5ŒM× Ò  Ñ)Ô)Ð)à×+Ò+¨EÑ2Ô2ð ;ð ;‘��aØ#×9Ò9Ø˜D cð  :ñ  ô  �õ —’Ð/°Ñ>Ô>Ð>Ø”Ô-×4Ò4°\Ô5HÑIÔIÐIØ”Ô-×4Ò4°TÑ:Ô:Ð:Ð:ØˆNà×+Ò+Ñ-Ô-¨eÔ4ˆDØ�uŠ}ˆ}õ 3°6¸)Ô3DÀcÑJÔJÐJÝ(Ð(Ý�MŠMÐ1°4¸Ñ?Ô?Ð?Ø×-Ò-¨f°dÀÐ-ÑDÔDÐDr   c                 ó    — t                                d|¦  «         |d         }||         }|r
|d         }|S |                      |||¬¦  «        S )z<Find definition from within the block at ``label``.
        zfind_def_from_bottom label %rr1   r±   r‘   )r'   r(   r´   )r   r=   r?   rm   r1   rg   Úlastdefs          r   rÀ   z!_FixSSAVars._find_def_from_bottom¨  s^   € õ 	�ŠÐ5°uÑ=Ô=Ð=Ø˜Ô!ˆØ�eŒ}ˆØð 	CØ˜2”hˆGØˆNà×*Ò*¨6°5¸cÐ*ÑBÔBÐBr   r±   c                 ó¨   — t          t          |j        ¦  «        ¦  «        d|…         D ]}|j        |         |u r|c S Œt          |j        ¦  «        S )z‘Find the positional index of the statement at ``block``.

        Assumptions:
        - no two statements can point to the same object.
        N)Úrangerc   r<   )r   r¹   rn   r°   Úis        r   r²   z_FixSSAVars._stmt_index´  sY   € õ •s˜5œ:‘”Ñ'Ô'¨¨¨Ô.ð 	ð 	ˆAØŒz˜!Œ} Ð'Ð'Ø���ð (å�5”:‰ŒÐr   N)r±   )r    r!   r"   r…   r   ry   rz   r¡   r«   r´   rÀ   r²   r#   r   r   r:   r:      s¢   € € € € € ðð ð0ð 0ð 0ðð ð ð>	ð 	ð 	ð0ð 0ð 0ðð ð ð8,Eð ,Eð ,Eð\
Cð 
Cð 
Cðð ð ð ð ð r   r:   c                 óx   — t           j        r-t          j        t	          j        d| › �|¬¦  «        ¦  «         d S d S )Nz Detected uninitialized variable r‘   )r   ÚALWAYS_WARN_UNINIT_VARr•   r–   r
   ÚNumbaWarning)r0   rm   s     r   rÄ   rÄ   Ã  sX   € ÝÔ$ð 
ÝŒÝÔØ<°7Ð<Ð<Øðñ ô ñ	
ô 	
ð 	
ð 	
ð 	
ð
ð 
r   ))r…   ÚloggingrO   r•   Ú	functoolsr   r   Úpprintr   Úcollectionsr   Únumbar   Ú
numba.corer   r	   r
   Únumba.core.analysisr   Ú	getLoggerr    r'   r   r   r   r*   r%   r8   r)   r_   r&   re   r9   r6   ri   r}   rf   r‹   rY   r:   rÄ   r#   r   r   ú<module>rÚ      s˜  ððð ð €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #à Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ð ˆ'Ô
˜HÑ
%Ô
%€ðð ð ðð ð ð ð ñ ô ð ð!ð !ð !ðHð ð ð$ð ð ð$ð ð ðð ð ðð ð ð
ð ð ðð ð ðð ð ð"ð ð ð
ð 
ð 
ð%ð %ð %ð %ð %ñ %ô %ð %ðP2ð 2ð 2ð 2ð 2˜ñ 2ô 2ð 2ðð ð ð ð ñ ô ð ðð ð ð ð �|ñ ô ð ð:`ð `ð `ð `ð `�,ñ `ô `ð `ðF
ð 
ð 
ð 
ð 
r   