U
    iâËdü(  ã                   @   s~  d dl Z d dlZ d dlmZmZ d dlmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZmZmZ d d
lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dlm*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m0Z0 d dl3Z4d dl5m6Z6m7Z7 d dl8Z8dd„ Z9dd„ Z:e j;dd„ ƒZ<dd„ Z=dd„ Z>G dd„ de8j?ƒZ@eAdk�rze8 B¡  dS )é    N)Úir_utilsÚcpu)Úcompile_isolatedÚFlags)ÚtypesÚtypingÚirÚconfigÚcompiler)Ú
cpu_target)Útype_annotations)Úcopy_propagateÚapply_copy_propagateÚget_name_var_tableÚremove_delsÚremove_deadÚremove_call_handlersÚalias_func_extensions)Útype_inference_stage)ÚFunctionPassÚregister_passÚPassManager)
ÚExtractByteCodeÚTranslateByteCodeÚ	FixupArgsÚIRProcessingÚDeadBranchPruneÚRewriteSemanticConstantsÚGenericRewritesÚWithLiftingÚ
PreserveIRÚInlineClosureLikes)
ÚNopythonTypeInferenceÚAnnotateTypesÚNopythonRewritesÚPreParforPassÚ
ParforPassÚDumpParforDiagnosticsÚNativeLoweringÚIRLegalizationÚNoPythonBackendr(   )Úskip_parfors_unsupportedÚ
needs_blasc                 C   s.   d}|}| dkr|| }nd}d| }|| k S )Né   r   é   © )ÚbÚzÚwÚx1ÚxÚyÚar/   r/   úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_remove_dead.pyÚtest_will_propagate    s    
r8   c                 C   s   d S ©Nr/   )r6   r0   ÚcÚdr/   r/   r7   Ú	null_func*   s    r<   c                 C   s   | S r9   r/   )ÚAr/   r/   r7   Údummy_aliased_func-   s    r>   c                 C   s   t  | |d j||¡ d S )Nr   )r   Z
_add_aliasÚname)Zlhs_nameÚargsZ	alias_mapZarg_aliasesr/   r/   r7   Úalias_ext_dummy_func1   s    rA   c                 C   sL   | j  ¡ D ]<\}}t|jƒD ](\}}t|tjƒr|jj|kr  dS qq
dS )NTF)	ÚblocksÚitemsÚ	enumerateÚbodyÚ
isinstancer   ÚAssignÚtargetr?   )Úfunc_irÚvarÚlabelÚblockÚiÚinstr/   r/   r7   ÚfindLhsAssign4   s
    rO   c                   @   s”   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d„ Zdd„ Zeedd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZd S )!ÚTestRemoveDeadFc                 C   s4   t ƒ }t d¡|_d|_t d¡|_t|||d�jS )NT)Úflags)	r   r   ZParallelOptionsÚauto_parallelZnrtZFastMathOptionsZfastmathr   Úentry_point)ÚselfÚfuncZ	arg_typesZfast_pflagsr/   r/   r7   Úcompile_parallel@   s
    zTestRemoveDead.compile_parallelc           
   	   C   sÂ   t  ¡ }t |¡}t t¡}t ||¡�� | 	¡  | 	¡  t
jt
jt
jf}t||||d ƒ\}}}}t|jƒ t|j|ƒ\}}	t|j|t|jƒ||ƒ t|j|j|ƒ |  t|dƒ¡ W 5 Q R X d S )Nr4   )r   ÚContextr   Z
CPUContextr
   Úrun_frontendr8   r   Znested_contextÚrefreshr   Zint64r   r   rB   r   r   r   r   Ú	arg_namesZassertFalserO   )
rT   Ú	typingctxZ	targetctxÚtest_irr@   ÚtypemapÚ_Ú	calltypesZin_cpsZout_cpsr/   r/   r7   Útest1G   s    


zTestRemoveDead.test1c                 C   s<   dd„ }dd„ }t  |¡}t|j|j|ƒ |  ||ƒ¡ d S )Nc                   S   s   t j d¡ d S )Nr.   )ÚnpÚrandomÚseedr/   r/   r/   r7   Úcall_np_random_seedX   s    z1TestRemoveDead.test2.<locals>.call_np_random_seedc                 S   sV   | j d jD ]D}t|tjƒrt|jtjƒr|jjdkr|  |jj	¡j
dkr dS qdS )Nr   Úcallrc   TF)rB   rE   rF   r   rG   ÚvalueÚExprÚopZget_definitionrU   Úattr)rI   rN   r/   r/   r7   Úseed_call_exists[   s    ÿ
þýz.TestRemoveDead.test2.<locals>.seed_call_exists)r
   rX   r   rB   rZ   Ú
assertTrue)rT   rd   rj   r\   r/   r/   r7   Útest2W   s
    	
zTestRemoveDead.test2c                 C   s`   t  d¡ dd¡}| ¡ }d}|  |t |¡t |¡f¡}|||ƒ |||ƒ t j ||¡ d S )Né   r.   r-   r   )	ra   ZarangeÚreshapeÚcopyrV   ÚnumbaÚtypeofÚtestingÚassert_array_equal)rT   rU   ÚA1ÚA2rM   Úpfuncr/   r/   r7   Úrun_array_index_testh   s    

z#TestRemoveDead.run_array_index_testc                 C   s   dd„ }|   |¡ d S )Nc                 S   s   |   ¡ }d||< d S ©Nr-   )Zravel©r=   rM   ÚBr/   r/   r7   rU   s   s    z-TestRemoveDead.test_alias_ravel.<locals>.func©rw   ©rT   rU   r/   r/   r7   Útest_alias_ravelr   s    zTestRemoveDead.test_alias_ravelc                 C   s   dd„ }|   |¡ d S )Nc                 S   s   | j }d||< d S rx   )Zflatry   r/   r/   r7   rU   z   s    z,TestRemoveDead.test_alias_flat.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_flaty   s    zTestRemoveDead.test_alias_flatc                 C   s   dd„ }|   |¡ d S )Nc                 S   s   | j }d||df< d S ©Nr-   r   )ÚTry   r/   r/   r7   rU   �   s    z2TestRemoveDead.test_alias_transpose1.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_transpose1€   s    z$TestRemoveDead.test_alias_transpose1c                 C   s   dd„ }|   |¡ d S )Nc                 S   s   |   ¡ }d||df< d S r   )Ú	transposery   r/   r/   r7   rU   ˆ   s    z2TestRemoveDead.test_alias_transpose2.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_transpose2‡   s    z$TestRemoveDead.test_alias_transpose2c                 C   s   dd„ }|   |¡ d S )Nc                 S   s   t  | ¡}d||df< d S r   )ra   r‚   ry   r/   r/   r7   rU   �   s    
z2TestRemoveDead.test_alias_transpose3.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_transpose3Ž   s    z$TestRemoveDead.test_alias_transpose3c              
      s°   ddl m} |ƒ  tj¡‰ ‡ fdd„}td d … }t |¡ ‡ fdd„}t d¡}| 	¡ }z.|  
|t |¡f¡}t |¡|ƒ ||ƒ W 5 |td d …< X |  |d |d ¡ d S )Nr   )Ú_BLASc                    s   |ˆ gkr| j d j|kS dS )Né   F)r@   r?   )ÚrhsZlivesÚ	call_list©Zxxnrm2r/   r7   Úremove_dead_xxnrm2œ   s    
z<TestRemoveDead.test_alias_ctypes.<locals>.remove_dead_xxnrm2c                    s"   t  d¡}ˆ dd|jd| jƒ d S )Nr†   éd   é   )ra   ZonesÚctypes)Úretr6   r‰   r/   r7   rU   ¦   s    
z.TestRemoveDead.test_alias_ctypes.<locals>.funcrŒ   )Znumba.np.linalgr…   Znumba_xxnrm2r   Zfloat64r   Úappendra   Zzerosro   rV   rp   rq   ÚnjitÚassertEqual)rT   r…   rŠ   Zold_remove_handlersrU   rt   ru   rv   r/   r‰   r7   Útest_alias_ctypes•   s    

z TestRemoveDead.test_alias_ctypesc                 C   s   dd„ }|   |¡ d S )Nc                 S   s   t  | d¡}d||df< d S )N)r-   r.   r-   r   )ra   rn   ry   r/   r/   r7   rU   ¸   s    z0TestRemoveDead.test_alias_reshape1.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_reshape1·   s    z"TestRemoveDead.test_alias_reshape1c                 C   s   dd„ }|   |¡ d S )Nc                 S   s   |   dd¡}d||df< d S )Nr-   r.   r   )rn   ry   r/   r/   r7   rU   ¿   s    z0TestRemoveDead.test_alias_reshape2.<locals>.funcr{   r|   r/   r/   r7   Útest_alias_reshape2¾   s    z"TestRemoveDead.test_alias_reshape2c                 C   s4   dd„ }t  ¡ }ztt d< |  |¡ W 5 |t_ X d S )Nc                 S   s   t | ƒ}d||df< d S r   )r>   ry   r/   r/   r7   rU   Æ   s    z0TestRemoveDead.test_alias_func_ext.<locals>.func)r>   znumba.tests.test_remove_dead)r   ro   r   rA   rw   )rT   rU   Zold_ext_handlersr/   r/   r7   Útest_alias_func_extÅ   s    ÿz"TestRemoveDead.test_alias_func_extc                 C   s"   dd„ }|   |ƒ t |¡ƒ ¡ dS )zimake sure lhs variable of assignment is considered live if used in
        rhs (test for #6715).
        c                  S   s(   t dƒD ]} dd„ | ƒ}t |¡}q|S )Nr-   c                 S   s   | S r9   r/   )Újr/   r/   r7   Ú<lambda>Ú   ó    zDTestRemoveDead.test_rm_dead_rhs_vars.<locals>.func.<locals>.<lambda>)Úrangera   Úarray)rM   r6   r/   r/   r7   rU   Ø   s    z2TestRemoveDead.test_rm_dead_rhs_vars.<locals>.funcN)r‘   rp   r�   r|   r/   r/   r7   Útest_rm_dead_rhs_varsÔ   s    z$TestRemoveDead.test_rm_dead_rhs_varsc                 C   s`   dd„ }t ddd�G dd„ dtƒƒ}G dd	„ d	tjƒ}tj|d
�|ƒƒ }|ƒ }tj ||¡ dS )zWMake sure aliases are considered in remove dead extension for
        parfors.
        c                  S   s:   d} t jj ¡  t | ¡}|}t  | ¡D ]}|||< q(|S )Né   )rp   ÚparforsÚparforZinit_prangera   ÚemptyZprange)Únr=   rz   rM   r/   r/   r7   rU   å   s    

z8TestRemoveDead.test_alias_parfor_extension.<locals>.funcFT)Zanalysis_onlyZmutates_CFGc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zATestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParforZlimited_parforc                 S   s   t  | ¡ d S r9   )r   Ú__init__)rT   r/   r/   r7   r¡   ó   s    zJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.__init__c                 S   s–   t jj |j|j|j|j|j|j	j
|j	|j|j¡	}t|jjƒ |j |jj¡ | |jj¡ t|jj|jj|j|jƒ t jj |jj|jj|j¡ dS )NT)rp   r�   rž   r&   rI   r]   r_   Úreturn_typer[   rQ   rR   ÚmetadataZparfor_diagnosticsr   rB   Zarray_analysisÚrunZ_convert_loopr   rZ   Zget_parfor_paramsÚoptionsZfusionZnested_fusion_info)rT   ÚstateZparfor_passr/   r/   r7   Úrun_passö   s0    ÷ýþzJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.run_passN)Ú__name__Ú
__module__Ú__qualname__Ú_namer¡   r§   r/   r/   r/   r7   ÚLimitedParforï   s   r¬   c                   @   s   e Zd ZdZdd„ ZdS )z@TestRemoveDead.test_alias_parfor_extension.<locals>.TestPipelinezÀTest pipeline that just converts prange() to parfor and calls
            remove_dead(). Copy propagation can replace B in the example code
            which this pipeline avoids.
            c                 S   s¨   d}t |ƒ}| td¡ | td¡ | td¡ | td¡ | jjjsj| t	d¡ | t
d¡ | td¡ | td	¡ | td
¡ | td¡ | td¡ | ¡  |gS )Nztest parfor aliasingzanalyzing bytecodezfix up argszprocessing IRzHandle with contextsznopython rewriteszrewrite semantic constantszdead branch pruningz(inline calls to locally defined closuresznopython frontendznative loweringznopython mode backend)r   Zadd_passr   r   r   r   r¦   rQ   Zno_rewritesr   r   r   r!   r"   r(   r*   Úfinalize)rT   r?   Úpmr/   r/   r7   Údefine_pipelines  s$    
ÿzQTestRemoveDead.test_alias_parfor_extension.<locals>.TestPipeline.define_pipelinesN)r¨   r©   rª   Ú__doc__r¯   r/   r/   r/   r7   ÚTestPipeline  s   r±   )Zpipeline_classN)	r   r   r
   ZCompilerrp   Zjitra   rr   rs   )rT   rU   r¬   r±   Ztest_resZpy_resr/   r/   r7   Útest_alias_parfor_extensionà   s    

z*TestRemoveDead.test_alias_parfor_extensionN)r¨   r©   rª   Z_numba_parallel_test_rV   r`   rl   rw   r}   r~   r�   rƒ   r„   r+   r,   r’   r“   r”   r•   r›   r²   r/   r/   r/   r7   rP   <   s&   
 rP   Ú__main__)Crp   Znumba.parfors.parforZ
numba.corer   r   Znumba.core.compilerr   r   r   r   r   r	   r
   Znumba.core.registryr   Znumba.core.annotationsr   Znumba.core.ir_utilsr   r   r   r   r   r   r   Znumba.core.typed_passesr   Znumba.core.compiler_machineryr   r   r   Znumba.core.untyped_passesr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Únumpyra   Znumba.tests.supportr+   r,   Zunittestr8   r<   r�   r>   rA   rO   ZTestCaserP   r¨   Úmainr/   r/   r/   r7   Ú<module>   s0   $00

 t
