a
    þ
þ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&   úb/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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   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   sT  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u rô| |j¡ qÎ|du r| |j¡ qÎ|d u rqÎ|dkr<| |j¡ | |j¡ qÎdsÎJ d	ƒ‚qÎtd
d„ |j ¡ D ƒƒ}tdd„ |
j ¡ D ƒƒ}z|  ||t|ƒ ¡ W nT tyæ } z:tdt|ƒƒ tdt|ƒƒ tdt|ƒƒ |‚W Y d }~n
d }~0 0 | dd¡}|rd|ini }t||fi |¤Ž}|d u r2| ¡ }|ƒ }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   r.   z4TestBranchPruneBase.assert_prune.<locals>.<listcomp>c                 S   s   g | ]}|‘qS r&   r&   r*   r&   r&   r'   r-   v   r.   Ú
new_labelsÚoriginal_labelsÚexpect_removedÚflags)r(   ÚcopyÚ_DEBUGÚprintÚdumpr   r   ZParallelOptionsÚrunr   ZPostProcessorr   r   r6   ÚassertEqualÚlenÚ	enumerateÚappendZtruebrZfalsebrÚsetr0   ÚkeysÚAssertionErrorÚsortedÚpopr   Úentry_point)r3   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@   r6   rY   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&   ra   r&   r&   r'   rc   —   s    Fc                 S   s   | d u rdS d S ©Nr`   r&   ra   r&   r&   r'   rc      s    é
   c                 S   s   | dkrdS d S ©Nrf   r`   r&   ra   r&   r&   r'   rc   ¤   s    c                 S   s   | dkrd}d S rg   r&   )rb   Úzr&   r&   r'   rc   «   s    c                 S   s   d }|}| |krdS d S )Néd   r&   )rb   rh   Úyr&   r&   r'   rc   ²   s    ©rY   r	   ÚNoneTypeÚIntegerLiteral©r3   rc   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 u rdS dS d S ©Nr`   çl&ßlsãù?r&   ra   r&   r&   r'   rc   ½   s    z1TestBranchPrune.test_single_if_else.<locals>.implrd   Frf   Trk   rn   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 ©Nri   r`   r&   ra   r&   r&   r'   rc   È   s    z6TestBranchPrune.test_single_if_const_val.<locals>.implrd   Tri   c                 S   s   d| krdS d S rs   r&   ra   r&   r&   r'   rc   Ï   s    rk   rn   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 rp   r&   )rb   rj   r&   r&   r'   rc   Ù   s    z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implri   é   rd   FTéè  )rY   r	   rm   rl   rn   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 u rd}nd}|r d}nd}|S )NFTé   rf   éýÿÿÿr&   )rb   Úx_is_none_workÚdeadrj   r&   r&   r'   rc   ê   s    zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implrd   Frf   Tc                 S   s$   d}| d u rd}n |rd}nd}|S )NFTrf   ry   r&   )rb   rz   rj   r&   r&   r'   rc   ú   s    )é   rf   )rY   r	   rl   rm   r   Z	PYVERSIONrn   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 u rd}nd}||kr(d}nd}||fS )Nri   é   rx   rf   ry   r&   )rb   Úone_hundredrz   r{   rj   r&   r&   r'   rc     s    z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implrd   Frf   Trk   rn   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 )Nri   r`   rq   r&   )rb   r   rj   r&   r&   r'   rc   (  s
    zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implrf   ri   ©rY   r	   rm   rn   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 u rd}nd}| d ur d}nd}||fS ©Nrf   é(   ri   é  r&   ©rb   rj   rh   r&   r&   r'   rc   6  s    z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implrd   FTrf   rk   rn   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 u rd}nd}| d ur d}nd}||fS rƒ   r&   r†   r&   r&   r'   rc   H  s    z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTrd   rf   )N)rY   r	   ÚOmittedrl   rm   rn   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 )	Nrv   c                 S   s,   | dkrd}nd}| dkr d}nd}||fS )Nrv   rf   r„   ri   r…   r&   r†   r&   r&   r'   rc   \  s    z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   rd   TF)rv   )rY   r	   rˆ   rm   rl   rn   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 u rdS dS )Nrf   é   r&   ra   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   ÚcallÚbinopr7   r8   r9   )r(   r6   rD   rE   Zcondr   Zget_definitionÚoprO   r@   rA   rB   r   Ú
assertTrueÚ
isinstancer   ÚConstÚvalue)
r$   Zarg_tysZbit_valr!   rS   Zpred_varZ	pred_defnZcondition_varZcondition_opZnew_condition_defn©r3   r&   r'   Úcheckw  s*    



z;TestBranchPrune.test_cond_rewrite_is_correct.<locals>.checkrd   r_   rf   r   )r	   rl   rm   )r3   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 )Nr_   r‹   )ÚndimÚdict©ÚaÚbr&   r&   r'   Úbugž  s
    
z3TestBranchPrune.test_obj_mode_fallback.<locals>.bugrf   r~   r‹   )ru   é   )	r   rD   ÚnpÚzerosZaranger˜   ZreshapeÚassertFalseZnopython_signatures)r3   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n|a0 d S )Nc                 S   s   t dkr| S | d S d S ©Nr    rf   ©Ú_GLOBALra   r&   r&   r'   rc   ®  s    z1TestBranchPrune.test_global_bake_in.<locals>.implr_   Fr   c                 S   s   t dkr| S | d S d S r¢   r£   ra   r&   r&   r'   rc   ¼  s    T)rY   r	   rm   r¤   )r3   rc   r5   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&   ra   ©Z_FREEVARr&   r'   rc   Ê  s    z2TestBranchPrune.test_freevar_bake_in.<locals>.implr_   Fr‹   c                    s   ˆ dkr| S | d S d S r¢   r&   ra   r¦   r&   r'   rc   Ô  s    Tr   rn   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   rf   é   r&   )Úarrayrš   r&   r&   r'   rc   à  s
    zRTestBranchPrune.test_redefined_variables_are_not_considered_in_prune.<locals>.implru   ÚCrd   ©ru   r|   )N©rY   r	   ÚArrayÚfloat64rl   rž   rŸ   rn   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   rf   é   r&   )r©   rš   rb   r&   r&   r'   rc   ò  s    z7TestBranchPrune.test_comparison_operators.<locals>.implru   rª   rd   Fr:   r«   g      (@)Nr¬   rn   r&   r&   r'   Útest_comparison_operatorsí  s    

ÿ
üÿ
üz)TestBranchPrune.test_comparison_operatorsc                 C   sF   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 )	Nru   r~   r‹   rx   é   r   rf   r¨   r&   ©r©   rb   rš   r›   r&   r&   r'   rc     s    zCTestBranchPrune.test_redefinition_analysis_same_block.<locals>.implru   rª   rd   )NFNr«   ç      ð?)Nr¬   rn   r&   r&   r'   Ú%test_redefinition_analysis_same_block  s    
ÿüz5TestBranchPrune.test_redefinition_analysis_same_blockc                 C   sF   d	dd„}|   |t tjdd¡tjt d¡fg d¢t d¡dd ¡ d S )
Nc                 S   sJ   d}|dkrd}|dk rd}|d u r.|d7 }n|d7 }|dk rBdS d| S )	Nr   r   é   r~   r‹   rx   rf   r¨   r&   r´   r&   r&   r'   rc   "  s    
zQTestBranchPrune.test_redefinition_analysis_different_block_can_exec.<locals>.implru   rª   rd   )NNNNr«   rµ   )Nr¬   rn   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 urd}|d u r"|d7 }n|d7 }d| S )Nr   r·   r   rx   r¨   r&   r´   r&   r&   r'   rc   :  s    
zTTestBranchPrune.test_redefinition_analysis_different_block_cannot_exec.<locals>.implru   rª   rd   Tr«   g333333ó?)NNr¬   rn   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 )Nrv   c                      s   d‰ d S ©Nr   r&   r&   ra   r&   r'   Úclosure\  s    zRTestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.impl.<locals>.closurer   TFr&   )r»   r&   ra   r'   rc   Y  s    zATestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.implr&   F)rY   rn   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 )Nrv   c                    s   | ‰ d S ©Nr&   )Útra   r&   r'   r»   o  s    zUTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.impl.<locals>.closurer   TFr&   )Únr»   r&   ra   r'   rc   l  s    zDTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.implr_   )rY   r	   Úint64rn   r&   r&   r'   Ú&test_closure_and_nonlocal_cannot_prunei  s    z6TestBranchPrune.test_closure_and_nonlocal_cannot_pruneN)rZ   r[   r\   ro   rr   rt   rw   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>’  r.   zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<dictcomp>c                 S   s   g | ]\}}|‘qS r&   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)	r3   ZpyfuncZconstsZpyfunc_coderÈ   rÅ   rÆ   Z
new_constsZnew_coder&   r&   r'   Ú_literal_const_sample_generator†  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ÚPLACEHOLDER1r`   ZPLACEHOLDER2r~   r&   )rb   Ú_CONST1Z_CONST2r&   r&   r'   rc   ž  s
    zCTestBranchPrunePredicates.test_literal_const_code_gen.<locals>.implr   r±   )r_   r|   rÑ   )Nr   r`   r±   r~   r`   é   )rÐ   rÉ   rÈ   rD   )r3   rc   Ú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&   ©rb   rÓ   r&   r&   r'   rc   ±  s    z<TestBranchPrunePredicates.test_single_if_const.<locals>.implFTr_   rd   ©Ú_TRUTHYÚ_FALSEYrÐ   rY   r	   rl   ©r3   rc   Úc_inprN   Ú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'   rc   ¾  s    zCTestBranchPrunePredicates.test_single_if_negate_const.<locals>.implFTr_   rd   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`   rq   r&   rØ   r&   r&   r'   rc   Ë  s    zATestBranchPrunePredicates.test_single_if_else_const.<locals>.implFTr_   rd   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'   rc   Ú  s    zHTestBranchPrunePredicates.test_single_if_else_negate_const.<locals>.implFTr_   rd   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 re   r&   ra   ©rÞ   r&   r'   r$   ë  s    z>TestBranchPrunePredicates.test_single_if_freevar.<locals>.funcrd   ©rÚ   rÛ   rY   r	   rl   ©r3   rÝ   rN   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 re   r&   ra   rä   r&   r'   r$   õ  s    zETestBranchPrunePredicates.test_single_if_negate_freevar.<locals>.funcrd   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 rp   r&   ra   rä   r&   r'   r$   ÿ  s    zCTestBranchPrunePredicates.test_single_if_else_freevar.<locals>.funcrd   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 rp   r&   ra   rä   r&   r'   r$     s    zJTestBranchPrunePredicates.test_single_if_else_negate_freevar.<locals>.funcrd   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 re   )Úc_test_single_if_globalra   r&   r&   r'   r$     s    z=TestBranchPrunePredicates.test_single_if_global.<locals>.funcrd   )rÚ   rÛ   rë   rY   r	   rl   ©r3   rÝ   rN   Ú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 re   )Úc_test_single_if_negate_globalra   r&   r&   r'   r$   *  s    zDTestBranchPrunePredicates.test_single_if_negate_global.<locals>.funcrd   )rÚ   rÛ   rï   rY   r	   rl   rì   r&   r&   r'   Útest_single_if_negate_global#  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 rp   )Úc_test_single_if_else_globalra   r&   r&   r'   r$   8  s    zBTestBranchPrunePredicates.test_single_if_else_global.<locals>.funcrd   )rÚ   rÛ   rñ   rY   r	   rl   rì   r&   r&   r'   Útest_single_if_else_global1  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 rp   )Ú#c_test_single_if_else_negate_globalra   r&   r&   r'   r$   G  s    zITestBranchPrunePredicates.test_single_if_else_negate_global.<locals>.funcrd   )rÚ   rÛ   ró   rY   r	   rl   rì   r&   r&   r'   Ú!test_single_if_else_negate_global@  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Ÿ   )r1   r5   r&   r&   r'   ÚfooQ  s
    
z6TestBranchPrunePredicates.test_issue_5618.<locals>.foor   g     Ð„@)r   ÚassertPreciseEqualÚpy_func)r3   rõ   r&   r&   r'   Útest_issue_5618O  s    
z)TestBranchPrunePredicates.test_issue_5618N)rZ   r[   r\   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passesr2   Z!define_nopython_lowering_pipelineÚfinalize)r3   ZpmZdpbZtyped_passesZlowering_passesr&   r&   r'   Údefine_pipelinesa  s    z5TestBranchPruneSSA.SSAPrunerCompiler.define_pipelinesN)rZ   r[   r\   rû   r&   r&   r&   r'   ÚSSAPrunerCompiler`  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Úqrh   Úrr&   r&   r'   rc   x  s    z4TestBranchPruneSSA.test_ssa_update_phi.<locals>.impl)NN)r   rü   rö   r÷   rn   r&   r&   r'   Útest_ssa_update_phit  s    
z&TestBranchPruneSSA.test_ssa_update_phic                 C   sf   t | jdddd„ƒ}|  |ƒ | ¡ ¡ |j|jd  jd }|j ¡ D ]}|  	g | 
d¡¢¡ qHd S )Nrý   c                 S   s   d}| d u rd}nd}|S r°   r&   )rþ   rh   r&   r&   r'   rc     s
    z5TestBranchPruneSSA.test_ssa_replace_phi.<locals>.implr   Úpreserved_irÚphi)N)r   rü   rö   r÷   Ú	overloadsÚ
signaturesÚmetadatar0   r1   r    Ú
find_exprs)r3   rc   r!   r4   r&   r&   r'   Útest_ssa_replace_phi‰  s    
	z'TestBranchPruneSSA.test_ssa_replace_phiN)rZ   r[   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 )Nru   r_   rf   )r—   Úshape)r©   r&   r&   r'   rc   ¤  s    
zKTestBranchPrunePostSemanticConstRewrites.test_array_ndim_attr.<locals>.implru   rª   Fr«   r_   Tr:   )ru   )rY   r	   r­   r®   rž   rŸ   rn   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 ndS d S )Nr|   ru   r_   r   ©rE   )Útupr&   r&   r'   rc   ´  s    zETestBranchPrunePostSemanticConstRewrites.test_tuple_len.<locals>.implr|   F©r_   ru   r|   ru   Tr:   r_   )rY   r	   ZUniTuplerÀ   rË   rn   r&   r&   r'   Útest_tuple_len²  s    ÿ
þÿ
þz7TestBranchPrunePostSemanticConstRewrites.test_tuple_lenc                 C   sT   t dd„ ƒ}|  tj¡}|ƒ  W d   ƒ n1 s40    Y  |  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)r3   r  rV   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—   ru   )r—   c                 S   s   | j dkr| j S tƒ  d S )Nru   )r—   Úobject)Úfar&   r&   r'   rc   ×  s    
zMTestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_array.<locals>.implrª   Fr«   r_   )r>   )ÚcollectionsÚ
namedtuplerY   r	   r­   r®   rž   rŸ   ZNamedUniTuplerÀ   Úenable_pyobj_flags)r3   r  r  rc   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'   rc   é  s    zlTestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewrites.<locals>.impl)r   r~   r|   ru   )r_   r_   )r   rž   rŸ   rö   r÷   )r3   rc   rO   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   rE   )rO   ÚsÚargr&   r&   r'   rc   ò  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+   rb   r&   r&   r'   Ú	<setcomp>  r.   zXTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.<setcomp>)r   r   rö   r÷   r  r  r  rH   r0   r1   r  Zfind_variable_assignmentÚrhsÚnameZassertIsInstancer“   r   r’   ÚaddrD   )	r3   rc   ÚinpÚolr!   Zbinop_constsr4   ÚexprÚinstr&   r&   r'   Útest_tuple_const_propagationñ  s    

zETestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagationN)	rZ   r[   r\   r  r  r  r  r  r)  r&   r&   r&   r'   r	  Ÿ  s   r	  )2r  r	   rÍ   Ú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 aB