
    .|h5                        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 Z4d Z5e j                  d        Z6d Z7d Z8 G d de2      Z9 G d de2      Z:e;dk(  r e3jx                          yy)    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                 8    d}|}| dkD  r||z   }nd}d|z  }|| k  S )N   r       )bzwx1xyas          [/var/www/html/test/engine/venv/lib/python3.12/site-packages/numba/tests/test_remove_dead.pytest_will_propagater7      s3    	
B
A1uE	AAq5L    c                      y Nr.   )r5   r/   cds       r6   	null_funcr=   )   s    	r8   c                     | S r:   r.   )As    r6   dummy_aliased_funcr@   ,   s    Hr8   c                 N    t        j                  | |d   j                  ||       y Nr   )r   
_add_aliasname)lhs_nameargs	alias_maparg_aliasess       r6   alias_ext_dummy_funcrI   0   s    $q',,	;Gr8   c                     | j                   j                         D ]Y  \  }}t        |j                        D ]<  \  }}t	        |t
        j                        s!|j                  j                  |k(  s;  y [ y)NTF)	blocksitems	enumeratebody
isinstancer   AssigntargetrD   )func_irvarlabelblockiinsts         r6   findLhsAssignrX   3   se    ,,. u , 	GAt$		*t{{/?/?/D	
 r8   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y)TestRemoveDeadFc                 *     t        |dd      |      S )NT)parallelfastmath)r   )selffunc	arg_typess      r6   compile_parallelzTestRemoveDead.compile_parallel?   s    <tIt<TBBr8   c                 h   t         j                  }t         j                  }t        j                  t
              }|j                          |j                          t        j                  t        j                  t        j                  f}t        ||||d       \  }}}}t        |j                         t        |j                  |      \  }}	t        |j                  |t        |j                        ||       t        |j                  |j                   |       | j#                  t%        |d             y )Nr3   )r	   typing_contexttarget_contextr   run_frontendr7   refreshr   int64r   r   rK   r
   r   r   r   	arg_namesassertFalserX   )
r^   	typingctx	targetctxtest_irrF   typemap_	calltypesin_cpsout_cpss
             r6   test1zTestRemoveDead.test1B   s    --	--	''(;<U[[%++6#7	9gW[]a#b IqGNN#(AW^^V5G5WY`bklGNNG$5$5w?w45r8   c                     d }d }t        j                  |      }t        |j                  |j                  |       | j                   ||             y )Nc                  B    t         j                  j                  d       y Nr-   )nprandomseedr.   r8   r6   call_np_random_seedz1TestRemoveDead.test2.<locals>.call_np_random_seedS   s    IINN1r8   c                 \   | j                   d   j                  D ]  }t        |t        j                        st        |j
                  t        j                        sC|j
                  j                  dk(  s]| j                  |j
                  j                        j                  dk(  s y y)Nr   callrx   TF)rK   rN   rO   r   rP   valueExpropget_definitionr_   attr)rR   rW   s     r6   seed_call_existsz.TestRemoveDead.test2.<locals>.seed_call_existsV   sy    q)..  tRYY/tzz2773JJMMV+**4::??;@@FJ  r8   )r   re   r   rK   rh   
assertTrue)r^   ry   r   rl   s       r6   test2zTestRemoveDead.test2R   sG    		 ''(;<GNNG$5$5w?(12r8   c                 J   t        j                  d      j                  dd      }|j                         }d}| j	                  |t        j                  |      t        j                  |      f      } |||        |||       t         j                  j                  ||       y )N   r-   r,   r   )	rv   arangereshapecopyra   numbatypeoftestingassert_array_equal)r^   r_   A1A2rV   pfuncs         r6   run_array_index_testz#TestRemoveDead.run_array_index_testc   sz    YYq\!!!A&WWY%%dU\\"-=u||A,OPRb!


%%b"-r8   c                 ,    d }| j                  |       y )Nc                 .    | j                         }d||<   y Nr,   )ravelr?   rV   Bs      r6   r_   z-TestRemoveDead.test_alias_ravel.<locals>.funcn   s    	AAaDr8   r   r^   r_   s     r6   test_alias_ravelzTestRemoveDead.test_alias_ravelm       	 	!!$'r8   c                 ,    d }| j                  |       y )Nc                 &    | j                   }d||<   y r   )flatr   s      r6   r_   z,TestRemoveDead.test_alias_flat.<locals>.funcu   s    AAaDr8   r   r   s     r6   test_alias_flatzTestRemoveDead.test_alias_flatt   r   r8   c                 ,    d }| j                  |       y )Nc                 *    | j                   }d||df<   y Nr,   r   )Tr   s      r6   r_   z2TestRemoveDead.test_alias_transpose1.<locals>.func|   s    AAacFr8   r   r   s     r6   test_alias_transpose1z$TestRemoveDead.test_alias_transpose1{       	 	!!$'r8   c                 ,    d }| j                  |       y )Nc                 2    | j                         }d||df<   y r   )	transposer   s      r6   r_   z2TestRemoveDead.test_alias_transpose2.<locals>.func   s    AAacFr8   r   r   s     r6   test_alias_transpose2z$TestRemoveDead.test_alias_transpose2   r   r8   c                 ,    d }| j                  |       y )Nc                 <    t        j                  |       }d||df<   y r   )rv   r   r   s      r6   r_   z2TestRemoveDead.test_alias_transpose3.<locals>.func   s    QAAacFr8   r   r   s     r6   test_alias_transpose3z$TestRemoveDead.test_alias_transpose3   r   r8   c                    ddl m}  |       j                  t        j                        fd}t
        d d  }t        j                  |       fd}t        j                  d      }|j                         }	 | j                  |t        j                  |      f      } t        j                  |      |        ||       |t
        d d  | j                  |d   |d          y # |t
        d d  w xY w)Nr   )_BLASc                 H    |gk(  r| j                   d   j                  |vS y)N   F)rF   rD   )rhslives	call_listxxnrm2s      r6   remove_dead_xxnrm2z<TestRemoveDead.test_alias_ctypes.<locals>.remove_dead_xxnrm2   s)    VH$xx{''u44r8   c                 p    t        j                  d      } dd|j                  d| j                         y )Nr   d      )rv   onesctypes)retr5   r   s     r6   r_   z.TestRemoveDead.test_alias_ctypes.<locals>.func   s(    
A3188Q

3r8   r   )numba.np.linalgr   numba_xxnrm2r   float64r   appendrv   zerosr   ra   r   r   r   assertEqual)	r^   r   r   old_remove_handlersr_   r   r   r   r   s	           @r6   test_alias_ctypesz TestRemoveDead.test_alias_ctypes   s     	*%%emm4	 315##$67	4 XXa[WWY	:))$b1A0CDEEJJtR "I ': #A1& ': #s   :A	C% %C0c                 ,    d }| j                  |       y )Nc                 >    t        j                  | d      }d||df<   y )N)r,   r-   r,   r   )rv   r   r   s      r6   r_   z0TestRemoveDead.test_alias_reshape1.<locals>.func   s    

1e$AAacFr8   r   r   s     r6   test_alias_reshape1z"TestRemoveDead.test_alias_reshape1   r   r8   c                 ,    d }| j                  |       y )Nc                 6    | j                  dd      }d||df<   y )Nr,   r-   r   )r   r   s      r6   r_   z0TestRemoveDead.test_alias_reshape2.<locals>.func   s    		!AAAacFr8   r   r   s     r6   test_alias_reshape2z"TestRemoveDead.test_alias_reshape2   r   r8   c                     d }t        j                         }	 t        t         d<   | j                  |       |t        _         y # |t        _         w xY w)Nc                 (    t        |       }d||df<   y r   )r@   r   s      r6   r_   z0TestRemoveDead.test_alias_func_ext.<locals>.func   s    "1%AAadGr8   )r@   znumba.tests.test_remove_dead)r   r   rI   r   r   )r^   r_   old_ext_handlerss      r6   test_alias_func_extz"TestRemoveDead.test_alias_func_ext   sQ    	
 1557	>3G " #0 1%%d+ .>H*-=H*s   A Ac                 h    d }| j                   |        t        j                  |                    y)zimake sure lhs variable of assignment is considered live if used in
        rhs (test for #6715).
        c                  b    t        d      D ]   }  d |       }t        j                  |      }" S )Nr,   c                     | S r:   r.   )js    r6   <lambda>zDTestRemoveDead.test_rm_dead_rhs_vars.<locals>.func.<locals>.<lambda>   s    q r8   )rangerv   array)rV   r5   s     r6   r_   z2TestRemoveDead.test_rm_dead_rhs_vars.<locals>.func   s3    1X   !$HHQK  Hr8   N)r   r   r   r   s     r6   test_rm_dead_rhs_varsz$TestRemoveDead.test_rm_dead_rhs_vars   s*    	 	!1D!1!34r8   c                 
   d }t        dd       G d dt                     } G d dt        j                        }  t	        j
                  |	      |             } |       }t        j                  j                  ||       y
)zWMake sure aliases are considered in remove dead extension for
        parfors.
        c                      d} t         j                  j                  j                          t	        j
                  |       }|}t        j                  |       D ]  }|||<   	 |S )N   )r   parforsparforinit_prangerv   emptyprange)nr?   r   rV   s       r6   r_   z8TestRemoveDead.test_alias_parfor_extension.<locals>.func   sV    AMM  ,,.AA\\!_ ! Hr8   FT)analysis_onlymutates_CFGc                       e Zd ZdZd Zd Zy)ATestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParforlimited_parforc                 .    t        j                  |        y r:   )r   __init__)r^   s    r6   r   zJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.__init__   s    %%d+r8   c                 b   t         j                  j                  j                  |j                  |j
                  |j                  |j                  |j                  |j                  j                  |j                  |j                  |j                  	      }t        |j                  j                         |j                  j!                  |j                  j                         |j#                  |j                  j                         t%        |j                  j                  |j                  j&                  |j                  |j
                         t         j                  j                  j)                  |j                  j                  |j*                  j,                  |j.                         y)NT)r   r   r   r#   rR   rm   ro   return_typerj   flagsauto_parallelmetadataparfor_diagnosticsr   rK   array_analysisrun_convert_loopr   rh   get_parfor_paramsoptionsfusionnested_fusion_info)r^   stateparfor_passs      r6   run_passzJTestRemoveDead.test_alias_parfor_extension.<locals>.LimitedParfor.run_pass   s"   #mm22==MMMMOO%%OOKK--KKNN,,
 EMM001**..u}}/C/CD))%--*>*>?EMM00!MM33!MM!MM+ $$66u}}7K7K0;0C0C0J0J0;0N0NP r8   N)__name__
__module____qualname___namer   r   r.   r8   r6   LimitedParforr      s    $E,r8   r   c                       e Zd ZdZd Zy)@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                 f   d}t        |      }|j                  t        d       |j                  t        d       |j                  t        d       |j                  t
        d       | j                  j                  j                  sB|j                  t        d       |j                  t        d       |j                  t        d       |j                  t        d	       |j                  t        d
       |j                  t        d       |j                  t        d       |j!                          |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)r^   rD   pms      r6   define_pipelineszQTestRemoveDead.test_alias_parfor_extension.<locals>.TestPipeline.define_pipelines  s    - &-/CDI}5L/:K)?@zz''33KK1DEKK 8:VWKK1FG.FH 13FG N,=>O-DEtr8   N)r   r   r   __doc__r  r.   r8   r6   TestPipeliner   	  s    r8   r  )pipeline_classN)	r   r   r   Compilerr   r   rv   r   r   )r^   r_   r   r  test_respy_ress         r6   test_alias_parfor_extensionz*TestRemoveDead.test_alias_parfor_extension   st    
	 
U	=	L 	 
>	<	8,, 	8 @9599L9$?A


%%h7r8   N)r   r   r   _numba_parallel_test_ra   rr   r   r   r   r   r   r   r   r(   r)   r   r   r   r   r   r  r.   r8   r6   rZ   rZ   ;   s}    !C6 3".((((( '  '@((>
5 K8 K8r8   rZ   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestSSADeadBranchPrunez?
    Test issues that required dead-branch-prune on SSA IR
    c                     t         dd       }t         dd       }| j                   |dd        |dd              | j                   |dd       |dd             y )Nc                     || |z   S | }| |z   S r:   r.   )r3   r4   s     r6   fooz3TestSSADeadBranchPrune.test_issue_9706.<locals>.foo/  s    }1u1ur8   c                     || |z   S | }| |z   S r:   r.   )r3   r4   y_s      r6   foo_manual_ssaz>TestSSADeadBranchPrune.test_issue_9706.<locals>.foo_manual_ssa7  s     }1u 2vr8   r,   
   r:   )r   r   )r^   r  r  s      r6   test_issue_9706z&TestSSADeadBranchPrune.test_issue_9706.  sd    		 
	 
	 
	 	Q~a'>?Q^Ar%:;r8   c                 r   t         dd       } |t        j                  g d            }t        j                  dd      } |t        j                  g d      |      }| j	                  ||       | j                  ||       d } |t        j                  g d      |      }| j                  ||       y )Nc                     | j                   \  }|t        j                  |      }n t        j                  d|k  ||k  z        sJ ||d d  |S rB   )shaperv   r   all)xsoutNs      r6   fz1TestSSADeadBranchPrune.test_issue_6541.<locals>.fD  sL    BA{iilvvqCxC!G4555CFJr8   )r,   r   r-   r,   i8)dtype)r  r:   )r   rv   r   r   assertIsassertPreciseEqual)r^   r  expectedr  gots        r6   test_issue_6541z&TestSSADeadBranchPrune.test_issue_6541C  s    		 
	 RXXi()ii&#-c3X.#-X.r8   c                    t         dd       }| j                   |dd              t        dt        j                  d      t        j
                  d            }| j                   |di | |j                  di |       y )Nc                 F    |y t        |      dk(  r|S | |kD  }||   }||z  S rB   )len)smthweightsdefaultidxs       r6   computez7TestSSADeadBranchPrune.test_issue_7482.<locals>.computeX  s8    7|q .CclGW$$r8   r   )r&  r'     )r&  r'  r(  )g        r.   )r   assertIsNonedictrv   r   r   r   py_func)r^   r*  kwargss      r6   test_issue_7482z&TestSSADeadBranchPrune.test_issue_7482W  sr    	
	% 

	% 	'q$781biilBHHQKH*6*(262	4r8   c                     t         dd       }g d}|D ]$  }| j                   ||  |j                  |        & t         fd}| j                   |        |d              y )Nc                 2    |d}| |z   S || k  r|dz  }| |z   S Nr   r.   )r5   r/   s     r6   r  z3TestSSADeadBranchPrune.test_issue_5661.<locals>.fook  s2    y q5L QQq5Lr8   ))r   r-   )r-   r   )r   c                 6    | d        | fd       } |       S )Nc                     | d} | S | dz  } | S )Nr   r   r.   )r   s    r6   innerzCTestSSADeadBranchPrune.test_issue_5661.<locals>.make.<locals>.inner  s#    =E  QJEr8   c                  <    d } t        d      D ]
  } |       }  | S )Nr  )r   )r   rV   r6  s     r6   fnz@TestSSADeadBranchPrune.test_issue_5661.<locals>.make.<locals>.fn  s)    r )A!%LE)r8   r.   )decorr8  r6  s     @r6   makez4TestSSADeadBranchPrune.test_issue_5661.<locals>.make~  s2        4Kr8   c                     | S r:   r.   )r3   s    r6   r   z8TestSSADeadBranchPrune.test_issue_5661.<locals>.<lambda>  s     r8   r:   )r   r   r.  )r^   r  	args_listrF   r:  s        r6   test_issue_5661z&TestSSADeadBranchPrune.test_issue_5661j  sn    		 
	
	
  	=DS$Zd);<	=
  	$ 	k!23r8   c                 p    dt         fd       }| j                   |       |j                                y )N    c                  L    dz  } g }| r|j                  |        | dz  } | r|S ru   r   )conditionalcollectCONSTs     r6   r  z3TestSSADeadBranchPrune.test_issue_9742.<locals>.foo  s8      1*KG{+!  Nr8   r   r   r.  r^   r  rD  s     @r6   test_issue_9742z&TestSSADeadBranchPrune.test_issue_9742  s4    			 
		 	.r8   c                 p    dt         fd       }| j                   |       |j                                y )Nr?  c                  <    g } dz   }|r| j                  |       | S r3  rA  )rC  r3   rD  s     r6   r  z;TestSSADeadBranchPrune.test_issue_9742_variant.<locals>.foo  s'    G 	Aq!Nr8   rE  rF  s     @r6   test_issue_9742_variantz.TestSSADeadBranchPrune.test_issue_9742_variant  s4    		 
	 	.r8   N)
r   r   r   r  r  r"  r0  r=  rG  rJ  r.   r8   r6   r  r  *  s&    <*/(4&&4P/"/r8   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'   numpyrv   numba.tests.supportr(   r)   r*   unittestr7   r=   r@   rI   rX   rZ   r  r   mainr.   r8   r6   <module>rW     s        + + *I I I 9 R RJ J J
L L L  N N 
  Hl8X l8^F/X F/R zHMMO r8   