Ë
    æÿæi,=  ã                   ót  — d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
c 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 j4                  «        yy)é    N)Údefaultdict)Úir)Úbinding)ÚTestCasec              #   ó¦   ‡ 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    €€úq/Volumes/fast/ai/experiments/voice-extract-mac/.venv/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   
   sJ   øè ø€ ôô —n‘n×*Ñ*Ö,‰
ˆˆ7Ø�<‰<˜ÕØ˜!˜�+™t G›}Ð,Ó,ñ -ù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Ñ1¸aÈAÔ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;   € Ù!)£Ñˆˆu�hÜ×#Ñ# E¨5Ó1×5Ñ5Ó7ˆØ×Ñ˜ 3Õ'r   N)	r   r   r/   r   r   r   Únamer   Úlocalsr   r   r   r1   r1      s,   „ ñò(ñ % ]Ö3‰
ˆˆdØ‰‹�Šñ 4r   r1   é   c                   ót   — e 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<   Œ 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_incref9   ó-   € Ü�‰œrŸ{™{›}¬v¨hÓ7ˆÜ�{‰{˜1˜d¨Ô6Ð6r   c                 óŒ   — t        j                  t        j                  «       t        g«      }t        j                  ||d¬«      S )NÚ
NRT_decrefrB   rC   rH   s      r   Úmake_decrefzTestRefPrunePass.make_decref=   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_switcherA   s-   € Ü�‰œrŸz™z¨"›~¨rÓ2ˆÜ�{‰{˜1˜d¨Ô4Ð4r   c                 ó„   — t        j                  t        j                  d«      d«      }t        j                  ||d¬«      S )Né   r   ÚbrancherrB   rS   rH   s      r   Úmake_brancherzTestRefPrunePass.make_brancherE   s-   € Ü�‰œrŸz™z¨!›}¨bÓ1ˆÜ�{‰{˜1˜d¨Ô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_irI   s  € ä�I‰I‹Kˆà×$Ñ$ QÓ'ˆ	Ø×$Ñ$ QÓ'ˆ	Ø×(Ñ(¨Ó+ˆØ×(Ñ(¨Ó+ˆä�‰œrŸ{™{›}¬v¨hÓ7ˆÜ�[‰[˜˜D vÔ.ˆØ—‘‰ˆØˆŒàˆÛˆBØ×-Ñ-¨bÓ1ˆE�"ŠIð ô —,‘,“.ˆØ %§¡§ÑˆB�Ø×#Ñ# E¨"¡IÔ.à œ)�Ø˜XÒ%Ø—L‘L ¨S¨EÕ2Ø˜xÒ'Ø—L‘L ¨S¨EÕ2ä(¨Ó7Ð7ð $ô ˜LÓ)ˆIØ˜AŠ~Ø× Ñ Õ"Ø˜a’Ø$‘�Ø—‘˜u S™zÕ*Ø˜a’Ø ,‘��uØ—l‘l ;°Ó3�Ø—‘  U¨4¡[°%¸±,Õ?Ø˜Q’Ø—l‘l ;°Ó3�Ø ,��˜à—^‘^ C°°t±�^Ó=�Ü'¨žo‘F�A�sØ—K‘K §¡¨£¨U°3©ZÕ8ò .ô % ]Ó3Ð3ð? !.ðB ˆ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£*Ó-ˆØ�W‰W‹YˆØ×$Ñ$Ó&ˆØ
×ÑÔØ
�‰ˆs�BŒØˆ
r   c                 óˆ  — t        d„ «      }|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 )Nc                  ó    — t        t        «      S r
   )r   Úintr   r   r   Ú<lambda>z(TestRefPrunePass.check.<locals>.<lambda>Œ   s	   € ¤¬CÔ 0r   r]   r^   )r]   r^   rW   r[   rA   rN   zBB )Úmsg)	r   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=  € ô
 Ñ0Ó1ˆà—[‘[–]‰EˆAˆrØ—x‘x Ó)ˆHØ—x‘x Ó)ˆHØ&°(Ñ;ˆAˆaŠDð #ð Ÿ™ž	‰HˆAˆuØ�|‰|˜A�Ø�h“ 1Ñ$“Ø& qœk�FØ�f‘I˜hÓ'¨1Ñ,Ô'ñ *ð "ð —”ˆAØ�v‰v˜ÓÙð ð
 —(”(ˆBØ�b—g‘g‘JˆEÜ�r“7ˆDØ—z‘z ,Ó/ˆHØ—z‘z ,Ó/ˆHØ×Ñ˜U 8™_¨h¸cÀ"À¸JÐÔGØ×Ñ˜U 8™_¨h¸cÀ"À¸JÐÕGñ r   c                 ó†   —  |«       \  }}}| j                  ||«      }| j                  |«      }| j                  |||«       y r
   )r„   r�   rŸ   )r   r6   r7   r8   r9   rŠ   Úoutmods          r   r   zTestRefPrunePass.generate_test¦   sB   € Ù!)£Ñˆˆu�hØ× Ñ  ¨Ó.ˆØ×$Ñ$ UÓ+ˆØ�
‰
�6˜8 UÕ+r   N)r   r   r/   r   rK   rO   rU   rY   r„   r�   rŸ   r   r   r;   r   r<   r   r   r   r?   r?   0   sQ   „ ñò7ò7ò5ò5ò4òlòHò>,ñ % ]Ö3‰
ˆˆdØ‰‹�Šñ 4r   r?   c                   ó   — e Zd ZdZ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§]¡] O°2°e°WÐ"=Ó>ˆØ�W‰W‹YˆØ×$Ñ$Ó&ˆØÐ!Ø× Ñ  ×!6Ñ!6Õ7à× Ñ  ×!6Ñ!6Ø0>ð !ô @ä×)Ñ)Ó+ˆØ
�‰ˆs�BŒÜ×(Ñ(Ó*ˆØ�E˜F‘NÐ"Ð"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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   € Ø—Z‘Z × 0Ñ 0Ó1‰
ˆˆ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«       | j	                  dt        |«      «       y )Né   zcall void @NRT_incref(ptr %ptr))rŸ   Úper_bb_ir_2r5   r²   ÚassertInr‡   r³   s      r   Útest_per_bb_2zTestPerBB.test_per_bb_2â   sC   € Ø—Z‘Z × 0Ñ 0Ó1‰
ˆˆUØ×Ñ˜×)Ñ)¨1Ô-à�‰Ð7¼¸S»ÕBr   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
}
c                 ó®   — | j                  | j                  «      \  }}| j                  |j                  d«       | j	                  dt        |«      «       y )Nr`   ú!call void @NRT_decref(ptr %other))rŸ   Úper_bb_ir_3r5   r²   r¸   r‡   r³   s      r   Útest_per_bb_3zTestPerBB.test_per_bb_3ò   óC   € Ø—Z‘Z × 0Ñ 0Ó1‰
ˆˆUØ×Ñ˜×)Ñ)¨1Ô-à�‰Ð9¼3¸s»8ÕDr   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
}
c                 ó®   — | j                  | j                  «      \  }}| j                  |j                  d«       | j	                  dt        |«      «       y )Nr¶   r»   )rŸ   Úper_bb_ir_4r5   r²   r¸   r‡   r³   s      r   Útest_per_bb_4zTestPerBB.test_per_bb_4  r¾   r   N)r   r   r/   r%   ÚRefPruneSubpassesÚPER_BBr©   r±   r´   r·   r¹   r¼   r½   rÀ   rÁ   r   r   r   r®   r®   È   sG   „ Ø×-Ñ-×4Ñ4Ðð€Kò.ð	€KòCð€KòEð
€KóEr   r®   c                   ój   — 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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_1  ó.   € Ø—Z‘Z × 2Ñ 2Ó3‰
ˆˆ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   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   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_4T  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_5i  rÊ   r   N)r   r   r/   r%   rÂ   ÚDIAMONDr©   rÇ   rÉ   rÌ   rÍ   rÐ   rÑ   rÓ   rÔ   rÖ   r×   r   r   r   rÅ   rÅ     sP   „ Ø×-Ñ-×5Ñ5Ðð	€Mò+ð€Mò+ð€Mò +ð€Mò +ð€Mó"+r   rÅ   c                   ó`   — e Zd ZdZej
                  j                  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‚  ó,   € Ø—Z‘Z §¡Ó.‰
ˆˆ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   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   € ð —Z‘Z §¡¸a�ZÓ@‰
ˆˆUØ×Ñ˜Ÿ™ qÕ)r   N)r   r   r/   r   r%   rÂ   ÚFANOUTr©   rÝ   rß   râ   rã   rç   rè   rê   r   r   r   rÚ   rÚ   n  sD   „ ñð ×-Ñ-×4Ñ4Ðð€Hò*ð€Hò*ð€Hò$*ó*r   rÚ   c                   ót   — 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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_1Ç  ó0   € Ø—Z‘Z × 3Ñ 3Ó4‰
ˆˆ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_2Û  s2   € ð —Z‘Z × 3Ñ 3Ó4‰
ˆˆ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   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   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   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_68  rò   r   N)r   r   r/   r%   rÂ   ÚFANOUT_RAISEr©   rï   rñ   rô   rõ   r÷   rø   rú   rû   rý   rþ   r  r  r   r   r   rí   rí   µ  s\   „ Ø×-Ñ-×:Ñ:Ðð€Nò0ð€Nò 0ð€Nò 0ð€Nò0ð€Nò$0ð
€Nó40r   rí   Ú__main__)ÚunittestÚcollectionsr   Úllvmliter   r   r%   Úllvmlite.testsr   Úllvmlite.tests.refprune_protoÚtestsÚrefprune_protor   r   r!   r1   rT   Ú
as_pointerrF   r?   r£   r®   rÅ   rÚ   rí   r   r[   r   r   r   Ú<module>r     sÈ   ðÛ Ý #Ý Ý $Ý #ç -Ð -ò	-÷1ñ 1ô˜Hô ð 
ˆ�‰�A‹×	!Ñ	!Ó	#€ô~�xÐ!1ô ~ôB#�8Ð-ô #ô.@E�ô @EôF`+�,ô `+ôFD*�ô D*ôNE0�lô E0ðP ˆzÒØ€H‡M�M…Oð r   