U
    +d!                     @   s   d Z zddlmZ W n ek
r(   Y nX ddlmZ dZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  ZG d!d" d"Zd#d$ Zd%d& Zed'kre  d(S ))zc
Contains tests and a prototype implementation for the fanout algorithm in
the LLVM refprune pass.
    )Digraph)defaultdictAc                  C   s   dgddgg ddgdgg ddgddgd	d
gddgg dgdddgdgdgg d} t t}dg|d< dg|d< ddg|d< dddhi}|| |fS )NBCDEFGHIJKLMZOP)r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   increfdecrefr   listedgesnodesexpected r   A/tmp/pip-unpacked-wheel-stw2luzp/llvmlite/tests/refprune_proto.pycase1   s.    

r   c                  C   sJ   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   r   r   r   case22   s    


r    c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r	   r   r   appendr   r   _r   r   r   r   case3@   s    r%   c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r   r   r!   r#   r   r   r   case4H   s    r&   c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r   r   r!   r#   r   r   r   case5P   s    r'   c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r   r   r!   r#   r   r   r   case6X   s    r(   c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r   r   r!   r#   r   r   r   case7`   s    r)   c                  C   sB   ddgdgg d} t t}dg|d< dg|d< ddhi}|| |fS r   r   r   r   r   r   case8h   s    


r*   c                  C   s,   t  \} }}|d d dd i}| ||fS )Nr   r   r   r*   r"   r#   r   r   r   case9u   s    r,   c                  C   s.   t  \} }}|d d ddhi}| ||fS )Nr   r   r+   r#   r   r   r   case10}   s    
r-   c                  C   s6   t  \} }}|d d g |d< ddhi}| ||fS Nr   r   r   r+   r#   r   r   r   case11   s
    
r/   c                  C   s8   t  \} }}|d d dg|d< ddhi}| ||fS r.   r+   r#   r   r   r   case12   s
    

r0   c                  C   s6   t  \} }}|d d dg|d< dd i}| ||fS )Nr   r   r   r   r+   r#   r   r   r   case13   s
    
r1   c                 C   s6   t t}|  D ] \}}|D ]}|| | qq|S N)r   setitemsadd)r   dsrcZ	outgoingsdstr   r   r   make_predecessor_map   s
    r9   c                   @   sh   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdddZdd ZdS )FanoutAlgorithmFc                 C   s*   || _ || _t|| _|rtn| j| _d S r2   )r   r   r9   	rev_edgesprint_null_print)selfr   r   verboser   r   r   __init__   s    
zFanoutAlgorithm.__init__c                 C   s   |   S r2   )find_fanout_in_function)r>   r   r   r   run   s    zFanoutAlgorithm.runc                 O   s   d S r2   r   )r>   argskwargsr   r   r   r=      s    zFanoutAlgorithm._null_printc                 C   sP   i }| j D ]@}dd | j| D D ]&}| |}| d|d| |||< q"q
|S )Nc                 s   s   | ]}|d kr|V  qdS )r   Nr   ).0xr   r   r   	<genexpr>   s      z:FanoutAlgorithm.find_fanout_in_function.<locals>.<genexpr>z>>z===)r   r   find_fanoutr<   )r>   gotcur_noder   decref_blocksr   r   r   rA      s    

z'FanoutAlgorithm.find_fanout_in_functionc                 C   s:   |  |}| d| |sd S | j||tds2d S t|S )N
candidates)entry)find_decref_candidatesr<   verify_non_overlappingENTRYr3   )r>   	head_noderK   r   r   r   rH      s    
  zFanoutAlgorithm.find_fanoutc           	      C   s   |  ddd t|}|r| }t }|g}~|r| }|  d|d| ||krZq4||krr|  d| dS || |  d| d	| |  | |D ].}||kr|  d
  dS ||kr|| qq4qdS )NrO   P   -rJ   |z%!! failed because we arrived at entryFz   z preds z.!! reject because predecessor in decref_blocksT)r<   centerr   popr3   r5   get_predecessorsr"   )	r>   rQ   rK   rM   todorJ   visitedZ	workstackpredr   r   r   rO      s>     
z&FanoutAlgorithm.verify_non_overlappingc                 C   s   t | j| S r2   )tupler   r>   noder   r   r   get_successors   s    zFanoutAlgorithm.get_successorsc                 C   s   t | j| S r2   )r[   r;   r\   r   r   r   rW      s    z FanoutAlgorithm.get_predecessorsc                 C   s   d| j | kS )Nr   )r   r\   r   r   r   
has_decref   s    zFanoutAlgorithm.has_decref
   c                 C   s   dt | }| |d|| |dkr(dS ||krD||d kr@dS dS | |rh|| | |d dS |d8 }||f7 }d}| |D ] }| |||sd} qqd}q| |d|  |S )	N walkr   FTzfound decref   zret )lenr<   r_   r5   r^   walk_child_for_decref)r>   rJ   
path_stackrK   depthindentfoundchildr   r   r   re      s4    


  z%FanoutAlgorithm.walk_child_for_decrefc                 C   s`   |  ddd |f}d}t }| |D ] }| |||sHd} qNq,d}q,|sXt S |S d S )NrN   rR   rS   FT)r<   rU   r3   r^   re   )r>   rJ   rf   ri   rK   rj   r   r   r   rN     s       z&FanoutAlgorithm.find_decref_candidatesN)F)r`   )__name__
__module____qualname__r@   rB   r=   rA   rH   rO   r^   rW   r_   re   rN   r   r   r   r   r:      s   
	( 
r:   c            	   	   C   s   t  \} }}t }|D ](}|j|d| dd| |  d q| D ]\}}|D ]}||| qTqH|  t| |dd}| }||kst	d S )NZrect
z\l)shapelabelT)r?   )
r1   r   r]   joinr4   Zedgeviewr:   rB   AssertionError)	r   r   r   r
   r]   childrenrj   algorI   r   r   r   
check_once*  s    &rv   c                  C   sj   t t  D ]N\} }| drt| dd | \}}}t||}| }||kstqtd d S )NZcaserR   rS   z
ALL PASSED)	r   globalsr4   
startswithr<   rU   r:   rB   rs   )kfnr   r   r   ru   rI   r   r   r   	check_all<  s    

r{   __main__N)__doc__Zgraphvizr   ImportErrorcollectionsr   rP   r   r    r%   r&   r'   r(   r)   r*   r,   r-   r/   r0   r1   r9   r:   rv   r{   rk   r   r   r   r   <module>   s4   
 