§
    ‚Ûg›7  ã                   óz  — 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„ Z
 G d„ d	e¦  «        Z ej        d
¦  «                             ¦   «         Z G d„ de¦  «        Z G d„ d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é   )Úrefprune_protoc              #   ó¬   ‡ 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    €€úR/granary/edev/quantum/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Ø�<Š<˜ÑÔð 	-Ø˜!�+�+˜t˜t G™}œ}Ð,Ð,Ð,Ð,øð-ð -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   € Ø!) ¡¤Ñˆˆu�hÝÔ# E¨5Ñ1Ô1×5Ò5Ñ7Ô7ˆØ×Ò˜ 3Ñ'Ô'Ð'Ð'Ð'r   N)	r   r   Ú__qualname__r   r   r    Únamer   Úlocalsr   r   r   r"   r"      s]   € € € € € ðð ð(ð (ð (ð %�n ]Ñ3Ô3ð ð ‰
ˆˆdØˆˆ‰Œ�‰ˆðð r   r"   é   c                   ó~   — 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<   Œ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œ{™}œ}­v¨hÑ7Ô7ˆÝŒ{˜1˜d¨Ð6Ñ6Ô6Ð6r   c                 óˆ   — t          j        t          j        ¦   «         t          g¦  «        }t          j        ||d¬¦  «        S )NÚ
NRT_decrefr4   r5   r:   s      r   Úmake_decrefzTestRefPrunePass.make_decref3   r>   r   c                 ó~   — t          j        t          j        d¦  «        d¦  «        }t          j        ||d¬¦  «        S )Né    r   Úswitcherr4   ©r   r6   ÚIntTyper9   r:   s      r   Úmake_switcherzTestRefPrunePass.make_switcher7   s2   € ÝŒ�rœz¨"™~œ~¨rÑ2Ô2ˆÝŒ{˜1˜d¨Ð4Ñ4Ô4Ð4r   c                 ó~   — t          j        t          j        d¦  «        d¦  «        }t          j        ||d¬¦  «        S )Nr   r   Úbrancherr4   rE   r:   s      r   Úmake_brancherzTestRefPrunePass.make_brancher;   s2   € ÝŒ�rœz¨!™}œ}¨bÑ1Ô1ˆÝŒ{˜1˜d¨Ð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Úmainr4   ÚmemÚincrefÚdecrefÚunreachabler   r   é   r   )Údefault)r   ÚModuler=   rA   rG   rJ   r6   r7   r8   r9   Úargsr-   Úappend_basic_blockÚ	IRBuilderr   Úposition_at_endÚcallÚAssertionErrorÚlenÚret_voidÚbranchÚcbranchÚswitchÚ	enumerateÚadd_caseÚtype)r   r(   r)   r;   Ú	incref_fnÚ	decref_fnÚswitcher_fnÚbrancher_fnr<   r   ÚptrÚbbmapÚbbÚbuilderÚjump_targetsÚactionÚ	n_targetsÚdstÚleftÚrightÚselÚheadÚtailÚswÚis                            r   Úgenerate_irzTestRefPrunePass.generate_ir?   sŸ  € åŒI‰KŒKˆà×$Ò$ QÑ'Ô'ˆ	Ø×$Ò$ QÑ'Ô'ˆ	Ø×(Ò(¨Ñ+Ô+ˆØ×(Ò(¨Ñ+Ô+ˆåŒ�rœ{™}œ}­v¨hÑ7Ô7ˆÝŒ[˜˜D vÐ.Ñ.Ô.ˆØ”‰ˆØˆŒàˆØð 	2ð 	2ˆBØ×-Ò-¨bÑ1Ô1ˆE�"‰IˆIå”,‘.”.ˆØ %§¢¡¤ð 	4ñ 	4ÑˆB�Ø×#Ò# E¨"¤IÑ.Ô.Ð.à œ)ð 8ð 8�Ø˜XÒ%Ð%Ø—L’L ¨S¨EÑ2Ô2Ð2Ð2Ø˜xÒ'Ð'Ø—L’L ¨S¨EÑ2Ô2Ð2Ð2å(¨Ñ7Ô7Ð7õ ˜LÑ)Ô)ˆIØ˜AŠ~ˆ~Ø× Ò Ñ"Ô"Ð"Ð"Ø˜a’�Ø$‘�Ø—’˜u SœzÑ*Ô*Ð*Ð*Ø˜a’�Ø ,‘��uØ—l’l ;°Ñ3Ô3�Ø—’  U¨4¤[°%¸´,Ñ?Ô?Ð?Ñ?Ø˜Q’�Ø—l’l ;°Ñ3Ô3�Ø ,��˜à—^’^ C°°t´�^Ñ=Ô=�Ý'¨™oœoð 9ð 9‘F�A�sØ—K’K §¢¨¡¤¨U°3¬ZÑ8Ô8Ð8Ð8ñ9õ % ]Ñ3Ô3Ð3àˆr   c                 óÀ   — t          j        t          |¦  «        ¦  «        }t          j        ¦   «         }|                     ¦   «          |                     |¦  «         |S r   )ÚllvmÚparse_assemblyÚstrÚModulePassManagerÚadd_refprune_passr%   )r   ÚirmodÚmodÚpms       r   Úapply_refprunezTestRefPrunePass.apply_refpruneu   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 )
NrN   rO   )rN   rO   r   rL   r3   r@   zBB )Úmsg)r   ÚcountÚgetÚ	functionsr-   Úblocksry   r&   )r   r}   r*   r(   Údr   ÚvsÚn_increfÚn_decrefÚstatsÚdec_bbÚfrh   Útexts                 r   ÚcheckzTestRefPrunePass.check|   s¡  € àˆØ—[’[‘]”]ð 	<ð 	<‰EˆAˆrØ—x’x Ñ)Ô)ˆHØ—x’x Ñ)Ô)ˆHØ&°(Ð;Ð;ˆAˆa‰DˆDØŸš™	œ	ð 	-ð 	-‰HˆAˆuØ�|Š|˜A‰Œð -Ø�h��” 1Ñ$��‘Ø& qœkð -ð -�FØ�f”I˜hÐ'Ð'Ô'¨1Ñ,Ð'Ð'Ñ'Ð'øð ”ð 	ð 	ˆAØŒv˜ÒÐØ�ð  ð ”(ð 	Hð 	HˆBØ�b”g”JˆEÝ�r‘7”7ˆDØ—z’z ,Ñ/Ô/ˆHØ—z’z ,Ñ/Ô/ˆHØ×Ò˜U 8œ_¨h¸JÀ"¸J¸JÐÑGÔGÐGØ×Ò˜U 8œ_¨h¸JÀ"¸J¸JÐÑGÔGÐGÐGð	Hð 	Hr   c                 ó¦   —  |¦   «         \  }}}|                       ||¦  «        }|                      |¦  «        }|                      |||¦  «         d S r   )ru   r   rŽ   )r   r'   r(   r)   r*   r|   Úoutmods          r   r   zTestRefPrunePass.generate_test–   sX   € Ø!) ¡¤Ñˆˆu�hØ× Ò  ¨Ñ.Ô.ˆØ×$Ò$ UÑ+Ô+ˆØ�
Š
�6˜8 UÑ+Ô+Ð+Ð+Ð+r   N)r   r   r,   r   r=   rA   rG   rJ   ru   r   rŽ   r   r    r-   r   r.   r   r   r   r1   r1   &   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Øˆˆ‰Œ�‰ˆðð r   r1   c                   ó   — e Zd ZdZdZdd„ZdS )ÚBaseTestByIRr   zG
declare void @NRT_incref(i8* %ptr)
declare void @NRT_decref(i8* %ptr)
Nc                 óZ  — t          j        | j        › d|› �¦  «        }t          j        ¦   «         }|€|                     | j        ¦  «         n|                     | j        |¬¦  «         t          j        ¦   «         }|                     |¦  «         t          j        ¦   «         }|||z
  fS )Nú
©Úsubgraph_limit)rw   rx   Úprologuerz   r{   Úrefprune_bitmaskÚdump_refprune_statsr%   )r   r|   r–   r}   r~   ÚbeforeÚafters          r   rŽ   zBaseTestByIR.check©   s²   € ÝÔ! T¤]Ð"=Ð"=°eÐ"=Ð"=Ñ>Ô>ˆÝÔ#Ñ%Ô%ˆØÐ!Ø× Ò  Ô!6Ñ7Ô7Ð7Ð7à× Ò  Ô!6Ø0>ð !ñ @ô @ð @åÔ)Ñ+Ô+ˆØ
�Šˆs‰ŒˆÝÔ(Ñ*Ô*ˆØ�E˜F‘NÐ"Ð"r   r   )r   r   r,   r˜   r—   rŽ   r   r   r   r’   r’   ¡   s5   € € € € € ØÐð€Hð
#ð #ð #ð #ð #ð #r   r’   c                   óN   — 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	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 ©NrQ   )rŽ   Úper_bb_ir_1r&   Ú
basicblock©r   r}   rŠ   s      r   Útest_per_bb_1zTestPerBB.test_per_bb_1Â   s9   € Ø—Z’Z Ô 0Ñ1Ô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        d¦  «         |                      dt          |¦  «        ¦  «         d S )Né   zcall void @NRT_incref(i8* %ptr))rŽ   Úper_bb_ir_2r&   r¡   ÚassertInry   r¢   s      r   Útest_per_bb_2zTestPerBB.test_per_bb_2Ñ   sT   € Ø—Z’Z Ô 0Ñ1Ô1‰
ˆˆUØ×Ò˜Ô)¨1Ñ-Ô-Ð-à�ŠÐ7½¸S¹¼ÑBÔBÐBÐBÐBr   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¦  «         |                      dt          |¦  «        ¦  «         d S )NrQ   ú!call void @NRT_decref(i8* %other))rŽ   Úper_bb_ir_3r&   r¡   r§   ry   r¢   s      r   Útest_per_bb_3zTestPerBB.test_per_bb_3á   óT   € Ø—Z’Z Ô 0Ñ1Ô1‰
ˆˆUØ×Ò˜Ô)¨1Ñ-Ô-Ð-à�ŠÐ9½3¸s¹8¼8ÑDÔDÐDÐDÐDr   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¦  «         |                      dt          |¦  «        ¦  «         d S )Nr¥   rª   )rŽ   Úper_bb_ir_4r&   r¡   r§   ry   r¢   s      r   Útest_per_bb_4zTestPerBB.test_per_bb_4ó   r­   r   N)r   r   r,   rw   ÚRefPruneSubpassesÚPER_BBr˜   r    r£   r¦   r¨   r«   r¬   r¯   r°   r   r   r   r�   r�   ·   sƒ   € € € € € ØÔ-Ô4Ðð€Kð.ð .ð .ð	€KðCð Cð Cð€KðEð Eð Eð
€KðEð Eð Eð Eð Er   r�   c                   óX   — 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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_1r&   Údiamondr¢   s      r   Útest_per_diamond_1zTestDiamond.test_per_diamond_1  ó8   € Ø—Z’Z Ô 2Ñ3Ô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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S rŸ   )rŽ   Úper_diamond_2r&   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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S ©Nr   )rŽ   Úper_diamond_3r&   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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S rŸ   )rŽ   Úper_diamond_4r&   r·   r¢   s      r   Útest_per_diamond_4zTestDiamond.test_per_diamond_4C  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_5r&   r·   r¢   s      r   Útest_per_diamond_5zTestDiamond.test_per_diamond_5X  r¹   r   N)r   r   r,   rw   r±   ÚDIAMONDr˜   r¶   r¸   r»   r¼   r¿   rÀ   rÂ   rÃ   rÅ   rÆ   r   r   r   r´   r´   ú   sŽ   € € € € € ØÔ-Ô5Ðð	€Mð+ð +ð +ð€Mð+ð +ð +ð€Mð +ð +ð +ð€Mð +ð +ð +ð€Mð"+ð +ð +ð +ð +r   r´   c                   óN   — 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	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_1r&   Úfanoutr¢   s      r   Útest_fanout_1zTestFanout.test_fanout_1q  ó7   € Ø—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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S r¾   )rŽ   Úfanout_2r&   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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S )Né   ©rŽ   Úfanout_3r&   rÍ   r¢   s      r   Útest_fanout_3zTestFanout.test_fanout_3™  rÏ   r   c                 óz   — |                       | j        d¬¦  «        \  }}|                      |j        d¦  «         d S )Nr   r•   r   rÕ   r¢   s      r   Útest_fanout_3_limitedz TestFanout.test_fanout_3_limited�  s=   € ð —Z’Z ¤¸a�ZÑ@Ô@‰
ˆˆUØ×Ò˜œ qÑ)Ô)Ð)Ð)Ð)r   N)r   r   r,   r   rw   r±   ÚFANOUTr˜   rÌ   rÎ   rÑ   rÒ   rÖ   r×   rÙ   r   r   r   rÉ   rÉ   ]  s}   € € € € € ðð ð Ô-Ô4Ðð€Hð*ð *ð *ð€Hð*ð *ð *ð€Hð$*ð *ð *ð*ð *ð *ð *ð *r   rÉ   c                   óX   — 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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_1r&   Úfanout_raiser¢   s      r   Útest_fanout_raise_1z#TestFanoutRaise.test_fanout_raise_1¶  ó9   € Ø—Z’Z Ô 3Ñ4Ô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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S r¾   )rŽ   Úfanout_raise_2r&   rß   r¢   s      r   Útest_fanout_raise_2z#TestFanoutRaise.test_fanout_raise_2Ê  s;   € ð —Z’Z Ô 3Ñ4Ô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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S rŸ   )rŽ   Úfanout_raise_3r&   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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S r¾   )rŽ   Úfanout_raise_4r&   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                 óv   — |                       | j        ¦  «        \  }}|                      |j        d¦  «         d S rŸ   )rŽ   Úfanout_raise_5r&   rß   r¢   s      r   Útest_fanout_raise_5z#TestFanoutRaise.test_fanout_raise_5  rá   r   N)r   r   r,   rw   r±   ÚFANOUT_RAISEr˜   rÞ   rà   rã   rä   ræ   rç   ré   rê   rì   rí   r   r   r   rÜ   rÜ   ¤  sŽ   € € € € € ØÔ-Ô:Ðð€Nð0ð 0ð 0ð€Nð 0ð 0ð 0ð€Nð 0ð 0ð 0ð€Nð0ð 0ð 0ð€Nð$0ð 0ð 0ð 0ð 0r   rÜ   Ú__main__)ÚunittestÚllvmliter   r   rw   Úllvmlite.testsr   Ú r   r   r    r"   rF   Ú
as_pointerr8   r1   r’   r�   r´   rÉ   rÜ   r   rL   r   r   r   ú<module>rõ      s  ðØ €€€Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø #Ð #Ð #Ð #Ð #Ð #à %Ð %Ð %Ð %Ð %Ð %ð	-ð 	-ð 	-ðð ð ð ð ˜Hñ ô ð ð 
ˆŒ�A‰Œ×	!Ò	!Ñ	#Ô	#€ðxð xð xð xð x�xñ xô xð xðv#ð #ð #ð #ð #�8ñ #ô #ð #ð,@Eð @Eð @Eð @Eð @E�ñ @Eô @Eð @EðF`+ð `+ð `+ð `+ð `+�,ñ `+ô `+ð `+ðFD*ð D*ð D*ð D*ð D*�ñ D*ô D*ð D*ðNf0ð f0ð f0ð f0ð f0�lñ f0ô f0ð f0ðR ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   