U
    b»{jÉ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   úS/var/www/html/bwave/python/venv/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ÚwarningZ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)rC   r&   T)r   rD   ©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   rN   Úexpectr   r   r   r   Útest_unhandled_undefinedœ   s    .z TestSSA.test_unhandled_undefinedN)r!   r"   r#   Ú__doc__r-   r2   r:   r<   r>   rD   rF   rM   rR   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%   )rK   Ú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(   ©rY   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&   rO   r0   r1   )r5   Zreshape)Úarrr8   r   r   r   r)   õ   s    
z1TestReportedSSAIssues.test_issue3931.<locals>.foo)r0   r1   )r   rK   Ú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   )rd   rW   ©re   r   r   r)     s
    
z1TestReportedSSAIssues.test_issue3976.<locals>.fooc                    s   ˆ S r   r   rc   rh   r   r   Úol  s    z0TestReportedSSAIssues.test_issue3976.<locals>.olT)r   r   r    )r   r)   ri   r   rh   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   ©rk   rl   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©rd   rg   r   r   r   re   $  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   rq   ©Z
b_is_tupler   r   Úimpl-  s    z>TestReportedSSAIssues.test_issue5219.<locals>.ol.<locals>.impl)N)ro   r   ÚTupleZUniTuple)rd   rg   rs   r   rr   r   ri   )  s    z0TestReportedSSAIssues.test_issue5219.<locals>.olc                    s   ˆ | |ƒ d S r   r   rq   rh   r   r   Ú
test_tuple3  s    z8TestReportedSSAIssues.test_issue5219.<locals>.test_tupler&   )r1   )N)N)r   r   r    )r   ri   ru   r   rh   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 )Nrf   r&   )rH   r   r5   )r(   r8   r   r   r   Úbar;  s    z1TestReportedSSAIssues.test_issue5223.<locals>.barrf   F)r   rK   ÚonesÚflagsZ	writeabler^   r_   r   )r   rw   rd   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   )rK   rL   r`   )ÚqZlinZstencilr   r   r   r)   K  s    

z1TestReportedSSAIssues.test_issue5243.<locals>.foo)r1   r1   )r   r    rK   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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   )rH   r5   )Úmr6   ÚdataZv0Ú_ÚtÚidxr€   rm   r   r   r)   Ž  s     

z>TestReportedSSAIssues.test_issue5493_unneeded_phi.<locals>.foor9   TF)ZforceobjrŽ   )rK   rx   r   r   r^   Úassert_array_equal)r   r•   r)   rQ   Zres1Zres2r   rm   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   )rZ   Ústackr8   r7   r   r   r   r)   ¯  s    zMTestReportedSSAIssues.test_issue5623_equal_statements_in_same_bb.<locals>.foor   iš  Tr&   )rK   rL   r   r^   r™   )r   r)   ÚpythonÚnbrQ   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__rE   ©Ú	__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ÚvaluesrH   ÚlistZ
find_exprsÚappend)r   r…   rJ   Ú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?   )rK   rU   r5   rH   )r6   Zmax_iterrd   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#   rX   r\   ra   rj   rn   rv   rz   r|   r�   r“   rš   rž   r·   r   r   r   r   rT   Ð   s   !&rT   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¢   rE   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   rK   Zaranger¶   r   rH   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¸   )*rS   Úsysr   ÚloggingÚnumpyrK   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   Z_DEBUGÚ	getLoggerZ
ssa_loggerÚsetLevelÚDEBUGÚ
addHandlerÚStreamHandlerÚstderrr   r$   rT   r¸   r   r   r   r   Ú<module>   s0   
 ,  (