
    shf$                         S SK Jr  S SKJrJrJrJr   " S S\5      r " S S\5      r	 " S S\5      r
0 r " S	 S
\5      rg)    )cached_property)iranalysis
transformsir_utilsc                       \ rS rSrS rSrg)
YieldPoint   c                     [        U[        R                  5      (       d   e[        U[        R                  5      (       d   eXl        X l        S U l        S U l        g N)
isinstancer   BlockYieldblockinst	live_varsweak_live_vars)selfr   r   s      g/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/core/postproc.py__init__YieldPoint.__init__   sI    %****$))))
	"    )r   r   r   r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__ r   r   r	   r	      s    #r   r	   c                        \ rS rSrS rS rSrg)GeneratorInfo   c                      0 U l         / U l        g r   )yield_points
state_varsr   s    r   r   GeneratorInfo.__init__   s    r   c                 6    U R                   R                  5       $ )z-
Return an iterable of YieldPoint instances.
)r#   valuesr%   s    r   get_yield_pointsGeneratorInfo.get_yield_points   s       ''))r   )r$   r#   N)r   r   r   r   r   r)   r   r   r   r   r    r       s    *r   r    c                   ^    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
VariableLifetime   z6
For lazily building information of variable lifetime
c                     Xl         g r   _blocks)r   blockss     r   r   VariableLifetime.__init__#   s    r   c                 B    [         R                  " U R                  5      $ r   )r   compute_cfg_from_blocksr0   r%   s    r   cfgVariableLifetime.cfg&   s    //==r   c                 B    [         R                  " U R                  5      $ r   )r   compute_use_defsr0   r%   s    r   usedefsVariableLifetime.usedefs*   s    ((66r   c                     [         R                  " U R                  U R                  U R                  R
                  U R                  R                  5      $ r   )r   compute_live_mapr5   r0   r9   usemapdefmapr%   s    r   livemapVariableLifetime.livemap.   s;    ((4<<)-)<)<)-)<)<> 	>r   c                     [         R                  " U R                  U R                  U R                  U R
                  R                  5      $ r   )r   compute_dead_mapsr5   r0   r?   r9   r>   r%   s    r   deadmapsVariableLifetime.deadmaps4   s4    ))$((DLL$,,*.,,*=*=? 	?r   r/   N)r   r   r   r   __doc__r   r   r5   r9   r?   rC   r   r   r   r   r,   r,      s\     > > 7 7 > >
 ? ?r   r,   c                   \    \ rS rSrSrS rSS\S\4S jjrS rS r	SS	 jr
 SS
 jrS rSrg)PostProcessor?   z 
A post-processor for Numba IR.
c                     Xl         g r   func_ir)r   rK   s     r   r   PostProcessor.__init__D   s    r   	emit_delsextend_lifetimesc                    [         R                  " U R                  R                  5      U R                  l        [	        U R                  R                  5      nX0R                  l        [        R                  " UR                  U R                  R                  UR                  R                  UR                  R                  5      nU R                  R                  R                  5        H   u  pVXE   U R                  R                  U'   M"     U R                  R                  (       a*  [!        5       U R                  l        U R%                  5         OSU R                  l        U(       a  U R'                  US9  gg)z
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rN   )r   canonicalize_cfgrK   r1   r,   variable_lifetimer   compute_live_variablesr5   r9   r>   rC   combineditemsblock_entry_varsis_generatorr    generator_info_compute_generator_info_insert_var_dels)r   rM   rN   vltbevoffsetir_blocks          r   runPostProcessor.runG   s	    )99$,,:M:MNt||223),&--cggt||7J7J.1kk.@.@.1ll.C.CE !% 3 3 9 9 ;F69kDLL))(3 !< <<$$*7/DLL'((**.DLL' !!3C!D r   c                    U R                   R                  R                  nU(       a   S5       eU R                   R                  R	                  5        H  nUR
                   H~  n[        U[        R                  5      (       d  M$  UR                  n[        U[        R                  5      (       d  MQ  [        U5      S-   nXTl        [        X$5      nXaUR                  '   M     M     g)z@
Fill `index` for the Yield instruction and create YieldPoints.
z"rerunning _populate_generator_info   N)rK   rX   r#   r1   r(   bodyr   r   Assignvaluer   lenindexr	   )r   dctr   r   	yieldinstrg   yps          r   _populate_generator_info&PostProcessor._populate_generator_infod   s     ll))66<<<w\\((//1E

dBII.. $

I!)RXX66 #C1*/'9/1IOO, # 2r   c                 :   U R                  5         U R                  5         U R                  R                  nUR	                  5        GHs  n[        U R                  R                  UR                  5      5      n[        5       n[        UR                  R                  5      nU H  n[        U[        R                  5      (       aB  UR                  UR                  L a    OnUR                  UR                   R"                  5        Md  [        U[        R$                  5      (       d  M  UR'                  UR                  5        M      S5       eU HY  n[        U[        R$                  5      (       a7  UR                  nXs;   a$  UR'                  U5        UR                  U5        MW  MY    O   X2l        XBl        GMv     [        5       nUR	                  5        H  nXR(                  -  nXR*                  -  nM!     [-        U5      Ul        U R1                  5         g)z]
Compute the generator's state variables as the union of live variables
at all yield points.
zcouldn't find yield pointN)rZ   rk   rK   rX   r)   setget_block_entry_varsr   iterrc   r   r   rd   re   r   addtargetnameDelremover   r   sortedr$   remove_dels)	r   girj   r   r   stmtsstmtrs   sts	            r   rY   %PostProcessor._compute_generator_infot   s    	%%'\\((%%'BDLL==bhhGHI UN'EdBII..zzRWW,MM$++"2"23bff--$$TZZ0  655q dBFF++::D(!((.&**40 )   %L .1 (4 U%%'B,,B###B ( r
r   c                     U R                   R                  nU R                  UR                  R                  UR                  R
                  US9  g)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.
rP   N)rK   rR   _patch_var_delsrC   internalescaping)r   rN   r[   s      r   rZ   PostProcessor._insert_var_dels   sB    " ll,,S\\22CLL4I4I.> 	 	@r   c           	      z   U R                   R                  R                  5        GH  u  pEX   R                  5       n/ n[	        UR
                  SS 5       H|  n[        S UR                  5        5       5      n	X-  n
[        R                  5        H'  u  p[        X5      (       d  M  U" X5      nX-  n
Xm-  nM)     UR                  X45        Xj-  nM~     / nUR                  n/ n[	        U5       H  u  nnU(       a  UR
                  S   R                  nOUR                  n[        U[        R                  5      (       d  UR                  U5        [        USS9 HC  n[        R                  " UUS9nU(       a  UR                  U5        M2  UR                  U5        ME     M     U(       a  UR                  U5        UR                  UR
                  S   5        Xl        X$   n[        U5       H>  nUR!                  [        R                  " UUR
                  S   R                  S95        M@     GM     g)z
Insert delete in each block
Nc              3   8   #    U  H  oR                   v   M     g 7fr   )rs   ).0vs     r   	<genexpr>0PostProcessor._patch_var_dels.<locals>.<genexpr>   s     @/?!vv/?s   T)reverse)locr   )rK   r1   rU   copyreversedrc   rn   	list_varsir_extension_insert_delsr   appendr   r   rt   rv   extendprepend)r   internal_dead_mapescaping_dead_maprN   r]   r^   internal_dead_set
delete_ptsrz   live_setdead_setTdef_func	done_delsrc   lastloc	del_store
delete_setvar_namedelnodeescape_dead_sets                        r   r~   PostProcessor._patch_var_dels   s   
 !% 3 3 9 9 ;F 1 9 > > @J s!34@t~~/?@@#7#;#A#A#CKA!$**$,T$<	 -)6)	 $D !!4"23!-! 5 DllGI$,Z$8 j $&mmB/33G"hhG!$//KK% !'z4 @H ffX7;G'!((1G, !A %9&  I&KKb)* M 07O"?3  hmmA6F6J6J!KL 4a !<r   c                 X    [         R                  " U R                  R                  5        g)z
Strips the IR of Del nodes
N)r   rw   rK   r1   r%   s    r   rw   PostProcessor.remove_dels   s     	T\\001r   rJ   N)FF)F)r   r   r   r   rE   r   boolr_   rk   rY   rZ   r~   rw   r   r   r   r   rG   rG   ?   sD    ET ET E:2 (T@, */6Mp2r   rG   N)	functoolsr   
numba.corer   r   r   r   objectr	   r    r,   r   rG   r   r   r   <module>r      sH    % 9 9# #*F *?v ?:  p2F p2r   