
    |h!                         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      W/home/james-whalen/.local/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   case6r/   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   case7r1   `   r)   r    c                  `    S/SS/S// S.n [        [        5      nS/US'   S/US'   SS10nXU4$ )Nr   r   r   )zentry:r   r   r   r   r   r   r   s      r   case8r3   h   sU    %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   r3   r%   r&   s       r   case9r6   v   r)   r    c                  V    [        5       u  pnUS   R                  S5        SS10nXU4$ )Nr   r   r5   r&   s       r   case10r8   ~   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   r5   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:   r5   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   r5   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_maprI      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 rA   )r   r   rI   	rev_edgesprint_null_print)selfr   r   verboses       r   __init__FanoutAlgorithm.__init__   s-    

-e4%U
4+;+;
r    c                 "    U R                  5       $ rA   )find_fanout_in_function)rQ   s    r   runFanoutAlgorithm.run   s    ++--r    c                     g rA    )rQ   argskwargss      r   rP   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   NrZ   ).0xs     r   	<genexpr>:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>   s     L&:8m11&:s   		z>>z===)r   r   find_fanoutrO   )rQ   gotcur_noder   decref_blockss        r   rV   '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_candidatesrO   verify_non_overlappingENTRYrB   )rQ   	head_noderg   s      r   rd   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)Nrm   P   -rf   |z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rO   centerr   poprB   rD   get_predecessorsr%   )	rQ   ro   rg   rk   todorf   visited	workstackpreds	            r   rm   &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      $ rA   )tupler   rQ   nodes     r   get_successorsFanoutAlgorithm.get_successors   s    TZZ%&&r    c                 2    [        U R                  U   5      $ rA   )r~   rN   r   s     r   rw    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 )lenrO   r   rD   r   walk_child_for_decref)rQ   rf   
path_stackrg   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$ )Nrl   rr   rs   FT)rO   ru   rB   r   r   )rQ   rf   r   r   rg   r   s         r   rl   &FanoutAlgorithm.find_decref_candidates  s}    

+222s;<[
((2E--=   3 5L  r    )r   r   rO   rN   N)F)
   )__name__
__module____qualname____firstlineno__rS   rW   rP   rV   rd   rm   r   rw   r   r   rl   __static_attributes__rZ   r    r   rK   rK      s?    <.	"&P'+, :<>!r    rK   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)rR   )	r?   r   r   joinrC   edgeviewrK   rW   )	r   r   r   r   r   childrenr   algore   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caserr   rs   z
ALL PASSED)r   globalsrC   
startswithrO   ru   rK   rW   )kfnr   r   r   r   re   s          r   	check_allr   =  su    gioo'(<<RD..S)*%'T"E("50D((*C?"? ) 
,r    __main__N)__doc__graphvizr   ImportErrorcollectionsr   rn   r   r"   r(   r+   r-   r/   r1   r3   r6   r8   r;   r=   r?   rI   rK   r   r   r   rZ   r    r   <module>r      s   
	  $ 	"6""""""""""""B! B!J$ zK A
  		s   A A$#A$