o
    8ήc|                     @   sL  d dl Z d dlZd dlZd dlmZmZmZ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 d dlmZ d dlmZ d dlmZmZ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&m'Z'm(Z( da)e Z*de*_+dd Z,G dd deeZ-G dd de-eZ.G dd de-eZ/G dd deeZ0G dd de-Z1dS )    N)compile_isolatedrun_frontendFlags	StateDict)jitnjitliteral_unroll)typeserrorsirrewritesir_utilsutilscpu)postproc)InlineClosureCallPass)TestCaseMemoryLeakMixinSerialMixinIRPreservingTestPipeline)dead_branch_prunerewrite_semantic_constants)ReconstructSSATranslateByteCodeIRProcessingDeadBranchPrune
PreserveIR)DefaultPassBuilderCompilerBasePassManager{   Tc                 C   s>   t | }t }||_d |_d |_t | tj	d| |S )Nzbefore-inference)
r   r   func_irtypemap	calltypesr   run_passr   rewrite_registryapply)funcr!   state r)   @/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_analysis.pycompile_to_ir   s   r+   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )TestBranchPruneBasez
    Tests branch pruning
    Fc                 C   s:   g }|j  D ]}dd |jtjdD }|| q|S )Nc                 S      g | ]}|qS r)   r)   .0_r)   r)   r*   
<listcomp>1       z5TestBranchPruneBase.find_branches.<locals>.<listcomp>)cls)blocksvalues
find_instsr   Branchextend)selfthe_irbranchesblktmpr)   r)   r*   find_branches.   s
   z!TestBranchPruneBase.find_branchesc              
   O   s8  t |}| }| jrtd td |  t|td}|  t	
|}	|	  t|| | jr@td td |  t|| |}
| jrRtd |  | |}| t|t| g }t|D ]7\}}|| }|du rz||j qg|du r||j qg|d u rqg|dkr||j ||j qgJ d	td
d |j D }tdd |
j D }z| ||t|  W n# ty } ztdt| tdt| tdt| |d }~ww |dd}|rd|ini }t||fi |}|d u r| }| }n	|j| }|| }| || d S )NP================================================================================zbefore inlineFbefore pruneafter pruneTbothr   unreachablec                 S   r-   r)   r)   r.   r)   r)   r*   r1   u   r2   z4TestBranchPruneBase.assert_prune.<locals>.<listcomp>c                 S   r-   r)   r)   r.   r)   r)   r*   r1   v   r2   
new_labelsoriginal_labelsexpect_removedflags)r+   copy_DEBUGprintdumpr   r   ParallelOptionsrunr   PostProcessorr   r   r>   assertEquallen	enumerateappendtruebrfalsebrsetr4   keysAssertionErrorsortedpopr   entry_point)r9   r'   args_tyspruneargskwargsr!   beforeinline_pass	post_procafterbefore_branchesrF   idxbranchrE   rD   esupplied_flagscompiler_kwscresresexpectedr)   r)   r*   assert_prune5   sr   





z TestBranchPruneBase.assert_pruneN)__name__
__module____qualname____doc__rI   r>   rl   r)   r)   r)   r*   r,   '   s
    r,   c                   @   s   e 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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d%d& Zd'd( Zd)d* Zd+S ),TestBranchPrunec                 C   s8  dd }|  |tdfdgd  dd }|  |tdfdgd  dd }|  |tdfdgd  |  |tdfdgd d	d }|  |tdfdgd  |  |tdfd gd d
d }|  |tdfdgd  |  |tdfd gd dd }|  |tdfdgd  |  |tdfdgd d S )Nc                 S   s   ddkrdS d S )N   r   n!	@r)   xr)   r)   r*   impl      z,TestBranchPrune.test_single_if.<locals>.implnoneTc                 S   s   ddkrdS d S )Nrr   rs   r)   rt   r)   r)   r*   rv      rw   Fc                 S   s   | d u rdS d S Nrs   r)   rt   r)   r)   r*   rv      rw   
   c                 S      | dkrdS d S Nrz   rs   r)   rt   r)   r)   r*   rv      rw   c                 S   s   | dkrd}d S d S r|   r)   )ru   zr)   r)   r*   rv      s   c                 S   s   d }|}| |kr
dS d S )Nd   r)   )ru   r}   yr)   r)   r*   rv      s
   rl   r	   NoneTypeIntegerLiteralr9   rv   r)   r)   r*   test_single_if   s    zTestBranchPrune.test_single_ifc                 C   s@   dd }|  |tdfdgd  |  |tdfdgd d S )Nc                 S      | d u rdS dS Nrs   l&ls?r)   rt   r)   r)   r*   rv         z1TestBranchPrune.test_single_if_else.<locals>.implrx   Frz   Tr   r   r)   r)   r*   test_single_if_else   s   z#TestBranchPrune.test_single_if_elsec                 C   s|   dd }|  |tdfdgd  |  |tdfd gd dd }|  |tdfdgd  |  |tdfd gd d S )Nc                 S   r{   Nr~   rs   r)   rt   r)   r)   r*   rv      rw   z6TestBranchPrune.test_single_if_const_val.<locals>.implrx   Tr~   c                 S   s   d| krdS d S r   r)   rt   r)   r)   r*   rv      s   r   r   r)   r)   r*   test_single_if_const_val   s   z(TestBranchPrune.test_single_if_const_valc                 C   s   dd }|  |tdfd d gdd |  |tdfd dgd d  |  |tdtdfdgdd  |  |tdtdfd gdd d S )	Nc                 S   s   | |krdS dS r   r)   )ru   r   r)   r)   r*   rv      r   z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implr~      rx   FT  )rl   r	   r   r   r   r)   r)   r*   !test_single_if_else_two_const_val   s"   z1TestBranchPrune.test_single_if_else_two_const_valc                 C   s   dd }|  |tdfdd gd  |  |tdfdd gd dd }tjdkr8|  |tdfdd gd  n|  |tdfd d gd  |  |tdfdd gd d S )	Nc                 S   s*   d}| d u r	d}nd}|rd}|S d}|S )NFT   rz   r)   )ru   x_is_none_workdeadr   r)   r)   r*   rv      s   zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implrx   Frz   Tc                 S   s(   d}| d u r	d}n	 |rd}|S d}|S )NFTrz   r   r)   )ru   r   r   r)   r)   r*   rv      s   )   rz   )rl   r	   r   r   r   	PYVERSIONr   r)   r)   r*   ,test_single_if_else_w_following_undetermined   s   
 z<TestBranchPrune.test_single_if_else_w_following_undeterminedc                 C   sD   dd }|  |tdfdd gd  |  |tdfdd gd d S )Nc                 S   s:   d}d}| d u rd}nd}||krd}||fS d}||fS )Nr~      r   rz   r   r)   )ru   one_hundredr   r   r   r)   r)   r*   rv     s   z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implrx   Frz   Tr   r   r)   r)   r*   test_double_if_else_rt_const  s    z,TestBranchPrune.test_double_if_else_rt_constc                 C   s@   dd }|  |tdfd gd |  |tdfd gd d S )Nc                 S   s   d}| |kr
d}|S d}|S )Nr~   rs   r   r)   )ru   r   r   r)   r)   r*   rv   (  s   zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implrz   r~   rl   r	   r   r   r)   r)   r*   %test_double_if_else_non_literal_const&  s   	z5TestBranchPrune.test_double_if_else_non_literal_constc                 C   sD   dd }|  |tdfddgd  |  |tdfddgd d S )Nc                 S   2   | d u rd}nd}| d urd}||fS d}||fS Nrz   (   r~     r)   ru   r   r}   r)   r)   r*   rv   6     z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implrx   FTrz   r   r   r)   r)   r*   "test_single_two_branches_same_cond4  s    z2TestBranchPrune.test_single_two_branches_same_condc                 C   sb   ddd}|  |td fddgd  |  |tdfddgd  |  |tdfddgd d S )Nc                 S   r   r   r)   r   r)   r)   r*   rv   H  r   z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTrx   rz   N)rl   r	   Omittedr   r   r   r)   r)   r*   test_cond_is_kwarg_noneF  s   
 z'TestBranchPrune.test_cond_is_kwarg_nonec                 C   s~   ddd}|  |tdfd d gd |  |tdfd d gd |  |tdfd d gd |  |tdfddgd  d S )	Nr   c                 S   s2   | dkrd}nd}| dkrd}||fS d}||fS )Nr   rz   r   r~   r   r)   r   r)   r)   r*   rv   \  r   z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   rx   TF)r   )rl   r	   r   r   r   r   r)   r)   r*   test_cond_is_kwarg_valueZ  s   
 z(TestBranchPrune.test_cond_is_kwarg_valuec                    s@   dd } fdd}||t dfd ||t dfd d S )	Nc                 S   r   )Nrz      r)   rt   r)   r)   r*   fnr  s   z8TestBranchPrune.test_cond_rewrite_is_correct.<locals>.fnc           
         s   t | } |} t|d |d j}t||} |jd |jd }t||} |jd  j	rDt
d t
d |  t||  j	rXt
d t
d |  t||}	 t|	tj  |	j| d S )Nrr   r   callbinopr?   r@   rA   )r+   r>   rO   rP   condr   get_definitionopr]   rI   rJ   rK   r   
assertTrue
isinstancer   Constvalue)
r'   arg_tysbit_valr!   rc   pred_var	pred_defncondition_varcondition_opnew_condition_defnr9   r)   r*   checkw  s*   



z;TestBranchPrune.test_cond_rewrite_is_correct.<locals>.checkrx   rr   rz   r   )r	   r   r   )r9   r   r   r)   r   r*   test_cond_rewrite_is_correcto  s    z,TestBranchPrune.test_cond_rewrite_is_correctc                 C   s   t dd }| |tddd | |tdd t  | |tdddg  | |tddd g  | |j d S )Nc                 S   s    | j dkr|d u rt S dS g S )Nrr   r   )ndimdictabr)   r)   r*   bug  s
   
z3TestBranchPrune.test_obj_mode_fallback.<locals>.bugrz   r   r   )r      )	r   rO   npzerosaranger   reshapeassertFalsenopython_signatures)r9   r   r)   r)   r*   test_obj_mode_fallback  s   
z&TestBranchPrune.test_obj_mode_fallbackc                 C   s^   dd }|  |tdfdgd t}zdadd }|  |tdfdgd W |ad S |aw )Nc                 S      t dkr| S | d S Nr    rz   _GLOBALrt   r)   r)   r*   rv        z1TestBranchPrune.test_global_bake_in.<locals>.implrr   Fr   c                 S   r   r   r   rt   r)   r)   r*   rv     r   T)rl   r	   r   r   )r9   rv   r=   r)   r)   r*   test_global_bake_in  s   z#TestBranchPrune.test_global_bake_inc                    sX   d  fdd}|  |tdfdgd d  fdd}|  |tdfdgd d S )	Nr    c                        dkr| S | d S r   r)   rt   _FREEVARr)   r*   rv     r   z2TestBranchPrune.test_freevar_bake_in.<locals>.implrr   Fr   c                    r   r   r)   rt   r   r)   r*   rv     r   Tr   r   r)   r   r*   test_freevar_bake_in  s   z$TestBranchPrune.test_freevar_bake_inc                 C   s@   ddd}|  |ttjddtdfd d gtdd  d S )Nc                 S   s   |d u rd}|dk rdS dS )Nr   rz      r)   )arrayr   r)   r)   r*   rv     s
   zRTestBranchPrune.test_redefined_variables_are_not_considered_in_prune.<locals>.implr   Crx   r   r   r   rl   r	   Arrayfloat64r   r   r   r   r)   r)   r*   4test_redefined_variables_are_not_considered_in_prune  s   

zDTestBranchPrune.test_redefined_variables_are_not_considered_in_prunec                 C   sn   d
dd}|  |ttjddtdfddgtdd  |  |ttjddtjfd d gtdd	 d S )Nc                 S   s    d}|d u rdS |dk rdS |S Nr   rz      r)   )r   r   ru   r)   r)   r*   rv     s   z7TestBranchPrune.test_comparison_operators.<locals>.implr   r   rx   FrB   r   g      (@r   r   r   r)   r)   r*   test_comparison_operators  s   



z)TestBranchPrune.test_comparison_operatorsc                 C   F   d	dd}|  |ttjddtjtdfg dtddd  d S )
Nc                 S   s:   d}|dk rd}|d u rd}nd}|dk rdS d| | S )	Nr   r   r   r      r   rz   r   r)   r   ru   r   r   r)   r)   r*   rv     s   zCTestBranchPrune.test_redefinition_analysis_same_block.<locals>.implr   r   rx   )NFNr         ?r   r   r   r)   r)   r*   %test_redefinition_analysis_same_block  s   
z5TestBranchPrune.test_redefinition_analysis_same_blockc                 C   r   )
Nc                 S   sP   d}|dkrd}|dk rd}|d u r|d7 }d| S |d7 }|dk r$dS d| S )	Nr   r      r   r   r   rz   r   r)   r   r)   r)   r*   rv   "  s   zQTestBranchPrune.test_redefinition_analysis_different_block_can_exec.<locals>.implr   r   rx   )NNNNr   r   r   r   r   r)   r)   r*   3test_redefinition_analysis_different_block_can_exec  s   
zCTestBranchPrune.test_redefinition_analysis_different_block_can_execc                 C   s   d	dd}|  |ttjddtdtdfdd gtdd d  |  |ttjddtdtjfdd gtdd d |  |ttjddtjtdfd d gtddd  d S )
Nc                 S   s8   d}|d urd}|d u r|d7 }d| S |d7 }d| S )Nr   r   r   r   r   r)   r   r)   r)   r*   rv   :  s   zTTestBranchPrune.test_redefinition_analysis_different_block_cannot_exec.<locals>.implr   r   rx   Tr   g333333?NNr   r   r)   r)   r*   6test_redefinition_analysis_different_block_cannot_exec6  s,   

zFTestBranchPrune.test_redefinition_analysis_different_block_cannot_execc                 C   s   dd }|  |ddg d S )Nc                     s&   d  fdd} |    dkrdS dS )Nr   c                      s   d d S Nr   r)   r)   rt   r)   r*   closure\     zRTestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.impl.<locals>.closurer   TFr)   )r   r)   rt   r*   rv   Y  s   zATestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.implr)   F)rl   r   r)   r)   r*   #test_closure_and_nonlocal_can_pruneV  s   z3TestBranchPrune.test_closure_and_nonlocal_can_prunec                 C   s"   dd }|  |tjfd gd d S )Nc                    s(   d  fdd}||   dkrdS dS )Nr   c                    s   |  d S r   r)   )trt   r)   r*   r   o  r   zUTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.impl.<locals>.closurer   TFr)   )nr   r)   rt   r*   rv   l  s   zDTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.implrr   )rl   r	   int64r   r)   r)   r*   &test_closure_and_nonlocal_cannot_prunei  s   z6TestBranchPrune.test_closure_and_nonlocal_cannot_pruneN)rm   rn   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   rq      s,    ,*+ rq   c                   @   s   e Zd 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dd Zdd Zdd Zdd Zdd Zdd  Zd!S )"TestBranchPrunePredicates)rr   StringTg@y              @)r    Fg        y                Nc           
      C   s   |j }dd t|jD }| D ]\}}|||< qtdd t| D }|jg}tjdkr6|	|j
 |	|j ||j|j|j|j||j|j|j|j|j|j|j|jg tj| }	t|	t S )aK  
        This takes a python function, pyfunc, and manipulates its co_const
        __code__ member to create a new function with different co_consts as
        supplied in argument consts.

        consts is a dict {index: value} of co_const tuple index to constant
        value used to update a pyfunc clone's co_const.
        c                 S   s   i | ]\}}||qS r)   r)   )r/   kvr)   r)   r*   
<dictcomp>  s    zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<dictcomp>c                 S   s   g | ]\}}|qS r)   r)   )r/   r0   r   r)   r)   r*   r1         zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<listcomp>)r      )__code__rQ   	co_constsitemstuplerX   co_argcountr   r   rR   co_posonlyargcountco_kwonlyargcountr8   
co_nlocalsco_stacksizeco_flagsco_codeco_namesco_varnamesco_filenameco_nameco_firstlineno	co_lnotabco_freevarsco_cellvarspytypesCodeTypeFunctionTypeglobals)
r9   pyfuncconstspyfunc_coder   r   r   
new_constsco_argsnew_coder)   r)   r*   _literal_const_sample_generator  s2   	


z9TestBranchPrunePredicates._literal_const_sample_generatorc                 C   sf   dd }|  |ddd}|jj}|jj}| |d | |d | |d d | |d d	 d S )
Nc                 S   s   d}|rdS d}|d S NPLACEHOLDER1rs   PLACEHOLDER2r   r)   )ru   _CONST1_CONST2r)   r)   r*   rv     s
   zCTestBranchPrunePredicates.test_literal_const_code_gen.<locals>.implr   r   )rr   r   r  )Nr   rs   r   r   rs      )r  r   r   rO   )r9   rv   newiconstnconstr)   r)   r*   test_literal_const_code_gen  s   z5TestBranchPrunePredicates.test_literal_const_code_genc                 C   ^   dd }| j df| jdffD ]\}}|D ]}| |d|i}| |tdf|gd  qqd S )Nc                 S   s   d}|rdS d S Nr  rs   r)   ru   r  r)   r)   r*   rv        z<TestBranchPrunePredicates.test_single_if_const.<locals>.implFTrr   rx   _TRUTHY_FALSEYr  rl   r	   r   r9   rv   c_inpr\   constr'   r)   r)   r*   test_single_if_const     z.TestBranchPrunePredicates.test_single_if_constc                 C   r  )Nc                 S   s   d}|sdS d S r   r)   r!  r)   r)   r*   rv     r"  zCTestBranchPrunePredicates.test_single_if_negate_const.<locals>.implFTrr   rx   r#  r&  r)   r)   r*   test_single_if_negate_const  r*  z5TestBranchPrunePredicates.test_single_if_negate_constc                 C   r  )Nc                 S   s   d}|rdS dS Nr  rs   r   r)   r!  r)   r)   r*   rv        zATestBranchPrunePredicates.test_single_if_else_const.<locals>.implFTrr   rx   r#  r&  r)   r)   r*   test_single_if_else_const     z3TestBranchPrunePredicates.test_single_if_else_constc                 C   r  )Nc                 S   s   d}|sdS dS r,  r)   r!  r)   r)   r*   rv     r-  zHTestBranchPrunePredicates.test_single_if_else_negate_const.<locals>.implFTrr   rx   r#  r&  r)   r)   r*    test_single_if_else_negate_const  r/  z:TestBranchPrunePredicates.test_single_if_else_negate_constc                    R   | j df| jdffD ]\}}|D ]  fdd}| |tdf|gd  qq
d S )NFTc                    s    rd fS d S ry   r)   rt   r(  r)   r*   r'         z>TestBranchPrunePredicates.test_single_if_freevar.<locals>.funcrx   r$  r%  rl   r	   r   r9   r'  r\   r'   r)   r2  r*   test_single_if_freevar     z0TestBranchPrunePredicates.test_single_if_freevarc                    r1  )NFTc                    s    sd fS d S ry   r)   rt   r2  r)   r*   r'   
  r3  zETestBranchPrunePredicates.test_single_if_negate_freevar.<locals>.funcrx   r4  r5  r)   r2  r*   test_single_if_negate_freevar  r7  z7TestBranchPrunePredicates.test_single_if_negate_freevarc                    r1  )NFTc                    s    rd fS d fS r   r)   rt   r2  r)   r*   r'        zCTestBranchPrunePredicates.test_single_if_else_freevar.<locals>.funcrx   r4  r5  r)   r2  r*   test_single_if_else_freevar     z5TestBranchPrunePredicates.test_single_if_else_freevarc                    r1  )NFTc                    s    sd fS d fS r   r)   rt   r2  r)   r*   r'      r9  zJTestBranchPrunePredicates.test_single_if_else_negate_freevar.<locals>.funcrx   r4  r5  r)   r2  r*   "test_single_if_else_negate_freevar  r;  z<TestBranchPrunePredicates.test_single_if_else_negate_freevarc                 C   R   | j df| jdffD ]\}}|D ]}|add }| |tdf|gd  qq
d S )NFTc                 S      t rdt fS d S ry   )c_test_single_if_globalrt   r)   r)   r*   r'   1  r3  z=TestBranchPrunePredicates.test_single_if_global.<locals>.funcrx   )r$  r%  r?  rl   r	   r   r9   r'  r\   cr'   r)   r)   r*   test_single_if_global*     z/TestBranchPrunePredicates.test_single_if_globalc                 C   r=  )NFTc                 S   r>  ry   )c_test_single_if_negate_globalrt   r)   r)   r*   r'   ?  r3  zDTestBranchPrunePredicates.test_single_if_negate_global.<locals>.funcrx   )r$  r%  rD  rl   r	   r   r@  r)   r)   r*   test_single_if_negate_global8  rC  z6TestBranchPrunePredicates.test_single_if_negate_globalc                 C   r=  )NFTc                 S   s   t rdt fS dt fS r   )c_test_single_if_else_globalrt   r)   r)   r*   r'   M  r9  zBTestBranchPrunePredicates.test_single_if_else_global.<locals>.funcrx   )r$  r%  rF  rl   r	   r   r@  r)   r)   r*   test_single_if_else_globalF     z4TestBranchPrunePredicates.test_single_if_else_globalc                 C   r=  )NFTc                 S   s   t sdt fS dt fS r   )#c_test_single_if_else_negate_globalrt   r)   r)   r*   r'   \  r9  zITestBranchPrunePredicates.test_single_if_else_negate_global.<locals>.funcrx   )r$  r%  rI  rl   r	   r   r@  r)   r)   r*   !test_single_if_else_negate_globalU  rH  z;TestBranchPrunePredicates.test_single_if_else_negate_globalc                 C   s6   t dd }| | d d | | d d d S )Nc                  S   s   t d} d}|r|| d< | S )Nrr   i  r   )r   r   )r5   r=   r)   r)   r*   foof  s
   
z6TestBranchPrunePredicates.test_issue_5618.<locals>.foor   g     Є@)r   assertPreciseEqualpy_func)r9   rK  r)   r)   r*   test_issue_5618d  s   
z)TestBranchPrunePredicates.test_issue_5618N)rm   rn   ro   r$  r%  r  r  r)  r+  r.  r0  r6  r8  r:  r<  rB  rE  rG  rJ  rN  r)   r)   r)   r*   r   }  s$    ,

r   c                   @   s,   e Zd ZG dd deZdd Zdd ZdS )TestBranchPruneSSAc                   @   s   e Zd Zdd ZdS )z$TestBranchPruneSSA.SSAPrunerCompilerc                 C   s   t d}|td |td |td |td |td t}|| j	}|j
|j
 || j	}|j
|j
 |  |gS )Nz
testing pmzanalyzing bytecodezprocessing IRssazdead branch pruningzpreserves the IR as metadata)r   add_passr   r   r   r   r   r   define_typed_pipeliner(   passesr8   !define_nopython_lowering_pipelinefinalize)r9   pmdpbtyped_passeslowering_passesr)   r)   r*   define_pipelinesv  s   z5TestBranchPruneSSA.SSAPrunerCompiler.define_pipelinesN)rm   rn   ro   rZ  r)   r)   r)   r*   SSAPrunerCompileru  s    r[  c                 C   s,   t | jdddd}| | |  d S )Npipeline_classc                 S   s,   d}d}| d u r
d}|r|d urd}||fS )Nrr   FTr   r)   )pqr}   rr)   r)   r*   rv     s   z4TestBranchPruneSSA.test_ssa_update_phi.<locals>.implr   )r   r[  rL  rM  r   r)   r)   r*   test_ssa_update_phi  s   
z&TestBranchPruneSSA.test_ssa_update_phic                 C   sf   t | jdddd}| | |  |j|jd  jd }|j D ]}| 	g |
d q$d S )Nr\  c                 S   s   d}| d u r
d}|S d}|S r   r)   )r^  r}   r)   r)   r*   rv     s   z5TestBranchPruneSSA.test_ssa_replace_phi.<locals>.implr   preserved_irphir   )r   r[  rL  rM  	overloads
signaturesmetadatar4   r5   r   
find_exprs)r9   rv   r!   r<   r)   r)   r*   test_ssa_replace_phi  s   
	z'TestBranchPruneSSA.test_ssa_replace_phiN)rm   rn   ro   r   r[  ra  rh  r)   r)   r)   r*   rO  r  s    rO  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )(TestBranchPrunePostSemanticConstRewritesc                 C   s\   dd }|  |ttjddfdd gtd |  |ttjddfdd	gtd
 d S )Nc                 S   s$   | j dkr| jd dkrdS d S dS )Nr   rr   rz   )r   shape)r   r)   r)   r*   rv     s
   
zKTestBranchPrunePostSemanticConstRewrites.test_array_ndim_attr.<locals>.implr   r   Fr   rr   TrB   )r   )rl   r	   r   r   r   r   r   r)   r)   r*   test_array_ndim_attr  s   z=TestBranchPrunePostSemanticConstRewrites.test_array_ndim_attrc                 C   s\   dd }|  |ttjdfdd gtg d |  |ttjdfddgtd	dg d S )
Nc                 S   s$   t | dkr| d dkrdS d S dS )Nr   r   rr   r   rP   )tupr)   r)   r*   rv     s
   zETestBranchPrunePostSemanticConstRewrites.test_tuple_len.<locals>.implr   Frr   r   r   r   TrB   rr   )rl   r	   UniTupler   r   r   r)   r)   r*   test_tuple_len  s   

z7TestBranchPrunePostSemanticConstRewrites.test_tuple_lenc                 C   sT   t dd }| tj}|  W d    n1 sw   Y  | dt|j d S )Nc                   S   s   t d d S )NgGz?)floatas_integer_ratior)   r)   r)   r*   test  s   zHTestBranchPrunePostSemanticConstRewrites.test_attr_not_len.<locals>.testz$Unknown attribute 'as_integer_ratio')r   assertRaisesr
   TypingErrorassertInstr	exception)r9   rs  rf   r)   r)   r*   test_attr_not_len  s   
z:TestBranchPrunePostSemanticConstRewrites.test_attr_not_lenc                 C   sr   t ddg}|dd}dd }| |ttjddfdgtd	 ttj	d
|}| j||fd g|t
d d S )N	FakeArrayr   r   )r   c                 S   s   | j dkr| j S t  d S )Nr   )r   object)far)   r)   r*   rv     s   

zMTestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_array.<locals>.implr   Fr   rr   )rG   )collections
namedtuplerl   r	   r   r   r   r   NamedUniTupler   enable_pyobj_flags)r9   rz  r|  rv   FakeArrayTyper)   r)   r*   test_ndim_not_on_array  s   

z?TestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_arrayc                 C   s:   t dd }tdtdf}| || |j|  d S )Nc                 S   s   | j d |j S r   )rj  r   r   r)   r)   r*   rv     s   zlTestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewrites.<locals>.impl)r   r   r   r   )rr   rr   )r   r   r   rL  rM  )r9   rv   r]   r)   r)   r*   5test_semantic_const_propagates_before_static_rewrites  s   
z^TestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewritesc           	      C   s   t tddd }d}| || |j|  |j|jd  }|jd }t }|j	 D ] }|
dD ]}||jj}| |jtj ||jj q2q+| |dd	 |D  d S )
Nr\  c                  W   s"   d}t | D ]}|t|7 }q|S r   )r   rP   )r]   sargr)   r)   r*   rv     s   zSTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.impl)r)   rn  r)   r   rb  inplace_binopc                 S   s   h | ]}t |qS r)   rl  )r/   ru   r)   r)   r*   	<setcomp>  r   zXTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.<setcomp>)r   r   rL  rM  rd  re  rf  rU   r4   r5   rg  find_variable_assignmentrhsnameassertIsInstancer   r   r   addrO   )	r9   rv   inpolr!   binop_constsr<   exprinstr)   r)   r*   test_tuple_const_propagation  s   

zETestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagationN)	rm   rn   ro   rk  rp  ry  r  r  r  r)   r)   r)   r*   ri    s    ri  )2r}  r	   r
  numpyr   numba.core.compilerr   r   r   r   numbar   r   r   
numba.corer
   r   r   r   r   r   r   numba.core.inline_closurecallr   numba.tests.supportr   r   r   r   numba.core.analysisr   r   numba.core.untyped_passesr   r   r   r   r   r   r   r   r   r  enable_pyobjectr+   r,   rq   r   rO  ri  r)   r)   r)   r*   <module>   s2   $f   s vB