+
    -i!                         R t  ^ RIHt ^ RIHt RtR tR tR t	R t
R tR	 tR
 tR tR tR tR tR tR tR t ! R R4      tR tR t]R8X  d
   ]! 4        R# R#   ] d     L]i ; i)zc
Contains tests and a prototype implementation for the fanout algorithm in
the LLVM refprune pass.
)Digraph)defaultdictAc                      / R R.bRRR.bR. bRRR.bRR.bR. bRRR.bRRR.bRR	R
.bR	RR.bR
. bRR.bR. RObRR.bRR.bR. bp \        \        4      pR.VR&   R.VR&   RR.VR&   RRR0/pWV3# )r   BCDEFGHIJKLMZOPincrefdecref)r   r   r   r   listedgesnodesexpecteds      [/var/www/html/photoedit/myenv/lib/python3.14/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                  j    R RR.RR.R. /p \        \        4      pR.VR &   R.VR&   R.VR&   R R/pWV3# )r   r   r   r   r   Nr   r   s      r   case2r!   2   s_    c3ZcURE
 EE#JE#JE#JT{H!!r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r
   r   Nr   appendr   r   _r   s       r   case3r'   @   3    gOE!	#JcT{H!!r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r	   r   Nr#   r%   s       r   case4r*   H   r(   r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r   r   Nr#   r%   s       r   case5r,   P   r(   r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r   r   Nr#   r%   s       r   case6r.   X   r(   r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r   r   Nr#   r%   s       r   case7r0   `   r(   r   c                  f    R R.RRR.RR.R. /p \        \        4      pR.VR&   R.VR&   RR0/pWV3# )zentry:r   r   r   r   r   r   r   s      r   case8r2   h   s]    3%c3ZcUR	E EE#JE#JcU|H!!r   c                  \    \        4       w  rpVR ,          P                  R4       RR/pWV3# )r   r   r   Nr2   r$   r%   s       r   case9r5   v   r(   r   c                  ^    \        4       w  rpVR ,          P                  R4       RR 0/pWV3# )r   r   r4   r%   s       r   case10r7   ~   s5    gOE!	#JccU|H!!r   c                  h    \        4       w  rpVR ,          P                  R4       . VR&   RR 0/pWV3# r   r   r   r4   r%   s       r   case11r:      s>    gOE!	#JcE#JcU|H!!r   c                  j    \        4       w  rpVR ,          P                  R4       R.VR&   RR 0/pWV3# r9   r4   r%   s       r   case12r<      s@    gOE!	#JcE#JcU|H!!r   c                  h    \        4       w  rpVR ,          P                  R4       R.VR&   RR/pWV3# )r   r   r   r   Nr4   r%   s       r   case13r>      s>    gOE!	#JcE#JT{H!!r   c                     \        \        4      pV P                  4        F%  w  r#V F  pW,          P                  V4       K  	  K'  	  V# N)r   setitemsadd)r   dsrc	outgoingsdsts   &    r   make_predecessor_maprH      s<    CA++-CFJJsO  ( Hr   c                   j   a  ] tR t^t o RR ltR tR tR tR tR t	R t
R tR	 tRR
 ltR tRtV tR# )FanoutAlgorithmc                    Wn         W n        \        V4      V n        V'       d   \        V n        R # V P
                  V n        R # r@   )r   r   rH   	rev_edgesprint_null_print)selfr   r   verboses   &&&&r   __init__FanoutAlgorithm.__init__   s-    

-e4%U
4+;+;
r   c                "    V P                  4       # r@   )find_fanout_in_function)rO   s   &r   runFanoutAlgorithm.run   s    ++--r   c                    R # r@    )rO   argskwargss   &*,r   rN   FanoutAlgorithm._null_print   s    r   c                    / pV P                    FM  pR  V P                  V,           4        F,  pV P                  V4      pV P                  RVRV4       WAV&   K.  	  KO  	  V# )c              3   6   "   T F  qR 8X  g   K  Vx  K  	  R# 5i)r   NrX   ).0xs   & r   	<genexpr>:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>   s     L&:8m11&:s   
z>>z===)r   r   find_fanoutrM   )rO   gotcur_noder   decref_blockss   &    r   rT   'FanoutAlgorithm.find_fanout_in_function   s^    

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

45-@ -H M #
 
r   c                    V P                  V4      pV P                  R V4       V'       g   R# V P                  W\        R7      '       g   R# \	        V4      # )
candidatesN)entry)find_decref_candidatesrM   verify_non_overlappingENTRYrA   )rO   	head_nodere   s   && r   rb   FanoutAlgorithm.find_fanout   sS    33I>

</**E + 
 
 =!!r   c                R   V P                  R P                  ^PR4      4       \        V4      pV'       d   VP                  4       p\	        4       pV.p?V'       g   K0  VP                  4       pV P                  RVRV4       WV9   d   K6  WS8X  d   V P                  RV4       R# VP                  V4       V P                  RV RV P                  V4       24       V P                  V4       F6  pW9   d   V P                  R4        R# W8w  g   K%  VP                  V4       K8  	  K  R	# )
rk   -rd   |z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rM   centerr   poprA   rC   get_predecessorsr$   )	rO   rm   re   ri   todord   visited	workstackpreds	   &&&&     r   rk   &FanoutAlgorithm.verify_non_overlapping   s   

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

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

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

L  %(!((. < r   c                :    \        V P                  V,          4      # r@   )tupler   rO   nodes   &&r   get_successorsFanoutAlgorithm.get_successors   s    TZZ%&&r   c                :    \        V P                  V,          4      # r@   )r{   rL   r|   s   &&r   rt    FanoutAlgorithm.get_predecessors   s    T^^D)**r   c                .    R V P                   V,          9   # )r   )r   r|   s   &&r   
has_decrefFanoutAlgorithm.has_decref   s    4::d+++r   c                   R \        V4      ,          pV P                  VRW!4       V^ 8:  d   R# W9   d   W^ ,          8X  d   R# R# V P                  V4      '       d&   VP                  V4       V P                  VR4       R# V^,          pW!3,          pRpV P	                  V4       F!  pV P                  WrV4      '       g   Rp MRpK#  	  V P                  VRV 24       V# ) walkFTzfound decrefzret )lenrM   r   rC   r~   walk_child_for_decref)rO   rd   
path_stackre   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                    V P                  R P                  ^PR4      4       V3pRp\        4       pV P                  V4       F!  pV P	                  WRV4      '       g   Rp MRpK#  	  V'       g   \        4       # V# )rj   rp   FT)rM   rr   rA   r~   r   )rO   rd   r   r   re   r   s   &&    r   rj   &FanoutAlgorithm.find_decref_candidates  s}    

+222s;<[
((2E--=   3 5L  r   )r   r   rM   rL   N)F)
   )__name__
__module____qualname____firstlineno__rQ   rU   rN   rT   rb   rk   r~   rt   r   r   rj   __static_attributes____classdictcell__)__classdict__s   @r   rJ   rJ      sB     <.	"&P'+,>! !r   rJ   c            
      |   \        4       w  rp\        4       pV F6  pVP                  VR V R2RP                  W,          4      ,           R7       K8  	  VP	                  4        F  w  rEV F  pVP                  WF4       K  	  K!  	  VP                  4        \        WRR7      pVP                  4       pW(8X  g   Q hR# )rect
z\l)shapelabelT)rP   N)	r>   r   r}   joinrB   edgeviewrJ   rU   )	r   r   r   r   r}   childrenr   algorc   s	            r   
check_oncer   +  s    #XE( 		A	t6D6uzz%+7N)NO ++-EFF4  ( FFH56D
((*C??r   c                  4   \        \        4       P                  4       4       Fg  w  rV P                  R 4      '       g   K  \	        V P                  ^PR4      4       V! 4       w  r#p\        W#4      pVP                  4       pWF8X  d   Kg  Q h	  \	        R4       R# )caserp   z
ALL PASSEDN)r   globalsrB   
startswithrM   rr   rJ   rU   )kfnr   r   r   r   rc   s          r   	check_allr   =  su    gioo'(<<RD..S)*%'T"E("50D((*C?"? ) 
,r   __main__N)__doc__graphvizr   ImportErrorcollectionsr   rl   r   r!   r'   r*   r,   r.   r0   r2   r5   r7   r:   r<   r>   rH   rJ   r   r   r   rX   r   r   <module>r      s   
	  $ 	"6""""""""""""B! B!J$ zK A
  		s   A A('A(