o
    ñ¹itT  ã                   @   sú   d dl Z d dlmZ d dlmZ d dlmZ d dlm  m	Z
 d dlmZ dd„ ZG dd	„ d	ƒZG d
d„ deƒZe d¡ ¡ ZG dd„ deeƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkr{e  ¡  dS dS )é    N)Úir)Úbinding)ÚTestCase)Úopaque_pointers_enabledc                 #   sD    ‡ fdd„}t j ¡ D ]\}}| d¡rd|› ||ƒfV  qd S )Nc                    s(   ‡ ‡fdd„}dˆ j › dˆ j› |_|S )Nc                    s
   ˆ| ˆ ƒS ©N© )Úself)ÚfnÚgenerate_testr   úY/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/llvmlite/tests/test_refprune.pyÚwrapped   s   
z-_iterate_cases.<locals>.wrap.<locals>.wrappedzgenerated test for Ú.)Ú
__module__Ú__name__Ú__doc__)r	   r   ©r
   )r	   r   Úwrap   s   z_iterate_cases.<locals>.wrapÚcaseÚtest_)ÚprotoÚ__dict__ÚitemsÚ
startswith)r
   r   ÚkÚcase_fnr   r   r   Ú_iterate_cases   s   €
€þr   c                   @   s   e Zd Zdd„ ZdS )ÚPassManagerMixinc                 C   s0   t  ¡  t j ¡  ¡ }t jddd}t  ||¡S )Nr   )Úspeed_levelÚ
size_level)ÚllvmÚinitialize_native_targetÚTargetÚfrom_default_tripleÚcreate_target_machineÚcreate_pipeline_tuning_optionsÚcreate_pass_builder)r   ÚtmÚptor   r   r   Úpb   s   zPassManagerMixin.pbN)r   r   Ú__qualname__r(   r   r   r   r   r      s    r   c                   @   s4   e Zd ZdZdd„ ZeeƒD ]	\ZZeeƒ e< qdS )ÚTestRefPrunePrototypez-
    Test that the prototype is working.
    c                 C   s,   |ƒ \}}}t  ||¡ ¡ }|  ||¡ d S r   )r   ÚFanoutAlgorithmÚrunÚassertEqual)r   Úcase_genÚnodesÚedgesÚexpectedÚgotr   r   r   r
   '   s   z#TestRefPrunePrototype.generate_testN)	r   r   r)   r   r
   r   Únamer   Úlocalsr   r   r   r   r*   #   s    ÿr*   é   c                   @   sœ   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d„ ZeeƒD ]	\ZZeeƒ e< q2eeƒD ]\ZZeeƒ ed < q@dS )ÚTestRefPrunePasszß
    Test that the C++ implementation matches the expected behavior as for
    the prototype.

    This generates a LLVM module for each test case, runs the pruner and checks
    that the expected results are achieved.
    c                 C   ó"   t  t  ¡ tg¡}t j||ddS )NÚ
NRT_incref©r3   ©r   ÚFunctionTypeÚVoidTypeÚptr_tyÚFunction©r   ÚmÚfntyr   r   r   Úmake_incref=   ó   zTestRefPrunePass.make_increfc                 C   r7   )NÚ
NRT_decrefr9   r:   r?   r   r   r   Úmake_decrefA   rC   zTestRefPrunePass.make_decrefc                 C   ó"   t  t  d¡d¡}t j||ddS )Né    r   Úswitcherr9   ©r   r;   ÚIntTyper>   r?   r   r   r   Úmake_switcherE   rC   zTestRefPrunePass.make_switcherc                 C   rF   )Né   r   Úbrancherr9   rI   r?   r   r   r   Úmake_brancherI   rC   zTestRefPrunePass.make_brancherc                 C   s¶  t  ¡ }|  |¡}|  |¡}|  |¡}|  |¡}t  t  ¡ tg¡}t j	||dd}	|	j
\}
d|
_i }|D ]	}|	 |¡||< q4t  ¡ }| ¡ D ]’\}}| || ¡ || D ]}|dkrc| ||
g¡ qU|dkro| ||
g¡ qUtdƒ‚t|ƒ}|dkr€| ¡  qF|dkr|\}| || ¡ qF|d	kr©|\}}| |d
¡}| ||| || ¡ qF|d	krÕ| |d
¡}|^}}|j||| d}t|ƒD ]\}}| | |¡|| ¡ qÄqFtdƒ‚|S )NÚmainr9   ÚmemÚincrefÚdecrefÚunreachabler   rL   é   r   )Údefault)r   ÚModulerB   rE   rK   rN   r;   r<   r=   r>   Úargsr3   Úappend_basic_blockÚ	IRBuilderr   Úposition_at_endÚcallÚAssertionErrorÚlenÚret_voidÚbranchÚcbranchÚswitchÚ	enumerateÚadd_caseÚtype)r   r/   r0   r@   Ú	incref_fnÚ	decref_fnÚswitcher_fnÚbrancher_fnrA   r	   ÚptrÚbbmapÚbbÚbuilderÚjump_targetsÚactionÚ	n_targetsÚdstÚleftÚrightÚselÚheadÚtailÚswÚir   r   r   Úgenerate_irM   sP   




ÿzTestRefPrunePass.generate_irc                 C   s6   t  t|ƒ¡}|  ¡ }| ¡ }| ¡  | ||¡ |S r   )r   Úparse_assemblyÚstrr(   ÚgetModulePassManagerÚadd_refprune_passr,   )r   ÚirmodÚmodr(   Úpmr   r   r   Úapply_refpruneƒ   s   zTestRefPrunePass.apply_refprunec                 C   s,   t  t|ƒ¡}t  ¡ }| ¡  | |¡ |S r   )r   ry   rz   ÚModulePassManagerr|   r,   )r   r}   r~   r   r   r   r   Úapply_refprune_legacy‹   s
   
z&TestRefPrunePass.apply_refprune_legacyc                 C   s
  i }|  ¡ D ]\}}| d¡}| d¡}||dœ||< q|  ¡ D ]"\}}	| |¡rB|	d  d8  < || D ]}
||
 d  d8  < q5q |jD ]	}|jdkrO nqF|jD ]/}||j }	t|ƒ}| d¡}| d¡}| j|	d |d|› d	 | j|	d |d|› d	 qSd S )
NrQ   rR   )rQ   rR   rL   rO   r8   rD   zBB )Úmsg)r   ÚcountÚgetÚ	functionsr3   Úblocksrz   r-   )r   r~   r1   r/   Údr   ÚvsÚn_increfÚn_decrefÚstatsÚdec_bbÚfrk   Útextr   r   r   Úcheck’   s.   


€

ÿ



úzTestRefPrunePass.checkc                 C   ó4   |ƒ \}}}|   ||¡}|  |¡}|  |||¡ d S r   )rx   r€   r   ©r   r.   r/   r0   r1   r}   Úoutmodr   r   r   r
   ¬   ó   
zTestRefPrunePass.generate_testc                 C   r‘   r   )rx   r‚   r   r’   r   r   r   Úgenerate_test_legacy²   r”   z%TestRefPrunePass.generate_test_legacyÚ_legacyN)r   r   r)   r   rB   rE   rK   rN   rx   r€   r‚   r   r
   r•   r   r3   r   r4   r   r   r   r   r6   4   s"    6ÿr6   c                   @   s(   e Zd ZdZdZddd„Zddd„ZdS )	ÚBaseTestByIRr   zG
declare void @NRT_incref(i8* %ptr)
declare void @NRT_decref(i8* %ptr)
Nc                 C   st   t  | j› d|› ¡}|  ¡ }| ¡ }|d u r| | j¡ n|j| j|d t  ¡ }| ||¡ t  ¡ }||| fS ©NÚ
©Úsubgraph_limit)	r   ry   Úprologuer(   r{   r|   Úrefprune_bitmaskÚdump_refprune_statsr,   )r   r}   r›   r~   r(   r   ÚbeforeÚafterr   r   r   r   È   s   ÿzBaseTestByIR.checkc                 C   sj   t  | j› d|› ¡}t  ¡ }|d u r| | j¡ n|j| j|d t  ¡ }| |¡ t  ¡ }||| fS r˜   )r   ry   rœ   r   r|   r   rž   r,   )r   r}   r›   r~   r   rŸ   r    r   r   r   Úcheck_legacyÖ   s   ÿ
zBaseTestByIR.check_legacyr   )r   r   r)   r   rœ   r   r¡   r   r   r   r   r—   À   s
    
r—   c                   @   st   e Zd ZejjZdZdd„ Zdd„ Z	dZ
dd„ Zd	d
„ Zer dndZdd„ Zdd„ Zer.dndZdd„ Zdd„ ZdS )Ú	TestPerBBzv
define void @main(i8* %ptr) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   ó"   |   | j¡\}}|  |jd¡ d S ©NrT   )r   Úper_bb_ir_1r-   Ú
basicblock©r   r~   rŒ   r   r   r   Útest_per_bb_1ï   ó   zTestPerBB.test_per_bb_1c                 C   r£   r¤   )r¡   r¥   r-   r¦   r§   r   r   r   Útest_per_bb_1_legacyó   r©   zTestPerBB.test_per_bb_1_legacyzâ
define void @main(i8* %ptr) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   óJ   |   | j¡\}}|  |jd¡ tr|  dt|ƒ¡ d S |  dt|ƒ¡ d S ©Né   zcall void @NRT_incref(ptr %ptr)zcall void @NRT_incref(i8* %ptr))r   Úper_bb_ir_2r-   r¦   r   ÚassertInrz   r§   r   r   r   Útest_per_bb_2  ó
   zTestPerBB.test_per_bb_2c                 C   r«   r¬   )r¡   r®   r-   r¦   r   r¯   rz   r§   r   r   r   Útest_per_bb_2_legacy  r±   zTestPerBB.test_per_bb_2_legacyzÌ
define void @main(ptr %ptr, ptr %other) {
    call void @NRT_incref(ptr %ptr)
    call void @NRT_incref(ptr %ptr)
    call void @NRT_decref(ptr %ptr)
    call void @NRT_decref(ptr %other)
    ret void
}
zÌ
define void @main(i8* %ptr, i8* %other) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %other)
    ret void
}
c                 C   r«   ©NrT   ú!call void @NRT_decref(ptr %other)ú!call void @NRT_decref(i8* %other))r   Úper_bb_ir_3r-   r¦   r   r¯   rz   r§   r   r   r   Útest_per_bb_3(  r±   zTestPerBB.test_per_bb_3c                 C   r«   r³   )r¡   r¶   r-   r¦   r   r¯   rz   r§   r   r   r   Útest_per_bb_3_legacy2  r±   zTestPerBB.test_per_bb_3_legacyzü
; reordered
define void @main(ptr %ptr, ptr %other) {
    call void @NRT_incref(ptr %ptr)
    call void @NRT_decref(ptr %ptr)
    call void @NRT_decref(ptr %ptr)
    call void @NRT_decref(ptr %other)
    call void @NRT_incref(ptr %ptr)
    ret void
}
zü
; reordered
define void @main(i8* %ptr, i8* %other) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %other)
    call void @NRT_incref(i8* %ptr)
    ret void
}
c                 C   r«   ©Nr­   r´   rµ   )r   Úper_bb_ir_4r-   r¦   r   r¯   rz   r§   r   r   r   Útest_per_bb_4R  r±   zTestPerBB.test_per_bb_4c                 C   r«   r¹   )r¡   rº   r-   r¦   r   r¯   rz   r§   r   r   r   Útest_per_bb_4_legacy\  r±   zTestPerBB.test_per_bb_4_legacyN)r   r   r)   r   ÚRefPruneSubpassesÚPER_BBr   r¥   r¨   rª   r®   r°   r²   r   r¶   r·   r¸   rº   r»   r¼   r   r   r   r   r¢   ä   s(    
øø
ö
ö
r¢   c                   @   sx   e Zd ZejjZdZdd„ Zdd„ Z	dZ
dd„ Zd	d
„ ZdZdd„ Zdd„ ZdZdd„ Zdd„ ZdZdd„ Zdd„ ZdS )ÚTestDiamondz•
define void @main(i8* %ptr) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br label %bb_B
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   r¤   )r   Úper_diamond_1r-   Údiamondr§   r   r   r   Útest_per_diamond_1u  r©   zTestDiamond.test_per_diamond_1c                 C   r£   r¤   )r¡   rÀ   r-   rÁ   r§   r   r   r   Útest_per_diamond_1_legacyy  r©   z%TestDiamond.test_per_diamond_1_legacyzè
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    br label %bb_D
bb_C:
    br label %bb_D
bb_D:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   r¤   )r   Úper_diamond_2r-   rÁ   r§   r   r   r   Útest_per_diamond_2Œ  r©   zTestDiamond.test_per_diamond_2c                 C   r£   r¤   )r¡   rÄ   r-   rÁ   r§   r   r   r   Útest_per_diamond_2_legacy  r©   z%TestDiamond.test_per_diamond_2_legacya3  
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    br label %bb_D
bb_C:
    call void @NRT_decref(i8* %ptr)  ; reject because of decref in diamond
    br label %bb_D
bb_D:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   ©Nr   )r   Úper_diamond_3r-   rÁ   r§   r   r   r   Útest_per_diamond_3¤  r©   zTestDiamond.test_per_diamond_3c                 C   r£   rÇ   )r¡   rÈ   r-   rÁ   r§   r   r   r   Útest_per_diamond_3_legacy¨  r©   z%TestDiamond.test_per_diamond_3_legacya5  
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_incref(i8* %ptr)     ; extra incref will not affect prune
    br label %bb_D
bb_C:
    br label %bb_D
bb_D:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   r¤   )r   Úper_diamond_4r-   rÁ   r§   r   r   r   Útest_per_diamond_4¼  r©   zTestDiamond.test_per_diamond_4c                 C   r£   r¤   )r¡   rË   r-   rÁ   r§   r   r   r   Útest_per_diamond_4_legacyÀ  r©   z%TestDiamond.test_per_diamond_4_legacya0  
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    br label %bb_D
bb_C:
    br label %bb_D
bb_D:
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   ©Nr­   )r   Úper_diamond_5r-   rÁ   r§   r   r   r   Útest_per_diamond_5Õ  r©   zTestDiamond.test_per_diamond_5c                 C   r£   rÎ   )r¡   rÏ   r-   rÁ   r§   r   r   r   Útest_per_diamond_5_legacyÙ  r©   z%TestDiamond.test_per_diamond_5_legacyN)r   r   r)   r   r½   ÚDIAMONDr   rÀ   rÂ   rÃ   rÄ   rÅ   rÆ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   rÏ   rÐ   rÑ   r   r   r   r   r¿   g  s"    r¿   c                   @   sd   e Zd ZdZejjZdZdd„ Z	dd„ Z
dZdd	„ Zd
d„ ZdZdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
TestFanoutz6More complex cases are tested in TestRefPrunePass
    zí
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret void
bb_C:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   ©Né   )r   Úfanout_1r-   Úfanoutr§   r   r   r   Útest_fanout_1ò  r©   zTestFanout.test_fanout_1c                 C   r£   rÔ   )r¡   rÖ   r-   r×   r§   r   r   r   Útest_fanout_1_legacyö  r©   zTestFanout.test_fanout_1_legacya6  
define void @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret void
bb_C:
    call void @NRT_decref(i8* %ptr)
    br label %bb_B                      ; illegal jump to other decref
}
c                 C   r£   rÇ   )r   Úfanout_2r-   r×   r§   r   r   r   Útest_fanout_2  r©   zTestFanout.test_fanout_2c                 C   r£   rÇ   )r¡   rÚ   r-   r×   r§   r   r   r   Útest_fanout_2_legacy  r©   zTestFanout.test_fanout_2_legacya}  
define void @main(i8* %ptr, i1 %cond) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
bb_C:
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 C   r£   ©Né   ©r   Úfanout_3r-   r×   r§   r   r   r   Útest_fanout_3"  r©   zTestFanout.test_fanout_3c                 C   ó&   | j | jdd\}}|  |jd¡ d S ©NrL   rš   r   rß   r§   r   r   r   Útest_fanout_3_limited&  ó   z TestFanout.test_fanout_3_limitedc                 C   r£   rÝ   ©r¡   rà   r-   r×   r§   r   r   r   Útest_fanout_3_legacy,  r©   zTestFanout.test_fanout_3_legacyc                 C   râ   rã   ræ   r§   r   r   r   Útest_fanout_3_limited_legacy0  rå   z'TestFanout.test_fanout_3_limited_legacyN)r   r   r)   r   r   r½   ÚFANOUTr   rÖ   rØ   rÙ   rÚ   rÛ   rÜ   rà   rá   rä   rç   rè   r   r   r   r   rÓ   Þ  s    rÓ   c                   @   sŒ   e Zd ZejjZdZdd„ Zdd„ Z	dZ
dd„ Zd	d
„ ZdZdd„ Zdd„ ZdZdd„ Zdd„ ZdZdd„ Zdd„ ZdZdd„ Zdd„ ZdS ) ÚTestFanoutRaisea'  
define i32 @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret i32 0
bb_C:
    store i8* null, i8** %excinfo, !numba_exception_output !0
    ret i32 1
}
!0 = !{i1 true}
c                 C   r£   r¤   )r   Úfanout_raise_1r-   Úfanout_raiser§   r   r   r   Útest_fanout_raise_1I  r©   z#TestFanoutRaise.test_fanout_raise_1c                 C   r£   r¤   )r¡   rë   r-   rì   r§   r   r   r   Útest_fanout_raise_1_legacyM  r©   z*TestFanoutRaise.test_fanout_raise_1_legacya:  
define i32 @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret i32 0
bb_C:
    store i8* null, i8** %excinfo, !numba_exception_typo !0      ; bad metadata
    ret i32 1
}

!0 = !{i1 true}
c                 C   r£   rÇ   )r   Úfanout_raise_2r-   rì   r§   r   r   r   Útest_fanout_raise_2a  ó   z#TestFanoutRaise.test_fanout_raise_2c                 C   r£   rÇ   )r¡   rï   r-   rì   r§   r   r   r   Útest_fanout_raise_2_legacyg  rñ   z*TestFanoutRaise.test_fanout_raise_2_legacya:  
define i32 @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    ret i32 0
bb_C:
    store i8* null, i8** %excinfo, !numba_exception_output !0
    ret i32 1
}

!0 = !{i32 1}       ; ok; use i32
c                 C   r£   r¤   )r   Úfanout_raise_3r-   rì   r§   r   r   r   Útest_fanout_raise_3}  r©   z#TestFanoutRaise.test_fanout_raise_3c                 C   r£   r¤   )r¡   ró   r-   rì   r§   r   r   r   Útest_fanout_raise_3_legacy  r©   z*TestFanoutRaise.test_fanout_raise_3_legacya!  
define i32 @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    ret i32 1    ; BAD; all tails are raising without decref
bb_C:
    ret i32 1    ; BAD; all tails are raising without decref
}

!0 = !{i1 1}
c                 C   r£   rÇ   )r   Úfanout_raise_4r-   rì   r§   r   r   r   Útest_fanout_raise_4“  r©   z#TestFanoutRaise.test_fanout_raise_4c                 C   r£   rÇ   )r¡   rö   r-   rì   r§   r   r   r   Útest_fanout_raise_4_legacy—  r©   z*TestFanoutRaise.test_fanout_raise_4_legacya™  
define i32 @main(i8* %ptr, i1 %cond, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    br label %common.ret
bb_C:
    store i8* null, i8** %excinfo, !numba_exception_output !0
    br label %common.ret
common.ret:
    %common.ret.op = phi i32 [ 0, %bb_B ], [ 1, %bb_C ]
    ret i32 %common.ret.op
}
!0 = !{i1 1}
c                 C   r£   r¤   )r   Úfanout_raise_5r-   rì   r§   r   r   r   Útest_fanout_raise_5­  r©   z#TestFanoutRaise.test_fanout_raise_5c                 C   r£   r¤   )r¡   rù   r-   rì   r§   r   r   r   Útest_fanout_raise_5_legacy±  r©   z*TestFanoutRaise.test_fanout_raise_5_legacyaf  
define i32 @main(i8* %ptr, i1 %cond1, i1 %cond2, i1 %cond3, i8** %excinfo) {
bb_A:
    call void @NRT_incref(i8* %ptr)
    call void @NRT_incref(i8* %ptr)
    br i1 %cond1, label %bb_B, label %bb_C
bb_B:
    call void @NRT_decref(i8* %ptr)
    br i1 %cond2, label %bb_D, label %bb_E
bb_C:
    store i8* null, i8** %excinfo, !numba_exception_output !0
    ret i32 1
bb_D:
    call void @NRT_decref(i8* %ptr)
    ret i32 0
bb_E:
    call void @NRT_incref(i8* %ptr)
    br i1 %cond3, label %bb_F, label %bb_C
bb_F:
    call void @NRT_decref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret i32 0
}
!0 = !{i1 1}
c                 C   r£   ©Né   )r   Úfanout_raise_6r-   rì   r§   r   r   r   Útest_fanout_raise_6Ð  r©   z#TestFanoutRaise.test_fanout_raise_6c                 C   r£   rü   )r¡   rþ   r-   rì   r§   r   r   r   Útest_fanout_raise_6_legacyÔ  r©   z*TestFanoutRaise.test_fanout_raise_6_legacyN)r   r   r)   r   r½   ÚFANOUT_RAISEr   rë   rí   rî   rï   rð   rò   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rþ   rÿ   r   r   r   r   r   rê   7  s(    rê   Ú__main__)ÚunittestÚllvmliter   r   r   Úllvmlite.testsr   Úllvmlite.tests.refprune_protoÚtestsÚrefprune_protor   r   r   r   r*   rJ   Ú
as_pointerr=   r6   r—   r¢   r¿   rÓ   rê   r   rO   r   r   r   r   Ú<module>   s,    	 $ wY #ÿ