U
    9%e)                     @   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&   X/var/www/html/Darija-Ai-API/env/lib/python3.8/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   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rtd td |  t|| |}
| jrt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 qdstd	qt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 )NP================================================================================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   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   rX   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'   rb      s    Fc                 S   s   | d krdS d S Nr_   r&   r`   r&   r&   r'   rb      s    
   c                 S   s   | dkrdS d S Nre   r_   r&   r`   r&   r&   r'   rb      s    c                 S   s   | dkrd}d S rf   r&   )ra   zr&   r&   r'   rb      s    c                 S   s   d }|}| |krdS d S )Nd   r&   )ra   rg   yr&   r&   r'   rb      s    rX   r	   NoneTypeIntegerLiteralr2   rb   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'   rb      s    z1TestBranchPrune.test_single_if_else.<locals>.implrc   Fre   Trj   rm   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 Nrh   r_   r&   r`   r&   r&   r'   rb      s    z6TestBranchPrune.test_single_if_const_val.<locals>.implrc   Trh   c                 S   s   d| krdS d S rr   r&   r`   r&   r&   r'   rb      s    rj   rm   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 ro   r&   )ra   ri   r&   r&   r'   rb      s    z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implrh      rc   FT  )rX   r	   rl   rk   rm   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   re   r&   )ra   x_is_none_workdeadri   r&   r&   r'   rb      s    zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implrc   Fre   Tc                 S   s$   d}| d krd}n |rd}nd}|S )NFTre   rx   r&   )ra   ry   ri   r&   r&   r'   rb      s    )   re   )rX   r	   rk   rl   r   Z	PYVERSIONrm   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 )Nrh      rw   re   rx   r&   )ra   one_hundredry   rz   ri   r&   r&   r'   rb     s    z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implrc   Fre   Trj   rm   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 )Nrh   r_   rp   r&   )ra   r~   ri   r&   r&   r'   rb   (  s
    zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implre   rh   rX   r	   rl   rm   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 Nre   (   rh     r&   ra   ri   rg   r&   r&   r'   rb   6  s    z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implrc   FTre   rj   rm   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'   rb   H  s    z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTrc   re   )N)rX   r	   Omittedrk   rl   rm   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 )	Nru   c                 S   s,   | dkrd}nd}| dkr d}nd}||fS )Nru   re   r   rh   r   r&   r   r&   r&   r'   rb   \  s    z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   rc   TF)ru   )rX   r	   r   rl   rk   rm   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 )Nre      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	rt
d t
d |  t||  j	rt
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oprN   r?   r@   rA   r   
assertTrue
isinstancer   Constvalue)
r$   Zarg_tysZbit_valr!   rR   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>.checkrc   r^   re   r   )r	   rk   rl   )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>.bugre   r}   r   )rt      )	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    re   _GLOBALr`   r&   r&   r'   rb     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'   rb     s    T)rX   r	   rl   r   )r2   rb   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'   rb     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'   rb     s    Tr   rm   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   re      r&   )arrayr   r&   r&   r'   rb     s
    zRTestBranchPrune.test_redefined_variables_are_not_considered_in_prune.<locals>.implrt   Crc   rt   r{   )NrX   r	   Arrayfloat64rk   r   r   rm   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   re      r&   )r   r   ra   r&   r&   r'   rb     s    z7TestBranchPrune.test_comparison_operators.<locals>.implrt   r   rc   Fr9   r   g      (@)Nr   rm   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 )	Nrt   r}   r   rw      r   re   r   r&   r   ra   r   r   r&   r&   r'   rb     s    zCTestBranchPrune.test_redefinition_analysis_same_block.<locals>.implrt   r   rc   Fr         ?)Nr   rm   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   rw   re   r   r&   r   r&   r&   r'   rb   "  s    
zQTestBranchPrune.test_redefinition_analysis_different_block_can_exec.<locals>.implrt   r   rc   r   r   )Nr   rm   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   rw   r   r&   r   r&   r&   r'   rb   :  s    
zTTestBranchPrune.test_redefinition_analysis_different_block_cannot_exec.<locals>.implrt   r   rc   Tr   g333333?)NNr   rm   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 )Nru   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'   rb   Y  s    zATestBranchPrune.test_closure_and_nonlocal_can_prune.<locals>.implr&   F)rX   rm   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 )Nru   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'   rb   l  s    zDTestBranchPrune.test_closure_and_nonlocal_cannot_prune.<locals>.implr^   )rX   r	   int64rm   r&   r&   r'   &test_closure_and_nonlocal_cannot_prunei  s    z6TestBranchPrune.test_closure_and_nonlocal_cannot_pruneN)rY   rZ   r[   rn   rq   rs   rv   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-     s     zMTestBranchPrunePredicates._literal_const_sample_generator.<locals>.<listcomp>)	co_consts)
__code__rE   r   itemstuplerJ   replacepytypesFunctionTypeglobals)	r2   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&   )ra   _CONST1Z_CONST2r&   r&   r'   rb     s
    zCTestBranchPrunePredicates.test_literal_const_code_gen.<locals>.implr   r   )r^   r{   r   )Nr   r_   r   r}   r_      )r   r   r   rC   )r2   rb   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&   ra   r   r&   r&   r'   rb     s    z<TestBranchPrunePredicates.test_single_if_const.<locals>.implFTr^   rc   _TRUTHY_FALSEYr   rX   r	   rk   r2   rb   c_inprM   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'   rb     s    zCTestBranchPrunePredicates.test_single_if_negate_const.<locals>.implFTr^   rc   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_   rp   r&   r   r&   r&   r'   rb     s    zATestBranchPrunePredicates.test_single_if_else_const.<locals>.implFTr^   rc   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'   rb     s    zHTestBranchPrunePredicates.test_single_if_else_negate_const.<locals>.implFTr^   rc   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 rd   r&   r`   r   r&   r'   r$     s    z>TestBranchPrunePredicates.test_single_if_freevar.<locals>.funcrc   r   r   rX   r	   rk   r2   r   rM   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 rd   r&   r`   r   r&   r'   r$     s    zETestBranchPrunePredicates.test_single_if_negate_freevar.<locals>.funcrc   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 ro   r&   r`   r   r&   r'   r$     s    zCTestBranchPrunePredicates.test_single_if_else_freevar.<locals>.funcrc   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 ro   r&   r`   r   r&   r'   r$     s    zJTestBranchPrunePredicates.test_single_if_else_negate_freevar.<locals>.funcrc   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 rd   )c_test_single_if_globalr`   r&   r&   r'   r$     s    z=TestBranchPrunePredicates.test_single_if_global.<locals>.funcrc   )r   r   r   rX   r	   rk   r2   r   rM   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 rd   )c_test_single_if_negate_globalr`   r&   r&   r'   r$   *  s    zDTestBranchPrunePredicates.test_single_if_negate_global.<locals>.funcrc   )r   r   r   rX   r	   rk   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 ro   )c_test_single_if_else_globalr`   r&   r&   r'   r$   8  s    zBTestBranchPrunePredicates.test_single_if_else_global.<locals>.funcrc   )r   r   r   rX   r	   rk   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 ro   )#c_test_single_if_else_negate_globalr`   r&   r&   r'   r$   G  s    zITestBranchPrunePredicates.test_single_if_else_negate_global.<locals>.funcrc   )r   r   r   rX   r	   rk   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   )r0   r4   r&   r&   r'   fooQ  s
    
z6TestBranchPrunePredicates.test_issue_5618.<locals>.foor   g     Є@)r   assertPreciseEqualpy_func)r2   r   r&   r&   r'   test_issue_5618O  s    
z)TestBranchPrunePredicates.test_issue_5618N)rY   rZ   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passesr1   Z!define_nopython_lowering_pipelinefinalize)r2   pmZdpbZtyped_passesZlowering_passesr&   r&   r'   define_pipelinesa  s    z5TestBranchPruneSSA.SSAPrunerCompiler.define_pipelinesN)rY   rZ   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 krd}|r$|d k	r$d}||fS )Nr^   FTr   r&   )pqrg   rr&   r&   r'   rb   x  s    z4TestBranchPruneSSA.test_ssa_update_phi.<locals>.impl)NN)r   r   r   r   rm   r&   r&   r'   test_ssa_update_phit  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   rg   r&   r&   r'   rb     s
    z5TestBranchPruneSSA.test_ssa_replace_phi.<locals>.implr   preserved_irphi)N)r   r   r   r   	overloads
signaturesmetadatar/   r0   r   
find_exprs)r2   rb   r!   r3   r&   r&   r'   test_ssa_replace_phi  s    
	z'TestBranchPruneSSA.test_ssa_replace_phiN)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 )Nrt   r^   re   )r   shape)r   r&   r&   r'   rb     s    
zKTestBranchPrunePostSemanticConstRewrites.test_array_ndim_attr.<locals>.implrt   r   Fr   r^   Tr9   )rt   )rX   r	   r   r   r   r   rm   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 )Nr{   rt   r^   r   rD   )tupr&   r&   r'   rb     s    zETestBranchPrunePostSemanticConstRewrites.test_tuple_len.<locals>.implr{   Fr^   rt   Tr9   )rX   r	   ZUniTupler   r   rm   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 )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  rU   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   rt   )r   c                 S   s   | j dkr| j S t  d S )Nrt   )r   object)far&   r&   r'   rb     s    
zMTestBranchPrunePostSemanticConstRewrites.test_ndim_not_on_array.<locals>.implr   Fr   r^   )r=   )collections
namedtuplerX   r	   r   r   r   r   ZNamedUniTupler   enable_pyobj_flags)r2   r  r  rb   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'   rb     s    zlTestBranchPrunePostSemanticConstRewrites.test_semantic_const_propagates_before_static_rewrites.<locals>.impl)r   r}   r{   rt   )r^   r^   )r   r   r   r   r   )r2   rb   rN   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   )rN   sargr&   r&   r'   rb     s    zSTestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagation.<locals>.impl)r&   )r^   rt   r{   r&   r   r  Zinplace_binopc                 S   s   h | ]}t |qS r&   r  )r+   ra   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   rb   Zinpolr!   Zbinop_constsr3   exprinstr&   r&   r'   test_tuple_const_propagation  s    

zETestBranchPrunePostSemanticConstRewrites.test_tuple_const_propagationN)	rY   rZ   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