o
    iJ                     @   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rke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                   @      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   Q/home/ubuntu/veenaModal/venv/lib/python3.10/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+      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| }|S |}|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   (   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   r5   )Nc                 S   s.   d}| }t | D ]
}||7 }|| 7 }q||fS r6   r7   )r9   r:   dr;   r   r   r    r*   K   s   
z(TestSSA.test_sum_loop_2vars.<locals>.foor   r<   r-   r.   r   r   r    test_sum_loop_2varsJ      
zTestSSA.test_sum_loop_2varsc                 C   r5   )Nc                 S   s4   d}t | D ]}t | D ]}||7 }q||7 }q|S r6   r7   )r9   r:   r;   jr   r   r    r*   X   s   

z%TestSSA.test_sum_2d_loop.<locals>.foor   r<   r-   r.   r   r   r    test_sum_2d_loopW   r@   zTestSSA.test_sum_2d_loopc                 C   s   t dd }|r.| tj}| |d W d    n1 sw   Y  | dt|j n| |d | t	 |
d W d    d S 1 sJw   Y  d S )Nc                 S   s    | r
| dkrd}|S |d7 }|S Nr   r'   r   )r9   r:   r   r   r    r*   e   s   z(TestSSA.check_undefined_var.<locals>.foor'   z!Detected uninitialized variable cr   )r   assertWarnsr   NumbaWarningr!   assertInstrwarningassertRaisesUnboundLocalErrorr   )r   should_warnr*   warnsr   r   r    check_undefined_vard   s   

"zTestSSA.check_undefined_varc                 C   sr   t dd | jdd W d    n1 sw   Y  t dd | jdd W d    d S 1 s2w   Y  d S )NALWAYS_WARN_UNINIT_VARr   F)rK   r'   T)r   rM   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rS|t | k rS|d8 }| | rE| | r-| | r$|d7 }| |  d8  < n| | r5|d7 }| |  d7  < ||7 }| | s||7 }|dkrS|t | k s||fS )Nr'   r   r<      )len)actionsr9   r;   ctr   r   r    r*      s$   z)TestSSA.test_phi_propagation.<locals>.foor'   r3   )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   sh   | r|}|}|}| }d S |r|r|}	d S |}
d S |r0|r&|r"|
}d S |}|S |r,|}| S |}
|S |}d S r   r   )arg1arg2arg3arg4arg5var1var2var3var4var5var6var7var8var9var10r   r   r    	function1   s4   z3TestSSA.test_unhandled_undefined.<locals>.function1r3   r2      r      )r   r   )r   rg   expectr   r   r   r    test_unhandled_undefined   s   .z TestSSA.test_unhandled_undefinedN)r"   r#   r$   __doc__r/   r4   r=   r?   rB   rM   rP   rW   rk   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S )TestReportedSSAIssuesc                 C   s   t dd }| | d S )Nc                  S   s>   t d} t d}t|D ]}d| |< qt|dD ]}qd S r&   )rU   emptyuint32r8   )Vsr;   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      z2TestReportedSSAIssues.test_issue3094.<locals>.doitc                    s   | rd} |S d} |S )NTFr   )predr)   rs   r   r    r*      s
   z1TestReportedSSAIssues.test_issue3094.<locals>.fooFr-   r.   r   rv   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'   rh   r2   r3   )r8   reshape)arrr;   r   r   r    r*      s   
z1TestReportedSSAIssues.test_issue3931.<locals>.foo)r2   r3   )r   rU   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} |}|S d}|S )N   br   )r   rq   r   r   r    r*     s   z1TestReportedSSAIssues.test_issue3976.<locals>.fooc                    s    S r   r   r   r   r   r    ol  rt   z0TestReportedSSAIssues.test_issue3976.<locals>.olT)r   r   r!   )r   r*   r   r   r   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 r6   r   )ABr)   r0   r;   r   r   r    r*     s   z1TestReportedSSAIssues.test_issue3979.<locals>.foo)r'   r3   r   r   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 r6   )
isinstancetupler   r   r   r   r    r   $  s   
z;TestReportedSSAIssues.test_issue5219.<locals>.overload_thisc                    s$   t |tjtjf d fdd	}|S )Nc                    s    du r|d }|S )NTr   r   r   
b_is_tupler   r    impl-  s   z>TestReportedSSAIssues.test_issue5219.<locals>.ol.<locals>.implr   )r   r   TupleUniTuple)r   r   r   r   r   r    r   )  s   z0TestReportedSSAIssues.test_issue5219.<locals>.olc                    s    | | d S r   r   r   r   r   r    
test_tuple3  s   z8TestReportedSSAIssues.test_issue5219.<locals>.test_tupler'   )r3   r   )r   r   r!   )r   r   r   r   r   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 )Nr   r'   )rR   r   r8   )r)   r;   r   r   r    bar;  s   z1TestReportedSSAIssues.test_issue5223.<locals>.barr   F)r   rU   onesflags	writeablerz   r{   r   )r   r   r   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?)r2   r2   )r   r   r   )rU   rV   r|   )qlinstencilr   r   r    r*   K  s   

z1TestReportedSSAIssues.test_issue5243.<locals>.foo)r3   r3   )r   r!   rU   r|   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q|}q|| krq|| }q|S r6   r7   r)   vr9   r;   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   )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q|}q|| krq|| }q|S r   r7   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 )
Nr3   r'   )r'   r'   c                    s   t |dkr|d }n|d }tdt |D ]}| 7 }qtd| D ]$}t|D ]}}|dkr:||d kr7q(|}q(||d krAq(|| }q(q"|S )Nr'   r   )rR   r8   )mr9   datav0_tidxr   r   r   r    r*     s"   


z>TestReportedSSAIssues.test_issue5493_unneeded_phi.<locals>.foor<   TF)forceobjr   )rU   r   r   r   rz   assert_array_equal)r   r   r*   rj   res1res2r   r   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   s8   d}d}| du r|||< |d7 }|||< |d7 }d S d S )Nr   r'   Tr   )ru   stackr;   r:   r   r   r    r*     s   zMTestReportedSSAIssues.test_issue5623_equal_statements_in_same_bb.<locals>.foor   i  Tr'   )rU   rV   r   rz   r   )r   r*   pythonnbrj   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__rO   	__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valuesrR   list
find_exprsappend)r   r   rT   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   sb   t | | f}d}||kr/tt|D ]}tt|D ]
}|| |||f< qq|d7 }||ks|S rC   )rU   rn   r8   rR   )r9   max_iterr   r;   rA   kr   r   r    	while_for  s   zGTestReportedSSAIssues.test_issue5678_non_minimal_phi.<locals>.while_forr<   )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_phic                    s   ddl m} ddlm m} d|ffdd|ddd	G  fd
dd G fdddt}t|ddd }|d d S )Nr   )
FunctionIR)AnalysisPassr   firc                    sF   | j  ^}}|jd}| |} |jd  tj	|j
 d S )Nr>   r   )r   r   scopegetget_definitionr   oprF   r   	UNDEFINEDincoming_values)r   r   r   vardefnrO   r   r    check  s
   
zCTestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.checkFTr   c                       s,   e Zd ZdZdZ fddZfddZdS )zFTestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.SSACheckz3
            Check SSA on variable `d`
            	SSA_Checkc                    s     |  d S r   )r   rO   )r   r   r    r        zOTestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.SSACheck.__init__c                    s    |j  dS )NF)r   )r   r   )r   r   r    r     s   
zOTestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.SSACheck.run_passN)r"   r#   r$   rl   r   r   r   r   )r   r   r   r    SSACheck  s
    r   c                       s   e Zd ZdZ fddZdS )zNTestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.SSACheckPipelinez^Inject SSACheck pass into the default pipeline following the SSA
            pass
            c                    s.   t | jd}d|_| t |  |gS )Nssa_check_custom_pipelineF)r	   r   r   
_finalizedr   r   r   )r   pipeliner   r   r    r     s   z_TestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.SSACheckPipeline.define_pipelinesN)r"   r#   r$   rl   r   r   r   r   r    SSACheckPipeline  s    r   r   c                 S   s    | dk}|r
| d }|o|dkS )Nr   r   r   )r   r:   r>   r   r   r    r   !  s   zETestReportedSSAIssues.test_issue9242_use_not_dom_def.<locals>.py_funcr<   )numba.core.irr   numba.core.compiler_machineryr   r   r
   r   )r   r   r   r   r   r   )r   r   r   r   r    test_issue9242_use_not_dom_def  s   

z4TestReportedSSAIssues.test_issue9242_use_not_dom_defN)r"   r#   r$   rr   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rm      s    !&1rm   c                   @   r   )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>.CloneFoobarAssignmentsclone_foobar_assignments_passc                 S   s   t |  d S r   )r   r   rO   r   r   r    r   <  r   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} | q"q|S )NFfoobarT)r   r   r   
find_instsr   Assigntargetnamer   r   r   insert_after)r   r   mutatedr   to_clone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    CloneFoobarAssignments7  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 )Ncustom_pipelineF)	r	   r   r   r   r   r   r   r   r   r   r  r   r    r   Q  s   zcTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.CustomCompiler.define_pipelinesNr   r   r  r   r    CustomCompilerP  s    r	  r   c                 S   s   | d }|S r&   r   )ry   r   r   r   r    udt]  r+   zGTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.udtr<   r'   r   r   preserved_irzonly one blockc                 S   s   g | ]
}|j jd kr|qS )r   )r   r   ).0stmtr   r   r    
<listcomp>n  s    zNTestSROAIssues.test_issue7258_multiple_assignment_post_SSA.<locals>.<listcomp>r3   z0expected two assignment statements into 'foobar'z5expected the two assignment statements to be the same)r   r   r
   r   rU   aranger   r   rR   r   r   	overloads
signaturesmetadatar   r   r   r   r   )r   r	  r
  ry   nirr   assignsfoobar_assignsr   )r  r  r    +test_issue7258_multiple_assignment_post_SSA1  s2   


z:TestSROAIssues.test_issue7258_multiple_assignment_post_SSAN)r"   r#   r$   r  r   r   r   r    r   ,  s    r   )*rl   sysr   loggingnumpyrU   numbar   r   r   
numba.corer   r   r   r   r   r   r	   r
   r   r   r   r   r   numba.extendingr   numba.tests.supportr   r   r   _DEBUG	getLogger
ssa_loggersetLevelDEBUG
addHandlerStreamHandlerstderrr   r%   rm   r   r   r   r   r    <module>   s2    
 ,  ^