U
    iâËdd  ã                   @   s¸   d dl Z d dlZd dl mZ d dlmZ d dlZd dlmZ	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ ed	d
„ ƒZG dd„ deƒZG dd„ deƒZedkr´e  ¡  dS )é    N)ÚTestCase)Úcontextmanager)Útypes)ÚNumbaInvalidConfigWarning)Úcompile_isolated)Ú_parse_refprune_flags©Úoverride_configc              	   c   s    t d| ƒ� d V  W 5 Q R X d S )NZLLVM_REFPRUNE_FLAGSr   )Úflags© r   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_refop_pruning.pyÚset_refprune_flags   s    r   c                   @   sH   e Zd 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S )ÚTestRefOpPruningFc           
   	   O   s–   t ddƒ� t||˜ƒ}W 5 Q R X |j dd¡}|  |¡ | ¡ D ]N\}}t||dƒ}|  |¡ d|› �}	|r€| j|d|	d� qB| j|d|	d� qBdS )a(  
        Asserts the the func compiled with argument types "argtys" reports
        refop pruning statistics. The **prune_types** kwargs list each kind
        of pruning and whether the stat should be zero (False) or >0 (True).

        Note: The exact statistic varies across platform.
        ZLLVM_REFPRUNE_PASSÚ1Zprune_statsNzfailed checking r   )Úmsg)	r	   r   ÚmetadataÚgetZassertIsNotNoneÚitemsÚgetattrZassertGreaterÚassertEqual)
ÚselfÚfuncZargtysZprune_typesZcresZpstatsÚkÚvÚstatr   r   r   r   Úcheck   s    	


zTestRefOpPruning.checkc                 C   s   dd„ }| j |tjdd� d S )Nc                 S   sL   t  | ¡}d}| dkr0|dd … }||d 7 }n|d d… }||d 7 }|S )Nr   é   é   éÿÿÿÿ©ÚnpÚzeros)ÚnÚaÚaccÚbÚcr   r   r   r   6   s    
z1TestRefOpPruning.test_basic_block_1.<locals>.funcT)Ú
basicblock©r   r   Úintp©r   r   r   r   r   Útest_basic_block_13   s    z#TestRefOpPruning.test_basic_block_1c              	   C   s8   dd„ }t dƒ� | j|tjddddd� W 5 Q R X d S )Nc                 S   s&   t  | ¡}d}| dkr| ¡ }|d S )Nr   é   r   )r    ZonesÚsum)r"   r#   Úxr   r   r   r   E   s
    
z-TestRefOpPruning.test_diamond_1.<locals>.funcúper_bb,diamondTF©r'   ZdiamondÚfanoutZfanout_raise©r   r   r   r)   r*   r   r   r   Útest_diamond_1C   s    
 ÿzTestRefOpPruning.test_diamond_1c              	   C   s8   dd„ }t dƒ� | j|tjddddd� W 5 Q R X d S )Nc                 S   sJ   g }t | ƒD ]}| t |¡¡ qd}|D ]}|| ¡ d|j  7 }q*|S )Nç        r   )ÚrangeÚappendr    Úaranger-   Úsize)r"   ÚconÚir&   Zarrr   r   r   r   S   s    z-TestRefOpPruning.test_diamond_2.<locals>.funcr/   TFr0   r2   r*   r   r   r   Útest_diamond_2Q   s    

 ÿzTestRefOpPruning.test_diamond_2c                 C   s    dd„ }| j |tjddd� d S )Nc                 S   s:   t  | ¡}t  | ¡}||f}d}|D ]}||d 7 }q$|S )Nr4   r   r   )r"   r#   r%   r.   r$   r:   r   r   r   r   c   s    

z,TestRefOpPruning.test_fanout_1.<locals>.funcT)r'   r1   r(   r*   r   r   r   Útest_fanout_1a   s    	zTestRefOpPruning.test_fanout_1c              	   C   s8   dd„ }t dƒ� | j|tjddddd� W 5 Q R X d S )Nc                 S   s2   t  | ¡}t  | ¡}||f}|D ]}| r t‚q |S ©N)r    r!   Ú
ValueError)r"   r#   r%   r.   r:   r   r   r   r   p   s    

z,TestRefOpPruning.test_fanout_2.<locals>.funczper_bb,fanoutTFr0   r2   r*   r   r   r   Útest_fanout_2n   s    	
 ÿzTestRefOpPruning.test_fanout_2c              	   C   s8   dd„ }t dƒ� | j|tjddddd� W 5 Q R X d S )Nc                 S   s.   t  | ¡}d}t  |¡D ]}|| ¡ 7 }qdS )Nr   r   )r    r7   ZnditerÚitem)r"   Zaryr&   r   r   r   r   r      s
    
z,TestRefOpPruning.test_fanout_3.<locals>.funczper_bb,fanout_raiseTFr0   r2   r*   r   r   r   Útest_fanout_3}   s    

 ÿzTestRefOpPruning.test_fanout_3N)Ú__name__Ú
__module__Ú__qualname__Z_numba_parallel_test_r   r+   r3   r;   r<   r?   rA   r   r   r   r   r      s   r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestRefPruneFlagsc                 C   s   t  dt¡ d S )NÚerror)ÚwarningsÚsimplefilterr   ©r   r   r   r   ÚsetUp�   s    zTestRefPruneFlags.setUpc                 C   s   t  ¡  d S r=   )rG   ÚresetwarningsrI   r   r   r   ÚtearDown’   s    zTestRefPruneFlags.tearDownc              
   C   s†   t dƒ�t |  t¡�}tƒ }W 5 Q R X |  t|jƒd¡ |  dt|jd j	ƒ¡ |  dt|jd j	ƒ¡ |  |t
jj¡ W 5 Q R X d S )Nzabc,per_bb,cder,   Úabcr   Zcder   )r   ZassertWarnsr   r   r   ÚlenrG   ZassertInÚstrÚmessageÚllvmÚRefPruneSubpassesÚPER_BB)r   ÚcmÚoptvalr   r   r   Útest_warn_invalid_flags•   s    
z)TestRefPruneFlags.test_warn_invalid_flagsc              	   C   s.   t dƒ� tƒ }|  |tjj¡ W 5 Q R X d S )Nz$per_bb, diamond, fanout,fanout_raise©r   r   r   rQ   rR   ÚALL©r   rU   r   r   r   Útest_valid_flagž   s    
z!TestRefPruneFlags.test_valid_flagc              	   C   s.   t dƒ� tƒ }|  |tjj¡ W 5 Q R X d S )NÚallrW   rY   r   r   r   Útest_the_all_flag£   s    
z#TestRefPruneFlags.test_the_all_flagc              	   C   s8   t dƒ�& tƒ }tj}|  ||j|jB ¡ W 5 Q R X d S )Nzper_bb, fanout)r   r   rQ   rR   r   rS   ZFANOUT)r   rU   Zenumclsr   r   r   Útest_some_flags¨   s    
z!TestRefPruneFlags.test_some_flagsN)	rB   rC   rD   rJ   rL   rV   rZ   r\   r]   r   r   r   r   rE   Ž   s   	rE   Ú__main__)ZunittestrG   r   Ú
contextlibr   Únumpyr    Zllvmlite.bindingZbindingrQ   Znumbar   Znumba.core.errorsr   Znumba.core.compilerr   Znumba.core.codegenr   Znumba.tests.supportr	   r   r   rE   rB   Úmainr   r   r   r   Ú<module>   s    
w!