B
      ›\„F  ã               @   s:  d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZ	d dl
mZ d dl
mZmZmZ d dlmZmZmZ d dlmZ d dlmZ dd	lmZmZ eƒ Ze d
¡ G dd„ deƒZG dd„ dejƒZG dd„ dejƒZe  ej!dkd¡G dd„ dejƒƒZ"G dd„ deeƒZ#G dd„ dejƒZ$e%dkr6e &¡  dS )é    )Úabsolute_importÚdivisionÚprint_functionN)Úunittest_support)ÚnjitÚtargetsÚtyping)Úcompile_isolatedÚFlagsÚtypes)Úrtsys)Únrtopté   )ÚMemoryLeakMixinÚTestCaseZnrtc               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDummyr   c             C   s   t | ƒ jd7  _d S )Nr   )ÚtypeÚalive)Úself© r   ú3lib/python3.7/site-packages/numba/tests/test_nrt.pyÚ__init__   s    zDummy.__init__c             C   s   t | ƒ jd8  _d S )Nr   )r   r   )r   r   r   r   Ú__del__   s    zDummy.__del__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdZdd„ ZdS )ÚTestNrtMemInfoNotInitializedzn
    Unit test for checking the use of the NRT fails if the
    initialization sequence has not been run.
    Fc          
   C   sx   ddddœ}xf|  ¡ D ]Z\}}zH|  t¡}dt_tt|ƒ}||Ž  W d Q R X d}|  |t|jƒ¡ W d dt_X qW d S )Nr   )r   r   )r   )ZlibraryÚmeminfo_newÚmeminfo_allocFz'Runtime must be initialized before use.T)	ÚitemsZassertRaisesÚRuntimeErrorr   Z_initÚgetattrÚassertInÚstrZ	exception)r   ÚmethodsÚmethÚargsZraisesÚfnÚmsgr   r   r   Útest_init_fail&   s    
z+TestNrtMemInfoNotInitialized.test_init_failN)r   r   r   Ú__doc__Z_numba_parallel_test_r)   r   r   r   r   r      s   r   c               @   sd   e Zd ZdZdd„ Zdd„ Zdd„ Ze e	j
dk d	¡d
d„ ƒZe e	j
dk d	¡dd„ ƒZdd„ ZdS )ÚTestNrtMemInfoz2
    Unit test for core MemInfo functionality
    c             C   s   dt _tj t ¡ ¡ d S )Nr   )r   r   r   ZcpuZ
CPUContextr   ZContext)r   r   r   r   ÚsetUp>   s    zTestNrtMemInfo.setUpc             C   s   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ ~|  t jd¡ | ¡  |  |jd¡ |  t jd¡ | ¡  |  |jd¡ ~|  t jd¡ d S )Nr   l   þJ[= é   r   )r   ÚassertEqualr   r   r   ÚrefcountÚacquireÚrelease)r   ÚdÚaddrÚmir   r   r   Útest_meminfo_refct_1D   s    z#TestNrtMemInfo.test_meminfo_refct_1c             C   s´   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ ~|  t jd¡ xtdƒD ]}| ¡  qLW |  |jd¡ |  t jd¡ xtdƒD ]}| ¡  q‚W |  |jd¡ ~|  t jd¡ d S )Nr   l   þJ[= éd   ée   r   )	r   r.   r   r   r   r/   Úranger0   r1   )r   r2   r3   r4   ZctÚ_r   r   r   Útest_meminfo_refct_2U   s     z#TestNrtMemInfo.test_meminfo_refct_2)é   zmemoryview not supportedc             C   s¾   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ t|ƒ}|  |jd¡ |  ||j¡ |  |j	¡ |  
||j¡ |  |j¡ |  |jd¡ |  |jd¡ ~~|  t jd¡ ~|  t jd¡ d S )Nr   l   þJ[= r   )r   r.   r   r   r   r/   Ú
memoryviewÚdataÚassertFalseÚreadonlyÚassertIsÚobjÚ
assertTrueÚc_contiguousÚitemsizeÚndim)r   r2   r3   r4   Úmviewr   r   r   Útest_fake_memoryviewh   s$    z#TestNrtMemInfo.test_fake_memoryviewc             C   st  ddl m}m}m}m} t tj¡}|jd }t	j
|dd}|j}|||jƒ||d ƒƒ}	x"tdƒD ]}
|  |	j|
 d¡ qdW xtdƒD ]}
|
d |	j|
< qˆW t|ƒ}|  |j|¡ |  |j¡ |  ||j¡ |  |j¡ |  |jd¡ |  |jd¡ ~tj||j|j |d}~tj t |j¡d |¡ |d7 }x(tdƒD ]}
|  |	j|
 |
d	 ¡ q>W |  |j j|¡ ~d S )
Nr   )Úc_uint32Úc_void_pÚPOINTERÚcasté
   T)Úsafel   ËK— r   )ÚdtypeÚshapeÚbufferr-   )ÚctypesrH   rI   rJ   rK   ÚnprN   Úuint32rD   r   r   r=   r8   r.   Úcontentsr<   Únbytesr>   r?   r@   rA   rB   rC   rE   ÚndarrayÚtestingÚassert_equalÚarangeÚsize)r   rH   rI   rJ   rK   rN   Úbytesizer4   r3   Úc_arrÚirF   Úarrr   r   r   Útest_memoryview   s6    
zTestNrtMemInfo.test_memoryviewc             C   s0  ddl m}m}m}m} t tj¡}|jd }t	j
|dd}|  |jd¡ |j}|||ƒ||d ƒƒ}	x"tdƒD ]}
|  |	j|
 d¡ qpW xtdƒD ]}
|
d |	j|
< q”W tj|||j |d}|  |jd¡ ~tj t |j¡d |¡ |d7 }x&tdƒD ]}
|  |	j|
 |
d	 ¡ qüW |  |j j|¡ ~d S )
Nr   )rH   rI   rJ   rK   rL   T)rM   r   l   ËK— )rN   rO   rP   r-   )rQ   rH   rI   rJ   rK   rR   rN   rS   rD   r   r   r.   r/   r=   r8   rT   rV   rW   rX   rY   rZ   )r   rH   rI   rJ   rK   rN   r[   r4   r3   r\   r]   r^   r   r   r   Útest_buffer©   s*    
zTestNrtMemInfo.test_bufferN)r   r   r   r*   r,   r5   r:   ÚunittestZskipIfÚsysÚversion_inforG   r_   r`   r   r   r   r   r+   9   s   *r+   )r;   é   z+need Python 3.4+ for the tracemalloc modulec               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestTracemalloczB
    Test NRT-allocated memory can be tracked by tracemalloc.
    c             C   sD   dd l }| ¡  z$| ¡ }|ƒ }| ¡ }~| |d¡S | ¡  X d S )Nr   Úlineno)ÚtracemallocÚstartZtake_snapshotZ
compare_toÚstop)r   Úfuncrg   ZbeforeZresZafterr   r   r   Úmeasure_memory_diffÕ   s    z#TestTracemalloc.measure_memory_diffc                sÒ   d‰ t j‰t‡ ‡fdd„ƒ‰‡fdd„}‡fdd„}|jjd }ˆƒ  |  |¡}|d	 }|  |jˆ ¡ | j|jˆ d
 dd |j	d	 }|  
tj |j¡d¡ |  
|j|¡ |  |¡}|d	 }|  |jˆ d ¡ d S )Ni@B c                  s   t  ˆ ˆ¡S )z<
            Allocate and return a large array.
            )rR   Úemptyr   )ÚNrN   r   r   Úalloc_nrt_memoryæ   s    z7TestTracemalloc.test_snapshot.<locals>.alloc_nrt_memoryc                  s   ˆ ƒ S )Nr   r   )rn   r   r   Úkeep_memoryí   s    z2TestTracemalloc.test_snapshot.<locals>.keep_memoryc                  s
   ˆ ƒ  d S )Nr   r   )rn   r   r   Úrelease_memoryð   s    z5TestTracemalloc.test_snapshot.<locals>.release_memoryr   r   g=
×£p=ð?zpUnexpected allocation overhead encountered. May be due to difference in CPython builds or running under coverage)r(   ztest_nrt.pyg{®Gáz„?)rR   Zint8r   Ú__code__Úco_firstlinenork   ZassertGreaterEqualrZ   Z
assertLessÚ	tracebackr.   ÚosÚpathÚbasenameÚfilenamerf   )r   ro   rp   Zalloc_linenoZdiffÚstatÚframer   )rm   rn   rN   r   Útest_snapshotâ   s$    


zTestTracemalloc.test_snapshotN)r   r   r   r*   rk   rz   r   r   r   r   re   Î   s   re   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestNRTIssuec                sh   t dd„ ƒ‰ t ‡ fdd„ƒ‰t ‡fdd„ƒ}d}tj |df¡}|||ƒ}| ||¡}tj ||¡ d	S )
zO
        GitHub Issue #1244 https://github.com/numba/numba/issues/1244
        c             S   s   | \}}t  |d |d  ¡S )Nr-   )ÚmathZsqrt)ÚvectorÚxÚyr   r   r   Úcalculate_2D_vector_mag  s    zNTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.calculate_2D_vector_magc                s<   t jdt jd}ˆ | ƒ}| \}}|| |d< || |d< |S )Nr-   )rN   r   r   )rR   rl   Úfloat64)r}   Únormalized_vectorZmagr~   r   )r€   r   r   Únormalize_2D_vector  s    zJTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.normalize_2D_vectorc                sZ   t j| dft jd}x@t| ƒD ]4}|| }ˆ |ƒ}|d ||df< |d ||df< qW |S )Nr-   )rN   r   r   )rR   rl   r   r8   )Únum_vectorsZvectorsZnormalized_vectorsr]   r}   r‚   )rƒ   r   r   Únormalize_vectors$  s    zHTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.normalize_vectorsrL   r-   N)r   rR   ZrandomÚpy_funcrW   Zassert_almost_equal)r   r…   r„   Ztest_vectorsÚgotZexpectedr   )r€   rƒ   r   Ú test_issue_with_refct_op_pruning  s    
z-TestNRTIssue.test_issue_with_refct_op_pruningc             C   s`   dd„ }t |dt tjt tjdd¡f¡ƒ}| ¡ \}}|  |d¡ |  |tj	dtjd¡ d S )Nc               S   s   dt jdt jdfS )Ng        r   )rN   )rR   ÚzerosÚint32r   r   r   r   Úf<  s    z.TestNRTIssue.test_incref_after_cast.<locals>.fr   r   ÚCy                )rN   )
r	   r   ZTupleZ
complex128ZArrayrŠ   Zentry_pointZassertPreciseEqualrR   r‰   )r   r‹   ZcresÚzr^   r   r   r   Útest_incref_after_cast9  s    z#TestNRTIssue.test_incref_after_castc             C   sB   t dd„ ƒ}|ƒ \}}tj ||¡ tj |tjdtjd¡ d S )Nc              S   s0   t jdt jd} t jdt jd}| |d d … fS )NrL   )rN   )rR   Úonesr   )ÚaÚbr   r   r   r‹   K  s    z5TestNRTIssue.test_refct_pruning_issue_1511.<locals>.frL   )rN   )r   rR   rW   rX   r   r   )r   r‹   r   r‘   r   r   r   Útest_refct_pruning_issue_1511J  s    
z*TestNRTIssue.test_refct_pruning_issue_1511c             C   sV   t dd„ ƒ}t ddddddddddg
g¡}| |dd¡}||ddƒ}|  ||¡ d S )Nc             S   s`   t  | dk¡}t|d ƒdkr(d}d}n|d d }|d d }|d | }|d | }||fS )Nr   r   )rR   ÚwhereÚlen)Zimager~   r   Znext_locZy_offsetZx_offsetZ
next_loc_xZ
next_loc_yr   r   r   ÚudtV  s    z7TestNRTIssue.test_refct_pruning_issue_1526.<locals>.udtr   r   é   )r   rR   Zarrayr†   r.   )r   r•   r   Zexpectr‡   r   r   r   Útest_refct_pruning_issue_1526U  s
     z*TestNRTIssue.test_refct_pruning_issue_1526N)r   r   r   rˆ   rŽ   r’   r—   r   r   r   r   r{     s   +r{   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestRefCtPruninga¡  
define i32 @"MyFunction"(i8** noalias nocapture %retptr, { i8*, i32 }** noalias nocapture %excinfo, i8* noalias nocapture readnone %env, double %arg.vt.0, double %arg.vt.1, double %arg.vt.2, double %arg.vt.3, double %arg.bounds.0, double %arg.bounds.1, double %arg.bounds.2, double %arg.bounds.3, i8* %arg.xs.0, i8* nocapture readnone %arg.xs.1, i64 %arg.xs.2, i64 %arg.xs.3, double* nocapture readonly %arg.xs.4, i64 %arg.xs.5.0, i64 %arg.xs.6.0, i8* %arg.ys.0, i8* nocapture readnone %arg.ys.1, i64 %arg.ys.2, i64 %arg.ys.3, double* nocapture readonly %arg.ys.4, i64 %arg.ys.5.0, i64 %arg.ys.6.0, i8* %arg.aggs_and_cols.0.0, i8* nocapture readnone %arg.aggs_and_cols.0.1, i64 %arg.aggs_and_cols.0.2, i64 %arg.aggs_and_cols.0.3, i32* nocapture %arg.aggs_and_cols.0.4, i64 %arg.aggs_and_cols.0.5.0, i64 %arg.aggs_and_cols.0.5.1, i64 %arg.aggs_and_cols.0.6.0, i64 %arg.aggs_and_cols.0.6.1) local_unnamed_addr {
entry:
tail call void @NRT_incref(i8* %arg.xs.0)
tail call void @NRT_incref(i8* %arg.ys.0)
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0)
%.251 = icmp sgt i64 %arg.xs.5.0, 0
br i1 %.251, label %B42.preheader, label %B160

B42.preheader:                                    ; preds = %entry
%0 = add i64 %arg.xs.5.0, 1
br label %B42

B42:                                              ; preds = %B40.backedge, %B42.preheader
%lsr.iv3 = phi i64 [ %lsr.iv.next, %B40.backedge ], [ %0, %B42.preheader ]
%lsr.iv1 = phi double* [ %scevgep2, %B40.backedge ], [ %arg.xs.4, %B42.preheader ]
%lsr.iv = phi double* [ %scevgep, %B40.backedge ], [ %arg.ys.4, %B42.preheader ]
%.381 = load double, double* %lsr.iv1, align 8
%.420 = load double, double* %lsr.iv, align 8
%.458 = fcmp ole double %.381, %arg.bounds.1
%not..432 = fcmp oge double %.381, %arg.bounds.0
%"$phi82.1.1" = and i1 %.458, %not..432
br i1 %"$phi82.1.1", label %B84, label %B40.backedge

B84:                                              ; preds = %B42
%.513 = fcmp ole double %.420, %arg.bounds.3
%not..487 = fcmp oge double %.420, %arg.bounds.2
%"$phi106.1.1" = and i1 %.513, %not..487
br i1 %"$phi106.1.1", label %B108.endif.endif.endif, label %B40.backedge

B160:                                             ; preds = %B40.backedge, %entry
tail call void @NRT_decref(i8* %arg.ys.0)
tail call void @NRT_decref(i8* %arg.xs.0)
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0)
store i8* null, i8** %retptr, align 8
ret i32 0

B108.endif.endif.endif:                           ; preds = %B84
%.575 = fmul double %.381, %arg.vt.0
%.583 = fadd double %.575, %arg.vt.1
%.590 = fptosi double %.583 to i64
%.630 = fmul double %.420, %arg.vt.2
%.638 = fadd double %.630, %arg.vt.3
%.645 = fptosi double %.638 to i64
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0)              ; GONE 1
tail call void @NRT_decref(i8* null)                                ; GONE 2
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0), !noalias !0 ; GONE 3
%.62.i.i = icmp slt i64 %.645, 0
%.63.i.i = select i1 %.62.i.i, i64 %arg.aggs_and_cols.0.5.0, i64 0
%.64.i.i = add i64 %.63.i.i, %.645
%.65.i.i = icmp slt i64 %.590, 0
%.66.i.i = select i1 %.65.i.i, i64 %arg.aggs_and_cols.0.5.1, i64 0
%.67.i.i = add i64 %.66.i.i, %.590
%.84.i.i = mul i64 %.64.i.i, %arg.aggs_and_cols.0.5.1
%.87.i.i = add i64 %.67.i.i, %.84.i.i
%.88.i.i = getelementptr i32, i32* %arg.aggs_and_cols.0.4, i64 %.87.i.i
%.89.i.i = load i32, i32* %.88.i.i, align 4, !noalias !3
%.99.i.i = add i32 %.89.i.i, 1
store i32 %.99.i.i, i32* %.88.i.i, align 4, !noalias !3
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0), !noalias !0 ; GONE 4
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0)              ; GONE 5
br label %B40.backedge

B40.backedge:                                     ; preds = %B108.endif.endif.endif, %B84, %B42
%scevgep = getelementptr double, double* %lsr.iv, i64 1
%scevgep2 = getelementptr double, double* %lsr.iv1, i64 1
%lsr.iv.next = add i64 %lsr.iv3, -1
%.294 = icmp sgt i64 %lsr.iv.next, 1
br i1 %.294, label %B42, label %B160
}
    c             C   sþ   | j }t| ¡ ƒ}dd„ |D ƒ}dd„ |D ƒ}t |¡}t| ¡ ƒ}dd„ |D ƒ}dd„ |D ƒ}|  ||¡ |  ||¡ t|ƒt|ƒ }	t|ƒt|ƒ }
|	|
B }|  ||	|
A ¡ d |¡}x"dD ]}d 	|¡}|  
||¡ qÀW |  tt| ¡ ƒƒt|ƒ¡ d S )	Nc             S   s   g | ]}d |kr|‘qS )Ú
NRT_increfr   )Ú.0Úlnr   r   r   ú
<listcomp>º  s    zDTestRefCtPruning.test_refct_pruning_op_recognize.<locals>.<listcomp>c             S   s   g | ]}d |kr|‘qS )Ú
NRT_decrefr   )rš   r›   r   r   r   rœ   »  s    c             S   s   g | ]}d |kr|‘qS )r™   r   )rš   r›   r   r   r   rœ   À  s    c             S   s   g | ]}d |kr|‘qS )r   r   )rš   r›   r   r   r   rœ   Á  s    Ú
)r   r-   r;   rd   é   z	; GONE {})Úsample_llvm_irÚlistÚ
splitlinesr   Z_remove_redundant_nrt_refctZassertNotEqualÚsetr.   ÚjoinÚformatr"   r”   )r   Zinput_irZinput_linesZbefore_increfsZbefore_decrefsZ	output_irZoutput_linesZafter_increfsZafter_decrefsZpruned_increfsZpruned_decrefsZcombinedZpruned_linesr]   Zgoner   r   r   Útest_refct_pruning_op_recognize·  s&    



z0TestRefCtPruning.test_refct_pruning_op_recognizec                s‚   t dd„ ƒ‰t dd„ ƒ‰ t ‡ ‡fdd„ƒ‰t dd‡fd	d
„ƒ}| d¡ t| |jd ¡ƒ}tt d|¡ƒ}|  t	|ƒd¡ dS )ztestcase from #2350c             S   s"   t  |¡s||| f  d7  < d S )Nr   )rR   Úisnan)r~   r   ÚaggÚfieldr   r   r   Ú_append_non_naØ  s    
zITestRefCtPruning.test_refct_pruning_with_branches.<locals>._append_non_nac             S   sB   t  |¡s>t  ||| f ¡r*|||| f< n||| f  |7  < d S )N)rR   r§   )r~   r   r¨   r©   r   r   r   Ú_appendÝ  s    
zBTestRefCtPruning.test_refct_pruning_with_branches.<locals>._appendc                s    ˆ| |||ƒ ˆ | |||ƒ d S )Nr   )r~   r   r¨   r©   )r«   rª   r   r   Úappendå  s    zATestRefCtPruning.test_refct_pruning_with_branches.<locals>.appendT)Zno_cpython_wrapperc                sB   x<t | jd ƒD ]*}x$t | jd ƒD ]}ˆ ||| |ƒ q$W qW d S )Nr   r   )r8   rO   )r^   r©   r]   Új)r¬   r   r   Úextendì  s    zATestRefCtPruning.test_refct_pruning_with_branches.<locals>.extendz(f4[:,::1], f4)r   z!(NRT_incref|NRT_decref)\([^\)]+\)N)
r   Úcompiler#   Zinspect_llvmZ
signaturesr¡   ÚreÚfinditerr.   r”   )r   r®   ZllvmirZrefopsr   )r«   rª   r¬   r   Ú test_refct_pruning_with_branchesÖ  s    
z1TestRefCtPruning.test_refct_pruning_with_branchesN)r   r   r   r    r¦   r²   r   r   r   r   r˜   m  s   Hr˜   Ú__main__)'Z
__future__r   r   r   r|   rt   rb   r°   ZnumpyrR   Znumbar   ra   r   r   r   Znumba.compilerr	   r
   r   Znumba.runtimer   r   Zsupportr   r   Zenable_nrt_flagsr£   Úobjectr   r   r+   Z
skipUnlessrc   re   r{   r˜   r   Úmainr   r   r   r   Ú<module>   s2   

 
=` 
