U
    iâËd1  ã                   @   sÒ   d dl mZmZ d dl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 d dlmZ d dlmZ d dlZd dlZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ dejƒZe dkrÎe !¡  dS )é    )ÚjitÚnjit)ÚtypesÚtypingÚirÚconfigÚcompilerÚcpu)Ú
cpu_target)Útype_annotations)Úcopy_propagateÚapply_copy_propagateÚget_name_var_table)Útype_inference_stage)ÚIRPreservingTestPipelineNc                 C   s.   d}|}| dkr|| }nd}d| }|| k S )Né   r   é   © )ÚbÚzÚwÚxÚx1ÚyÚar   r   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_copy_propagate.pyÚtest_will_propagate   s    
r   c                 C   s.   d}| dkr|| }d}nd}d| }|| k S )Nr   r   é   r   r   )r   r   r   r   r   r   r   r   r   Útest_wont_propagate   s    r   c                 C   s   d S )Nr   )r   r   ÚcÚdr   r   r   Ú	null_func(   s    r!   c                 C   s   | D ]}|j |kr dS qdS ©NTF)Úname)Zlist_varÚvarÚir   r   r   Ú	inListVar,   s    
r&   c                 C   s^   | j  ¡ D ]N\}}t|jƒD ]:\}}t|tjƒr|jj|kr| 	¡ }t
||ƒr  dS qq
dS r"   )ÚblocksÚitemsÚ	enumerateÚbodyÚ
isinstancer   ÚAssignÚtargetr#   Z	list_varsr&   )Úfunc_irr$   ÚlabelÚblockr%   ÚinstZall_varr   r   r   Ú
findAssign3   s    
r2   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestCopyPropagatec                 C   sÆ   t  ¡ }t |d¡}t t¡}t ||¡�’ | 	¡  | 	¡  t
jt
jt
jf}t||||d ƒ\}}}}tj|||dd ||tjd�}	t|j|ƒ\}
}t|j|
t|jƒ||ƒ |  t|dƒ¡ W 5 Q R X d S )Nr	   r   ©r.   ÚtypemapÚ	calltypesZliftedZlifted_fromÚargsÚreturn_typeZhtml_outputr   )r   ÚContextr	   Ú
CPUContextr   Úrun_frontendr   r
   Únested_contextÚrefreshr   Úint64r   r   ÚTypeAnnotationr   ÚHTMLr   r'   r   r   ZassertFalser2   ©ÚselfZ	typingctxZ	targetctxZtest_irr7   r5   r8   r6   Ú_Ztype_annotationZin_cpsZout_cpsr   r   r   Útest1?   s<    
üø	 þzTestCopyPropagate.test1c                 C   sÆ   t  ¡ }t |d¡}t t¡}t ||¡�’ | 	¡  | 	¡  t
jt
jt
jf}t||||d ƒ\}}}}tj|||dd ||tjd�}	t|j|ƒ\}
}t|j|
t|jƒ||ƒ |  t|dƒ¡ W 5 Q R X d S )Nr	   r   r4   r   )r   r9   r	   r:   r   r;   r   r
   r<   r=   r   r>   r   r   r?   r   r@   r   r'   r   r   Ú
assertTruer2   rA   r   r   r   Útest2\   s4    
üø	zTestCopyPropagate.test2c                 C   sÎ   dd„ }t td�|ƒ}|  |dƒ|dƒ¡ |j|jd  jd }|  t|jƒdk¡ t	t
|j ¡ ƒƒ}d}|jD ]N}t|tjƒrp|jjd	krpd
}|  t|jtjƒoº|jjdkoº|jjjdk¡ qp|  |¡ dS )z”make sure Interpreter._remove_unused_temporaries() has removed extra copies
        in the IR in simple cases so copy propagation is faster
        c                 S   s   | d }|S )Nr   r   )r   r   r   r   r   Ú	test_impl{   s    z?TestCopyPropagate.test_input_ir_extra_copies.<locals>.test_impl)Zpipeline_classé   r   Zpreserved_irr   Fr   TZbinopr   N)r   r   ÚassertEqualZ	overloadsZ
signaturesÚmetadatarE   Úlenr'   ÚnextÚiterÚvaluesr*   r+   r   r,   r-   r#   ÚvalueÚExprÚopÚlhs)rB   rG   Zj_funcZfirr0   Zb_foundÚstmtr   r   r   Útest_input_ir_extra_copiesw   s     

ÿÿz,TestCopyPropagate.test_input_ir_extra_copiesc                 C   s”   dd„ }dd„ }dd„ }G dd„ dƒ}|   |d	ƒt|ƒd	ƒ¡ |   |t d
¡dd	ƒt|ƒt d
¡dd	ƒ¡ |   ||ƒ d	ƒtdd�|ƒ|ƒ d	ƒ¡ dS )z„make sure Interpreter._remove_unused_temporaries() does not generate
        invalid code for rare chained assignment cases
        c                 S   s   | d  }}||fS )Nr   r   )r   r   r   r   r   r   Úimpl1”   s    zDTestCopyPropagate.test_input_ir_copy_remove_transform.<locals>.impl1c                 S   s    |d  }| |< || | d fS ©Nr   r   r   )ÚAr%   r   r   r   r   r   Úimpl2™   s    zDTestCopyPropagate.test_input_ir_copy_remove_transform.<locals>.impl2c                 S   s   |d  }| _ || j d fS rV   )r   )rW   r   r   r   r   r   Úimpl3ž   s    zDTestCopyPropagate.test_input_ir_copy_remove_transform.<locals>.impl3c                   @   s   e Zd ZdS )z@TestCopyPropagate.test_input_ir_copy_remove_transform.<locals>.CN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚC¢   s   r]   rH   r   r   T)ZforceobjN)rI   r   ÚnpZonesr   )rB   rU   rX   rY   r]   r   r   r   Ú#test_input_ir_copy_remove_transform�   s    ,z5TestCopyPropagate.test_input_ir_copy_remove_transformN)rZ   r[   r\   rD   rF   rT   r_   r   r   r   r   r3   >   s   r3   Ú__main__)"Znumbar   r   Z
numba.corer   r   r   r   r   r	   Znumba.core.registryr
   Znumba.core.annotationsr   Znumba.core.ir_utilsr   r   r   Znumba.core.typed_passesr   Znumba.tests.supportr   Únumpyr^   Zunittestr   r   r!   r&   r2   ZTestCaser3   rZ   Úmainr   r   r   r   Ú<module>   s     l