
    J/Ph!                         d Z 	 ddlmZ n# e$ r Y nw xY w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             dS dS )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      ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/llvmlite/tests/refprune_proto.pycase1r      s9   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                  r    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   sc    3ZU E
 EE#JE#JE#JT{H%!!r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r   r	   r   appendr   r   _r   s       r   case3r)   @   ?    ggOE5!	#JcT{H%!!r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r
   r	   r%   r'   s       r   case4r,   H   r*   r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case5r.   P   r*   r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case6r0   X   r*   r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r   r	   r%   r'   s       r   case7r2   `   r*   r    c                  h    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   sZ    3ZU E
 EE#JE#JcU|H%!!r    c                  n    t                      \  } }}|d                             d           dd i}| ||fS )Nr   r   r   r4   r&   r'   s       r   case9r7   u   r*   r    c                  p    t                      \  } }}|d                             d           ddhi}| ||fS )Nr   r   r6   r'   s       r   case10r9   }   sA    ggOE5!	#JccU|H%!!r    c                  z    t                      \  } }}|d                             d           g |d<   ddhi}| ||fS Nr   r	   r   r6   r'   s       r   case11r<      sJ    ggOE5!	#JcE#JcU|H%!!r    c                  |    t                      \  } }}|d                             d           dg|d<   ddhi}| ||fS r;   r6   r'   s       r   case12r>      sL    ggOE5!	#JcE#JcU|H%!!r    c                  z    t                      \  } }}|d                             d           dg|d<   dd i}| ||fS )Nr   r	   r   r   r6   r'   s       r   case13r@      sJ    ggOE5!	#JcE#JT{H%!!r    c                     t          t                    }|                                 D ]%\  }}|D ]}||                             |           &|S N)r   setitemsadd)r   dsrc	outgoingsdsts        r   make_predecessor_maprJ      sX    CA++--  Y 	 	CcFJJsOOOO	Hr    c                   V    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dS )FanoutAlgorithmFc                 t    || _         || _        t          |          | _        |rt          n| j        | _        d S rB   )r   r   rJ   	rev_edgesprint_null_print)selfr   r   verboses       r   __init__zFanoutAlgorithm.__init__   s6    

-e44%;UU4+;


r    c                 *    |                                  S rB   )find_fanout_in_function)rQ   s    r   runzFanoutAlgorithm.run   s    ++---r    c                     d S rB    )rQ   argskwargss      r   rP   zFanoutAlgorithm._null_print   s    r    c                     i }| j         D ]N}d | j        |         D             D ]4}|                     |          }|                     d|d|           |||<   5O|S )Nc              3   &   K   | ]}|d k    |V  dS )r   NrX   ).0xs     r   	<genexpr>z:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>   s&      LLa8mm1mmmmLLr    z>>z===)r   r   find_fanoutrO   )rQ   gotcur_noder   decref_blockss        r   rU   z'FanoutAlgorithm.find_fanout_in_function   s~    
 	. 	.HLLdj&:LLL . . $ 0 0 : :

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

</// 	4**}E + 
 
 	 4=!!!r    c                    |                      d                    dd                     t          |          }|r|                                }t	                      }|g}~|r|                                }|                      d|d|           ||v r3||k    r|                      d|           dS |                    |           |                      d| d	|                     |                      |                     |          D ]9}||v r|                      d
            dS ||k    r|                    |           :||dS )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"" 	/xxzzHeeG!
I /$==??

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

L(LL4+@+@+J+JLL   !11(;; 	/ 	/D},,

L    %uuy((!((...3  /  	/B tr    c                 6    t          | j        |                   S rB   )tupler   rQ   nodes     r   get_successorszFanoutAlgorithm.get_successors   s    TZ%&&&r    c                 6    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  }|                     |d||           |dk    rdS ||v r||d         k    rdS dS |                     |          r-|                    |           |                     |d           dS |dz  }||fz  }d}|                     |          D ]}|                     |||          sd} nd} |                     |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88A::5z!!:a=((u4??8$$ 	h'''JJv~...4
xk!
((22 	 	E--z=   

6>%>>***r    c                    |                      d                    dd                     |f}d}t                      }|                     |          D ]}|                     |||          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  s    

+222s;;<<<[
((22 	 	E--z=    	!55L  r    N)F)r~   )__name__
__module____qualname__rS   rV   rP   rU   r`   rh   rz   rq   r}   r   rg   rX   r    r   rL   rL      s        < < < <. . .    	" 	" 	"& & &P' ' '+ + +, , , :<   >! ! ! ! !r    rL   c            
         t                      \  } }}t                      }|D ]9}|                    |d| dd                    | |                   z              :|                                D ] \  }}|D ]}|                    ||           !|                                 t          | |d          }|                                }||k    sJ d S )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    #XXE5( 			A P P	t6Duzz%+7N7N)NOOOO++--    h 	  	 EFF4	  FFHHH5%666D
((**Cs??????r    c                  p   t          t                                                                D ]x\  } }|                     d          r^t	          |                     dd                      |            \  }}}t          ||          }|                                }||k    sJ yt	          d           d S )Ncaserl   rm   z
ALL PASSED)r   globalsrD   
startswithrO   ro   rL   rV   )kfnr   r   r   r   ra   s          r   	check_allr   <  s    giioo''(( # #2<< 	#R'..S))***%'RTT"E5("5%0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   
	        	 	 	D	 # # # # # # 	" " "6" " "" " "" " "" " "" " "" " "
" 
" 
"" " "" " "" " "" " "" " "  B! B! B! B! B! B! B! B!J  $   zIKKKKK s    