§
    1@Äj‹B  ã                   ó’  — 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mZmZ ddl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)Údefaultdict)Úconfig)ÚirÚir_utilsÚerrors)Ú
OrderedSetÚ_lazy_pformat)Ú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    ú?C:\Projects\Historical\venv\Lib\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¨SÑ1Ô1€Iå$Ñ&Ô&€Oð ð 0ð 0ˆÝ�ŠØ(¨'ñ	
ô 	
ð 	
õ
 % V¨WÑ5Ô5‰ˆ�Ý�ŠÐ0µ-ÀÑ2GÔ2GÑHÔHÐHõ ˜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
    r1   r2   Úphimapr-   Úphi_locations)Ú_make_statesr   ÚlistÚ_compute_phi_locationsÚ_run_block_rewriteÚ_FixSSAVarsÚitemsÚbody)r   r1   r2   r-   r.   r0   Ústatesr5   Ú	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$   )rG   ÚvÚ	domfrontss     €r   ú
<listcomp>z'_iterated_domfronts.<locals>.<listcomp>p   s   ø€ Ð)CÐ)CÐ)C¸1¨)°A¬,Ð)CÐ)CÐ)Cr   )Údominance_frontierr<   r   ÚoperatorÚor_rE   Ú
difference)r-   Ú
keep_goingrH   rI   ÚinnerrM   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   )rE   r<   )Úiterated_dfr2   r6   ÚdeflabelÚdefstmtss        r   r9   r9   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
    r1   r2   )r7   r   r8   r:   Ú_FreshVarHandler)r   r1   r>   r2   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                 ó¢  — t          t          ¦  «        }t          t          ¦  «        }t          ||¬¦  «        }t	          | |t          ¦   «         ¦  «         t                               dt          |¦  «        ¦  «         t          d„ | 
                    ¦   «         D ¦   «         ¦  «        }|                     ¦   «         }| 
                    ¦   «         D ]T\  }}||vrK|D ]H}	||	         }
d„ ||         D ¦   «         }|                     |
¦  «        s|                     |¦  «          nŒIŒUt                               dt          |¦  «        ¦  «         |S )zm
    Returns
    -------
    res : Set[str]
        The SSA violators in a dictionary of variable names.
    )ÚdefsÚuseszdefs %sc                 ó>   — g | ]\  }}t          |¦  «        d k    ¯|‘ŒS )é   )ÚlenrF   s      r   rN   z(_find_defs_violators.<locals>.<listcomp>    s'   € ÐGÐGÐG¡% ! R½3¸r¹7¼7ÀQº;¸;˜A¸;¸;¸;r   c                 ó   — h | ]\  }}|’ŒS r$   r$   )rG   Ú_assignr@   s      r   ú	<setcomp>z'_find_defs_violators.<locals>.<setcomp>§   s   € ÐCÐCÐC©¨°˜eÐCÐCÐCr   zSSA violators %s)r   r8   rE   ÚdictÚ_run_block_analysisÚ_GatherDefsHandlerr(   r)   r   r
   r<   Ú
dominatorsÚintersectionÚadd)r   r-   rb   rc   r>   r/   ÚdomsrH   Ú
use_blocksr@   ÚdomÚ
def_labelss               r   r'   r'   ‘   sG  € õ •tÑÔ€DÝ•sÑÔ€DÝ�t $Ð'Ñ'Ô'€FÝ˜ Õ(:Ñ(<Ô(<Ñ=Ô=Ð=Ý‡M‚M�)�]¨4Ñ0Ô0Ñ1Ô1Ð1õ ÐGÐG¨4¯:ª:©<¬<ÐGÑGÔGÑHÔH€Ià�>Š>ÑÔ€DØŸš™œð ð ‰ˆˆ:Ø�IÐÐØ#ð ð �Ø˜5”k�ØCÐC¸$¸q¼'ÐCÑCÔC�
Ø!×.Ò.¨sÑ3Ô3ð Ø—M’M !Ñ$Ô$Ð$Ø�Eðøõ ‡M‚MÐ$¥m°IÑ&>Ô&>Ñ?Ô?Ð?ØÐr   c                 ó¢   — |                       ¦   «         D ]9\  }}t                               d|¦  «         ||d<   t          |||¦  «        D ]}ŒŒ:d S )Nz"==== SSA block analysis pass on %sr@   )r<   r(   r)   Ú_run_ssa_block_pass)r   r>   Úhandlerr@   Úblkr_   s         r   rk   rk   ¯   sh   € Ø—l’l‘n”nð ð ‰
ˆˆsÝ�ŠÐ:¸EÑBÔBÐBØˆˆw‰Ý$ 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]   ry   ru   Úappendr=   )	r   r>   rv   r?   r@   rw   ÚnewblkÚnewbodyÚstmts	            r   r:   r:   ·   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]   )rj   r`   )r   s    r   r7   r7   È   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>   rw   rv   r   Úrets        r   ru   ru   Î   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   r„   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>   r   s      r   r…   z_BaseHandler.on_otherð   r‹   r   N©r!   r"   r#   Ú__doc__r„   r…   r$   r   r   rˆ   rˆ   Û   s<   € € € € € ðð ðð ð ð$ð ð ð ð r   rˆ   c                   ó   — e Zd ZdZd„ Zd„ ZdS )rl   aZ  Find all defs and uses of variable in each block

    ``states["label"]`` is a int; label of the current block
    ``states["defs"]`` is a Mapping[str, List[Tuple[ir.Assign, int]]]:
        - a mapping of the name of the assignee variable to the assignment
          IR node and the block label.
    ``states["uses"]`` is a Mapping[Set[int]]
    c                 ó  — |d         |j         j                                      ||d         f¦  «         |                     ¦   «         D ]@}|j        }||j         j        k    r'|d         |                              |d         ¦  «         ŒAd S )Nrb   r@   rc   )ÚtargetÚnamer|   r   ro   )r   r>   rŠ   ÚvarrH   s        r   r„   z_GatherDefsHandler.on_assign  s‹   € àˆvŒ�v”}Ô)Ô*×1Ò1°6¸6À'¼?Ð2KÑLÔLÐLà×#Ò#Ñ%Ô%ð 	7ð 	7ˆCØ”ˆAØ�F”MÔ&Ò&Ð&Ø�v”˜qÔ!×%Ò% f¨W¤oÑ6Ô6Ð6øð	7ð 	7r   c                 ó�   — |                      ¦   «         D ]0}|j        }|d         |                              |d         ¦  «         Œ1d S )Nrc   r@   )r   r“   ro   )r   r>   r   r”   rH   s        r   r…   z_GatherDefsHandler.on_other  sP   € à—>’>Ñ#Ô#ð 	3ð 	3ˆCØ”ˆAØ�6ŒN˜1Ô×!Ò! &¨¤/Ñ2Ô2Ð2Ð2ð	3ð 	3r   NrŽ   r$   r   r   rl   rl     s<   € € € € € ðð ð7ð 7ð 7ð3ð 3ð 3ð 3ð 3r   rl   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 )rZ   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 )Nr1   r]   r2   r   zfirst assign: %sz	variable z is not in scope.©ry   ©r’   Úvaluery   r@   )r’   r“   rf   r(   r)   Ú	localvarsÚwarningsÚwarnr	   ÚNumbaIRAssumptionWarningry   Úredefiner   rƒ   rŸ   r|   )r   r>   rŠ   r]   r2   Ú	newtargetÚwmsgs          r   r„   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   r…   z_FreshVarHandler.on_other<  s   € Øˆr   NrŽ   r$   r   r   rZ   rZ   #  s<   € € € € € ðð ðð ð ð,ð ð ð ð r   rZ   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   r0   s     r   r   z_FixSSAVars.__init__I  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 )Nr1   rž   )rŸ   r‚   r   ÚInstÚ_fix_varrª   r   r’   rš   r“   r   r   Úreplace_vars_innerrƒ   ry   ÚVar)r   r>   rŠ   ÚrhsÚnewdefÚreplmaps         r   r„   z_FixSSAVars.on_assignL  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 )Nr1   )
r­   rª   r   r’   r   rš   r“   r   r   Úreplace_vars_stmt)r   r>   r   r±   r²   s        r   r…   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“   )rG   rH   s     r   rN   z(_FixSSAVars._fix_var.<locals>.<listcomp>y  s   € Ð.Ð.Ð.˜q�A”FÐ.Ð.Ð.r   r1   N)Ú	_find_def)r   r>   r   Ú	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=%sr1   Nr@   r2   r5   rz   )Ústopéÿÿÿÿr�   )r(   r)   Ú_stmt_indexÚreversedÚ_find_def_from_topry   )r   r>   r   Úselected_defr@   Ú
local_defsÚ
local_phisrz   Ú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-   r2   r5   r6   r]   rz   r1   r�   rž   zinsert phi node %s at %sr   zincoming_def %szidom %s from label %s)r(   r)   ry   r¤   r   rƒ   ÚExprÚphiÚinsertr|   ÚpredecessorsÚ_find_def_from_bottomrŸ   Úincoming_valuesr’   Úincoming_blocksÚimmediate_dominatorsÚ"_warn_about_uninitialized_variabler—   )r   r>   r@   ry   r-   r2   r5   r6   r]   ÚfreshvarÚphinodeÚpredr_   Úincoming_defÚidoms                  r   rÀ   z_FixSSAVars._find_def_from_topš  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 %rr2   r½   r�   )r(   r)   rÀ   )r   r>   r@   ry   r2   rb   Ú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)Úrangerf   r=   )r   rÅ   rz   r¼   Úis        r   r¾   z_FixSSAVars._stmt_indexÔ  sY   € õ •s˜5œ:‘”Ñ'Ô'¨¨¨Ô.ð 	ð 	ˆAØŒz˜!Œ} Ð'Ð'Ø���ð (å�5”:‰ŒÐr   N)r½   )r!   r"   r#   r�   r   r„   r…   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)r1   ry   s     r   rÐ   rÐ   ã  sX   € ÝÔ$ð 
ÝŒÝÔØ<°7Ð<Ð<Øðñ ô ñ	
ô 	
ð 	
ð 	
ð 	
ð
ð 
r   )*r�   ÚloggingrP   r¡   Ú	functoolsr   r   Úcollectionsr   Únumbar   Ú
numba.corer   r   r	   Únumba.core.utilsr
   r   Únumba.core.analysisr   Ú	getLoggerr!   r(   r   r   r   r+   r&   r9   r*   r`   r'   rk   r:   r7   ru   rˆ   rl   r—   rZ   r;   rÐ   r$   r   r   ú<module>ræ      sž  ððð ð €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #à Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ð ˆ'Ô
˜HÑ
%Ô
%€ðð ð ðð ð ð ð ñ ô ð ð!ð !ð !ðHð ð ð$ð ð ð$ð ð ðð ð ðð ð ð
ð ð ð<ð ð ðð ð ð"ð ð ð
ð 
ð 
ð%ð %ð %ð %ð %ñ %ô %ð %ðP3ð 3ð 3ð 3ð 3˜ñ 3ô 3ð 3ð2ð ð ð ð ñ ô ð ðð ð ð ð �|ñ ô ð ð:`ð `ð `ð `ð `�,ñ `ô `ð `ðF
ð 
ð 
ð 
ð 
r   