
    sh!                         S r  SSKJr  SSKJr  SrS rS rS 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 rS r\S:X  a  \" 5         gg! \ a     NYf = f)zc
Contains tests and a prototype implementation for the fanout algorithm in
the LLVM refprune pass.
    )Digraph)defaultdictAc                      0 SS/_SSS/_S/ _SSS/_SS/_S/ _SSS	/_S	SS/_SS
S/_S
SS/_S/ _SS/_S/ SQ_SS/_SS/_S/ _n [        [        5      nS/US'   S/US'   SS/US'   SSS10nXU4$ )Nr   BCDEFGHIJKLMZ)r   OPr   r   increfdecrefr   listedgesnodesexpecteds      q/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/llvmlite/tests/refprune_proto.pycase1r      s0   cUc3Z 	R 	c3Z	
 	cU 	R 	c3Z 	c3Z 	c3Z 	c3Z 	R 	cU 	_ 	cU 	cU  	R!E$ EE#JE#JH%E#Jc3Z H!!    c                  f    SS/S// S.n [        [        5      nS/US'   S/US'   S/US'   SS 0nXU4$ Nr   r   )r   r   r   r   r   r   r   r   s      r   case2r#   2   sY    3ZUE
 EE#JE#JE#JT{H!!r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r   r	   r   appendr   r   _r   s       r   case3r)   @   3    gOE!	#JcT{H!!r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r
   r	   r%   r'   s       r   case4r,   H   r*   r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r   r	   r%   r'   s       r   case5r.   P   r*   r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r   r	   r%   r'   s       r   case6r0   X   r*   r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r   r	   r%   r'   s       r   case7r2   `   r*   r    c                  \    SS/S// S.n [        [        5      nS/US'   S/US'   SS10nXU4$ r"   r   r   s      r   case8r4   h   sP    3ZUE
 EE#JE#JcU|H!!r    c                  T    [        5       u  pnUS   R                  S5        SS 0nXU4$ )Nr   r   r   r4   r&   r'   s       r   case9r7   u   r*   r    c                  V    [        5       u  pnUS   R                  S5        SS10nXU4$ )Nr   r   r6   r'   s       r   case10r9   }   s5    gOE!	#JccU|H!!r    c                  `    [        5       u  pnUS   R                  S5        / US'   SS10nXU4$ Nr   r	   r   r6   r'   s       r   case11r<      s>    gOE!	#JcE#JcU|H!!r    c                  b    [        5       u  pnUS   R                  S5        S/US'   SS10nXU4$ r;   r6   r'   s       r   case12r>      s@    gOE!	#JcE#JcU|H!!r    c                  `    [        5       u  pnUS   R                  S5        S/US'   SS 0nXU4$ )Nr   r	   r   r   r6   r'   s       r   case13r@      s>    gOE!	#JcE#JT{H!!r    c                     [        [        5      nU R                  5        H!  u  p#U H  nX   R                  U5        M     M#     U$ N)r   setitemsadd)r   dsrc	outgoingsdsts        r   make_predecessor_maprJ      s<    CA++-CFJJsO  ( Hr    c                   `    \ rS rSrSS jrS rS rS rS rS r	S r
S	 rS
 r SS jrS rSrg)FanoutAlgorithm   c                     Xl         X l        [        U5      U l        U(       a  [        U l        g U R
                  U l        g rB   )r   r   rJ   	rev_edgesprint_null_print)selfr   r   verboses       r   __init__FanoutAlgorithm.__init__   s-    

-e4%U
4+;+;
r    c                 "    U R                  5       $ rB   )find_fanout_in_function)rR   s    r   runFanoutAlgorithm.run   s    ++--r    c                     g rB    )rR   argskwargss      r   rQ   FanoutAlgorithm._null_print   s    r    c                     0 nU R                    HI  nS U R                  U    5        H,  nU R                  U5      nU R                  SUSU5        XAU'   M.     MK     U$ )Nc              3   4   #    U  H  oS :X  d  M
  Uv   M     g7f)r   Nr[   ).0xs     r   	<genexpr>:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>   s     L&:8m11&:s   		z>>z===)r   r   find_fanoutrP   )rR   gotcur_noder   decref_blockss        r   rW   'FanoutAlgorithm.find_fanout_in_function   s^    

HLdjj&:L $ 0 0 :

45-@ -H M #
 
r    c                     U R                  U5      nU R                  SU5        U(       d  g U R                  X[        S9(       d  g [	        U5      $ )N
candidates)entry)find_decref_candidatesrP   verify_non_overlappingENTRYrC   )rR   	head_noderh   s      r   re   FanoutAlgorithm.find_fanout   sN    33I>

</**E + 
 =!!r    c                 \   U R                  SR                  SS5      5        [        U5      nU(       a  UR                  5       n[	        5       nU/nAU(       a  UR                  5       nU R                  SUSU5        XV;   a  M2  XS:X  a  U R                  SU5        gUR                  U5        U R                  SU S	U R                  U5       35        U R                  U5       H3  nX;   a  U R                  S
5          gX:w  d  M"  UR                  U5        M5     U(       a  M  U(       a  M  g)Nrn   P   -rg   |z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rP   centerr   poprC   rE   get_predecessorsr&   )	rR   rp   rh   rl   todorg   visited	workstackpreds	            r   rn   &FanoutAlgorithm.verify_non_overlapping   s   

+222s;< M"xxzHeG!
I$==?

:xi@&$JJ? !H%

(74+@+@+J*KL !11(;D,

L  %(!((. <! ) dB r    c                 2    [        U R                  U   5      $ rB   )tupler   rR   nodes     r   get_successorsFanoutAlgorithm.get_successors   s    TZZ%&&r    c                 2    [        U R                  U   5      $ rB   )r   rO   r   s     r   rx    FanoutAlgorithm.get_predecessors   s    T^^D)**r    c                 &    SU R                   U   ;   $ )Nr   )r   r   s     r   
has_decrefFanoutAlgorithm.has_decref   s    4::d+++r    c                    S[        U5      -  nU R                  USX!5        US::  a  gX;   a
  XS   :X  a  ggU R                  U5      (       a$  UR                  U5        U R                  US5        gUS-  nX!4-  nSnU R	                  U5       H   nU R                  XrU5      (       d  Sn  OSnM"     U R                  USU 35        U$ )	N walkr   FTzfound decref   zret )lenrP   r   rE   r   walk_child_for_decref)rR   rg   
path_stackrh   depthindentfoundchilds           r   r   %FanoutAlgorithm.walk_child_for_decref   s     s:&

66:8A:!a=(??8$$h'JJv~.
k!
((2E--=   3 	

6T%>*r    c                     U R                  SR                  SS5      5        U4nSn[        5       nU R                  U5       H   nU R	                  XRU5      (       d  Sn  OSnM"     U(       d
  [        5       $ U$ )Nrm   rs   rt   FT)rP   rv   rC   r   r   )rR   rg   r   r   rh   r   s         r   rm   &FanoutAlgorithm.find_decref_candidates  s}    

+222s;<[
((2E--=   3 5L  r    )r   r   rP   rO   N)F)
   )__name__
__module____qualname____firstlineno__rT   rX   rQ   rW   re   rn   r   rx   r   r   rm   __static_attributes__r[   r    r   rL   rL      s?    <.	"&P'+, :<>!r    rL   c            
      \   [        5       u  pn[        5       nU H+  nUR                  USU S3SR                  X   5      -   S9  M-     UR	                  5        H  u  pEU H  nUR                  XF5        M     M!     UR                  5         [        XSS9nUR                  5       nX(:X  d   eg )Nrect
z\l)shapelabelT)rS   )	r@   r   r   joinrD   edgeviewrL   rX   )	r   r   r   r   r   childrenr   algorf   s	            r   
check_oncer   *  s    #XE( 		A	t6D6uzz%+7N)NO ++-EFF4  ( FFH56D
((*C??r    c                  .   [        [        5       R                  5       5       He  u  pU R                  S5      (       d  M  [	        U R                  SS5      5        U" 5       u  p#n[        X#5      nUR                  5       nXF:X  a  Me   e   [	        S5        g )Ncasers   rt   z
ALL PASSED)r   globalsrD   
startswithrP   rv   rL   rX   )kfnr   r   r   r   rf   s          r   	check_allr   <  su    gioo'(<<RD..S)*%'T"E("50D((*C?"? ) 
,r    __main__N)__doc__graphvizr   ImportErrorcollectionsr   ro   r   r#   r)   r,   r.   r0   r2   r4   r7   r9   r<   r>   r@   rJ   rL   r   r   r   r[   r    r   <module>r      s   
	  $ 	"6""""""
""""""B! B!J$ zK 	  		s   A A$#A$