
    shtT                     v   S SK r S SKJr  S SKJr  S SKJr  S SKJs  J	r
  S SKJr  S r " S S5      r " S	 S
\5      r\R                  " S5      R!                  5       r " S S\\5      r " S S\\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\S:X  a  \ R2                  " 5         gg)    N)ir)binding)TestCase)opaque_pointers_enabledc              #      ^ #    U 4S jn[         R                  R                  5        H,  u  p#UR                  S5      (       d  M  SU 3U" U5      4v   M.     g 7f)Nc                 Z   >^  U U4S jnST R                    ST R                   3Ul        U$ )Nc                    > T" U T5      $ N )selffngenerate_tests    p/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/llvmlite/tests/test_refprune.pywrapped-_iterate_cases.<locals>.wrap.<locals>.wrapped   s     r**    zgenerated test for .)
__module____name____doc__)r   r   r   s   ` r   wrap_iterate_cases.<locals>.wrap   s)    	+/a}Mr   casetest_)proto__dict__items
startswith)r   r   kcase_fns   `   r   _iterate_casesr!      sJ      nn**,
<<!+tG},, -s   >AAc                       \ rS rSrS rSrg)PassManagerMixin   c                     [         R                  " 5         [         R                  R                  5       R	                  5       n[         R
                  " SSS9n[         R                  " X5      $ )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   pbPassManagerMixin.pb   sL    %%'[[,,.DDF11aAN''00r   r   N)r   r   __qualname____firstlineno__r1   __static_attributes__r   r   r   r#   r#      s    1r   r#   c                   V    \ rS rSrSrS r\" \5       H  u  rr\\	" 5       \'   M     Sr
g)TestRefPrunePrototype#   z%
Test that the prototype is working.
c                     U" 5       u  p#n[         R                  " X#5      R                  5       nU R                  XE5        g r
   )r   FanoutAlgorithmrunassertEqual)r   case_gennodesedgesexpectedgots         r   r   #TestRefPrunePrototype.generate_test'   s5    !)h##E1557'r   r   N)r   r   r3   r4   r   r   r!   namer   localsr5   r   r   r   r7   r7   #   s,    ( %]3
d 4r   r7      c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS r\" \5       H  u  rr\\" 5       \'   M     \" \5       H  u  rr\\" 5       \S-   '   M     Srg)TestRefPrunePass4   z
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                     [         R                  " [         R                  " 5       [        /5      n[         R                  " XSS9$ )N
NRT_increfrC   r   FunctionTypeVoidTypeptr_tyFunctionr   mfntys      r   make_increfTestRefPrunePass.make_incref=   +    r{{}vh7{{166r   c                     [         R                  " [         R                  " 5       [        /5      n[         R                  " XSS9$ )N
NRT_decrefrK   rL   rQ   s      r   make_decrefTestRefPrunePass.make_decrefA   rV   r   c                     [         R                  " [         R                  " S5      S5      n[         R                  " XSS9$ )N    r   switcherrK   r   rM   IntTyperP   rQ   s      r   make_switcherTestRefPrunePass.make_switcherE   s+    rzz"~r2{{144r   c                     [         R                  " [         R                  " S5      S5      n[         R                  " XSS9$ )N   r   brancherrK   r^   rQ   s      r   make_brancherTestRefPrunePass.make_brancherI   s+    rzz!}b1{{144r   c                    [         R                  " 5       nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      n[         R                  " [         R                  " 5       [        /5      n[         R                  " X8SS9n	U	R                  u  n
SU
l        0 nU H  nU	R                  U5      X'   M     [         R                  " 5       nUR                  5        GHO  u  pUR                  X   5        X    H@  nUS:X  a  UR!                  XJ/5        M  US:X  a  UR!                  XZ/5        M7  [#        S5      e   [%        U5      nUS:X  a  UR'                  5         M  US:X  a  Uu  nUR)                  UU   5        M  US	:X  a2  Uu  nnUR!                  US
5      nUR+                  UUU   UU   5        M  US	:  ae  UR!                  US
5      nUtnnUR-                  UUU   S9n[/        U5       H*  u  nnUR1                  UR3                  U5      UU   5        M,     GMG  [#        S5      e   U$ )NmainrK   memincrefdecrefunreachabler   rc      r   )default)r   ModulerT   rY   r`   re   rM   rN   rO   rP   argsrC   append_basic_block	IRBuilderr   position_at_endcallAssertionErrorlenret_voidbranchcbranchswitch	enumerateadd_casetype)r   r>   r?   rR   	incref_fn	decref_fnswitcher_fnbrancher_fnrS   r   ptrbbmapbbbuilderjump_targetsaction	n_targetsdstleftrightselheadtailswis                            r   generate_irTestRefPrunePass.generate_irM   s   IIK$$Q'	$$Q'	((+((+r{{}vh7[[v.B--b1EI  ,,. %B##EI.)X%LLE2x'LLE2(77 $ L)IA~  "a$uSz*a ,ull;3U4[%,?Qll;3 ,^^Ct^='oFAsKKU3Z8 . %]33? !.B r   c                     [         R                  " [        U5      5      nU R                  5       nUR	                  5       nUR                  5         UR                  X#5        U$ r
   )r(   parse_assemblystrr1   getModulePassManageradd_refprune_passr;   )r   irmodmodr1   pms        r   apply_refpruneTestRefPrunePass.apply_refprune   sK    !!#e*-WWY$$&

s
r   c                     [         R                  " [        U5      5      n[         R                  " 5       nUR	                  5         UR                  U5        U$ r
   )r(   r   r   ModulePassManagerr   r;   )r   r   r   r   s       r   apply_refprune_legacy&TestRefPrunePass.apply_refprune_legacy   s@    !!#e*-##%

s
r   c                 |   0 nUR                  5        H-  u  pVUR                  S5      nUR                  S5      nXxS.XE'   M/     UR                  5        HD  u  pYUR                  U5      (       d  M  U	S==   S-  ss'   X%    H  n
XJ   S==   S-  ss'   M     MF     UR                   H  nUR                  S:X  d  M    O   WR
                   Hl  nXLR                     n	[        U5      nUR                  S5      nUR                  S5      nU R                  U	S   USU 3S	9  U R                  U	S   USU 3S	9  Mn     g )
Nrj   rk   )rj   rk   rc   rh   rJ   rX   zBB )msg)r   countget	functionsrC   blocksr   r<   )r   r   r@   r>   dr   vsn_increfn_decrefstatsdec_bbfr   texts                 r   checkTestRefPrunePass.check   s)   [[]EAxx)Hxx)H&;AD # 	HA||Ah1$&kFIh'1,' * " Avv  ((BggJEr7Dzz,/Hzz,/HU8_hc"JGU8_hc"JG r   c                     U" 5       u  p#nU R                  X#5      nU R                  U5      nU R                  XdU5        g r
   )r   r   r   r   r=   r>   r?   r@   r   outmods          r   r   TestRefPrunePass.generate_test   s<    !)h  .$$U+

6U+r   c                     U" 5       u  p#nU R                  X#5      nU R                  U5      nU R                  XdU5        g r
   )r   r   r   r   s          r   generate_test_legacy%TestRefPrunePass.generate_test_legacy   s<    !)h  .++E2

6U+r   _legacyr   N)r   r   r3   r4   r   rT   rY   r`   re   r   r   r   r   r   r   r!   rC   r   rD   r5   r   r   r   rG   rG   4   s    77554lH4,, %]3
d 4 %%9:
d%)	!" ;r   rG   c                   0    \ rS rSrSrSrSS jrSS jrSrg)	BaseTestByIR   r   zG
declare void @NRT_incref(i8* %ptr)
declare void @NRT_decref(i8* %ptr)
Nc                    [         R                  " U R                   SU 35      nU R                  5       nUR	                  5       nUc  UR                  U R                  5        OUR                  U R                  US9  [         R                  " 5       nUR                  X45        [         R                  " 5       nX7U-
  4$ N
subgraph_limit)	r(   r   prologuer1   r   r   refprune_bitmaskdump_refprune_statsr;   )r   r   r   r   r1   r   beforeafters           r   r   BaseTestByIR.check   s    !!T]]O2eW"=>WWY$$&!  !6!67  !6!60> ! @))+
s((*FN""r   c                 j   [         R                  " U R                   SU 35      n[         R                  " 5       nUc  UR	                  U R
                  5        OUR	                  U R
                  US9  [         R                  " 5       nUR                  U5        [         R                  " 5       nX6U-
  4$ r   )r(   r   r   r   r   r   r   r;   )r   r   r   r   r   r   r   s          r   check_legacyBaseTestByIR.check_legacy   s    !!T]]O2eW"=>##%!  !6!67  !6!60> ! @))+
s((*FN""r   r   r
   )	r   r   r3   r4   r   r   r   r   r5   r   r   r   r   r      s    H
##r   r   c                       \ rS rSr\R
                  R                  rSrS r	S r
SrS rS r\(       a  SOS	rS
 rS r\(       a  SOSrS rS rSrg)	TestPerBB   zv
define void @main(i8* %ptr) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g Nrm   )r   per_bb_ir_1r<   
basicblockr   r   r   s      r   test_per_bb_1TestPerBB.test_per_bb_1   s.    ZZ 0 01
))1-r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   r   r<   r   r   s      r   test_per_bb_1_legacyTestPerBB.test_per_bb_1_legacy   s0    &&t'7'78
))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                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g N   zcall void @NRT_incref(ptr %ptr)zcall void @NRT_incref(i8* %ptr))r   per_bb_ir_2r<   r   r   assertInr   r   s      r   test_per_bb_2TestPerBB.test_per_bb_2  s\    ZZ 0 01
))1- #"MM;SXFMM;SXFr   c                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g r   )r   r   r<   r   r   r   r   r   s      r   test_per_bb_2_legacyTestPerBB.test_per_bb_2_legacy  s^    &&t'7'78
))1- #"MM;SXFMM;SX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                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g Nrm   !call void @NRT_decref(ptr %other)!call void @NRT_decref(i8* %other))r   per_bb_ir_3r<   r   r   r   r   r   s      r   test_per_bb_3TestPerBB.test_per_bb_3(  \    ZZ 0 01
))1- #"MM=s3xHMM=s3xHr   c                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g r   )r   r   r<   r   r   r   r   r   s      r   test_per_bb_3_legacyTestPerBB.test_per_bb_3_legacy2  ^    &&t'7'78
))1- #"MM=s3xHMM=s3x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                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g Nr   r   r   )r   per_bb_ir_4r<   r   r   r   r   r   s      r   test_per_bb_4TestPerBB.test_per_bb_4R  r   r   c                     U R                  U R                  5      u  pU R                  UR                  S5        [        (       a  U R                  S[        U5      5        g U R                  S[        U5      5        g r   )r   r   r<   r   r   r   r   r   s      r   test_per_bb_4_legacyTestPerBB.test_per_bb_4_legacy\  r   r   r   N)r   r   r3   r4   r(   RefPruneSubpassesPER_BBr   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r   r   r   r   r      sx    --44K..	KGG$ % $II( 

% ,IIr   r   c                       \ rS rSr\R
                  R                  rSrS r	S r
SrS rS rSrS	 rS
 rSrS rS rSrS rS rSrg)TestDiamondig  z
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    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   per_diamond_1r<   diamondr   s      r   test_per_diamond_1TestDiamond.test_per_diamond_1u  ,    ZZ 2 23
*r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   r   r<   r   r   s      r   test_per_diamond_1_legacy%TestDiamond.test_per_diamond_1_legacyy  .    &&t'9'9:
*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    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   per_diamond_2r<   r   r   s      r   test_per_diamond_2TestDiamond.test_per_diamond_2  r   r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   r  r<   r   r   s      r   test_per_diamond_2_legacy%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    U R                  U R                  5      u  pU R                  UR                  S5        g Nr   )r   per_diamond_3r<   r   r   s      r   test_per_diamond_3TestDiamond.test_per_diamond_3  r   r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   r  r<   r   r   s      r   test_per_diamond_3_legacy%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    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   per_diamond_4r<   r   r   s      r   test_per_diamond_4TestDiamond.test_per_diamond_4  r   r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   r  r<   r   r   s      r   test_per_diamond_4_legacy%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    U R                  U R                  5      u  pU R                  UR                  S5        g Nr   )r   per_diamond_5r<   r   r   s      r   test_per_diamond_5TestDiamond.test_per_diamond_5  r   r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   r  r<   r   r   s      r   test_per_diamond_5_legacy%TestDiamond.test_per_diamond_5_legacy  r  r   r   N)r   r   r3   r4   r(   r   DIAMONDr   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r5   r   r   r   r   r   g  si    --55	M++M++M ++M ++M"++r   r   c                       \ rS rSrSr\R                  R                  rSr	S r
S rSrS rS rS	rS
 rS rS rS rSrg)
TestFanouti  z6More 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    U R                  U R                  5      u  pU R                  UR                  S5        g N   )r   fanout_1r<   fanoutr   s      r   test_fanout_1TestFanout.test_fanout_1  *    ZZ.
q)r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r%  )r   r'  r<   r(  r   s      r   test_fanout_1_legacyTestFanout.test_fanout_1_legacy  ,    &&t}}5
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    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   fanout_2r<   r(  r   s      r   test_fanout_2TestFanout.test_fanout_2  r+  r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   r1  r<   r(  r   s      r   test_fanout_2_legacy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    U R                  U R                  5      u  pU R                  UR                  S5        g N   r   fanout_3r<   r(  r   s      r   test_fanout_3TestFanout.test_fanout_3"  r+  r   c                 t    U R                  U R                  SS9u  pU R                  UR                  S5        g Nrc   r   r   r:  r   s      r   test_fanout_3_limited TestFanout.test_fanout_3_limited&  s0     ZZaZ@
q)r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r8  r   r;  r<   r(  r   s      r   test_fanout_3_legacyTestFanout.test_fanout_3_legacy,  r/  r   c                 t    U R                  U R                  SS9u  pU R                  UR                  S5        g r?  rC  r   s      r   test_fanout_3_limited_legacy'TestFanout.test_fanout_3_limited_legacy0  s3     &&t}}Q&G
q)r   r   N)r   r   r3   r4   r   r(   r   FANOUTr   r'  r)  r-  r1  r2  r5  r;  r<  r@  rD  rG  r5   r   r   r   r#  r#    sX     --44H**H**H$****r   r#  c                       \ rS rSr\R
                  R                  rSrS r	S r
SrS rS rSrS	 rS
 rSrS rS rSrS rS rSrS rS rSrg)TestFanoutRaisei7  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 = !{i1 true}
c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   fanout_raise_1r<   fanout_raiser   s      r   test_fanout_raise_1#TestFanoutRaise.test_fanout_raise_1I  .    ZZ 3 34
++Q/r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   rM  r<   rN  r   s      r   test_fanout_raise_1_legacy*TestFanoutRaise.test_fanout_raise_1_legacyM  0    &&t':':;
++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    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   fanout_raise_2r<   rN  r   s      r   test_fanout_raise_2#TestFanoutRaise.test_fanout_raise_2a  s0     ZZ 3 34
++Q/r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   rW  r<   rN  r   s      r   test_fanout_raise_2_legacy*TestFanoutRaise.test_fanout_raise_2_legacyg  s2     &&t':':;
++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    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   fanout_raise_3r<   rN  r   s      r   test_fanout_raise_3#TestFanoutRaise.test_fanout_raise_3}  rQ  r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   r^  r<   rN  r   s      r   test_fanout_raise_3_legacy*TestFanoutRaise.test_fanout_raise_3_legacy  rU  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    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   fanout_raise_4r<   rN  r   s      r   test_fanout_raise_4#TestFanoutRaise.test_fanout_raise_4  rQ  r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r  )r   re  r<   rN  r   s      r   test_fanout_raise_4_legacy*TestFanoutRaise.test_fanout_raise_4_legacy  rU  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    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   fanout_raise_5r<   rN  r   s      r   test_fanout_raise_5#TestFanoutRaise.test_fanout_raise_5  rQ  r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g r   )r   rl  r<   rN  r   s      r   test_fanout_raise_5_legacy*TestFanoutRaise.test_fanout_raise_5_legacy  rU  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    U R                  U R                  5      u  pU R                  UR                  S5        g N   )r   fanout_raise_6r<   rN  r   s      r   test_fanout_raise_6#TestFanoutRaise.test_fanout_raise_6  rQ  r   c                 v    U R                  U R                  5      u  pU R                  UR                  S5        g rs  )r   ru  r<   rN  r   s      r   test_fanout_raise_6_legacy*TestFanoutRaise.test_fanout_raise_6_legacy  rU  r   r   N)r   r   r3   r4   r(   r   FANOUT_RAISEr   rM  rO  rS  rW  rX  r[  r^  r_  rb  re  rf  ri  rl  rm  rp  ru  rv  ry  r5   r   r   r   rK  rK  7  sz    --::N00N 00N 00N00N$00
N400r   rK  __main__)unittestllvmliter   r   r(   llvmlite.testsr   llvmlite.tests.refprune_prototestsrefprune_protor   r   r!   r#   r7   r_   
as_pointerrO   rG   r   r   r   r#  rK  r   rh   r   r   r   <module>r     s      $ # - -
 -	-1 1H  
A	!	!	#I*x!1 I*X!#8- !#H@I @IFt+, t+nV* V*r_0l _0D zMMO r   