
    sKg!                         d Z 	 ddlmZ ddlmZ dZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Z G d d      Zd Zd Zedk(  r e        yy# e$ r Y Ww xY w)zc
Contains tests and a prototype implementation for the fanout algorithm in
the LLVM refprune pass.
    )Digraph)defaultdictAc                      i ddgdddgdg dddgddgdg ddd	gd	ddgdd
dgd
ddgdg ddgdg dddgddgdg } t        t              }dg|d<   dg|d<   ddg|d<   dddhi}|| |fS )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      a/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/llvmlite/tests/refprune_proto.pycase1r      s2   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                  h    ddgdgg d} t        t              }dg|d<   dg|d<   dg|d<   dd i}|| |fS Nr   r   )r   r   r   r   r   r   r   r   s      r   case2r#   2   s[    3ZUE
 EE#JE#JE#JT{H%!!r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r   r	   r   appendr   r   _r   s       r   case3r)   @   7    gOE5!	#JcT{H%!!r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r
   r	   r%   r'   s       r   case4r,   H   r*   r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case5r.   P   r*   r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case6r0   X   r*   r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case7r2   `   r*   r    c                  ^    ddgdgg d} t        t              }dg|d<   dg|d<   ddhi}|| |fS r"   r   r   s      r   case8r4   h   sR    3ZUE
 EE#JE#JcU|H%!!r    c                  X    t               \  } }}|d   j                  d       dd i}| ||fS )Nr   r   r   r4   r&   r'   s       r   case9r7   u   r*   r    c                  Z    t               \  } }}|d   j                  d       ddhi}| ||fS )Nr   r   r6   r'   s       r   case10r9   }   s9    gOE5!	#JccU|H%!!r    c                  d    t               \  } }}|d   j                  d       g |d<   ddhi}| ||fS Nr   r	   r   r6   r'   s       r   case11r<      sB    gOE5!	#JcE#JcU|H%!!r    c                  f    t               \  } }}|d   j                  d       dg|d<   ddhi}| ||fS r;   r6   r'   s       r   case12r>      sD    gOE5!	#JcE#JcU|H%!!r    c                  d    t               \  } }}|d   j                  d       dg|d<   dd i}| ||fS )Nr   r	   r   r   r6   r'   s       r   case13r@      sB    gOE5!	#JcE#JT{H%!!r    c                     t        t              }| j                         D ]   \  }}|D ]  }||   j                  |        " |S N)r   setitemsadd)r   dsrc	outgoingsdsts        r   make_predecessor_maprJ      s@    CA++-YCcFJJsO  ( Hr    c                   T    e Zd ZddZd Zd Zd Zd Zd Zd Z	d Z
d	 Z	 dd
Zd Zy)FanoutAlgorithmc                 ~    || _         || _        t        |      | _        |rt        | _        y | j
                  | _        y rB   )r   r   rJ   	rev_edgesprint_null_print)selfr   r   verboses       r   __init__zFanoutAlgorithm.__init__   s1    

-e4%U
4+;+;
r    c                 "    | j                         S rB   )find_fanout_in_function)rQ   s    r   runzFanoutAlgorithm.run   s    ++--r    c                      y rB    )rQ   argskwargss      r   rP   zFanoutAlgorithm._null_print   s    r    c                     i }| j                   D ]G  }d | j                  |   D        D ],  }| j                  |      }| j                  d|d|       |||<   . I |S )Nc              3   ,   K   | ]  }|d k(  s	|  yw)r   NrX   ).0xs     r   	<genexpr>z:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>   s     L&:a8m1&:s   
z>>z===)r   r   find_fanoutrO   )rQ   gotcur_noder   decref_blockss        r   rU   z'FanoutAlgorithm.find_fanout_in_function   s`    

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

45-@ -H M #
 
r    c                     | j                  |      }| j                  d|       |sy | j                  ||t              sy t	        |      S )N
candidates)entry)find_decref_candidatesrO   verify_non_overlappingENTRYrC   )rQ   	head_noderc   s      r   r`   zFanoutAlgorithm.find_fanout   sP    33I>

</**}E + 
 =!!r    c                 $   | j                  dj                  dd             t        |      }|r|j                         }t	               }|g}~|r|j                         }| j                  d|d|       ||v r+||k(  r| j                  d|       y|j                  |       | j                  d| d	| j                  |              | j                  |      D ]0  }||v r| j                  d
        y||k7  s |j                  |       2 |r|ry)Nrh   P   -rb   |z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)rO   centerr   poprC   rE   get_predecessorsr&   )	rQ   rj   rc   rf   todorb   visited	workstackpreds	            r   rh   z&FanoutAlgorithm.verify_non_overlapping   s   

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

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

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

L  %y(!((. <!  B r    c                 2    t        | j                  |         S rB   )tupler   rQ   nodes     r   get_successorszFanoutAlgorithm.get_successors   s    TZZ%&&r    c                 2    t        | j                  |         S rB   )rw   rN   rx   s     r   rq   z FanoutAlgorithm.get_predecessors   s    T^^D)**r    c                 $    d| j                   |   v S )Nr   )r   rx   s     r   
has_decrefzFanoutAlgorithm.has_decref   s    4::d+++r    c                 ~   dt        |      z  }| j                  |d||       |dk  ry||v r
||d   k(  ryy| j                  |      r$|j                  |       | j                  |d       y|dz  }||fz  }d}| j	                  |      D ]  }| j                  |||      sd} nd} | j                  |d|        |S )	N walkr   FTzfound decref   zret )lenrO   r}   rE   rz   walk_child_for_decref)rQ   rb   
path_stackrc   depthindentfoundchilds           r   r   z%FanoutAlgorithm.walk_child_for_decref   s     s:&

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

6T%>*r    c                     | j                  dj                  dd             |f}d}t               }| j                  |      D ]  }| j	                  |||      sd} nd} |s
t               S |S )Nrg   rl   rm   FT)rO   ro   rC   rz   r   )rQ   rb   r   r   rc   r   s         r   rg   z&FanoutAlgorithm.find_decref_candidates  sz    

+222s;<[
((2E--z=  3 5L  r    N)F)
   )__name__
__module____qualname__rS   rV   rP   rU   r`   rh   rz   rq   r}   r   rg   rX   r    r   rL   rL      s?    <.	"&P'+, :<>!r    rL   c            
      f   t               \  } }}t               }|D ].  }|j                  |d| ddj                  | |         z          0 |j	                         D ]  \  }}|D ]  }|j                  ||          |j                          t        | |d      }|j                         }||k(  sJ y )Nrect
z\l)shapelabelT)rR   )	r@   r   ry   joinrD   edgeviewrL   rV   )	r   r   r   r   ry   childrenr   algora   s	            r   
check_oncer   *  s    #XE5( 		A	t6D6uzz%+7N)NO ++-hEFF4  ( FFH5%6D
((*Cs??r    c                  $   t        t               j                               D ]a  \  } }| j                  d      st	        | j                  dd              |       \  }}}t        ||      }|j                         }||k(  raJ  t	        d       y )Ncaserl   rm   z
ALL PASSED)r   globalsrD   
startswithrO   ro   rL   rV   )kfnr   r   r   r   ra   s          r   	check_allr   <  sz    gioo'(2<<RD..S)*%'T"E5("5%0D((*Cs?"? ) 
,r    __main__N)__doc__graphvizr   ImportErrorcollectionsr   ri   r   r#   r)   r,   r.   r0   r2   r4   r7   r9   r<   r>   r@   rJ   rL   r   r   r   rX   r    r   <module>r      s   
	  $ 	"6""""""
""""""B! B!J$ zK 	  		s   A A"!A"