U
    iâËdÉC  ã                   @   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rÖe 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   úM/home/sam/Atlas/atlas_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r‚qP|| }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   
 ,  (