U
    ,‰d|  ã                   @   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ÚtypemapZ	calltypesr   Zrun_passr   Zrewrite_registryÚapply)Úfuncr!   Ústate© r&   ú=/tmp/pip-unpacked-wheel-eu7e0c37/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   s   g | ]}|‘qS r&   r&   ©Ú.0Ú_r&   r&   r'   Ú
<listcomp>1   s     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   sN  t |ƒ}| ¡ }| jr.tdƒ tdƒ | ¡  t|t d¡ƒ}| ¡  t	 
|¡}	|	 ¡  t||ƒ | jr€tdƒ tdƒ | ¡  t||ƒ |}
| jr¤tdƒ | ¡  |  |¡}|  t|ƒt|ƒ¡ g }t|ƒD ]z\}}|| }|dkrô| |j¡ qÎ|dkr| |j¡ qÎ|d krqÎ|dkr<| |j¡ | |j¡ qÎdsÎtd	ƒ‚qÎtd
d„ |j ¡ D ƒƒ}tdd„ |
j ¡ D ƒƒ}z|  ||t|ƒ ¡ W nR tk
rä } z2tdt|ƒƒ tdt|ƒƒ tdt|ƒƒ |‚W 5 d }~X Y nX | dd¡}|r d|ini }t||f|Ž}|d kr,| ¡ }|ƒ }n|j|Ž }||Ž }|  ||¡ d S )NúP================================================================================zbefore inlineFúbefore pruneúafter pruneTÚbothr   Zunreachablec                 S   s   g | ]}|‘qS r&   r&   r*   r&   r&   r'   r-   u   s     z4TestBranchPruneBase.assert_prune.<locals>.<listcomp>c                 S   s   g | ]}|‘qS r&   r&   r*   r&   r&   r'   r-   v   s     Ú
new_labelsÚoriginal_labelsÚexpect_removedÚflags)r(   ÚcopyÚ_DEBUGÚprintÚdumpr   r   ZParallelOptionsÚrunr   ZPostProcessorr   r   r5   ÚassertEqualÚlenÚ	enumerateÚappendZtruebrZfalsebrÚAssertionErrorÚsetr/   ÚkeysÚsortedÚpopr   Zentry_point)r2   r$   Zargs_tysÚpruneÚargsÚkwargsr!   ÚbeforeZinline_passZ	post_procÚafterÚbefore_branchesr<   ÚidxÚbranchr;   r:   ÚeZsupplied_flagsZcompiler_kwsZcresÚresÚexpectedr&   r&   r'   Úassert_prune5   sn    ÿ








z TestBranchPruneBase.assert_pruneN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   r5   rW   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‘   s    z,TestBranchPrune.test_single_if.<locals>.implÚnoneTc                 S   s   ddkrdS d S )Nr]   r^   r&   r_   r&   r&   r'   ra   —   s    Fc                 S   s   | d krdS d S ©Nr^   r&   r_   r&   r&   r'   ra      s    é
   c                 S   s   | dkrdS d S ©Nrd   r^   r&   r_   r&   r&   r'   ra   ¤   s    c                 S   s   | dkrd}d S re   r&   )r`   Úzr&   r&   r'   ra   «   s    c                 S   s   d }|}| |krdS d S )Néd   r&   )r`   rf   Úyr&   r&   r'   ra   ²   s    ©rW   r	   ÚNoneTypeÚIntegerLiteral©r2   ra   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   s   | d krdS dS d S ©Nr^   çl&ßlsãù?r&   r_   r&   r&   r'   ra   ½   s    z1TestBranchPrune.test_single_if_else.<locals>.implrb   Frd   Tri   rl   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   s   | dkrdS d S ©Nrg   r^   r&   r_   r&   r&   r'   ra   È   s    z6TestBranchPrune.test_single_if_const_val.<locals>.implrb   Trg   c                 S   s   d| krdS d S rq   r&   r_   r&   r&   r'   ra   Ï   s    ri   rl   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 d S rn   r&   )r`   rh   r&   r&   r'   ra   Ù   s    z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implrg   é   rb   FTéè  )rW   r	   rk   rj   rl   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rp|   |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 krd}nd}|r d}nd}|S )NFTé   rd   éýÿÿÿr&   )r`   Úx_is_none_workÚdeadrh   r&   r&   r'   ra   ê   s    zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implrb   Frd   Tc                 S   s$   d}| d krd}n |rd}nd}|S )NFTrd   rw   r&   )r`   rx   rh   r&   r&   r'   ra   ú   s    )é   rd   )rW   r	   rj   rk   r   Ú	PYVERSIONrl   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   s4   d}d}| d krd}nd}||kr(d}nd}||fS )Nrg   é   rv   rd   rw   r&   )r`   Úone_hundredrx   ry   rh   r&   r&   r'   ra     s    z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implrb   Frd   Tri   rl   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}nd}|S )Nrg   r^   ro   r&   )r`   r~   rh   r&   r&   r'   ra   (  s
    zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implrd   rg   ©rW   r	   rk   rl   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   s,   | d krd}nd}| d k	r d}nd}||fS ©Nrd   é(   rg   é  r&   ©r`   rh   rf   r&   r&   r'   ra   6  s    z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implrb   FTrd   ri   rl   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   s,   | d krd}nd}| d k	r d}nd}||fS r‚   r&   r…   r&   r&   r'   ra   H  s    z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTrb   rd   )N)rW   r	   ÚOmittedrj   rk   rl   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 )	Nrt   c                 S   s,   | dkrd}nd}| dkr d}nd}||fS )Nrt   rd   rƒ   rg   r„   r&   r…   r&   r&   r'   ra   \  s    z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   rb   TF)rt   )rW   r	   r‡   rk   rj   rl   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   s   | d krdS dS )Nrd   é   r&   r_   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	rˆt
dƒ t
dƒ | ¡  t||ƒ ˆ j	r°t
dƒ t
dƒ | ¡  t ||¡}	ˆ  t|	tjƒ¡ ˆ  |	j|¡ d S )Nr]   r   ÚcallZbinopr6   r7   r8   )r(   r5   rC   rD   Zcondr   Zget_definitionÚoprM   r?   r@   rA   r   Ú
assertTrueÚ
isinstancer   ÚConstÚvalue)
r$   Zarg_tysZbit_valr!   rQ   Zpred_varZ	pred_defnZcondition_varZcondition_opZnew_condition_defn©r2   r&   r'   Úcheckw  s*    



z;TestBranchPrune.test_cond_rewrite_is_correct.<locals>.checkrb   r]   rd   r   )r	   rj   rk   )r2   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 krtƒ S dS g S )Nr]   rŠ   )ÚndimÚdict©ÚaÚbr&   r&   r'   Úbugž  s
    
z3TestBranchPrune.test_obj_mode_fallback.<locals>.bugrd   r}   rŠ   )rs   é   )	r   rC   ÚnpÚzerosZaranger–   ZreshapeÚassertFalseZnopython_signatures)r2   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 5 |aX d S )Nc                 S   s   t dkr| S | d S d S ©Nr    rd   ©Ú_GLOBALr_   r&   r&   r'   ra   ®  s    z1TestBranchPrune.test_global_bake_in.<locals>.implr]   Fr›   c                 S   s   t dkr| S | d S d S r    r¡   r_   r&   r&   r'   ra   ¼  s    T)rW   r	   rk   r¢   )r2   ra   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                    s   ˆ dkr| S | d S d S r    r&   r_   ©Z_FREEVARr&   r'   ra   Ê  s    z2TestBranchPrune.test_freevar_bake_in.<locals>.implr]   FrŠ   c                    s   ˆ dkr| S | d S d S r    r&   r_   r¤   r&   r'   ra   Ô  s    Tr€   rl   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 krd}|dk rdS dS )Nr   rd   é   r&   )Úarrayr˜   r&   r&   r'   ra   à  s
    zRTestBranchPrune.test_redefined_variables_are_not_considered_in_prune.<locals>.implrs   ÚCrb   ©rs   rz   )N©rW   r	   ÚArrayÚfloat64rj   rœ   r   rl   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 krdS |dk rdS |S ©Nr   rd   é   r&   )r§   r˜   r`   r&   r&   r'   ra   ò  s    z7TestBranchPrune.test_comparison_operators.<locals>.implrs   r¨   rb   Fr9   r©   g      (@)Nrª   rl   r&   r&   r'   Útest_comparison_operatorsí  s"    

ÿ üÿ üz)TestBranchPrune.test_comparison_operatorsc                 C   sH   d	dd„}|   |t tjdd¡tjt d¡fd dd gt d¡dd ¡ d S )
Nc                 S   s:   d}|dk rd}|d krd}nd}|dk r.dS d| | S )	Nrs   r}   rŠ   rv   é   r   rd   r¦   r&   ©r§   r`   r˜   r™   r&   r&   r'   ra     s    zCTestBranchPrune.test_redefinition_analysis_same_block.<locals>.implrs   r¨   rb   Fr©   ç      ð?)Nrª   rl   r&   r&   r'   Ú%test_redefinition_analysis_same_block  s    
 ÿ  üz5TestBranchPrune.test_redefinition_analysis_same_blockc                 C   sJ   ddd„}|   |t tjdd¡tjt d¡fd d d d gt d¡dd ¡ d S )	Nc                 S   sJ   d}|dkrd}|dk rd}|d kr.|d7 }n|d7 }|dk rBdS d| S )	Nr   r›   é   r}   rŠ   rv   rd   r¦   r&   r²   r&   r&   r'   ra   "  s    
zQTestBranchPrune.test_redefinition_analysis_different_block_can_exec.<locals>.implrs   r¨   rb   r©   r³   )Nrª   rl   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   s2   d}|d k	rd}|d kr"|d7 }n|d7 }d| S )Nr   rµ   r›   rv   r¦   r&   r²   r&   r&   r'   ra   :  s    
zTTestBranchPrune.test_redefinition_analysis_different_block_cannot_exec.<locals>.implrs   r¨   rb   Tr©   g333333ó?)NNrª   rl   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 d S )Nrt   c                      s   d‰ d S ©Nr   r&   r&   r_   r&   r'   Úclosure\  s    zRTestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.impl.<locals>.closurer   TFr&   )r¹   r&   r_   r'   ra   Y  s    zATestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.implr&   F)rW   rl   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 d S )Nrt   c                    s   | ‰ d S ©Nr&   )Útr_   r&   r'   r¹   o  s    zUTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.impl.<locals>.closurer   TFr&   )Únr¹   r&   r_   r'   ra   l  s    zDTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.implr]   )rW   r	   Úint64rl   r&   r&   r'   Ú&test_closure_and_nonlocal_cannot_prunei  s    z6TestBranchPrune.test_closure_and_nonlocal_cannot_pruneN)rX   rY   rZ   rm   rp   rr   ru   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   sÌ   |j }dd„ t|jƒD ƒ}| ¡ D ]\}}|||< q"tdd„ t| ¡ ƒD ƒƒ}|jg}tjdkrl| 	|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+   r,   rÄ   r&   r&   r'   r-   •  s     zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<listcomp>)rz   é   )Ú__code__rE   Ú	co_constsÚitemsÚtuplerJ   Úco_argcountr   r{   rF   Úco_posonlyargcountÚco_kwonlyargcountr1   Ú
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)
r2   ZpyfuncZconstsZpyfunc_coderÈ   rÃ   rÄ   Z
new_constsZco_argsZ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ÚPLACEHOLDER1r^   ZPLACEHOLDER2r}   r&   )r`   Ú_CONST1Z_CONST2r&   r&   r'   ra   ³  s
    zCTestBranchPrunePredicates.test_literal_const_code_gen.<locals>.implr   r¯   )r]   rz   rß   )Nr   r^   r¯   r}   r^   é   )rÞ   rÇ   rÈ   rC   )r2   ra   ÚnewZiconstZnconstr&   r&   r'   Útest_literal_const_code_gen²  s    z5TestBranchPrunePredicates.test_literal_const_code_genc                 C   s^   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à   r^   r&   ©r`   rá   r&   r&   r'   ra   Æ  s    z<TestBranchPrunePredicates.test_single_if_const.<locals>.implFTr]   rb   ©Ú_TRUTHYÚ_FALSEYrÞ   rW   r	   rj   ©r2   ra   Úc_inprL   Úconstr$   r&   r&   r'   Útest_single_if_constÄ  s    ÿz.TestBranchPrunePredicates.test_single_if_constc                 C   s^   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}|sdS d S rå   r&   ræ   r&   r&   r'   ra   Ó  s    zCTestBranchPrunePredicates.test_single_if_negate_const.<locals>.implFTr]   rb   rç   rê   r&   r&   r'   Útest_single_if_negate_constÑ  s    ÿz5TestBranchPrunePredicates.test_single_if_negate_constc                 C   s^   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 d S ©Nrà   r^   ro   r&   ræ   r&   r&   r'   ra   à  s    zATestBranchPrunePredicates.test_single_if_else_const.<locals>.implFTr]   rb   rç   rê   r&   r&   r'   Útest_single_if_else_constÞ  s    ÿz3TestBranchPrunePredicates.test_single_if_else_constc                 C   s^   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}|sdS dS d S rï   r&   ræ   r&   r&   r'   ra   ï  s    zHTestBranchPrunePredicates.test_single_if_else_negate_const.<locals>.implFTr]   rb   rç   rê   r&   r&   r'   Ú test_single_if_else_negate_constí  s    ÿz:TestBranchPrunePredicates.test_single_if_else_negate_constc                    sR   | j df| jdffD ]8\}}|D ]*‰ ‡ fdd„}|  |t d¡f|gd ¡ q qd S )NFTc                    s   ˆ rdˆ fS d S rc   r&   r_   ©rì   r&   r'   r$      s    z>TestBranchPrunePredicates.test_single_if_freevar.<locals>.funcrb   ©rè   ré   rW   r	   rj   ©r2   rë   rL   r$   r&   rò   r'   Útest_single_if_freevarü  s    ÿz0TestBranchPrunePredicates.test_single_if_freevarc                    sR   | j df| jdffD ]8\}}|D ]*‰ ‡ fdd„}|  |t d¡f|gd ¡ q qd S )NFTc                    s   ˆ sdˆ fS d S rc   r&   r_   rò   r&   r'   r$   
  s    zETestBranchPrunePredicates.test_single_if_negate_freevar.<locals>.funcrb   ró   rô   r&   rò   r'   Útest_single_if_negate_freevar  s    ÿz7TestBranchPrunePredicates.test_single_if_negate_freevarc                    sR   | j df| jdffD ]8\}}|D ]*‰ ‡ fdd„}|  |t d¡f|gd ¡ q qd S )NFTc                    s   ˆ rdˆ fS dˆ fS d S rn   r&   r_   rò   r&   r'   r$     s    zCTestBranchPrunePredicates.test_single_if_else_freevar.<locals>.funcrb   ró   rô   r&   rò   r'   Útest_single_if_else_freevar  s    ÿz5TestBranchPrunePredicates.test_single_if_else_freevarc                    sR   | j df| jdffD ]8\}}|D ]*‰ ‡ fdd„}|  |t d¡f|gd ¡ q qd S )NFTc                    s   ˆ sdˆ fS dˆ fS d S rn   r&   r_   rò   r&   r'   r$      s    zJTestBranchPrunePredicates.test_single_if_else_negate_freevar.<locals>.funcrb   ró   rô   r&   rò   r'   Ú"test_single_if_else_negate_freevar  s    ÿz<TestBranchPrunePredicates.test_single_if_else_negate_freevarc                 C   sR   | j df| jdffD ]8\}}|D ]*}|add„ }|  |t d¡f|gd ¡ q qd S )NFTc                 S   s   t rdt fS d S rc   )Úc_test_single_if_globalr_   r&   r&   r'   r$   1  s    z=TestBranchPrunePredicates.test_single_if_global.<locals>.funcrb   )rè   ré   rù   rW   r	   rj   ©r2   rë   rL   Úcr$   r&   r&   r'   Útest_single_if_global*  s    ÿz/TestBranchPrunePredicates.test_single_if_globalc                 C   sR   | j df| jdffD ]8\}}|D ]*}|add„ }|  |t d¡f|gd ¡ q qd S )NFTc                 S   s   t rdt fS d S rc   )Úc_test_single_if_negate_globalr_   r&   r&   r'   r$   ?  s    zDTestBranchPrunePredicates.test_single_if_negate_global.<locals>.funcrb   )rè   ré   rý   rW   r	   rj   rú   r&   r&   r'   Útest_single_if_negate_global8  s    ÿz6TestBranchPrunePredicates.test_single_if_negate_globalc                 C   sR   | j df| jdffD ]8\}}|D ]*}|add„ }|  |t d¡f|gd ¡ q qd S )NFTc                 S   s   t rdt fS dt fS d S rn   )Úc_test_single_if_else_globalr_   r&   r&   r'   r$   M  s    zBTestBranchPrunePredicates.test_single_if_else_global.<locals>.funcrb   )rè   ré   rÿ   rW   r	   rj   rú   r&   r&   r'   Útest_single_if_else_globalF  s    ÿz4TestBranchPrunePredicates.test_single_if_else_globalc                 C   sR   | j df| jdffD ]8\}}|D ]*}|add„ }|  |t d¡f|gd ¡ q qd S )NFTc                 S   s   t sdt fS dt fS d S rn   )Ú#c_test_single_if_else_negate_globalr_   r&   r&   r'   r$   \  s    zITestBranchPrunePredicates.test_single_if_else_negate_global.<locals>.funcrb   )rè   ré   r  rW   r	   rj   rú   r&   r&   r'   Ú!test_single_if_else_negate_globalU  s    ÿ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'   Úfoof  s
    
z6TestBranchPrunePredicates.test_issue_5618.<locals>.foor   g     Ð„@)r   ÚassertPreciseEqualÚpy_func)r2   r  r&   r&   r'   Útest_issue_5618d  s    
z)TestBranchPrunePredicates.test_issue_5618N)rX   rY   rZ   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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   ZpmZdpbZtyped_passesZlowering_passesr&   r&   r'   Údefine_pipelinesv  s    z5TestBranchPruneSSA.SSAPrunerCompiler.define_pipelinesN)rX   rY   rZ   r	  r&   r&   r&   r'   ÚSSAPrunerCompileru  s   r
  c                 C   s,   t | jdddd„ƒ}|  |ƒ | ¡ ¡ d S )N©Zpipeline_classc                 S   s,   d}d}| d krd}|r$|d k	r$d}||fS )Nr]   FTr¯   r&   )ÚpÚqrf   Úrr&   r&   r'   ra     s    z4TestBranchPruneSSA.test_ssa_update_phi.<locals>.impl)NN)r   r
  r  r  rl   r&   r&   r'   Útest_ssa_update_phi‰  s    
z&TestBranchPruneSSA.test_ssa_update_phic                 C   sd   t | jdddd„ƒ}|  |ƒ | ¡ ¡ |j|jd  jd }|j ¡ D ]}|  	| 
d¡•¡ qHd S )Nr  c                 S   s   d}| d krd}nd}|S r®   r&   )r  rf   r&   r&   r'   ra   ¢  s
    z5TestBranchPruneSSA.test_ssa_replace_phi.<locals>.implr   Úpreserved_irÚphi)N)r   r
  r  r  Ú	overloadsÚ
signaturesÚmetadatar/   r0   rž   Ú
find_exprs)r2   ra   r!   r3   r&   r&   r'   Útest_ssa_replace_phiž  s    
	z'TestBranchPruneSSA.test_ssa_replace_phiN)rX   rY   rZ   r   r
  r  r  r&   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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 ndS d S )Nrs   r]   rd   )r•   Úshape)r§   r&   r&   r'   ra   ¹  s    
zKTestBranchPrunePostSemanticConstRewrites.test_array_ndim_attr.<locals>.implrs   r¨   Fr©   r]   Tr9   )rs   )rW   r	   r«   r¬   rœ   r   rl   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dddgƒ¡ |   |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 ndS d S )Nrz   rs   r]   r   ©rD   )Útupr&   r&   r'   ra   É  s    zETestBranchPrunePostSemanticConstRewrites.test_tuple_len.<locals>.implrz   Fr]   rs   Tr9   )rW   r	   ZUniTupler¾   rÊ   rl   r&   r&   r'   Útest_tuple_lenÇ  s    ÿþÿ
þz7TestBranchPrunePostSemanticConstRewrites.test_tuple_lenc              	   C   s@   t dd„ ƒ}|  tj¡}|ƒ  W 5 Q R X |  dt|jƒ¡ d S )Nc                   S   s   t  d¡ d S )Ng®Gáz®ó?)Ú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  rT   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•   rs   )r•   c                 S   s   | j dkr| j S tƒ  d S )Nrs   )r•   Úobject)Úfar&   r&   r'   ra   ì  s    
zMTestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_array.<locals>.implr¨   Fr©   r]   )r=   )ÚcollectionsÚ
namedtuplerW   r	   r«   r¬   rœ   r   ZNamedUniTupler¾   Úenable_pyobj_flags)r2   r$  r&  ra   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'   ra   þ  s    zlTestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewrites.<locals>.impl)r›   r}   rz   rs   )r]   r]   )r   rœ   r   r  r  )r2   ra   rM   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 ]0}| |jj¡}|  |jtj¡ | |jj¡ qdqV|  |dd	„ |D ƒ¡ d S )
Nr  c                  W   s"   d}t | ƒD ]}|t|ƒ7 }q|S r¸   )r   rD   )rM   ÚsÚargr&   r&   r'   ra     s    zSTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.impl)r&   )r]   rs   rz   r&   r   r  Zinplace_binopc                 S   s   h | ]}t |ƒ’qS r&   r  )r+   r`   r&   r&   r'   Ú	<setcomp>  s     zXTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.<setcomp>)r   r   r  r  r  r  r  rH   r/   r0   r  Zfind_variable_assignmentÚrhsÚnameZassertIsInstancer‘   r   r   ÚaddrC   )	r2   ra   ÚinpÚolr!   Zbinop_constsr3   ÚexprÚinstr&   r&   r'   Útest_tuple_const_propagation  s    

zETestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagationN)	rX   rY   rZ   r  r  r#  r*  r+  r6  r&   r&   r&   r'   r  ´  s   r  )2r'  r	   rÚ   Znumpyrœ   Znumba.core.compilerr   r   r   r   Znumbar   r   r   Z
numba.corer
   r   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¢   r)  Zenable_pyobjectr(   r)   r\   rÀ   r  r  r&   r&   r&   r'   Ú<module>   s0   $f   s vB