
    J/PhtT                        d dl Z d dlmZ d dlmZ d dlmZ d dlmc m	Z
 d dlmZ d Z G d d          Z G d	 d
e          Z ej        d                                          Z G d dee          Z G d dee          Z G d de          Z G d de          Z G d de          Z G d de          Zedk    r e j                     dS dS )    N)ir)binding)TestCase)opaque_pointers_enabledc              #       K    fd}t           j                                        D ],\  }}|                    d          rd|  ||          fV  -d S )Nc                 D      fd}d j          d j         |_        |S )Nc                      |           S N )selffngenerate_tests    \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/llvmlite/tests/test_refprune.pywrappedz-_iterate_cases.<locals>.wrap.<locals>.wrapped   s     =r***    zgenerated test for .)
__module____name____doc__)r   r   r   s   ` r   wrapz_iterate_cases.<locals>.wrap   sB    	+ 	+ 	+ 	+ 	+ 	+MMMMMr   casetest_)proto__dict__items
startswith)r   r   kcase_fns   `   r   _iterate_casesr      s           n**,, - -
7<< 	-!++ttG}},,,,- -r   c                       e Zd Zd ZdS )PassManagerMixinc                     t          j                     t           j                                                                        }t          j        dd          }t          j        ||          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ptos      r   pbzPassManagerMixin.pb   sX    %'''[,,..DDFF1aANNN'C000r   N)r   r   __qualname__r.   r   r   r   r!   r!      s#        1 1 1 1 1r   r!   c                   T    e Zd ZdZd Z ee          D ]\  ZZe e            e<   dS )TestRefPrunePrototypez-
    Test that the prototype is working.
    c                      |            \  }}}t          j        ||                                          }|                     ||           d S r
   )r   FanoutAlgorithmrunassertEqual)r   case_gennodesedgesexpectedgots         r   r   z#TestRefPrunePrototype.generate_test'   sN    !)uh#E51155773'''''r   N)	r   r   r/   r   r   r   namer   localsr   r   r   r1   r1   #   s]         ( ( ( %n]33  
d r   r1      c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z ee          D ]\  ZZe e            e<    ee          D ]\  ZZe e            edz   <   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                     t          j        t          j                    t          g          }t          j        ||d          S )N
NRT_increfr;   r   FunctionTypeVoidTypeptr_tyFunctionr   mfntys      r   make_increfzTestRefPrunePass.make_incref=   2    r{}}vh77{1d6666r   c                     t          j        t          j                    t          g          }t          j        ||d          S )N
NRT_decrefrB   rC   rH   s      r   make_decrefzTestRefPrunePass.make_decrefA   rL   r   c                 ~    t          j        t          j        d          d          }t          j        ||d          S )N    r   switcherrB   r   rD   IntTyperG   rH   s      r   make_switcherzTestRefPrunePass.make_switcherE   s2    rz"~~r22{1d4444r   c                 ~    t          j        t          j        d          d          }t          j        ||d          S )N   r   brancherrB   rS   rH   s      r   make_brancherzTestRefPrunePass.make_brancherI   s2    rz!}}b11{1d4444r   c                 B   t          j                    }|                     |          }|                     |          }|                     |          }|                     |          }t          j        t          j                    t          g          }t          j	        ||d          }	|	j
        \  }
d|
_        i }|D ]}|	                    |          ||<   t          j                    }|                                D ]\  }}|                    ||                    ||         D ]L}|dk    r|                    ||
g            |dk    r|                    ||
g           >t#          d          t%          |          }|dk    r|                                 |dk    r |\  }|                    ||                    |d	k    r@|\  }}|                    |d
          }|                    |||         ||                    |d	k    r}|                    |d
          }|^}}|                    |||                   }t/          |          D ]4\  }}|                    |                    |          ||                    5t#          d          |S )NmainrB   memincrefdecrefunreachabler   rW      r   )default)r   ModulerK   rO   rU   rY   rD   rE   rF   rG   argsr;   append_basic_block	IRBuilderr   position_at_endcallAssertionErrorlenret_voidbranchcbranchswitch	enumerateadd_casetype)r   r7   r8   rI   	incref_fn	decref_fnswitcher_fnbrancher_fnrJ   r   ptrbbmapbbbuilderjump_targetsaction	n_targetsdstleftrightselheadtailswis                            r   generate_irzTestRefPrunePass.generate_irM   s   IKK$$Q''	$$Q''	((++((++r{}}vh77[Dv... 	2 	2B--b11E"II,.. % 	4 	4B##E"I...) 8 8X%%LLSE2222x''LLSE2222(777 L))IA~~  """"a$uSz****a ,ull;33U4[%,????Qll;33 ,^^Ct^=='oo 9 9FAsKKU3Z88889 %]333r   c                     t          j        t          |                    }|                                 }|                                }|                                 |                    ||           |S r
   )r%   parse_assemblystrr.   getModulePassManageradd_refprune_passr4   )r   irmodmodr.   pms        r   apply_refprunezTestRefPrunePass.apply_refprune   s^    !#e**--WWYY$$&&

sB
r   c                     t          j        t          |                    }t          j                    }|                                 |                    |           |S r
   )r%   r   r   ModulePassManagerr   r4   )r   r   r   r   s       r   apply_refprune_legacyz&TestRefPrunePass.apply_refprune_legacy   sL    !#e**--#%%

s
r   c                    i }|                                 D ]7\  }}|                    d          }|                    d          }||d||<   8|                                 D ]K\  }}	|                    |          r1|	dxx         dz  cc<   ||         D ]}
||
         dxx         dz  cc<   L|j        D ]}|j        dk    r n|j        D ]}||j                 }	t          |          }|                    d          }|                    d          }|                     |	d         |d| 	           |                     |	d         |d| 	           d S )
Nr]   r^   )r]   r^   rW   r[   rA   rN   zBB )msg)r   countget	functionsr;   blocksr   r5   )r   r   r9   r7   dr   vsn_increfn_decrefstatsdec_bbfrw   texts                 r   checkzTestRefPrunePass.check   s   [[]] 	< 	<EArxx))Hxx))H&(;;AaDD		 	- 	-HAu||A -h1$&qk - -FfIh'''1,''''  	 	Av   ( 	H 	HBbgJEr77Dzz,//Hzz,//HU8_hJ"JJGGGU8_hJ"JJGGGG	H 	Hr   c                      |            \  }}}|                      ||          }|                     |          }|                     |||           d S r
   )r   r   r   r   r6   r7   r8   r9   r   outmods          r   r   zTestRefPrunePass.generate_test   sX    !)uh  ..$$U++

68U+++++r   c                      |            \  }}}|                      ||          }|                     |          }|                     |||           d S r
   )r   r   r   r   s          r   generate_test_legacyz%TestRefPrunePass.generate_test_legacy   sX    !)uh  ..++E22

68U+++++r   _legacyN)r   r   r/   r   rK   rO   rU   rY   r   r   r   r   r   r   r   r;   r   r<   r   r   r   r?   r?   4   s        7 7 77 7 75 5 55 5 54 4 4l    H H H4, , ,, , , %n]33  
d$n%9:: * *
d%)	!""* *r   r?   c                   &    e Zd ZdZdZddZddZdS )BaseTestByIRr   zG
declare void @NRT_incref(i8* %ptr)
declare void @NRT_decref(i8* %ptr)
Nc                    t          j        | j         d|           }|                                 }|                                }||                    | j                   n|                    | j        |           t          j                    }|                    ||           t          j                    }|||z
  fS N
subgraph_limit)	r%   r   prologuer.   r   r   refprune_bitmaskdump_refprune_statsr4   )r   r   r   r   r.   r   beforeafters           r   r   zBaseTestByIR.check   s    !T]"="=e"="=>>WWYY$$&&!  !67777  !60> ! @ @ @)++
sB(**EFN""r   c                 Z   t          j        | j         d|           }t          j                    }||                    | j                   n|                    | j        |           t          j                    }|                    |           t          j                    }|||z
  fS r   )r%   r   r   r   r   r   r   r4   )r   r   r   r   r   r   r   s          r   check_legacyzBaseTestByIR.check_legacy   s    !T]"="=e"="=>>#%%!  !67777  !60> ! @ @ @)++
s(**EFN""r   r
   )r   r   r/   r   r   r   r   r   r   r   r   r      sI        H
# # # ## # # # # #r   r   c                   v    e Zd Zej        j        ZdZd Zd Z	dZ
d Zd ZerdndZd	 Zd
 ZerdndZd Z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                 v    |                      | j                  \  }}|                     |j        d           d S Nr`   )r   per_bb_ir_1r5   
basicblockr   r   r   s      r   test_per_bb_1zTestPerBB.test_per_bb_1   s9    ZZ 011
U)1-----r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_bb_1_legacyzTestPerBB.test_per_bb_1_legacy   s;    &&t'788
U)1-----r   z
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                    |                      | 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_2r5   r   r   assertInr   r   s      r   test_per_bb_2zTestPerBB.test_per_bb_2  s    ZZ 011
U)1--- # 	GMM;SXXFFFFFMM;SXXFFFFFr   c                    |                      | j                  \  }}|                     |j        d           t          r%|                     dt          |                     d S |                     dt          |                     d S r   )r   r   r5   r   r   r   r   r   s      r   test_per_bb_2_legacyzTestPerBB.test_per_bb_2_legacy  s    &&t'788
U)1--- # 	GMM;SXXFFFFFMM;SXXFFFFFr   z
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                    |                      | j                  \  }}|                     |j        d           t          r%|                     dt          |                     d S |                     dt          |                     d S Nr`   !call void @NRT_decref(ptr %other)!call void @NRT_decref(i8* %other))r   per_bb_ir_3r5   r   r   r   r   r   s      r   test_per_bb_3zTestPerBB.test_per_bb_3(      ZZ 011
U)1--- # 	IMM=s3xxHHHHHMM=s3xxHHHHHr   c                    |                      | j                  \  }}|                     |j        d           t          r%|                     dt          |                     d S |                     dt          |                     d S r   )r   r   r5   r   r   r   r   r   s      r   test_per_bb_3_legacyzTestPerBB.test_per_bb_3_legacy2      &&t'788
U)1--- # 	IMM=s3xxHHHHHMM=s3xxHHHHHr   z
; 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                    |                      | j                  \  }}|                     |j        d           t          r%|                     dt          |                     d S |                     dt          |                     d S Nr   r   r   )r   per_bb_ir_4r5   r   r   r   r   r   s      r   test_per_bb_4zTestPerBB.test_per_bb_4R  r   r   c                    |                      | j                  \  }}|                     |j        d           t          r%|                     dt          |                     d S |                     dt          |                     d S r   )r   r   r5   r   r   r   r   r   s      r   test_per_bb_4_legacyzTestPerBB.test_per_bb_4_legacy\  r   r   N)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        -4K. . .. . .	KG G GG G G$   % $I I II I I(  
 

% ,I I II I I I Ir   r   c                   v    e Zd Zej        j        ZdZd Zd Z	dZ
d Zd ZdZd Zd	 Zd
Zd Zd ZdZd Z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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   per_diamond_1r5   diamondr   s      r   test_per_diamond_1zTestDiamond.test_per_diamond_1u  8    ZZ 233
U*****r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_diamond_1_legacyz%TestDiamond.test_per_diamond_1_legacyy  :    &&t'9::
U*****r   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:
    br label %bb_D
bb_C:
    br label %bb_D
bb_D:
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   per_diamond_2r5   r   r   s      r   test_per_diamond_2zTestDiamond.test_per_diamond_2  r   r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_diamond_2_legacyz%TestDiamond.test_per_diamond_2_legacy  r   r   a3  
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                 v    |                      | j                  \  }}|                     |j        d           d S Nr   )r   per_diamond_3r5   r   r   s      r   test_per_diamond_3zTestDiamond.test_per_diamond_3  r   r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_diamond_3_legacyz%TestDiamond.test_per_diamond_3_legacy  r   r   a5  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   per_diamond_4r5   r   r   s      r   test_per_diamond_4zTestDiamond.test_per_diamond_4  r   r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_diamond_4_legacyz%TestDiamond.test_per_diamond_4_legacy  r   r   a0  
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                 v    |                      | j                  \  }}|                     |j        d           d S Nr   )r   per_diamond_5r5   r   r   s      r   test_per_diamond_5zTestDiamond.test_per_diamond_5  r   r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_per_diamond_5_legacyz%TestDiamond.test_per_diamond_5_legacy  r   r   N)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        -5	M+ + ++ + +M+ + ++ + +M + + ++ + +M + + ++ + +M"+ + ++ + + + +r   r   c                   f    e Zd ZdZej        j        ZdZd Z	d Z
dZd Zd ZdZd	 Zd
 Zd Z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                 v    |                      | j                  \  }}|                     |j        d           d S N   )r   fanout_1r5   fanoutr   s      r   test_fanout_1zTestFanout.test_fanout_1  7    ZZ..
Uq)))))r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r   r5   r   r   s      r   test_fanout_1_legacyzTestFanout.test_fanout_1_legacy  9    &&t}55
Uq)))))r   a6  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_2r5   r   r   s      r   test_fanout_2zTestFanout.test_fanout_2  r  r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r  r5   r   r   s      r   test_fanout_2_legacyzTestFanout.test_fanout_2_legacy  r  r   a}  
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                 v    |                      | j                  \  }}|                     |j        d           d S N   r   fanout_3r5   r   r   s      r   test_fanout_3zTestFanout.test_fanout_3"  r  r   c                 z    |                      | j        d          \  }}|                     |j        d           d S NrW   r   r   r  r   s      r   test_fanout_3_limitedz TestFanout.test_fanout_3_limited&  s=     ZZaZ@@
Uq)))))r   c                 v    |                      | j                  \  }}|                     |j        d           d S r  r   r  r5   r   r   s      r   test_fanout_3_legacyzTestFanout.test_fanout_3_legacy,  r  r   c                 z    |                      | j        d          \  }}|                     |j        d           d S r  r  r   s      r   test_fanout_3_limited_legacyz'TestFanout.test_fanout_3_limited_legacy0  s@     &&t}Q&GG
Uq)))))r   N)r   r   r/   r   r%   r   FANOUTr   r   r   r  r  r  r	  r  r  r  r  r  r   r   r   r   r     s          -4H* * ** * *H* * ** * *H$* * ** * ** * ** * * * *r   r   c                       e Zd Zej        j        ZdZd Zd Z	dZ
d Zd ZdZd Zd	 Zd
Zd Zd ZdZd Zd ZdZd Z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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_raise_1r5   fanout_raiser   s      r   test_fanout_raise_1z#TestFanoutRaise.test_fanout_raise_1I  9    ZZ 344
U+Q/////r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r  r5   r  r   s      r   test_fanout_raise_1_legacyz*TestFanoutRaise.test_fanout_raise_1_legacyM  ;    &&t':;;
U+Q/////r   a:  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_raise_2r5   r  r   s      r   test_fanout_raise_2z#TestFanoutRaise.test_fanout_raise_2a  s;     ZZ 344
U+Q/////r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r$  r5   r  r   s      r   test_fanout_raise_2_legacyz*TestFanoutRaise.test_fanout_raise_2_legacyg  s=     &&t':;;
U+Q/////r   a:  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_raise_3r5   r  r   s      r   test_fanout_raise_3z#TestFanoutRaise.test_fanout_raise_3}  r  r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r)  r5   r  r   s      r   test_fanout_raise_3_legacyz*TestFanoutRaise.test_fanout_raise_3_legacy  r"  r   a!  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_raise_4r5   r  r   s      r   test_fanout_raise_4z#TestFanoutRaise.test_fanout_raise_4  r  r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r.  r5   r  r   s      r   test_fanout_raise_4_legacyz*TestFanoutRaise.test_fanout_raise_4_legacy  r"  r   a  
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                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   fanout_raise_5r5   r  r   s      r   test_fanout_raise_5z#TestFanoutRaise.test_fanout_raise_5  r  r   c                 v    |                      | j                  \  }}|                     |j        d           d S r   )r   r3  r5   r  r   s      r   test_fanout_raise_5_legacyz*TestFanoutRaise.test_fanout_raise_5_legacy  r"  r   af  
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                 v    |                      | j                  \  }}|                     |j        d           d S N   )r   fanout_raise_6r5   r  r   s      r   test_fanout_raise_6z#TestFanoutRaise.test_fanout_raise_6  r  r   c                 v    |                      | j                  \  }}|                     |j        d           d S r8  )r   r:  r5   r  r   s      r   test_fanout_raise_6_legacyz*TestFanoutRaise.test_fanout_raise_6_legacy  r"  r   N)r   r   r/   r%   r   FANOUT_RAISEr   r  r  r!  r$  r%  r'  r)  r*  r,  r.  r/  r1  r3  r4  r6  r:  r;  r=  r   r   r   r  r  7  s        -:N0 0 00 0 0N 0 0 00 0 0N 0 0 00 0 0N0 0 00 0 0N$0 0 00 0 0
N40 0 00 0 0 0 0r   r  __main__)unittestllvmliter   r   r%   llvmlite.testsr   llvmlite.tests.refprune_prototestsrefprune_protor   r   r   r!   r1   rT   
as_pointerrF   r?   r   r   r   r   r  r   r[   r   r   r   <module>rG     sO          $ $ $ $ $ $ # # # # # # - - - - - - - - -
 - , , , , ,	- 	- 	-1 1 1 1 1 1 1 1    H    
A	!	!	#	#I* I* I* I* I*x!1 I* I* I*X!# !# !# !# !#8- !# !# !#H@I @I @I @I @I @I @I @IFt+ t+ t+ t+ t+, t+ t+ t+nV* V* V* V* V* V* V* V*r_0 _0 _0 _0 _0l _0 _0 _0D zHMOOOOO r   