
     YHhtT                     t   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      j!                         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 j2                          yy)    N)ir)binding)TestCase)opaque_pointers_enabledc              #       K    fd}t         j                  j                         D ]&  \  }}|j                  d      sd|  ||      f ( y w)Nc                 X      fd}d j                    d j                   |_        |S )Nc                      |       S N )selffngenerate_tests    U/var/www/html/planif/env/lib/python3.12/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   s)    	+/a}Mr   casetest_)proto__dict__items
startswith)r   r   kcase_fns   `   r   _iterate_casesr      sO      nn**, -
7<<!+tG},,-s
   ;AAc                       e Zd Zd Zy)PassManagerMixinc                     t        j                          t         j                  j                         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   sN    %%'[[,,.DDF11aAN''C00r   N)r   r   __qualname__r.   r   r   r   r!   r!      s    1r   r!   c                   J    e Zd ZdZd Z ee      D ]  \  ZZe e       e<    y)TestRefPrunePrototypez-
    Test that the prototype is working.
    c                      |       \  }}}t        j                  ||      j                         }| j                  ||       y r
   )r   FanoutAlgorithmrunassertEqual)r   case_gennodesedgesexpectedgots         r   r   z#TestRefPrunePrototype.generate_test'   s;    !)uh##E515573'r   N)	r   r   r/   r   r   r   namer   localsr   r   r   r1   r1   #   s1    ( %]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   <    y)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=   -    r{{}vh7{{1d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   s-    rzz"~r2{{1d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   s-    rzz!}b1{{1d44r   c                    t        j                         }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }t        j                  t        j                         t        g      }t        j                  ||d      }	|	j                  \  }
d|
_        i }|D ]  }|	j                  |      ||<    t        j                         }|j                         D ]H  \  }}|j                  ||          ||   D ]>  }|dk(  r|j!                  ||
g       |dk(  r|j!                  ||
g       5t#        d       t%        |      }|dk(  r|j'                          |dk(  r|\  }|j)                  ||          |d	k(  r1|\  }}|j!                  |d
      }|j+                  |||   ||          |d	kD  re|j!                  |d
      }|^}}|j-                  |||         }t/        |      D ])  \  }}|j1                  |j3                  |      ||          + @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)   IIK$$Q'	$$Q'	((+((+r{{}vh7[[Dv. 	2B--b1E"I	2 ,,. % 	4B##E"I.) 8X%LLSE2x'LLSE2(778 L)IA~  "a$uSz*a ,ull;3U4[%,?Qll;3 ,^^Ct^='o 9FAsKKU3Z89 %]33?	4B r   c                     t        j                  t        |            }| j                         }|j	                         }|j                          |j                  ||       |S r
   )r%   parse_assemblystrr.   getModulePassManageradd_refprune_passr4   )r   irmodmodr.   pms        r   apply_refprunezTestRefPrunePass.apply_refprune   sM    !!#e*-WWY$$&

sB
r   c                     t        j                  t        |            }t        j                         }|j	                          |j                  |       |S r
   )r%   r   r   ModulePassManagerr   r4   )r   r   r   r   s       r   apply_refprune_legacyz&TestRefPrunePass.apply_refprune_legacy   s@    !!#e*-##%

s
r   c                 t   i }|j                         D ]/  \  }}|j                  d      }|j                  d      }||d||<   1 |j                         D ]>  \  }}	|j                  |      s|	dxx   dz  cc<   ||   D ]  }
||
   dxx   dz  cc<    @ |j                  D ]  }|j                  dk(  s n j
                  D ]r  }||j                     }	t        |      }|j                  d      }|j                  d      }| j                  |	d   |d| 	       | j                  |	d   |d| 	       t y )
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   sP   [[] 	<EArxx)Hxx)H&(;AaD	< 	 	-HAu||Ah1$&qk -FfIh'1,'-	-  	Avv	 (( 	HBbggJEr7Dzz,/Hzz,/HU8_hc"JGU8_hc"JG	Hr   c                      |       \  }}}| j                  ||      }| j                  |      }| j                  |||       y r
   )r   r   r   r   r6   r7   r8   r9   r   outmods          r   r   zTestRefPrunePass.generate_test   sB    !)uh  .$$U+

68U+r   c                      |       \  }}}| j                  ||      }| j                  |      }| j                  |||       y r
   )r   r   r   r   s          r   generate_test_legacyz%TestRefPrunePass.generate_test_legacy   sB    !)uh  .++E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554lH4,, %]3 
d %%9: *
d%)	!"*r   r?   c                   $    e Zd ZdZdZddZddZy)BaseTestByIRr   zG
declare void @NRT_incref(i8* %ptr)
declare void @NRT_decref(i8* %ptr)
Nc                    t        j                  | j                   d|       }| j                         }|j	                         }||j                  | j                         n|j                  | j                  |       t        j                         }|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]]O2eW"=>WWY$$&!  !6!67  !6!60> ! @))+
sB((*EFN""r   c                 h   t        j                  | j                   d|       }t        j                         }||j	                  | j
                         n|j	                  | j
                  |       t        j                         }|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]]O2eW"=>##%!  !6!67  !6!60> ! @))+
s((*EFN""r   r
   )r   r   r/   r   r   r   r   r   r   r   r   r      s    H
##r   r   c                       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y)	TestPerBBzv
define void @main(i8* %ptr) {
    call void @NRT_incref(i8* %ptr)
    call void @NRT_decref(i8* %ptr)
    ret void
}
c                 x    | j                  | j                        \  }}| j                  |j                  d       y Nr`   )r   per_bb_ir_1r5   
basicblockr   r   r   s      r   test_per_bb_1zTestPerBB.test_per_bb_1   s0    ZZ 0 01
U))1-r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   r   r5   r   r   s      r   test_per_bb_1_legacyzTestPerBB.test_per_bb_1_legacy   s2    &&t'7'7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                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y 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 01
U))1- #MM;SXFMM;SXFr   c                     | j                  | j                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y 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'78
U))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                     | j                  | j                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y 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 01
U))1- #MM=s3xHMM=s3xHr   c                     | j                  | j                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y r   )r   r   r5   r   r   r   r   r   s      r   test_per_bb_3_legacyzTestPerBB.test_per_bb_3_legacy2  ]    &&t'7'78
U))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                     | j                  | j                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y 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                        \  }}| j                  |j                  d       t        r| j                  dt        |             y | j                  dt        |             y 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      sx    --44K..	KGG$ % $II( 

% ,II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y)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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   per_diamond_1r5   diamondr   s      r   test_per_diamond_1zTestDiamond.test_per_diamond_1u  .    ZZ 2 23
U*r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   r   r5   r   r   s      r   test_per_diamond_1_legacyz%TestDiamond.test_per_diamond_1_legacyy  0    &&t'9'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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   per_diamond_2r5   r   r   s      r   test_per_diamond_2zTestDiamond.test_per_diamond_2  r   r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y Nr   )r   per_diamond_3r5   r   r   s      r   test_per_diamond_3zTestDiamond.test_per_diamond_3  r   r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   per_diamond_4r5   r   r   s      r   test_per_diamond_4zTestDiamond.test_per_diamond_4  r   r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y Nr   )r   per_diamond_5r5   r   r   s      r   test_per_diamond_5zTestDiamond.test_per_diamond_5  r   r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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  si    --55	M++M++M ++M ++M"++r   r   c                   x    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y)
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                 x    | j                  | j                        \  }}| j                  |j                  d       y N   )r   fanout_1r5   fanoutr   s      r   test_fanout_1zTestFanout.test_fanout_1  ,    ZZ.
Uq)r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   r   r5   r   r   s      r   test_fanout_1_legacyzTestFanout.test_fanout_1_legacy  .    &&t}}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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_2r5   r   r   s      r   test_fanout_2zTestFanout.test_fanout_2  r  r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y N   r   fanout_3r5   r   r   s      r   test_fanout_3zTestFanout.test_fanout_3"  r  r   c                 |    | j                  | j                  d      \  }}| j                  |j                  d       y NrW   r   r   r  r   s      r   test_fanout_3_limitedz TestFanout.test_fanout_3_limited&  s2     ZZaZ@
Uq)r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r  r   r  r5   r   r   s      r   test_fanout_3_legacyzTestFanout.test_fanout_3_legacy,  r  r   c                 |    | j                  | j                  d      \  }}| j                  |j                  d       y r  r  r   s      r   test_fanout_3_limited_legacyz'TestFanout.test_fanout_3_limited_legacy0  s5     &&t}}Q&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     sX     --4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y)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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_raise_1r5   fanout_raiser   s      r   test_fanout_raise_1z#TestFanoutRaise.test_fanout_raise_1I  0    ZZ 3 34
U++Q/r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   r  r5   r  r   s      r   test_fanout_raise_1_legacyz*TestFanoutRaise.test_fanout_raise_1_legacyM  2    &&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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_raise_2r5   r  r   s      r   test_fanout_raise_2z#TestFanoutRaise.test_fanout_raise_2a  s2     ZZ 3 34
U++Q/r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   r$  r5   r  r   s      r   test_fanout_raise_2_legacyz*TestFanoutRaise.test_fanout_raise_2_legacyg  s4     &&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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_raise_3r5   r  r   s      r   test_fanout_raise_3z#TestFanoutRaise.test_fanout_raise_3}  r  r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_raise_4r5   r  r   s      r   test_fanout_raise_4z#TestFanoutRaise.test_fanout_raise_4  r  r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y r   )r   fanout_raise_5r5   r  r   s      r   test_fanout_raise_5z#TestFanoutRaise.test_fanout_raise_5  r  r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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                 x    | j                  | j                        \  }}| j                  |j                  d       y N   )r   fanout_raise_6r5   r  r   s      r   test_fanout_raise_6z#TestFanoutRaise.test_fanout_raise_6  r  r   c                 x    | j                  | j                        \  }}| j                  |j                  d       y 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  sz    --::N00N 00N 00N00N$00
N4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     s      $ # - -
 -	-1 1H  
A	!	!	#I*x!1 I*X!#8- !#H@I @IFt+, t+nV* V*r_0l _0D zHMMO r   