o
    i>                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZ edd ZG d	d
 d
eZG dd deZedkrTe   dS dS )    N)contextmanager)njittypes)NumbaInvalidConfigWarning)_parse_refprune_flags)override_configTestCasec                 c   s8    t d|  d V  W d    d S 1 sw   Y  d S )NLLVM_REFPRUNE_FLAGS)r   )flags r   \/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/tests/test_refop_pruning.pyset_refprune_flags   s   "r   c                   @   sl   e Zd ZdZdd Zejdd Zejdd Zejdd	 Z	ejd
d Z
ejdd Zejdd ZdS )TestRefOpPruningFc           
      O   s   t dd tg |R |jg |R  }W d   n1 sw   Y  |jdd}| | | D ]4\}}t||d}| | d| }	|r`|dkrW| j|d|	d q4| j	|d|	d q4| j
|d|	d q4dS )	a  
        Asserts 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.

        NOTE: Tests using this `check` method need to run in subprocesses as
        `njit` sets up the module pass manager etc once and the overrides have
        no effect else.
        LLVM_REFPRUNE_PASS1Nprune_statszfailed checking fanout_raiser   )msg)r   r   	overloadsmetadatagetassertIsNotNoneitemsgetattrassertGreaterEqualassertGreaterassertEqual)
selffuncargtysprune_typescres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   sN   t | }d}| dkr|dd  }||d 7 }|S |d d }||d 7 }|S )Nr         npzeros)naaccbcr   r   r   r   <   s   
z1TestRefOpPruning.test_basic_block_1.<locals>.funcT)
basicblockr&   r   intpr   r   r   r   r   test_basic_block_18   s   z#TestRefOpPruning.test_basic_block_1c              	   C   N   dd }t d | j|tjddddd W d    d S 1 s w   Y  d S )Nc                 S   s&   t | }d}| dkr| }|d S )Nr      r(   )r+   onessum)r-   r.   xr   r   r   r   L   s
   
z-TestRefOpPruning.test_diamond_1.<locals>.funcper_bb,diamondTFr2   diamondfanoutr   r   r&   r   r4   r5   r   r   r   test_diamond_1I   s   
"zTestRefOpPruning.test_diamond_1c              	   C   r7   )Nc                 S   sJ   g }t | D ]
}|t| qd}|D ]}|| d|j  7 }q|S )N        r(   )rangeappendr+   aranger:   size)r-   conir1   arrr   r   r   r   [   s   z-TestRefOpPruning.test_diamond_2.<locals>.funcr<   TFr=   r@   r5   r   r   r   test_diamond_2X      

"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 )NrB   r   r*   )r-   r.   r0   r;   r/   rH   r   r   r   r   l   s   

z,TestRefOpPruning.test_fanout_1.<locals>.funcT)r2   r?   r3   r5   r   r   r   test_fanout_1i   s   	zTestRefOpPruning.test_fanout_1c              	   C   sN   dd }t d | j|tjddddd W d    d S 1 s w   Y  d S )Nc                 S   s2   t | }t | }||f}|D ]}| rtq|S N)r+   r,   
ValueError)r-   r.   r0   r;   rH   r   r   r   r   z   s   

z,TestRefOpPruning.test_fanout_2.<locals>.funczper_bb,fanoutTFr=   r@   r5   r   r   r   test_fanout_2w   s   
	"zTestRefOpPruning.test_fanout_2c              	   C   sN   dd }t d | j|tjddddd W d    d S 1 s w   Y  d S )Nc                 S   s.   t | }d}t |D ]}|| 7 }qdS )Nr   r(   )r+   rE   nditeritem)r-   aryr1   r$   r   r   r   r      s
   
z,TestRefOpPruning.test_fanout_3.<locals>.funczper_bb,fanout_raiseTFr=   r@   r5   r   r   r   test_fanout_3   rK   zTestRefOpPruning.test_fanout_3N)__name__
__module____qualname___numba_parallel_test_r&   r   run_test_in_subprocessr6   rA   rJ   rL   rO   rS   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 rM   )r[   resetwarningsr]   r   r   r   tearDown   s   zTestRefPruneFlags.tearDownc              	   C   s   t dJ | t}t }W d    n1 sw   Y  | t|jd | dt|jd j	 | dt|jd j	 | |t
jj W d    d S 1 sQw   Y  d S )Nzabc,per_bb,cder8   abcr   cder(   )r   assertWarnsr   r   r   lenr[   assertInstrmessagellvmRefPruneSubpassesPER_BB)r   cmoptvalr   r   r   test_warn_invalid_flags   s   
"z)TestRefPruneFlags.test_warn_invalid_flagsc                 C   D   t d t }| |tjj W d    d S 1 sw   Y  d S )Nz$per_bb, diamond, fanout,fanout_raiser   r   r   rh   ri   ALLr   rl   r   r   r   test_valid_flag      
"z!TestRefPruneFlags.test_valid_flagc                 C   rn   )Nallro   rq   r   r   r   test_the_all_flag   rs   z#TestRefPruneFlags.test_the_all_flagc                 C   sN   t d t }tj}| ||j|jB  W d    d S 1 s w   Y  d S )Nzper_bb, fanout)r   r   rh   ri   r   rj   FANOUT)r   rl   enumclsr   r   r   test_some_flags   s
   
"z!TestRefPruneFlags.test_some_flagsN)	rT   rU   rV   r^   r`   rm   rr   ru   rx   r   r   r   r   rY      s    	rY   __main__)unittestr[   
contextlibr   numpyr+   llvmlite.bindingbindingrh   numbar   r   numba.core.errorsr   numba.core.codegenr   numba.tests.supportr   r   r   r   rY   rT   mainr   r   r   r   <module>   s"    
 !