o
    Ò0 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   úh/home/app/PaddleOCR-VL-test/.venv_paddleocr/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ÚcaseZtest_)ÚprotoÚ__dict__ÚitemsÚ
startswith)r
   r   ÚkZ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   )Zspeed_levelZ
size_level)ÚllvmZinitialize_native_targetZTargetZfrom_default_tripleZcreate_target_machineZcreate_pipeline_tuning_optionsZcreate_pass_builder)r   ÚtmZ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   Z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©r'   ©r   ÚFunctionTypeÚVoidTypeÚptr_tyÚFunction©r   ÚmÚfntyr   r   r   Úmake_incref=   ó   zTestRefPrunePass.make_increfc                 C   r+   )NÚ
NRT_decrefr-   r.   r3   r   r   r   Úmake_decrefA   r7   zTestRefPrunePass.make_decrefc                 C   ó"   t  t  d¡d¡}t j||ddS )Né    r   Zswitcherr-   ©r   r/   ÚIntTyper2   r3   r   r   r   Úmake_switcherE   r7   zTestRefPrunePass.make_switcherc                 C   r:   )Né   r   Zbrancherr-   r<   r3   r   r   r   Úmake_brancherI   r7   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Úmainr-   ZmemÚincrefÚdecrefZunreachabler   r?   é   r   )Údefault)r   ÚModuler6   r9   r>   r@   r/   r0   r1   r2   Úargsr'   Zappend_basic_blockZ	IRBuilderr   Zposition_at_endÚcallÚAssertionErrorÚlenZret_voidÚbranchZcbranchÚswitchÚ	enumerateZadd_caseÚtype)r   r#   r$   r4   Z	incref_fnZ	decref_fnZswitcher_fnZbrancher_fnr5   r	   ZptrZbbmapÚbbÚbuilderZjump_targetsÚactionZ	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   r[   r\   ÚModulePassManagerr^   r    )r   r_   r`   ra   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 )
NrB   rC   )rB   rC   r?   rA   r,   r8   zBB )Úmsg)r   ÚcountÚgetZ	functionsr'   Úblocksr\   r!   )r   r`   r%   r#   Údr   ÚvsZn_increfZn_decrefÚstatsZdec_bbÚfrO   Útextr   r   r   Úcheck’   s.   


€

ÿ



úzTestRefPrunePass.checkc                 C   ó4   |ƒ \}}}|   ||¡}|  |¡}|  |||¡ d S r   )rZ   rb   rn   ©r   r"   r#   r$   r%   r_   Zoutmodr   r   r   r
   ¬   ó   
zTestRefPrunePass.generate_testc                 C   ro   r   )rZ   rd   rn   rp   r   r   r   Úgenerate_test_legacy²   rq   z%TestRefPrunePass.generate_test_legacyZ_legacyN)r   r   r   r   r6   r9   r>   r@   rZ   rb   rd   rn   r
   rr   r   r'   r   r(   r   r   r   r   r*   4   s"    6ÿr*   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   r[   Úprologuer   r]   r^   Úrefprune_bitmaskÚdump_refprune_statsr    )r   r_   rw   r`   r   ra   ÚbeforeÚafterr   r   r   rn   È   s   ÿzBaseTestByIR.checkc                 C   sj   t  | j› d|› ¡}t  ¡ }|d u r| | j¡ n|j| j|d t  ¡ }| |¡ t  ¡ }||| fS rt   )r   r[   rx   rc   r^   ry   rz   r    )r   r_   rw   r`   ra   r{   r|   r   r   r   Úcheck_legacyÖ   s   ÿ
zBaseTestByIR.check_legacyr   )r   r   r   ry   rx   rn   r}   r   r   r   r   rs   À   s
    
rs   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 ©NrD   )rn   Úper_bb_ir_1r!   Ú
basicblock©r   r`   rk   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))rn   Úper_bb_ir_2r!   r‚   r   ÚassertInr\   rƒ   r   r   r   Útest_per_bb_2  ó
   zTestPerBB.test_per_bb_2c                 C   r‡   rˆ   )r}   rŠ   r!   r‚   r   r‹   r\   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‡   ©NrD   ú!call void @NRT_decref(ptr %other)ú!call void @NRT_decref(i8* %other))rn   Úper_bb_ir_3r!   r‚   r   r‹   r\   rƒ   r   r   r   Útest_per_bb_3(  r   zTestPerBB.test_per_bb_3c                 C   r‡   r   )r}   r’   r!   r‚   r   r‹   r\   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‘   )rn   Úper_bb_ir_4r!   r‚   r   r‹   r\   rƒ   r   r   r   Útest_per_bb_4R  r   zTestPerBB.test_per_bb_4c                 C   r‡   r•   )r}   r–   r!   r‚   r   r‹   r\   rƒ   r   r   r   Útest_per_bb_4_legacy\  r   zTestPerBB.test_per_bb_4_legacyN)r   r   r   r   ÚRefPruneSubpassesZPER_BBry   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€   )rn   Ú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€   )rn   Ú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   )rn   Ú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€   )rn   Ú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‰   )rn   Ú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™   ZDIAMONDry   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é   )rn   Ú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¢   )rn   Ú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é   ©rn   Ú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 ©Nr?   rv   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™   ZFANOUTry   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€   )rn   Ú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¢   )rn   Ú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€   )rn   Ú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¢   )rn   Ú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€   )rn   Ú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é   )rn   Ú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™   ZFANOUT_RAISEry   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__)ZunittestZllvmliter   r   r   Zllvmlite.testsr   Zllvmlite.tests.refprune_protoÚtestsZrefprune_protor   r   r   r   r   r=   Z
as_pointerr1   r*   rs   r~   rš   r­   rÃ   r   rA   r   r   r   r   Ú<module>   s,    	 $ wY #ÿ