o
    i5                     @   sz  d dl Z d dlZ d dl mZmZ d dlmZ d dlmZmZ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)m*Z*m+Z+m,Z,m*Z* d dl-Z.d dl/m0Z0m1Z1m2Z2 d dl3Z3dd Z4dd Z5e jdd Z6dd Z7dd Z8G dd de2Z9G dd de2Z:e;dkre3<  dS dS )    N)njitjit)ir_utils)typesircompiler)
cpu_target)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_blasTestCasec                 C   s.   d}|}| dkr|| }nd}d| }|| k S )N   r       )bzwx1xyar,   r,   Y/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/numba/tests/test_remove_dead.pytest_will_propagate   s   
r5   c                 C   s   d S Nr,   )r3   r-   cdr,   r,   r4   	null_func)   s   r9   c                 C      | S r6   r,   )Ar,   r,   r4   dummy_aliased_func,   s   r<   c                 C   s   t | |d j|| d S Nr   )r   
_add_aliasname)lhs_nameargs	alias_maparg_aliasesr,   r,   r4   alias_ext_dummy_func0   s   rD   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,   r4   findLhsAssign3   s   rR   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   s   t |ddd|S )NT)parallelfastmath)r   )selffunc	arg_typesr,   r,   r4   compile_parallel?   s   zTestRemoveDead.compile_parallelc           
      C   s   t j}t j}tt}|  |  tjtjtjf}t	||||d \}}}}t
|j t|j|\}}	t|j|t|j|| t|j|j| | t|d d S )Nr1   )r   typing_contexttarget_contextr   run_frontendr5   refreshr   int64r   r   rE   r	   r
   r   r   	arg_namesassertFalserR   )
rV   	typingctx	targetctxtest_irrA   typemap_	calltypesin_cpsout_cpsr,   r,   r4   test1B   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,   r4   call_np_random_seedS   s   z1TestRemoveDead.test2.<locals>.call_np_random_seedc                 S   sV   | j d j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   callrm   TF)rE   rH   rI   r   rJ   valueExpropget_definitionrW   attr)rL   rQ   r,   r,   r4   seed_call_existsV   s   z.TestRemoveDead.test2.<locals>.seed_call_exists)r   r\   r   rE   r_   
assertTrue)rV   rn   ru   rc   r,   r,   r4   test2R   s
   
	zTestRemoveDead.test2c                 C   s`   t ddd}| }d}| |t|t|f}||| ||| t j|| d S )N   r+   r*   r   )	rk   arangereshapecopyrY   numbatypeoftestingassert_array_equal)rV   rW   A1A2rP   pfuncr,   r,   r4   run_array_index_testc   s   

z#TestRemoveDead.run_array_index_testc                 C      dd }|  | d S )Nc                 S   s   |   }d||< d S Nr*   )ravelr;   rP   Br,   r,   r4   rW   n   s   z-TestRemoveDead.test_alias_ravel.<locals>.funcr   rV   rW   r,   r,   r4   test_alias_ravelm      zTestRemoveDead.test_alias_ravelc                 C   r   )Nc                 S   s   | j }d||< d S r   )flatr   r,   r,   r4   rW   u   s   z,TestRemoveDead.test_alias_flat.<locals>.funcr   r   r,   r,   r4   test_alias_flatt   r   zTestRemoveDead.test_alias_flatc                 C   r   )Nc                 S   s   | j }d||df< d S Nr*   r   )Tr   r,   r,   r4   rW   |   s   z2TestRemoveDead.test_alias_transpose1.<locals>.funcr   r   r,   r,   r4   test_alias_transpose1{   r   z$TestRemoveDead.test_alias_transpose1c                 C   r   )Nc                 S   s   |   }d||df< d S r   )	transposer   r,   r,   r4   rW         z2TestRemoveDead.test_alias_transpose2.<locals>.funcr   r   r,   r,   r4   test_alias_transpose2   r   z$TestRemoveDead.test_alias_transpose2c                 C   r   )Nc                 S   s   t | }d||df< d S r   )rk   r   r   r,   r,   r4   rW      s   
z2TestRemoveDead.test_alias_transpose3.<locals>.funcr   r   r,   r,   r4   test_alias_transpose3   r   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 |td d < n|td d < w | |d |d  d S )Nr   )_BLASc                    s   | gkr| j d j|vS dS )N   F)rA   r?   )rhslives	call_listxxnrm2r,   r4   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      )rk   onesctypes)retr3   r   r,   r4   rW      s   
z.TestRemoveDead.test_alias_ctypes.<locals>.funcr   )numba.np.linalgr   numba_xxnrm2r   float64r   appendrk   zerosr{   rY   r|   r}   r   assertEqual)rV   r   r   old_remove_handlersrW   r   r   r   r,   r   r4   test_alias_ctypes   s   


z TestRemoveDead.test_alias_ctypesc                 C   r   )Nc                 S   s   t | d}d||df< d S )N)r*   r+   r*   r   )rk   rz   r   r,   r,   r4   rW         z0TestRemoveDead.test_alias_reshape1.<locals>.funcr   r   r,   r,   r4   test_alias_reshape1   r   z"TestRemoveDead.test_alias_reshape1c                 C   r   )Nc                 S   s   |  dd}d||df< d S )Nr*   r+   r   )rz   r   r,   r,   r4   rW      r   z0TestRemoveDead.test_alias_reshape2.<locals>.funcr   r   r,   r,   r4   test_alias_reshape2   r   z"TestRemoveDead.test_alias_reshape2c                 C   s8   dd }t  }ztt d< | | W |t_ d S |t_ w )Nc                 S   s   t | }d||df< d S r   )r<   r   r,   r,   r4   rW      r   z0TestRemoveDead.test_alias_func_ext.<locals>.func)r<   znumba.tests.test_remove_dead)r   r{   rD   r   r   )rV   rW   old_ext_handlersr,   r,   r4   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   r:   r6   r,   )jr,   r,   r4   <lambda>       zDTestRemoveDead.test_rm_dead_rhs_vars.<locals>.func.<locals>.<lambda>)rangerk   array)rP   r3   r,   r,   r4   rW      s   z2TestRemoveDead.test_rm_dead_rhs_vars.<locals>.funcN)r   r|   r   r   r,   r,   r4   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   )r|   parforsparforinit_prangerk   emptyprange)nr;   r   rP   r,   r,   r4   rW      s   

z8TestRemoveDead.test_alias_parfor_extension.<locals>.funcFT)analysis_onlymutates_CFGc                   @   s    e Zd ZdZdd Zdd ZdS )zATestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParforlimited_parforc                 S   s   t |  d S r6   )r   __init__)rV   r,   r,   r4   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)r|   r   r   r"   rL   rd   rf   return_typera   flagsauto_parallelmetadataparfor_diagnosticsr   rE   array_analysisrun_convert_loopr   r_   get_parfor_paramsoptionsfusionnested_fusion_info)rV   stateparfor_passr,   r,   r4   run_pass   s0   zJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.run_passN)__name__
__module____qualname___namer   r   r,   r,   r,   r4   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s5|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   add_passr   r   r   r   r   r   no_rewritesr   r   r   r   r   r$   r&   finalize)rV   r?   pmr,   r,   r4   define_pipelines  s$   
zQTestRemoveDead.test_alias_parfor_extension.<locals>.TestPipeline.define_pipelinesN)r   r   r   __doc__r   r,   r,   r,   r4   TestPipeline	  s    r   )pipeline_classN)	r   r   r   Compilerr|   r   rk   r~   r   )rV   rW   r   r   test_respy_resr,   r,   r4   test_alias_parfor_extension   s   

z*TestRemoveDead.test_alias_parfor_extensionN)r   r   r   _numba_parallel_test_rY   ri   rw   r   r   r   r   r   r   r'   r(   r   r   r   r   r   r   r,   r,   r,   r4   rS   ;   s(    
 rS   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S )TestSSADeadBranchPrunez?
    Test issues that required dead-branch-prune on SSA IR
    c                 C   sP   t ddd}t ddd}| |dd |dd  | |dd|dd d S )Nc                 S   s   |d ur| | S | }| | S r6   r,   )r1   r2   r,   r,   r4   foo/  s   z3TestSSADeadBranchPrune.test_issue_9706.<locals>.fooc                 S   s   |d ur| | S | }| | S r6   r,   )r1   r2   y_r,   r,   r4   foo_manual_ssa7  s   z>TestSSADeadBranchPrune.test_issue_9706.<locals>.foo_manual_ssar*   
   r6   )r   r   )rV   r   r   r,   r,   r4   test_issue_9706.  s   z&TestSSADeadBranchPrune.test_issue_9706c                 C   s   t ddd}|tg d}tjddd}|tg d|d}| || | || d }|tg d|d}| || d S )	Nc                 S   sF   | j \}|d u rt|}ntd|k||k @ sJ ||d d < |S r=   )shaperk   ry   all)xsoutNr,   r,   r4   fD  s   z1TestSSADeadBranchPrune.test_issue_6541.<locals>.f)r*   r   r+   r*   i8)dtype)r   r6   )r   rk   r   ry   assertIsassertPreciseEqual)rV   r   expectedr   gotr,   r,   r4   test_issue_6541C  s   	z&TestSSADeadBranchPrune.test_issue_6541c                 C   s`   t ddd}| |dd d tdtdtdd}| |d	i ||jd	i | d S )
N        c                 S   s4   |d u rd S t |dkr|S | |k}|| }|| S r=   )len)smthweightsdefaultidxr,   r,   r4   computeX  s   z7TestSSADeadBranchPrune.test_issue_7482.<locals>.computer   )r   r      )r   r   r   )r   r,   )r   assertIsNonedictrk   ry   r   r   py_func)rV   r   kwargsr,   r,   r4   test_issue_7482W  s   z&TestSSADeadBranchPrune.test_issue_7482c                 C   s\   t ddd}g d}|D ]}| || |j|  qt fdd}| | |dd  d S )	Nc                 S   s,   |d u r
d}| | S || k r|d7 }| | S Nr   r,   )r3   r-   r,   r,   r4   r   k  s   z3TestSSADeadBranchPrune.test_issue_5661.<locals>.foo))r   r+   )r+   r   )r   c                    s"   | dd  |  fdd}| S )Nc                 S   s   | d u rd} | S | d7 } | S )Nr   r   r,   )r   r,   r,   r4   inner  s
   zCTestSSADeadBranchPrune.test_issue_5661.<locals>.make.<locals>.innerc                     s   d } t dD ]} | } q| S )Nr   )r   )r   rP   r  r,   r4   fn  s   
z@TestSSADeadBranchPrune.test_issue_5661.<locals>.make.<locals>.fnr,   )decorr  r,   r  r4   make~  s
   
z4TestSSADeadBranchPrune.test_issue_5661.<locals>.makec                 S   r:   r6   r,   )r1   r,   r,   r4   r     r   z8TestSSADeadBranchPrune.test_issue_5661.<locals>.<lambda>r6   )r   r   r   )rV   r   	args_listrA   r  r,   r,   r4   test_issue_5661j  s   z&TestSSADeadBranchPrune.test_issue_5661c                    *   d t  fdd}| | |  d S )N    c                     s*    d } g }| r| |  | d } | s|S rj   r   )conditionalcollectCONSTr,   r4   r     s   
z3TestSSADeadBranchPrune.test_issue_9742.<locals>.foor   r   r   rV   r   r,   r  r4   test_issue_9742  s   z&TestSSADeadBranchPrune.test_issue_9742c                    r
  )Nr  c                     s   g }  d }|r|  | | S r  r  )r  r1   r  r,   r4   r     s
   
z;TestSSADeadBranchPrune.test_issue_9742_variant.<locals>.foor  r  r,   r  r4   test_issue_9742_variant  s   	z.TestSSADeadBranchPrune.test_issue_9742_variantN)
r   r   r   r   r   r   r  r	  r  r  r,   r,   r,   r4   r   *  s    (r   __main__)=r|   numba.parfors.parforr   r   
numba.corer   r   r   r   numba.core.registryr   numba.core.ir_utilsr	   r
   r   r   r   r   r   numba.core.typed_passesr   numba.core.compiler_machineryr   r   r   numba.core.untyped_passesr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   numpyrk   numba.tests.supportr'   r(   r)   unittestr5   r9   r<   rD   rR   rS   r   r   mainr,   r,   r,   r4   <module>   s6   $00

 p 
