U
    iâËdñ$  ã                   @   sê   d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZ d
Zede jj e j ¡fgƒG dd„ de!ƒƒZ"G dd„ deƒZ#e$dkræe %¡  dS )é    N)ÚTestCaseÚunittest)Ú
cpu_target)ÚCompilerBaseÚFlags)ÚPassManager)ÚtypesÚirÚbytecodeÚcompilerÚir_utilsÚregistry)ÚExtractByteCodeÚTranslateByteCodeÚ	FixupArgsÚIRProcessing)ÚNopythonTypeInferenceÚtype_inference_stageÚDeadCodeElimination)Újitclassé   Úvalc                   @   s   e Zd Zdd„ ZdS )ÚDummyc                 C   s
   || _ d S ©N)r   )Úselfr   © r   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_ir_utils.pyÚ__init__   s    zDummy.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestIrUtilszA
    Tests ir handling utility functions like find_callname.
    c                 C   sx   dd„ }t  |¡}tj}tj}t|||ddƒ}t ||jd j	d j
|j¡}|  t|tƒopt|ƒdkop|d dk¡ dS )	zGTest matching of an object method (other than Array see #3449)
        c                  S   s   t dgƒ} | j d¡ d S )Né   é   )r   r   Úappend)Údr   r   r   Ú	test_func!   s    
z2TestIrUtils.test_obj_func_match.<locals>.test_funcr   Nr   é   r#   r$   )r   Úrun_frontendr   Útyping_contextÚtarget_contextr   r   Zfind_callnameÚblocksÚbodyÚvalueÚtypemapÚ
assertTrueÚ
isinstanceÚtupleÚlen)r   r&   Ztest_irZ	typingctxZ	targetctxZ
typing_resZmatched_callr   r   r   Útest_obj_func_match   s*    
    ÿ  ÿ
ÿ
þzTestIrUtils.test_obj_func_matchc           	         s¤   G dd„ dt ƒ}‡ fdd„}‡ fdd„}dd„ }| tjf¡}| |¡}||ƒ}| tjf¡}|j|d	d
�}||ƒ ˆ  t|jd jƒt|ƒ t|jd jƒ¡ d S )Nc                   @   s0   e Zd Zeddi dddfdd„ƒZddd„ZdS )z6TestIrUtils.test_dead_code_elimination.<locals>.TesterNc                 S   sD   |s
t ƒ }d|_|d kr tjj}|d kr0tjj}| |||||||ƒS )NT)r   Znrtr   r   r)   r*   )ÚclsÚargsÚreturn_typeÚflagsÚlocalsZlibraryr)   r*   r   r   r   Úmk_pipeline4   s    
  ÿzBTestIrUtils.test_dead_code_elimination.<locals>.Tester.mk_pipelineFc                 S   s�   t j |¡}|| j_tƒ  | j¡ | j}d}t|ƒ}| t	d¡ | t
d¡ | td¡ | td¡ |dkrx| td¡ | ¡  | |¡ |jS )z7
                Compile and return IR
                ZDCE_testingzanalyzing bytecodezfix up argszprocessing IRznopython frontendTzDCE after typing)r
   ZFunctionIdentityÚfrom_functionÚstateÚfunc_idr   Zrun_passr   Zadd_passr   r   r   r   r   ÚfinalizeÚrunÚfunc_ir)r   ÚfuncÚDCEr<   r;   ÚnameÚpmr   r   r   Úcompile_to_irB   s    
zDTestIrUtils.test_dead_code_elimination.<locals>.Tester.compile_to_ir)F)r   r   r    Úclassmethodr9   rD   r   r   r   r   ÚTester2   s    þrF   c                    s¨   ˆ   t| jƒd¡ | jd }g }| tj¡D ]4}tt|dd ƒtjƒr,dt|j	ddƒkr,| 
|¡ q,ˆ   t|ƒd¡ |D ],}|  |j¡}ˆ  td|j	j d	ƒ|j¡ qv|S )
Nr"   r   ÚtargetÚdeadrB   Ú r#   z0x%sé   )ÚassertEqualr2   r+   Ú
find_instsr	   ÚAssignr0   ÚgetattrÚVarrG   r$   Zget_definitionr-   r/   ÚintrB   )Úthe_irÚblockÚdeadsÚxr%   Z	const_val©r   r   r   Úcheck_initial_irW   s    
ÿz@TestIrUtils.test_dead_code_elimination.<locals>.check_initial_irc                    s´   ˆ   t| jƒd¡ | jd }g }g }| tj¡D ]R}tt|dd ƒtjƒrddt|j	ddƒkrd| 
|¡ tt|dd ƒtjƒr0| 
|¡ q0ˆ   t|ƒd¡ |D ]}ˆ  |jjdk¡ q˜d S )	Nr"   r   rG   rH   rB   rI   r-   )é­Þ  ì   ­^[= )rK   r2   r+   rL   r	   rM   r0   rN   rO   rG   r$   ZConstr/   r-   )rQ   rR   rS   ZconstsrT   rU   r   r   Úcheck_dce_irp   s    

z<TestIrUtils.test_dead_code_elimination.<locals>.check_dce_irc                 S   s$   | d }d}|d }d}|| }|S )Nr"   rW   r#   rX   r   )rT   ÚyrH   ÚzZdeaddeadÚretr   r   r   Úfoo‚   s    z3TestIrUtils.test_dead_code_elimination.<locals>.fooT)rA   r   )	r   r9   r   ÚintprD   rK   r2   r+   r,   )	r   rF   rV   rY   r]   Ztest_pipelineZno_dceÚremovedZw_dcer   rU   r   Útest_dead_code_elimination0   s    %
ÿz&TestIrUtils.test_dead_code_eliminationc                    s¨   d‰ ‡ fdd„}t  |¡}|jd }d}d}|jD ]X}t|tjƒr`|jjdkr`t	 
t	j||j¡}t|tjƒr2|jjdkr2t	 
t	j||j¡}q2|  |t¡ |  |ˆ ¡ dS )z–
        Test find_const() for values in globals (ir.Global) and freevars
        (ir.FreeVar) that are considered constants for compilation.
        é   c                    s   t }ˆ }| | | S r   )ÚGLOBAL_B)ÚaÚbÚc©Z	FREEVAR_Cr   r   r]   �   s    z/TestIrUtils.test_find_const_global.<locals>.foor   Nrd   re   )r   r(   r+   r,   r0   r	   rM   rG   rB   r   ÚguardZ
find_constrK   rb   )r   r]   Zf_irrR   Zconst_bZconst_cÚinstr   rf   r   Útest_find_const_global–   s*    


  ÿ  ÿz"TestIrUtils.test_find_const_globalc                    sX   dd„ }dd„ }dd„ }‡ fdd„}||ƒ}||ƒ}||ƒ}ˆ   ||¡ ˆ  ||¡ d	S )
z tests flatten_labels c                 S   s‚   d}| dkr"|d7 }| dkrndS nL| dk rf| dkr:|d7 }t dƒD ]}|d8 }|d	k rB qnqB|d
7 }ntdƒ‚d}d	}d}d}|S )Nr   é   r"   é   é5   éè  ra   é
   r#   r'   úsome stringé   ©ÚrangeÚ
ValueError©rc   ÚaccrT   Úpy310_defeat1Úpy310_defeat2Úpy310_defeat3Úpy310_defeat4r   r   r   r]   ´   s&    
z,TestIrUtils.test_flatten_labels.<locals>.fooc                 S   s®   d}d}| dkr6|d7 }|d7 }| dkrš|d7 }dS nd| dk r’| dkrV|d7 }|d7 }t dƒD ] }|d7 }|d8 }|d	k r^ qšq^|d7 }|d
7 }ntdƒ‚d}d	}d}d}|S )Nr   ra   rj   r"   rk   rl   rm   rn   r#   r'   ro   rp   rq   )rc   ru   r[   rT   rv   rw   rx   ry   r   r   r   ÚbarÌ   s2    
z,TestIrUtils.test_flatten_labels.<locals>.barc                 S   s†   d}| dkr&|d7 }| dkr dS dS nL| dk rj| dkr>|d7 }t d	ƒD ]}|d8 }|d
k rF qrqF|d7 }ntdƒ‚d}d
}d}d}|S )Nr   rj   r"   rk   rl   é7   rm   ra   rn   r#   r'   ro   rp   rq   rt   r   r   r   Úbazé   s(    
z,TestIrUtils.test_flatten_labels.<locals>.bazc                    sB   t  | tƒ ¡}t  |j¡}ˆ  t| ¡ ƒd t|jƒ¡ t  	|¡S )Nr"   )
r   Zcompile_to_numba_irÚdictZflatten_labelsr+   rK   ÚmaxÚkeysr2   Zcompute_cfg_from_blocks)r@   r?   Zflat_blocksrU   r   r   Úget_flat_cfg  s    z5TestIrUtils.test_flatten_labels.<locals>.get_flat_cfgN)rK   ZassertNotEqual)r   r]   rz   r|   r€   Zfoo_cfgZbar_cfgZbaz_cfgr   rU   r   Útest_flatten_labels²   s    zTestIrUtils.test_flatten_labelsN)r   r   r    Ú__doc__r3   r`   ri   r�   r   r   r   r   r!      s
   fr!   Ú__main__)&ZnumbaZnumba.tests.supportr   r   Znumba.core.registryr   Znumba.core.compilerr   r   Znumba.core.compiler_machineryr   Z
numba.corer   r	   r
   r   r   r   Znumba.core.untyped_passesr   r   r   r   Znumba.core.typed_passesr   r   r   Znumba.experimentalr   rb   ÚcoreÚListr^   Úobjectr   r!   r   Úmainr   r   r   r   Ú<module>   s     y