o
    1&i                     @   sD  d dl Z d dlZd dlZd dl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 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Z.G dd de+Z/dS )    N)run_frontendFlags	StateDict)jitnjitliteral_unroll)typeserrorsirrewritesir_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typemapZ	calltypesr   Zrun_passr   Zrewrite_registryapply)funcr   state r$   DC:\wamp64\www\opt\env\Lib\site-packages\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valuesZ
find_instsr
   ZBranchextend)selfZthe_irZbranchesblktmpr$   r$   r%   find_branches.   s
   z!TestBranchPruneBase.find_branchesc              
   O   s4  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di}t|fi ||j| }|d u r	| }| }n	|j| }|| }| || d S )NP================================================================================zbefore inlineFbefore pruneafter pruneTbothr   Zunreachablec                 S   r(   r$   r$   r)   r$   r$   r%   r,   u   r-   z4TestBranchPruneBase.assert_prune.<locals>.<listcomp>c                 S   r(   r$   r$   r)   r$   r$   r%   r,   v   r-   
new_labelsoriginal_labelsexpect_removedflagsnopython)r&   copy_DEBUGprintdumpr   r   ZParallelOptionsrunr   ZPostProcessorr   r   r5   assertEquallen	enumerateappendZtruebrZfalsebrsetr/   keysAssertionErrorsortedpopr   	overloadsentry_point)r2   r"   Zargs_tyspruneargskwargsr   beforeZinline_passZ	post_procafterbefore_branchesr<   idxbranchr;   r:   eZsupplied_flagsZcresresexpectedr$   r$   r%   assert_prune5   sp   





z TestBranchPruneBase.assert_pruneN)__name__
__module____qualname____doc__r@   r5   rZ   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)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 )Nr`   ra   r$   rb   r$   r$   r%   rd      re   Fc                 S   s   | d u rdS d S Nra   r$   rb   r$   r$   r%   rd      re   
   c                 S      | dkrdS d S Nrh   ra   r$   rb   r$   r$   r%   rd      re   c                 S   s   | dkrd}d S d S rj   r$   )rc   zr$   r$   r%   rd      s   c                 S   s   d }|}| |kr
dS d S )Nd   r$   )rc   rk   yr$   r$   r%   rd      s
   rZ   r   NoneTypeIntegerLiteralr2   rd   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 Nra   l&ls?r$   rb   r$   r$   r%   rd         z1TestBranchPrune.test_single_if_else.<locals>.implrf   Frh   Trn   rq   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   ri   Nrl   ra   r$   rb   r$   r$   r%   rd      re   z6TestBranchPrune.test_single_if_const_val.<locals>.implrf   Trl   c                 S   s   d| krdS d S rx   r$   rb   r$   r$   r%   rd      s   rn   rq   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 rt   r$   )rc   rm   r$   r$   r%   rd      rv   z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implrl      rf   FT  )rZ   r   rp   ro   rq   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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   rh   r$   )rc   x_is_none_workdeadrm   r$   r$   r%   rd      s   zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implrf   Frh   Tc                 S   s(   d}| d u r	d}n	 |rd}|S d}|S )NFTrh   r~   r$   )rc   r   rm   r$   r$   r%   rd      s   rn   rq   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 )Nrl      r}   rh   r~   r$   )rc   one_hundredr   r   rm   r$   r$   r%   rd     s   z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implrf   Frh   Trn   rq   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 )Nrl   ra   ru   r$   )rc   r   rm   r$   r$   r%   rd   $  s   zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implrh   rl   rZ   r   rp   rq   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 Nrh   (   rl     r$   rc   rm   rk   r$   r$   r%   rd   2     z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implrf   FTrh   rn   rq   r$   r$   r%   "test_single_two_branches_same_cond0  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%   rd   D  r   z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTrf   rh   N)rZ   r   Omittedro   rp   rq   r$   r$   r%   test_cond_is_kwarg_noneB  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{   rh   r   rl   r   r$   r   r$   r$   r%   rd   X  r   z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   rf   TF)r{   )rZ   r   r   rp   ro   rq   r$   r$   r%   test_cond_is_kwarg_valueV  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   rs   )Nrh      r$   rb   r$   r$   r%   fnn  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 )Nr`   r   callbinopr6   r7   r8   )r&   r5   rD   rE   Zcondr   Zget_definitionoprP   r@   rA   rB   r   
assertTrue
isinstancer
   Constvalue)
r"   Zarg_tysZbit_valr   rT   Zpred_varZ	pred_defnZcondition_varZcondition_opZnew_condition_defnr2   r$   r%   checks  s*   



z;TestBranchPrune.test_cond_rewrite_is_correct.<locals>.checkrf   r`   rh   r   )r   ro   rp   )r2   r   r   r$   r   r%   test_cond_rewrite_is_correctk  s    z,TestBranchPrune.test_cond_rewrite_is_correctc                 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   rh   _GLOBALrb   r$   r$   r%   rd        z1TestBranchPrune.test_global_bake_in.<locals>.implr`   F   c                 S   r   r   r   rb   r$   r$   r%   rd     r   T)rZ   r   rp   r   )r2   rd   r4   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$   rb   Z_FREEVARr$   r%   rd     r   z2TestBranchPrune.test_freevar_bake_in.<locals>.implr`   Fr   c                    r   r   r$   rb   r   r$   r%   rd     r   Tr   rq   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   rh      r$   )arrayar$   r$   r%   rd     s
   zRTestBranchPrune.test_redefined_variables_are_not_considered_in_prune.<locals>.implrz   Crf   rz      r   rZ   r   Arrayfloat64ro   npzerosrq   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   rh      r$   )r   r   rc   r$   r$   r%   rd     s   z7TestBranchPrune.test_comparison_operators.<locals>.implrz   r   rf   Fr9   r   g      (@r   r   rq   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 )	Nrz   r   r   r}      r   rh   r   r$   r   rc   r   br$   r$   r%   rd     s   zCTestBranchPrune.test_redefinition_analysis_same_block.<locals>.implrz   r   rf   )NFNr         ?r   r   rq   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}   rh   r   r$   r   r$   r$   r%   rd     s   zQTestBranchPrune.test_redefinition_analysis_different_block_can_exec.<locals>.implrz   r   rf   )NNNNr   r   r   r   rq   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%   rd   $  s   zTTestBranchPrune.test_redefinition_analysis_different_block_cannot_exec.<locals>.implrz   r   rf   Tr   g333333?NNr   rq   r$   r$   r%   6test_redefinition_analysis_different_block_cannot_exec   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$   rb   r$   r%   closureF     zRTestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.impl.<locals>.closurer   TFr$   )r   r$   rb   r%   rd   C  s   zATestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.implr$   F)rZ   rq   r$   r$   r%   #test_closure_and_nonlocal_can_prune@  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$   )trb   r$   r%   r   Y  r   zUTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.impl.<locals>.closurer   TFr$   )nr   r$   rb   r%   rd   V  s   zDTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.implr`   )rZ   r   int64rq   r$   r$   r%   &test_closure_and_nonlocal_cannot_pruneS  s   z6TestBranchPrune.test_closure_and_nonlocal_cannot_pruneN)r[   r\   r]   rr   rw   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r_      s*    ,&+ r_   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)r`   StringTg@y              @)r    Fg        y                Nc           	      C   sh   |j }dd t|jD }| D ]\}}|||< qtdd t| D }|j|d}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*   r+   r   r$   r$   r%   r,         zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<listcomp>)	co_consts)
__code__rF   r   itemstuplerK   replacepytypesFunctionTypeglobals)	r2   ZpyfuncZconstsZpyfunc_coder   r   r   Z
new_constsZnew_coder$   r$   r%   _literal_const_sample_generatorp  s   	
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PLACEHOLDER1ra   ZPLACEHOLDER2r   r$   )rc   _CONST1Z_CONST2r$   r$   r%   rd     s
   zCTestBranchPrunePredicates.test_literal_const_code_gen.<locals>.implr   r   )r`   r   r   )Nr   ra   r   r   ra      )r   r   r   rD   )r2   rd   newZiconstZ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   ra   r$   rc   r   r$   r$   r%   rd        z<TestBranchPrunePredicates.test_single_if_const.<locals>.implFTr`   rf   _TRUTHY_FALSEYr   rZ   r   ro   r2   rd   c_inprO   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%   rd     r   zCTestBranchPrunePredicates.test_single_if_negate_const.<locals>.implFTr`   rf   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   ra   ru   r$   r   r$   r$   r%   rd        zATestBranchPrunePredicates.test_single_if_else_const.<locals>.implFTr`   rf   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%   rd     r   zHTestBranchPrunePredicates.test_single_if_else_negate_const.<locals>.implFTr`   rf   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 rg   r$   rb   r   r$   r%   r"        z>TestBranchPrunePredicates.test_single_if_freevar.<locals>.funcrf   r   r   rZ   r   ro   r2   r   rO   r"   r$   r   r%   test_single_if_freevar     z0TestBranchPrunePredicates.test_single_if_freevarc                    r   )NFTc                    s    sd fS d S rg   r$   rb   r   r$   r%   r"     r   zETestBranchPrunePredicates.test_single_if_negate_freevar.<locals>.funcrf   r   r   r$   r   r%   test_single_if_negate_freevar  r   z7TestBranchPrunePredicates.test_single_if_negate_freevarc                    r   )NFTc                    s    rd fS d fS rt   r$   rb   r   r$   r%   r"        zCTestBranchPrunePredicates.test_single_if_else_freevar.<locals>.funcrf   r   r   r$   r   r%   test_single_if_else_freevar     z5TestBranchPrunePredicates.test_single_if_else_freevarc                    r   )NFTc                    s    sd fS d fS rt   r$   rb   r   r$   r%   r"     r   zJTestBranchPrunePredicates.test_single_if_else_negate_freevar.<locals>.funcrf   r   r   r$   r   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 rg   )c_test_single_if_globalrb   r$   r$   r%   r"     r   z=TestBranchPrunePredicates.test_single_if_global.<locals>.funcrf   )r   r   r   rZ   r   ro   r2   r   rO   cr"   r$   r$   r%   test_single_if_global     z/TestBranchPrunePredicates.test_single_if_globalc                 C   r   )NFTc                 S   r   rg   )c_test_single_if_negate_globalrb   r$   r$   r%   r"     r   zDTestBranchPrunePredicates.test_single_if_negate_global.<locals>.funcrf   )r   r   r  rZ   r   ro   r   r$   r$   r%   test_single_if_negate_global  r  z6TestBranchPrunePredicates.test_single_if_negate_globalc                 C   r   )NFTc                 S   s   t rdt fS dt fS rt   )c_test_single_if_else_globalrb   r$   r$   r%   r"   "  r   zBTestBranchPrunePredicates.test_single_if_else_global.<locals>.funcrf   )r   r   r  rZ   r   ro   r   r$   r$   r%   test_single_if_else_global     z4TestBranchPrunePredicates.test_single_if_else_globalc                 C   r   )NFTc                 S   s   t sdt fS dt fS rt   )#c_test_single_if_else_negate_globalrb   r$   r$   r%   r"   1  r   zITestBranchPrunePredicates.test_single_if_else_negate_global.<locals>.funcrf   )r   r   r	  rZ   r   ro   r   r$   r$   r%   !test_single_if_else_negate_global*  r  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 )Nr`   i  r   )r   r   )r0   r4   r$   r$   r%   foo;  s
   
z6TestBranchPrunePredicates.test_issue_5618.<locals>.foor   g     Є@)r   assertPreciseEqualpy_func)r2   r  r$   r$   r%   test_issue_56189  s   
z)TestBranchPrunePredicates.test_issue_5618N)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   g  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 IRZssazdead branch pruningzpreserves the IR as metadata)r   Zadd_passr   r   r   r   r   r   Zdefine_typed_pipeliner#   Zpassesr1   Z!define_nopython_lowering_pipelinefinalize)r2   pmZdpbZtyped_passesZlowering_passesr$   r$   r%   define_pipelinesK  s   z5TestBranchPruneSSA.SSAPrunerCompiler.define_pipelinesN)r[   r\   r]   r  r$   r$   r$   r%   SSAPrunerCompilerJ  s    r  c                 C   s,   t | jdddd}| | |  d S )NZpipeline_classc                 S   s,   d}d}| d u r
d}|r|d urd}||fS )Nr`   FTr   r$   )pqrk   rr$   r$   r%   rd   b  s   z4TestBranchPruneSSA.test_ssa_update_phi.<locals>.implr   )r   r  r  r  rq   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  rk   r$   r$   r%   rd   w  s   z5TestBranchPruneSSA.test_ssa_replace_phi.<locals>.implr   preserved_irphir   )r   r  r  r  rM   
signaturesmetadatar/   r0   ZassertFalse
find_exprs)r2   rd   r   r3   r$   r$   r%   test_ssa_replace_phis  s   
	z'TestBranchPruneSSA.test_ssa_replace_phiN)r[   r\   r]   r   r  r  r  r$   r$   r$   r%   r  G  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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 )Nrz   r`   rh   )ndimshape)r   r$   r$   r%   rd     s
   
zKTestBranchPrunePostSemanticConstRewrites.test_array_ndim_attr.<locals>.implrz   r   Fr   r`   Tr9   )rz   )rZ   r   r   r   r   r   rq   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   rz   r`   r   rE   )tupr$   r$   r%   rd     s
   zETestBranchPrunePostSemanticConstRewrites.test_tuple_len.<locals>.implr   Fr`   rz   r   rz   Tr9   r`   )rZ   r   ZUniTupler   r   rq   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	   ZTypingErrorZassertInstr	exception)r2   r)  rW   r$   r$   r%   test_attr_not_len  s   
z:TestBranchPrunePostSemanticConstRewrites.test_attr_not_lenc                 C   sx   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|dddd d S )N	FakeArrayr   rz   )r   c                 S   s   | j dkr| j S t  d S )Nrz   )r   object)far$   r$   r%   rd     s   

zMTestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_array.<locals>.implr   Fr   r`   T)r>   Zforceobj)r=   )
collections
namedtuplerZ   r   r   r   r   r   ZNamedUniTupler   )r2   r.  r0  rd   Z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   )r!  r   )r   r   r$   r$   r%   rd     s   zlTestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewrites.<locals>.impl)r   r   r   rz   )r`   r`   )r   r   r   r  r  )r2   rd   rP   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   rE   )rP   sargr$   r$   r%   rd     s   zSTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.impl)r$   r%  r$   r   r  Zinplace_binopc                 S   s   h | ]}t |qS r$   r#  )r*   rc   r$   r$   r%   	<setcomp>  r   zXTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.<setcomp>)r   r   r  r  rM   r  r  rH   r/   r0   r  Zfind_variable_assignmentrhsnameZassertIsInstancer   r
   r   addrD   )	r2   rd   inpZolr   Zbinop_constsr3   exprinstr$   r$   r%   test_tuple_const_propagation  s   

zETestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagationN)	r[   r\   r]   r"  r&  r-  r3  r4  r>  r$   r$   r$   r%   r    s    r  )0r1  r   r   numpyr   Znumba.core.compilerr   r   r   Znumbar   r   r   Z
numba.corer	   r
   r   r   r   r   Znumba.core.inline_closurecallr   Znumba.tests.supportr   r   r   r   Znumba.core.analysisr   r   Znumba.core.untyped_passesr   r   r   r   r   r   r   r   r   Zenable_pyobj_flagsZenable_pyobjectr&   r'   r_   r   r  r  r$   r$   r$   r%   <module>   s2    f   ] aB