
    ܙd(                        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 Z9d Z:e j;        d             Z<d Z=d Z> G d de8j?                  Z@eAdk    r e8jB                     dS 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                 <    d}|}| dk    r||z   }nd}d|z  }|| k     S )N   r       )bzwx1xyas          <lib/python3.11/site-packages/numba/tests/test_remove_dead.pytest_will_propagater:       s7    	
B
A1uuE	AAq5L    c                     d S Nr1   )r8   r2   cds       r9   	null_funcr@   *   s    	Er;   c                     | S r=   r1   )As    r9   dummy_aliased_funcrC   -   s    Hr;   c                 J    t          j        | |d         j        ||           d S )Nr   )r   
_add_aliasname)lhs_nameargs	alias_maparg_aliasess       r9   alias_ext_dummy_funcrK   1   s%    $q',	;GGGGGr;   c                     | j                                         D ]M\  }}t          |j                  D ]3\  }}t	          |t
          j                  r|j        j        |k    r  dS 4NdS )NTF)	blocksitems	enumeratebody
isinstancer	   AssigntargetrF   )func_irvarlabelblockiinsts         r9   findLhsAssignrZ   4   sy    ,,..  u ,, 	 	GAt$	** t{/?/D/Dttt	 5r;   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zeed                         Zd Zd Zd Zd Zed             ZdS )TestRemoveDeadFc                     t                      }t          j        d          |_        d|_        t          j        d          |_        t          |||          j        S )NT)flags)	r   r   ParallelOptionsauto_parallelnrtFastMathOptionsfastmathr   entry_point)selffunc	arg_typesfast_pflagss       r9   compile_parallelzTestRemoveDead.compile_parallel@   sP    gg$'$7$=$=!"2488i{CCCOOr;   c                    t          j                    }t          j        |          }t	          j        t                    }t          j        ||          5  |	                                 |	                                 t          j        t          j        t          j        f}t          ||||d           \  }}}}t          |j                   t          |j        |          \  }}	t!          |j        |t#          |j                  ||           t%          |j        |j        |           |                     t+          |d                     d d d            d S # 1 swxY w Y   d S )Nr6   )r   Contextr   
CPUContextr   run_frontendr:   r   nested_contextrefreshr   int64r   r   rM   r   r   r   r   	arg_namesassertFalserZ   )
re   	typingctx	targetctxtest_irrH   typemap_	calltypesin_cpsout_cpss
             r9   test1zTestRemoveDead.test1G   s|   N$$	N9--	'(;<<&y)<< 
	: 
	:Kek:D';IyRY[_ae'f'f$GQ	1''',W^WEEOFG 9KGN9[9[]dfoppp(97CCC]7C88999
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	: 
	:s   C8EE"Ec                     d }d }t          j        |          }t          |j        |j        |           |                      ||                     d S )Nc                  D    t           j                            d           d S )Nr0   )nprandomseedr1   r;   r9   call_np_random_seedz1TestRemoveDead.test2.<locals>.call_np_random_seedX   s    INN1r;   c                    | j         d         j        D ]v}t          |t          j                  rZt          |j        t          j                  r;|j        j        dk    r+|                     |j        j	                  j
        dk    r dS wdS )Nr   callr   TF)rM   rP   rQ   r	   rR   valueExpropget_definitionrf   attr)rT   rY   s     r9   seed_call_existsz.TestRemoveDead.test2.<locals>.seed_call_exists[   s    q).    tRY//  tz2733 JMV++**4:?;;@FJJ445r;   )r   rm   r   rM   rq   
assertTrue)re   r   r   ru   s       r9   test2zTestRemoveDead.test2W   sn    	 	 		 	 	 '(;<<GNG$5w???((1122222r;   c                 j   t          j        d                              dd          }|                                }d}|                     |t          j        |          t          j        |          f          } |||            |||           t           j                            ||           d S )N   r0   r/   r   )	r~   arangereshapecopyri   numbatypeoftestingassert_array_equal)re   rf   A1A2rX   pfuncs         r9   run_array_index_testz#TestRemoveDead.run_array_index_testh   s    Yq\\!!!A&&WWYY%%dU\"-=-=u|A,OPPRb!

%%b"-----r;   c                 6    d }|                      |           d S )Nc                 8    |                                  }d||<   d S Nr/   )ravelrB   rX   Bs      r9   rf   z-TestRemoveDead.test_alias_ravel.<locals>.funcs   s    		AAaDDDr;   r   re   rf   s     r9   test_alias_ravelzTestRemoveDead.test_alias_ravelr   -    	 	 	 	!!$'''''r;   c                 6    d }|                      |           d S )Nc                     | j         }d||<   d S r   )flatr   s      r9   rf   z,TestRemoveDead.test_alias_flat.<locals>.funcz   s    AAaDDDr;   r   r   s     r9   test_alias_flatzTestRemoveDead.test_alias_flaty   r   r;   c                 6    d }|                      |           d S )Nc                 "    | j         }d||df<   d S Nr/   r   )Tr   s      r9   rf   z2TestRemoveDead.test_alias_transpose1.<locals>.func   s    AAacFFFr;   r   r   s     r9   test_alias_transpose1z$TestRemoveDead.test_alias_transpose1   -    	 	 	 	!!$'''''r;   c                 6    d }|                      |           d S )Nc                 <    |                                  }d||df<   d S r   )	transposer   s      r9   rf   z2TestRemoveDead.test_alias_transpose2.<locals>.func   s     AAacFFFr;   r   r   s     r9   test_alias_transpose2z$TestRemoveDead.test_alias_transpose2   r   r;   c                 6    d }|                      |           d S )Nc                 <    t          j        |           }d||df<   d S r   )r~   r   r   s      r9   rf   z2TestRemoveDead.test_alias_transpose3.<locals>.func   s     QAAacFFFr;   r   r   s     r9   test_alias_transpose3z$TestRemoveDead.test_alias_transpose3   r   r;   c                 0   ddl m}  |                                t          j                  fd}t
          d d          }t          j        |           fd}t          j        d          }|	                                }	 | 
                    |t          j        |          f          } t          j        |          |            ||           |t
          d d <   n# |t
          d d <   w xY w|                     |d         |d                    d S )Nr   )_BLASc                 >    |gk    r| j         d         j        |vS dS )N   F)rH   rF   )rhslives	call_listxxnrm2s      r9   remove_dead_xxnrm2z<TestRemoveDead.test_alias_ctypes.<locals>.remove_dead_xxnrm2   s)    VH$$x{'u445r;   c                 b    t          j        d          } dd|j        d| j                   d S )Nr   d      )r~   onesctypes)retr8   r   s     r9   rf   z.TestRemoveDead.test_alias_ctypes.<locals>.func   s2    

AF318Q
33333r;   r   )numba.np.linalgr   numba_xxnrm2r   float64r   appendr~   zerosr   ri   r   r   njitassertEqual)	re   r   r   old_remove_handlersrf   r   r   r   r   s	           @r9   test_alias_ctypesz TestRemoveDead.test_alias_ctypes   sE    	*)))))%%em44	 	 	 	 	 31115#$6777	4 	4 	4 	4 	4 Xa[[WWYY	:))$b1A1A0CDDEEJtR   E"III ': ##&9 #9999A1&&&&&s   AC# #C1c                 6    d }|                      |           d S )Nc                 >    t          j        | d          }d||df<   d S )N)r/   r0   r/   r   )r~   r   r   s      r9   rf   z0TestRemoveDead.test_alias_reshape1.<locals>.func   s$    
1e$$AAacFFFr;   r   r   s     r9   test_alias_reshape1z"TestRemoveDead.test_alias_reshape1   r   r;   c                 6    d }|                      |           d S )Nc                 @    |                      dd          }d||df<   d S )Nr/   r0   r   )r   r   s      r9   rf   z0TestRemoveDead.test_alias_reshape2.<locals>.func   s$    		!AAAacFFFr;   r   r   s     r9   test_alias_reshape2z"TestRemoveDead.test_alias_reshape2   r   r;   c                     d }t          j                    }	 t          t           d<   |                     |           |t          _         d S # |t          _         w xY w)Nc                 2    t          |           }d||df<   d S r   )rC   r   s      r9   rf   z0TestRemoveDead.test_alias_func_ext.<locals>.func   s     "1%%AAadGGGr;   )rC   znumba.tests.test_remove_dead)r   r   rK   r   r   )re   rf   old_ext_handlerss      r9   test_alias_func_extz"TestRemoveDead.test_alias_func_ext   sr    	 	 	
 1577	>3G " #0 1%%d+++ .>H***-=H*====s   $A
 
Ac                 |    d }|                       |             t          j        |                                 dS )zimake sure lhs variable of assignment is considered live if used in
        rhs (test for #6715).
        c                  j    t          d          D ]"}  d |           }t          j        |          }#|S )Nr/   c                     | S r=   r1   )js    r9   <lambda>zDTestRemoveDead.test_rm_dead_rhs_vars.<locals>.func.<locals>.<lambda>   s    q r;   )ranger~   array)rX   r8   s     r9   rf   z2TestRemoveDead.test_rm_dead_rhs_vars.<locals>.func   s<    1XX     [[!$$HQKKHr;   N)r   r   r   r   s     r9   test_rm_dead_rhs_varsz$TestRemoveDead.test_rm_dead_rhs_vars   sH    	 	 	 	!1D!1!1!3!344444r;   c                 0   d }t          dd           G d dt                                } G d dt          j                  }  t	          j        |	          |                      } |            }t          j                            ||           d
S )zWMake sure aliases are considered in remove dead extension for
        parfors.
        c                      d} t           j        j                                         t	          j        |           }|}t          j        |           D ]}|||<   |S )N   )r   parforsparforinit_pranger~   emptyprange)nrB   r   rX   s       r9   rf   z8TestRemoveDead.test_alias_parfor_extension.<locals>.func   sW    AM ,,...AA\!__  !Hr;   FT)analysis_onlymutates_CFGc                       e Zd ZdZd Zd ZdS )ATestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParforlimited_parforc                 .    t          j        |            d S r=   )r   __init__)re   s    r9   r   zJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.__init__   s    %d+++++r;   c                 X   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'   rT   rv   rx   return_typers   r^   r`   metadataparfor_diagnosticsr   rM   array_analysisrun_convert_loopr   rq   get_parfor_paramsoptionsfusionnested_fusion_info)re   stateparfor_passs      r9   run_passzJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.run_pass   s   #m2==MMO%OK-KN,
 
 EM0111*..u}/CDDD))%-*>???EM0!M3!M!M+ + + $66u}7K0;0C0J0;0NP P P tr;   N)__name__
__module____qualname___namer   r   r1   r;   r9   LimitedParforr      s7        $E, , ,    r;   r   c                       e Zd ZdZd ZdS )@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                    d}t          |          }|                    t          d           |                    t          d           |                    t          d           |                    t
          d           | j        j        j        sQ|                    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)re   rF   pms      r9   define_pipelineszQTestRemoveDead.test_alias_parfor_extension.<locals>.TestPipeline.define_pipelines  s/   - &&-/CDDDI}555L/:::K)?@@@z'3 HKK1DEEEKK 8:VWWWKK1FGGG.FH H H 13FGGG N,=>>>O-DEEEtr;   N)r   r   r   __doc__r  r1   r;   r9   TestPipeliner    s-             r;   r
  )pipeline_classN)	r   r   r   Compilerr   jitr~   r   r   )re   rf   r   r
  test_respy_ress         r9   test_alias_parfor_extensionz*TestRemoveDead.test_alias_parfor_extension   s    
	 	 	 
U	=	=	=	 	 	 	 	L 	 	 
>	=	<	 	 	 	 	8, 	 	 	8 @959L999$??AA

%%h77777r;   N)r   r   r   _numba_parallel_test_ri   r{   r   r   r   r   r   r   r   r,   r-   r   r   r   r   r   r  r1   r;   r9   r\   r\   <   s(       !P P P: : : 3 3 3". . .( ( (( ( (( ( (( ( (( ( ( ' ' Z '@( ( (( ( (> > >
5 
5 
5 K8 K8 K8 K8 K8r;   r\   __main__)Cr   numba.parfors.parfor
numba.corer   r   numba.core.compilerr   r   r   r   r	   r
   r   numba.core.registryr   numba.core.annotationsr   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+   numpyr~   numba.tests.supportr,   r-   unittestr:   r@   r   rC   rK   rZ   TestCaser\   r   mainr1   r;   r9   <module>r!     s?        $ $ $ $ $ $ $ $ 7 7 7 7 7 7 7 7 : : : : : : : : : : : : : : * * * * * * 3 3 3 3 3 3I I I I I I I I I I I I I I I I I I 9 8 8 8 8 8 R R R R R R R R R RJ J J J J J J J J J J J J J J J J J J J J J J J
L L L L L L L L L L L L L L L L L L L L L L L L     D D D D D D D D   
 
 
   H H H  p8 p8 p8 p8 p8X& p8 p8 p8f zHMOOOOO r;   