§
    1@ÄjU%  ã                   óž   — d dl mZ d dlmZmZmZmZ  G d„ de¦  «        Z G d„ de¦  «        Z	 G d„ de¦  «        Z
i Z G d	„ d
e¦  «        ZdS )é    )Úcached_property)ÚirÚanalysisÚ
transformsÚir_utilsc                   ó   — e Zd Zd„ ZdS )Ú
YieldPointc                 ó®   — t          |t          j        ¦  «        sJ ‚t          |t          j        ¦  «        sJ ‚|| _        || _        d | _        d | _        d S ©N)Ú
isinstancer   ÚBlockÚYieldÚblockÚinstÚ	live_varsÚweak_live_vars)Úselfr   r   s      úDC:\Projects\Historical\venv\Lib\site-packages\numba/core/postproc.pyÚ__init__zYieldPoint.__init__   sU   € Ý˜%¥¤Ñ*Ô*Ð*Ð*Ð*Ý˜$¥¤Ñ)Ô)Ð)Ð)Ð)ØˆŒ
ØˆŒ	ØˆŒØ"ˆÔÐÐó    N)Ú__name__Ú
__module__Ú__qualname__r   © r   r   r	   r	      s#   € € € € € ð#ð #ð #ð #ð #r   r	   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚGeneratorInfoc                 ó"   — i | _         g | _        d S r   )Úyield_pointsÚ
state_vars©r   s    r   r   zGeneratorInfo.__init__   s   € àˆÔàˆŒˆˆr   c                 ó4   — | j                              ¦   «         S )z=
        Return an iterable of YieldPoint instances.
        )r   Úvaluesr    s    r   Úget_yield_pointszGeneratorInfo.get_yield_points   s   € ð Ô ×'Ò'Ñ)Ô)Ð)r   N)r   r   r   r   r#   r   r   r   r   r      s2   € € € € € ðð ð ð*ð *ð *ð *ð *r   r   c                   óp   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	dS )ÚVariableLifetimez>
    For lazily building information of variable lifetime
    c                 ó   — || _         d S r   )Ú_blocks)r   Úblockss     r   r   zVariableLifetime.__init__#   s   € ØˆŒˆˆr   c                 ó4   — t          j        | j        ¦  «        S r   )r   Úcompute_cfg_from_blocksr'   r    s    r   ÚcfgzVariableLifetime.cfg&   s   € åÔ/°´Ñ=Ô=Ð=r   c                 ó4   — t          j        | j        ¦  «        S r   )r   Úcompute_use_defsr'   r    s    r   ÚusedefszVariableLifetime.usedefs*   s   € åÔ(¨¬Ñ6Ô6Ð6r   c                 ól   — t          j        | j        | j        | j        j        | j        j        ¦  «        S r   )r   Úcompute_live_mapr+   r'   r.   ÚusemapÚdefmapr    s    r   ÚlivemapzVariableLifetime.livemap.   s/   € åÔ(¨¬°4´<Ø)-¬Ô)<Ø)-¬Ô)<ñ>ô >ð 	>r   c                 ób   — t          j        | j        | j        | j        | j        j        ¦  «        S r   )r   Úcompute_dead_mapsr+   r'   r3   r.   r2   r    s    r   ÚdeadmapszVariableLifetime.deadmaps4   s+   € åÔ)¨$¬(°D´LÀ$Ä,Ø*.¬,Ô*=ñ?ô ?ð 	?r   N)
r   r   r   Ú__doc__r   r   r+   r.   r3   r6   r   r   r   r%   r%      s™   € € € € € ðð ðð ð ð ð>ð >ñ „_ð>ð ð7ð 7ñ „_ð7ð ð>ð >ñ „_ð>ð
 ð?ð ?ñ „_ð?ð ?ð ?r   r%   c                   óN   — e Zd ZdZd„ Zddedefd„Zd„ Zd„ Zdd	„Z		 dd
„Z
d„ ZdS )ÚPostProcessorz(
    A post-processor for Numba IR.
    c                 ó   — || _         d S r   )Úfunc_ir)r   r;   s     r   r   zPostProcessor.__init__D   s   € ØˆŒˆˆr   FÚ	emit_delsÚextend_lifetimesc                 óD  — t          j        | j        j        ¦  «        | j        _        t	          | j        j        ¦  «        }|| j        _        t          j        |j        | j        j        |j	        j
        |j        j        ¦  «        }| j        j                             ¦   «         D ]\  }}||         | j        j        |<   Œ| j        j        r-t!          ¦   «         | j        _        |                      ¦   «          nd| j        _        |r|                      |¬¦  «         dS dS )a   
        Run the following passes over Numba IR:
        - canonicalize the CFG
        - emit explicit `del` instructions for variables
        - compute lifetime of variables
        - compute generator info (if function is a generator function)
        N©r=   )r   Úcanonicalize_cfgr;   r(   r%   Úvariable_lifetimer   Úcompute_live_variablesr+   r.   r2   r6   ÚcombinedÚitemsÚblock_entry_varsÚis_generatorr   Úgenerator_infoÚ_compute_generator_infoÚ_insert_var_dels)r   r<   r=   ÚvltÚbevÚoffsetÚir_blocks          r   ÚrunzPostProcessor.runG   s  € õ )Ô9¸$¼,Ô:MÑNÔNˆŒÔÝ˜tœ|Ô2Ñ3Ô3ˆØ),ˆŒÔ&åÔ-¨c¬g°t´|Ô7JØ.1¬kÔ.@Ø.1¬lÔ.CñEô Eˆð !%¤Ô 3× 9Ò 9Ñ ;Ô ;ð 	Bð 	BÑˆF�HØ69¸&´kˆDŒLÔ)¨(Ñ3Ð3àŒ<Ô$ð 	/Ý*7©/¬/ˆDŒLÔ'Ø×(Ò(Ñ*Ô*Ð*Ð*à*.ˆDŒLÔ'ð ð 	EØ×!Ò!Ð3CÐ!ÑDÔDÐDÐDÐDð	Eð 	Er   c                 ór  — | j         j        j        }|r
J d¦   «         ‚| j         j                             ¦   «         D ]z}|j        D ]p}t          |t          j        ¦  «        rT|j	        }t          |t          j
        ¦  «        r3t          |¦  «        dz   }||_        t          ||¦  «        }|||j        <   ŒqŒ{dS )zP
        Fill `index` for the Yield instruction and create YieldPoints.
        z"rerunning _populate_generator_infoé   N)r;   rG   r   r(   r"   Úbodyr   r   ÚAssignÚvaluer   ÚlenÚindexr	   )r   Údctr   r   Ú	yieldinstrU   Úyps          r   Ú_populate_generator_infoz&PostProcessor._populate_generator_infod   sÆ   € ð ŒlÔ)Ô6ˆØÐ<Ð<Ð<Ñ<Ô<ˆwØ”\Ô(×/Ò/Ñ1Ô1ð 	2ð 	2ˆEØœ
ð 2ð 2�Ý˜d¥B¤IÑ.Ô.ð 2Ø $¤
�IÝ! )­R¬XÑ6Ô6ð 2Ý # C¡¤¨1¡˜Ø*/˜	œÝ'¨¨yÑ9Ô9˜Ø/1˜˜IœOÑ,øð2ð	2ð 	2r   c                 óè  — |                       ¦   «          |                      ¦   «          | j        j        }|                     ¦   «         D �]F}t          | j                             |j        ¦  «        ¦  «        }t          ¦   «         }t          |j        j	        ¦  «        }|D ]€}t          |t          j        ¦  «        r0|j        |j        u r n_|                     |j        j        ¦  «         ŒLt          |t          j        ¦  «        r|                     |j        ¦  «         Œ�J d¦   «         ‚|D ]R}t          |t          j        ¦  «        r6|j        }||v r*|                     |¦  «         |                     |¦  «         ŒR ||_        ||_        �ŒHt          ¦   «         }|                     ¦   «         D ]}||j        z  }||j        z  }Œt-          |¦  «        |_        |                      ¦   «          dS )zu
        Compute the generator's state variables as the union of live variables
        at all yield points.
        r   zcouldn't find yield pointN)rI   rY   r;   rG   r#   ÚsetÚget_block_entry_varsr   ÚiterrQ   r   r   rR   rS   r   ÚaddÚtargetÚnameÚDelÚremover   r   Úsortedr   Úremove_dels)	r   ÚgirX   r   r   ÚstmtsÚstmtr`   Ústs	            r   rH   z%PostProcessor._compute_generator_infot   sé  € ð 	×ÒÑÔÐØ×%Ò%Ñ'Ô'Ð'ØŒ\Ô(ˆØ×%Ò%Ñ'Ô'ð 	/ñ 	/ˆBÝ˜DœL×=Ò=¸b¼hÑGÔGÑHÔHˆIÝ ™UœUˆNÝ˜œœÑ'Ô'ˆEØð 6ð 6�Ý˜d¥B¤IÑ.Ô.ð 1Ø”z R¤WÐ,Ð,Ø˜Ø—M’M $¤+Ô"2Ñ3Ô3Ð3Ð3Ý ¥b¤fÑ-Ô-ð 1Ø×$Ò$ T¤ZÑ0Ô0Ð0øà5Ð5Ñ5Ô5�qð ð ð �Ý˜d¥B¤FÑ+Ô+ð Øœ:�DØ˜yÐ(Ð(Ø!×(Ò(¨Ñ.Ô.Ð.Ø&×*Ò*¨4Ñ0Ô0Ð0øàØ$ˆBŒLØ .ˆBÔÑå‰UŒUˆØ×%Ò%Ñ'Ô'ð 	$ð 	$ˆBØ�"”,ÑˆBØ�"Ô#Ñ#ˆBˆBÝ˜r™
œ
ˆŒØ×ÒÑÔÐÐÐr   c                 óv   — | j         j        }|                      |j        j        |j        j        |¬¦  «         dS )a®  
        Insert del statements for each variable.
        Returns a 2-tuple of (variable definition map, variable deletion map)
        which indicates variables defined and deleted in each block.

        The algorithm avoids relying on explicit knowledge on loops and
        distinguish between variables that are defined locally vs variables that
        come from incoming blocks.
        We start with simple usage (variable reference) and definition (variable
        creation) maps on each block. Propagate the liveness info to predecessor
        blocks until it stabilize, at which point we know which variables must
        exist before entering each block. Then, we compute the end of variable
        lives and insert del statements accordingly. Variables are deleted after
        the last use. Variable referenced by terminators (e.g. conditional
        branch and return) are deleted by the successors or the caller.
        r?   N)r;   rA   Ú_patch_var_delsr6   ÚinternalÚescaping)r   r=   rJ   s      r   rI   zPostProcessor._insert_var_delsž   sK   € ð" ŒlÔ,ˆØ×Ò˜Sœ\Ô2°C´LÔ4IØ.>ð 	ñ 	@ô 	@ð 	@ð 	@ð 	@r   c           	      ó�  — | j         j                             ¦   «         D �]%\  }}||                              ¦   «         }g }t	          |j        dd…         ¦  «        D ]“}t          d„ |                     ¦   «         D ¦   «         ¦  «        }	|	|z  }
t                               ¦   «         D ]+\  }}t          ||¦  «        r |||
¦  «        }|
|z  }
||z  }Œ,| 
                    ||
f¦  «         ||
z  }Œ”g }|j        }g }t	          |¦  «        D ]§\  }}|r|j        d         j        }n|j        }t          |t          j        ¦  «        s| 
                    |¦  «         t          |d¬¦  «        D ]E}t          j        ||¬¦  «        }|r| 
                    |¦  «         Œ0| 
                    |¦  «         ŒFŒ¨|r|                     |¦  «         | 
                    |j        d         ¦  «         ||_        ||         }t          |¦  «        D ];}|                     t          j        ||j        d         j        ¬¦  «        ¦  «         Œ<�Œ'dS )z-
        Insert delete in each block
        Néÿÿÿÿc              3   ó$   K  — | ]}|j         V — Œd S r   )r`   )Ú.0Úvs     r   ú	<genexpr>z0PostProcessor._patch_var_dels.<locals>.<genexpr>¿   s$   è è € Ð@Ð@¨!˜qœvÐ@Ð@Ð@Ð@Ð@Ð@r   T)Úreverse)Úlocr   )r;   r(   rD   ÚcopyÚreversedrQ   r[   Ú	list_varsÚir_extension_insert_delsr   Úappendrt   r   ra   rc   ÚextendÚprepend)r   Úinternal_dead_mapÚescaping_dead_mapr=   rL   rM   Úinternal_dead_setÚ
delete_ptsrg   Úlive_setÚdead_setÚTÚdef_funcÚ	done_delsrQ   ÚlastlocÚ	del_storeÚ
delete_setÚvar_nameÚdelnodeÚescape_dead_sets                        r   rj   zPostProcessor._patch_var_dels³   sŸ  € ð
 !%¤Ô 3× 9Ò 9Ñ ;Ô ;ð 1	Mñ 1	MÑˆF�Hà 1°&Ô 9× >Ò >Ñ @Ô @ÐØˆJå  ¤¨s°¨sÔ!3Ñ4Ô4ð .ð .�åÐ@Ð@¨t¯~ª~Ñ/?Ô/?Ð@Ñ@Ô@Ñ@Ô@�Ø#Ð&7Ñ7�Ý#;×#AÒ#AÑ#CÔ#Cð 7ð 7‘K�A�xÝ! $¨Ñ*Ô*ð 7Ø$, H¨T°8Ñ$<Ô$<˜	Ø  IÑ-˜Ø)¨YÑ6Ð)øà×!Ò! 4¨Ð"2Ñ3Ô3Ð3Ø! XÑ-Ð!Ð!ð ˆDØ”lˆGØˆIÝ$,¨ZÑ$8Ô$8ð -ð -Ñ ��jð $ð 'Ø&œm¨BÔ/Ô3�G�Gà"œh�Gå! $­¬Ñ/Ô/ð &Ø—K’K Ñ%Ô%Ð%õ !' z¸4Ð @Ñ @Ô @ð -ð -�HÝ œf X°7Ð;Ñ;Ô;�GØ'ð -Ø!×(Ò(¨Ñ1Ô1Ð1Ð1àŸš GÑ,Ô,Ð,Ð,ð-ð  ð 'Ø—’˜IÑ&Ô&Ð&Ø�KŠK˜œ bÔ)Ñ*Ô*Ð*Ø ˆHŒMð 0°Ô7ˆOÝ" ?Ñ3Ô3ð Mð M�Ø× Ò ¥¤¨°h´mÀAÔ6FÔ6JÐ!KÑ!KÔ!KÑLÔLÐLÐLñMða1	Mð 1	Mr   c                 óB   — t          j        | j        j        ¦  «         dS )z,
        Strips the IR of Del nodes
        N)r   rd   r;   r(   r    s    r   rd   zPostProcessor.remove_delsë   s    € õ 	Ô˜Tœ\Ô0Ñ1Ô1Ð1Ð1Ð1r   N)FF)F)r   r   r   r7   r   ÚboolrN   rY   rH   rI   rj   rd   r   r   r   r9   r9   ?   s¿   € € € € € ðð ðð ð ðEð E˜Tð E¸Tð Eð Eð Eð Eð:2ð 2ð 2ð (ð (ð (ðT@ð @ð @ð @ð, */ð6Mð 6Mð 6Mð 6Mðp2ð 2ð 2ð 2ð 2r   r9   N)Ú	functoolsr   Ú
numba.corer   r   r   r   Úobjectr	   r   r%   rx   r9   r   r   r   ú<module>r�      sÿ   ðØ %Ð %Ð %Ð %Ð %Ð %Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9ð#ð #ð #ð #ð #�ñ #ô #ð #ð*ð *ð *ð *ð *�Fñ *ô *ð *ð?ð ?ð ?ð ?ð ?�vñ ?ô ?ð ?ð: Ð ðp2ð p2ð p2ð p2ð p2�Fñ p2ô p2ð p2ð p2ð p2r   