
    sh@                     p   S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJrJrJr  SSKJrJr  SS	KJr  \R(                  " \5      rS
 r " S S5      rS rS rS rS rS rS rS rS r S r!S r"S r# " S S5      r$ " S S\$5      r% " S S5      r& " S S\$5      r' " S  S!\$5      r(S" r)g)#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                 :    [        U R                  5      U l        U $ )zfApply SSA reconstruction algorithm on the given IR.

Produces minimal SSA using Choi et al algorithm.
)_run_ssablocks)func_irs    b/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/core/ssa.pyreconstruct_ssar      s    
 gnn-GNN    c                        \ rS rSrS rS rSrg)_CacheListVars$   c                     0 U l         g N_savedselfs    r   __init___CacheListVars.__init__%   s	    r   c                     U R                   R                  U5      nUc  UR                  5       =U R                   U'   nU$ r   )r   get	list_vars)r   instgots      r   r    _CacheListVars.get(   s8    kkood#;&*nn&66DKK
r   r   N)__name__
__module____qualname____firstlineno__r   r    __static_attributes__ r   r   r   r   $   s    r   r   c           	      l   U (       d  0 $ [        U 5      n[        U5      n[        X5      n[        5       nU HS  n[        R                  SU5        [        X5      u  p[        R                  S[        U5      5        [        XXaUU5      n MU     [        U 5      nXq:w  a  [        R                  " S5      eU $ )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1I$&O ('	

 %V50-2GH vW.0  'v.H""#<==Mr   c                    [        U 5      nXS'   X&S'   [        [        5      =US'   nX6S'   [        XB5      US'   [	        X[        U5      5      nUR                  5        H  u  pX   nXR                  -   Ul        M     U$ )z=Rewrite all uses to ``varname`` given the definition map
    r7   r8   phimapr3   phi_locations)_make_statesr   list_compute_phi_locations_run_block_rewrite_FixSSAVarsitemsbody)r   r7   r8   r3   r4   r6   statesr;   	newblockslabelphilistcurblks               r   r1   r1   S   s     &!F98 +D 11F8v5M4WEF?"6;3OPI ,,.!+ ) r   c           	         U R                  5       R                  5        VVs0 s H  u  pU[        U5      _M     nnnSnU(       ax  SnUR                  5        HY  u  p[        [        R
                  U Vs/ s H  oSU   PM	     sn[        5       5      nUR                  U5      (       d  MS  X&-  nSnM[     U(       a  Mx  U$ s  snnf s  snf )zCompute the iterated dominance frontiers (DF+ in literatures).

Returns a dictionary which maps block label to the set of labels of its
iterated dominance frontiers.
TF)dominance_frontierrB   setr   operatoror_
difference)r3   kvs	domfronts
keep_goingvinners          r   r,   r,   e   s     *-)?)?)A)G)G)IJ)ICG)IIJJ

__&EA8<<)C1A,)CSUKE##!
	 ' *  K
 *Ds   C 5Cc                 l    [        5       nUR                  5        H  u  p4U(       d  M  X U   -  nM     U$ r   )rK   rB   )iterated_dfr8   r<   deflabeldefstmtss        r   r?   r?   w   s8     EM$lln822M - r   c                 v    [        U 5      nXS'   [        [        5      =US'   n[        X[	        5       5      nXC4$ )z(Rewrite to put fresh variable names
    r7   r8   )r=   r   r>   r@   _FreshVarHandler)r   r7   rD   r8   rE   s        r   r0   r0      sC     &!F9 +D 11F8v"63C3EFIr   c                 <    U R                  5       tpUR                  $ r   )valuesscope)r   first_s      r   
_get_scoper`      s    IE;;r   c           	         [        [        5      n[        [        5      n[        X#S9n[	        X[        5       5        [        R                  S[        U5      5        [        UR                  5        VVs/ s H  u  pV[        U5      S:  d  M  UPM     snn5      nUR                  5       nUR                  5        H[  u  pYXW;  d  M  U	 HI  n
X   nX%    VV
s1 s H  u  pU
iM	     nnn
UR                  U5      (       a  M7  UR                  U5          MY     M]     [        R                  S[        U5      5        U$ s  snnf s  sn
nf )zY
Returns
-------
res : Set[str]
    The SSA violators in a dictionary of variable names.
)defsuseszdefs %s   zSSA violators %s)r   r>   rK   dict_run_block_analysis_GatherDefsHandlerr.   r/   r   r
   rB   len
dominatorsintersectionadd)r   r3   rb   rc   rD   rO   rP   r5   doms
use_blocksrF   dom_assign
def_labelss                 r   r-   r-      s    tDsDt'F(:(<=MM)]401 4::<G<%!3r7Q;A<GHI>>D#k:>'C'e'
C!..s33MM!$ $ & MM$mI&>? H Ds   3D:
D:
E 
c                     U R                  5        H2  u  p4[        R                  SU5        X1S'   [        XU5       H  nM     M4     g )Nz"==== SSA block analysis pass on %srF   )rB   r.   r/   _run_ssa_block_pass)r   rD   handlerrF   blkr_   s         r   rf   rf      s>    lln
:EBw$V':A ; %r   c                 4   0 nU R                  5        H  u  pE[        R                  SU5        [        R                  " UR
                  UR                  S9n/ nXAS'   XQS'   [        XU5       H  nUc   eUR                  U5        M     Xvl	        XcU'   M     U$ )Nz!==== SSA block rewrite pass on %s)r]   locrF   block)
rB   r.   r/   r   Blockr]   rv   rr   appendrC   )	r   rD   rs   rE   rF   rt   newblknewbodystmts	            r   r@   r@      s    Illn
95A		sww7ww'W=D###NN4  > !% % r   c                 &    [        [        U 5      S9$ )N)r]   )re   r`   )r   s    r   r=   r=      s      r   c              #   P  #    [         R                  SU5        UR                   H|  n[         R                  SU5        [        U[        R
                  5      (       a  UR                  X5      nOUR                  X5      nXCLa  Ub  [         R                  SU5        Uv   M~     g 7f)Nz
Running %szon stmt: %szreplaced with: %s)r.   r/   rC   
isinstancer   Assign	on_assignon_other)rD   rt   rs   r|   rets        r   rr   rr      s}     MM,(mT*dBII&&##F1C""60C?sMM-s3	 s   B$B&c                   $    \ rS rSrSrS rS rSrg)_BaseHandler   zGA base handler for all the passes used here for the SSA algorithm.
    c                     g)a2  
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   rD   assigns      r   r   _BaseHandler.on_assign       r   c                     g)aE  
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   rD   r|   s      r   r   _BaseHandler.on_other   r   r   r*   Nr%   r&   r'   r(   __doc__r   r   r)   r*   r   r   r   r      s    $r   r   c                   $    \ rS rSrSrS rS rSrg)rg   i  aB  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                    US   UR                   R                     R                  X!S   45        UR                  5        HD  nUR                  nXBR                   R                  :w  d  M*  US   U   R	                  US   5        MF     g )Nrb   rF   rc   )targetnamery   r!   rk   )r   rD   r   varrO   s        r   r   _GatherDefsHandler.on_assign  sq    vv}}))*116'?2KL##%CAMM&&&vq!%%fWo6 &r   c                 ~    UR                  5        H)  nUR                  nUS   U   R                  US   5        M+     g )Nrc   rF   )r!   r   rk   )r   rD   r|   r   rO   s        r   r   _GatherDefsHandler.on_other  s7    >>#CA6N1!!&/2 $r   r*   Nr   r*   r   r   rg   rg     s    73r   rg   c                   2    \ rS rSrS r\R                  rSrg)UndefinedVariablei  c                     [        S5      e)NzNot intended for instantiation)NotImplementedErrorr   s    r   r   UndefinedVariable.__init__  s    !"BCCr   r*   N)	r%   r&   r'   r(   r   r   	UNDEFINEDr   r)   r*   r   r   r   r     s    D \\Fr   r   c                   $    \ rS rSrSrS rS rSrg)rZ   i#  z9Replaces assignment target with new fresh variables.
    c                 R   UR                   R                  US   :X  Ga  US   nUS   n[        U5      S:X  a  UR                   n[        R	                  SU5        UR                  UR
                  ;  aD  SUR                  < S3n[        R                  " [        R                  " UUR                  S95        O.UR                  UR                   R                  UR                  S9n[        R                  " UUR                  UR                  S	9nXAS
      R                  U5        U$ )Nr7   r]   r8   r   zfirst assign: %sz	variable z is not in scope.rv   r   valuerv   rF   )r   r   rh   r.   r/   	localvarswarningswarnr	   NumbaIRAssumptionWarningrv   redefiner   r   r   ry   )r   rD   r   r]   r8   	newtargetwmsgs          r   r   _FreshVarHandler.on_assign&  s    ==	!227OEH%F6{a"MM	0)<>>8&y~~&88IJDMM&"A"A$&,jj#2 3 "NN6==+=+=6::NN	YY llJJF
 '?#**62r   c                     U$ r   r*   r   s      r   r   _FreshVarHandler.on_other<  s    r   r*   Nr   r*   r   r   rZ   rZ   #  s    ,r   rZ   c                   L    \ rS rSrSrS rS rS rS rS r	S r
S	 rSS
 jrSrg)rA   i@  a2  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                     Xl         g r   _cache_list_vars)r   r6   s     r   r   _FixSSAVars.__init__I  s     /r   c                 B   UR                   n[        U[        R                  5      (       a  U R	                  XU R
                  R                  UR                   5      5      nUb  UR                  [        R                  Lay  US   UR                  R                  :w  a\  US   UR                  0n[        U5      n[        R                  " X55        [        R                  " UR                  UUR                  S9$ U$ [        U[        R                  5      (       a  U R	                  XU/5      nUbn  UR                  [        R                  LaQ  US   UR                  R                  :w  a4  [        R                  " UR                  UR                  UR                  S9$ U$ )Nr7   r   )r   r   r   Inst_fix_varr   r    r   r   r   r   r   replace_vars_innerr   rv   Var)r   rD   r   rhsnewdefreplmaps         r   r   _FixSSAVars.on_assignL  sC   llc277##]] 5 5 9 9&,, GF !fmm2<<&G)$(:(::%i0&--@Gs)C//=99%}}!"JJ    RVV$$]]6C59F!fmm2<<&G)$(:(::99%}}$mm"JJ  r   c                 :   U R                  XU R                  R                  U5      5      nUbl  UR                  [        R
                  LaO  US   UR                  R                  :w  a2  US   UR                  0n[        U5      n[        R                  " X$5        U$ )Nr7   )
r   r   r    r   r   r   r   r   r   replace_vars_stmt)r   rD   r|   r   r   s        r   r   _FixSSAVars.on_otherk  s    $//33D9
 &--r||"Ci FMM$6$66!),fmm<Dz**49r   c                 z    U Vs/ s H  oDR                   PM     nnUS   nXe;   a  U R                  X5      $ gs  snf )z0Fix all variable uses in ``used_vars``.
        r7   N)r   	_find_def)r   rD   r|   	used_varsrO   varnamesphivars          r   r   _FixSSAVars._fix_varv  sC     %..IqFFI.	">>&//  /s   8c                 <   [         R                  SUS   U5        SnUS   nUS   U   nUS   U   nUS   nU R                  X'5      n[        U5       H(  n	U R                  XUS9n
X:  a  U	n  OX;   d  M#  US	   n  O   Uc  U R	                  XUR
                  S
9nU$ )z?Find definition of ``stmt`` for the statement ``stmt``
        zfind_def var=%r stmt=%sr7   NrF   r8   r;   rw   )stopr   )r.   r/   _stmt_indexreversed_find_def_from_toprv   )r   rD   r|   selected_defrF   
local_defs
local_phisrw   cur_posdefstmtdef_poss              r   r   _FixSSAVars._find_def~  s     	/	1BDIwH%e,
H%e,
w""4/
+G&&wG&DG &&)"~ , 22488 3 L r   c                 ^   [         R                  SU5        US   nUS   nUS   nUS   nX';   Ga+  US   nUS   R                  nUR                  US   US	9n	[        R
                  " U	[        R                  R                  US	9US
9n
[         R                  SX5        XR   R                  SU
5        Xb   R                  U
5        UR                  U5       H  u  pU R                  XUS	9n[         R                  SU5        U
R                  R                  R                  UR                  5        U
R                  R                  R                  U5        M     U
$ UR!                  5       U   nX:X  a  [#        US   U5        [$        $ [         R                  SX5        U R                  XUS	9$ )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 %rr3   r8   r;   r<   r]   rw   r7   r   r   zinsert phi node %s at %sr   zincoming_def %szidom %s from label %s)r.   r/   rv   r   r   r   Exprphiinsertry   predecessors_find_def_from_bottomr   incoming_valuesr   incoming_blocksimmediate_dominators"_warn_about_uninitialized_variabler   )r   rD   rF   rv   r3   r8   r;   r<   r]   freshvarphinodepredr_   incoming_defidoms                  r   r   _FixSSAVars._find_def_from_top  s    	2E:Um!!/!7OE/%%C~~fY&7S~AHiiggkkck*G
 MM4gEM  G,M  )++E2#99c  :   />--44\5H5HI--44T: 3 N++-e4D} 36)3DcJ((MM14?--f-DDr   c                 |    [         R                  SU5        US   nXB   nU(       a  US   nU$ U R                  XUS9$ )z<Find definition from within the block at ``label``.
        zfind_def_from_bottom label %rr8   r   r   )r.   r/   r   )r   rD   rF   rv   r8   rb   lastdefs          r   r   !_FixSSAVars._find_def_from_bottom  sK     	5u=!}2hGN**6c*BBr   c                     [        [        UR                  5      5      SU  H  nUR                  U   UL d  M  Us  $    [        UR                  5      $ )zyFind the positional index of the statement at ``block``.

Assumptions:
- no two statements can point to the same object.
N)rangerh   rC   )r   r   rw   r   is        r   r   _FixSSAVars._stmt_index  sG     s5::'.Azz!}' / 5::r   r   N)r   )r%   r&   r'   r(   r   r   r   r   r   r   r   r   r   r)   r*   r   r   rA   rA   @  s2    0>	08,E\
Cr   rA   c                     [         R                  (       a-  [        R                  " [        R
                  " SU  3US95        g g )Nz Detected uninitialized variable r   )r   ALWAYS_WARN_UNINIT_VARr   r   r	   NumbaWarning)r7   rv   s     r   r   r     s7    $$27)<	
 %r   )*r   loggingrL   r   	functoolsr   r   collectionsr   numbar   
numba.corer   r   r	   numba.core.utilsr
   r   numba.core.analysisr   	getLoggerr%   r.   r   r   r   r1   r,   r?   r0   r`   r-   rf   r@   r=   rr   r   rg   r   rZ   rA   r   r*   r   r   <module>r      s         #  + + 6 7 

H
% !H$$
<"
% %P3 32 | :`, `F
r   