U
    9%e(                     @   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rze8B  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/   [/var/www/html/Darija-Ai-API/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>.TestPipelinezTest 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
