U
    9%eC                     @   s  d Z ddlZddlZddlZddlZddlmZmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZ dZeredZ e j!ej"d e #e$ej% G dd deZ&G dd de&Z'G dd de&Z(G dd deeZ)dS )z
Tests for SSA reconstruction
    N)njitjittypes)errorsir)FunctionPassregister_pass)DefaultPassBuilderCompilerBase)ReconstructSSA
PreserveIR)NativeLowering)overload)MemoryLeakMixinTestCaseoverride_configFznumba.core.ssa)levelc                   @   s   e Zd Zdd ZdS )SSABaseTestc                 G   s.   |t | }|jt | }| || d S N)copydeepcopypy_funcassertEqual)selffuncargsgotexp r   S/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_ssa.py
check_func   s    zSSABaseTest.check_funcN)__name__
__module____qualname__r    r   r   r   r   r      s   r   c                   @   sX   e 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S )TestSSAz8
    Contains tests to help isolate problems in SSA
    c                 C   s   t dd }| |d d S )Nc                 S   s   | d7 } | S N   r   xr   r   r   foo+   s    z.TestSSA.test_argument_name_reused.<locals>.foo{   r   r    r   r)   r   r   r   test_argument_name_reused*   s    
z!TestSSA.test_argument_name_reusedc                 C   s,   t dd }| |dd | |dd d S )Nc                 S   s   | | }| |k r| }n|}|S r   r   )r(   yzr   r   r   r)   3   s
    z*TestSSA.test_if_else_redefine.<locals>.foo      r+   r,   r   r   r   test_if_else_redefine2   s    
zTestSSA.test_if_else_redefinec                 C   s(   t dd }| |d | |d d S )Nc                 S   s   d}t | D ]}||7 }q|S Nr   range)ncir   r   r   r)   @   s    
z"TestSSA.test_sum_loop.<locals>.foor   
   r+   r,   r   r   r   test_sum_loop?   s    
zTestSSA.test_sum_loopc                 C   s(   t dd }| |d | |d d S )Nc                 S   s.   d}| }t | D ]}||7 }|| 7 }q||fS r3   r4   )r6   r7   dr8   r   r   r   r)   K   s    
z(TestSSA.test_sum_loop_2vars.<locals>.foor   r9   r+   r,   r   r   r   test_sum_loop_2varsJ   s    
zTestSSA.test_sum_loop_2varsc                 C   s(   t dd }| |d | |d d S )Nc                 S   s4   d}t | D ]"}t | D ]}||7 }q||7 }q|S r3   r4   )r6   r7   r8   jr   r   r   r)   X   s    

z%TestSSA.test_sum_2d_loop.<locals>.foor   r9   r+   r,   r   r   r   test_sum_2d_loopW   s    
zTestSSA.test_sum_2d_loopc              	   C   sx   t dd }|rH| tj}| |d W 5 Q R X | dt|j n| |d | t	 |
d W 5 Q R X d S )Nc                 S   s$   | r| dkrd}|S |d7 }|S d S Nr   r&   r   )r6   r7   r   r   r   r)   e   s    z(TestSSA.check_undefined_var.<locals>.foor&   z!Detected uninitialized variable cr   )r   ZassertWarnsr   ZNumbaWarningr    ZassertInstrwarningassertRaisesUnboundLocalErrorr   )r   should_warnr)   Zwarnsr   r   r   check_undefined_vard   s    

zTestSSA.check_undefined_varc              	   C   sH   t dd | jdd W 5 Q R X t dd | jdd W 5 Q R X d S )NZALWAYS_WARN_UNINIT_VARr   F)rD   r&   T)r   rE   r   r   r   r   test_undefined_var|   s    zTestSSA.test_undefined_varc                 C   s&   t dd }| |tddg d S )Nc                 S   s   d}d}d}|dkr|t | k r|d8 }| | r| | rZ| | rH|d7 }| |  d8  < n | | rj|d7 }| |  d7  < ||7 }q(||7 }q||fS )Nr&   r   r9      )len)actionsr6   r8   ctr   r   r   r)      s     

z)TestSSA.test_phi_propagation.<locals>.foor&   r1   )r   r    nparrayr,   r   r   r   test_phi_propagation   s    
zTestSSA.test_phi_propagationc                 C   s<   dd }|ddddd}t |ddddd}| || d S )Nc                 S   s   | r|}|}|}| }d S |r4|r(|}	d S |}
d S |
S |rp|rT|rH|
}d S |}|S d S |r`|}| S |}
|S d S d S |}d S |S |}|}|S d S r   r   )Zarg1Zarg2Zarg3Zarg4Zarg5Zvar1Zvar2Zvar3Zvar4Zvar5Zvar6Zvar7Zvar8Zvar9Zvar10r   r   r   	function1   sD    z3TestSSA.test_unhandled_undefined.<locals>.function1r1   r0      r      )r   r   )r   rO   expectr   r   r   r   test_unhandled_undefined   s    .z TestSSA.test_unhandled_undefinedN)r!   r"   r#   __doc__r-   r2   r:   r<   r>   rE   rG   rN   rS   r   r   r   r   r$   %   s   r$   c                   @   st   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S )TestReportedSSAIssuesc                 C   s   t dd }| | d S )Nc                  S   s>   t d} t d}t|D ]}d| |< qt|dD ]}q4d S r%   )rL   emptyZuint32r5   )Vsr8   r   r   r   r)      s    


z1TestReportedSSAIssues.test_issue2194.<locals>.foor+   r,   r   r   r   test_issue2194   s    
	z$TestReportedSSAIssues.test_issue2194c                    s,   t dd  t  fdd}| |d d S )Nc                 S   s   | S r   r   r'   r   r   r   doit   s    z2TestReportedSSAIssues.test_issue3094.<locals>.doitc                    s   | r
d}nd} |S )NTFr   )predr(   rZ   r   r   r)      s    z1TestReportedSSAIssues.test_issue3094.<locals>.fooFr+   r,   r   r\   r   test_issue3094   s
    
z$TestReportedSSAIssues.test_issue3094c                 C   s4   t dd }tj|td|td d S )Nc                 S   s(   t dD ]}| d} | dd} q| S )Nr&   rP   r0   r1   )r5   Zreshape)arrr8   r   r   r   r)      s    
z1TestReportedSSAIssues.test_issue3931.<locals>.foo)r0   r1   )r   rL   testingassert_allclosezerosr   r,   r   r   r   test_issue3931   s
    
z$TestReportedSSAIssues.test_issue3931c                    s<   dd  t  fdd}t  fdd}| |d d S )Nc                 S   s   dS )Ndummyr   ar   r   r   overload_this  s    z;TestReportedSSAIssues.test_issue3976.<locals>.overload_thisc                    s   | rd} |}nd}|S )N   br   )re   rX   rf   r   r   r)     s
    
z1TestReportedSSAIssues.test_issue3976.<locals>.fooc                    s    S r   r   rd   ri   r   r   ol  s    z0TestReportedSSAIssues.test_issue3976.<locals>.olT)r   r   r    )r   r)   rj   r   ri   r   test_issue3976   s    	z$TestReportedSSAIssues.test_issue3976c                 C   s   t dd }| |dd d S )Nc                 S   s4   | d }|d }| D ]}|}q|D ]}|}q"||fS r3   r   )ABr(   r.   r8   r   r   r   r)     s    z1TestReportedSSAIssues.test_issue3979.<locals>.foo)r&   r1   rl   rm   r+   r,   r   r   r   test_issue3979  s    
	z$TestReportedSSAIssues.test_issue3979c                    s>   d	dd t  d
dd}t fdd}| |dd d S )Nc                 S   s   t |tr|d }|S r3   )
isinstancetuplere   rh   r   r   r   rf   $  s    
z;TestReportedSSAIssues.test_issue5219.<locals>.overload_thisc                    s$   t |tjtjf d fdd	}|S )Nc                    s    dkr|d }|S )NTr   r   rr   Z
b_is_tupler   r   impl-  s    z>TestReportedSSAIssues.test_issue5219.<locals>.ol.<locals>.impl)N)rp   r   TupleZUniTuple)re   rh   rt   r   rs   r   rj   )  s    z0TestReportedSSAIssues.test_issue5219.<locals>.olc                    s    | | d S r   r   rr   ri   r   r   
test_tuple3  s    z8TestReportedSSAIssues.test_issue5219.<locals>.test_tupler&   )r1   )N)N)r   r   r    )r   rj   rv   r   ri   r   test_issue5219"  s    
	z$TestReportedSSAIssues.test_issue5219c                 C   s:   t dd }td}d|j_tj|||| d S )Nc                 S   s>   t | dkr| S |  } tt | D ]}| |  d7  < q$| S )Nrg   r&   )rI   r   r5   )r(   r8   r   r   r   bar;  s    z1TestReportedSSAIssues.test_issue5223.<locals>.barrg   F)r   rL   onesflagsZ	writeabler_   r`   r   )r   rx   re   r   r   r   test_issue52239  s
    

z$TestReportedSSAIssues.test_issue5223c                 C   s"   t dd }| |td d S )Nc                 S   s(   t d}t d}| d |d< |d S )N)g?g333333?g333333?)r0   r0   )r   r   r   )rL   rM   ra   )qZlinZstencilr   r   r   r)   K  s    

z1TestReportedSSAIssues.test_issue5243.<locals>.foo)r1   r1   )r   r    rL   ra   r,   r   r   r   test_issue5243I  s    
z$TestReportedSSAIssues.test_issue5243c                 C   s   t ddd }d S )N(intp, intp, intp)c                 S   s<   t |D ].}|dkr$|| krq6|}q|| kr.q|| }q|S r3   r4   r(   vr6   r8   problematicr   r   r   r)   W  s    
zGTestReportedSSAIssues.test_issue5482_missing_variable_init.<locals>.foo)r   r,   r   r   r   $test_issue5482_missing_variable_initT  s    z:TestReportedSSAIssues.test_issue5482_missing_variable_initc                    s`   ddl m}m  ddlmm ddlm G  fddd|}tdd|d	d
d }d S )Nr   r
   r	   )r   IRProcessing)PreLowerStripPhisc                       s   e Zd Z fddZdS )zWTestReportedSSAIssues.test_issue5482_objmode_expr_null_lowering.<locals>.CustomPipelinec                    s2     | j}| | |  |gS r   )Zdefine_objectmode_pipelinestateadd_pass_afterfinalizer   pmr	   r   r   r   r   r   define_pipelineso  s
    zhTestReportedSSAIssues.test_issue5482_objmode_expr_null_lowering.<locals>.CustomPipeline.define_pipelinesNr!   r"   r#   r   r   r   r   r   CustomPipelinen  s   r   r~   F)loopliftpipeline_classc                 S   s<   t |D ].}||kr$|| krq6|}q|| kr.q|| }q|S r   r4   r   r   r   r   r)   w  s    
zLTestReportedSSAIssues.test_issue5482_objmode_expr_null_lowering.<locals>.foo)	numba.core.compilerr
   r	   numba.core.untyped_passesr   r   numba.core.typed_passesr   r   )r   r
   r   r)   r   r   r   )test_issue5482_objmode_expr_null_loweringf  s    	z?TestReportedSSAIssues.test_issue5482_objmode_expr_null_loweringc                    s   t dt df}t d t d fdd}|dd|}t|dd|}tddd	|dd|}t j|| t j|| d S )
Nr1   r&   )r&   r&   c                    s   t |dkr|d }n$|d }tdt |D ]}| 7 }q,td| D ]H}t|D ]:}}|dkrt||d krnq|}qP||d krqP|| }qPqD|S )Nr&   r   )rI   r5   )mr6   dataZv0_tidxr   rn   r   r   r)     s     

z>TestReportedSSAIssues.test_issue5493_unneeded_phi.<locals>.foor9   TF)Zforceobjr   )rL   ry   r   r   r_   assert_array_equal)r   r   r)   rR   Zres1Zres2r   rn   r   test_issue5493_unneeded_phi  s    

z1TestReportedSSAIssues.test_issue5493_unneeded_phic                 C   sj   dd }t ddg}|d| t ddg}t|d| t ddg}t j|| t j|| d S )Nc                 S   s4   d}d}| dkr0|||< |d7 }|||< |d7 }d S )Nr   r&   Tr   )r[   stackr8   r7   r   r   r   r)     s    zMTestReportedSSAIssues.test_issue5623_equal_statements_in_same_bb.<locals>.foor   i  Tr&   )rL   rM   r   r_   r   )r   r)   pythonnbrR   r   r   r   *test_issue5623_equal_statements_in_same_bb  s    

z@TestReportedSSAIssues.test_issue5623_equal_statements_in_same_bbc                    s   ddl m}m ddlmm}m} g |dddG fddd| G  fd	d
d
|}t|dddd}|d|	d 
dg d S )Nr   r   )r   r   r   FT)mutates_CFGanalysis_onlyc                       s4   e Zd Zjjd Z fddZfddZ  ZS )zMTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.CheckSSAMinimalz.CheckSSAMinimalc                    s   t  |  d S r   )super__init__rF   	__class__r   r   r     s    zVTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.CheckSSAMinimal.__init__c                    s:   d}|j j D ]}|tt|d7 }q | dS )Nr   phiT)func_irblocksvaluesrI   listZ
find_exprsappend)r   r   rK   blk)phi_counterr   r   run_pass  s
    
zVTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.CheckSSAMinimal.run_pass)r!   r"   r#   r   _namer   r   __classcell__r   )r   r   r   r   CheckSSAMinimal  s   r   c                       s   e Zd Z fddZdS )zLTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.CustomPipelinec                    s&    | j}|  |  |gS r   )define_nopython_pipeliner   r   r   r   r   r	   r   r   r   r     s    z]TestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.CustomPipeline.define_pipelinesNr   r   r   r   r   r     s   r   r   r&   c                 S   s\   t | | f}d}||krXtt|D ]&}tt|D ]}|| |||f< q6q&|d7 }q|S r?   )rL   rV   r5   rI   )r6   Zmax_iterre   r8   r=   kr   r   r   	while_for  s    
zGTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.while_forr9   )r&   )r   r
   r	   r   r   r   r   r   assertPreciseEqualr   r   )r   r
   r   r   r   r   r   )r   r	   r   r   r   r   test_issue5678_non_minimal_phi  s    
z4TestReportedSSAIssues.test_issue5678_non_minimal_phiN)r!   r"   r#   rY   r]   rb   rk   ro   rw   r{   r}   r   r   r   r   r   r   r   r   r   rU      s   !&rU   c                   @   s   e Zd Zdd ZdS )TestSROAIssuesc                    s  g t dddG fdddt G  fdddt}t|dd	d
 }td}| |||d  | td | d j	j
d |j|jd  jd }| t|jdd |j \}|tj}dd |D }| t|dd | |d |d d d S )NFT)r   r   c                       s$   e Zd ZdZdd Z fddZdS )zZTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CloneFoobarAssignmentsZclone_foobar_assignments_passc                 S   s   t |  d S r   )r   r   rF   r   r   r   r     s    zcTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CloneFoobarAssignments.__init__c                    st   d}|j j D ]^}g }|tjD ]}|jjdkr$|| q$|D ](}t	
|}||| d} | qDq|S )NFfoobarT)r   r   r   
find_instsr   Assigntargetnamer   r   r   Zinsert_after)r   r   Zmutatedr   Zto_cloneZassigncloneclonedr   r   r   	  s    
zcTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CloneFoobarAssignments.run_passN)r!   r"   r#   r   r   r   r   r   r   r   CloneFoobarAssignments  s   r   c                       s   e Zd Z fddZdS )zRTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CustomCompilerc                    s:   t | jd}d|_| t |tt |  |gS )NZcustom_pipelineF)	r	   r   r   Z
_finalizedr   r   r   r   r   r   r   r   r   r     s     zcTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CustomCompiler.define_pipelinesNr   r   r   r   r   CustomCompiler  s   r   r   c                 S   s   | d }|S r%   r   )r^   r   r   r   r   udt'  s    zGTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.udtr9   r&   r   r   Zpreserved_irzonly one blockc                 S   s   g | ]}|j jd kr|qS )r   )r   r   ).0stmtr   r   r   
<listcomp>8  s    zNTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.<listcomp>r1   z0expected two assignment statements into 'foobar'z5expected the two assignment statements to be the same)r   r   r
   r   rL   Zaranger   r   rI   r   r   Z	overloadsZ
signaturesmetadatar   r   r   r   r   )r   r   r   r^   Znirr   ZassignsZfoobar_assignsr   )r   r   r   +test_issue7258_multiple_assignment_post_SSA  s6    


  z:TestSROAIssues.test_issue7258_multiple_assignment_post_SSAN)r!   r"   r#   r   r   r   r   r   r     s   r   )*rT   sysr   loggingnumpyrL   Znumbar   r   r   Z
numba.corer   r   Znumba.core.compiler_machineryr   r   r   r	   r
   r   r   r   r   r   Znumba.extendingr   Znumba.tests.supportr   r   r   _DEBUG	getLoggerZ
ssa_loggersetLevelDEBUG
addHandlerStreamHandlerstderrr   r$   rU   r   r   r   r   r   <module>   s0   
 ,  (