o
    £¸¢iïì ã                   @   s~  d Z ddlZddlZddlZddlZddl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 e
 d¡Ze
 d¡Ze
 d	¡Ze
 d
¡Ze
 d¡Ze
 ¡ Ze
 ¡ Ze
 ¡ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!dd„ Z"G dd„ deƒZ#G d d!„ d!eƒZ$G d"d#„ d#eƒZ%e&d$kr½e '¡  dS dS )%z
IR Construction Tests
é    Né   )ÚTestCase)Úir)Úbinding)Úir_layer_typed_pointers_enabledé   é   é    é@   c                   @   s”   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zd%dd„Z	d&dd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )'ÚTestBasez!
    Utilities for IR tests.
    c                 C   s6   dd„ }d  t||ƒ¡}t dd|¡}|  ||¡ dS )zr
        Assert *pattern* is in *text*, ignoring any whitespace differences
        (including newlines).
        c                 S   s   |   ¡ s|  ¡ sd|  S | S )Nú\)ÚisalnumÚisspace)Úc© r   úT/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/llvmlite/tests/test_ir.pyÚescape'   s   z%TestBase.assertInText.<locals>.escapeÚ z\s+z\\s*N)ÚjoinÚmapÚreÚsubÚassertRegex)ÚselfÚpatternÚtextr   Úregexr   r   r   ÚassertInText!   s   zTestBase.assertInTextc                 C   s&   dd„ t |ƒ ¡ D ƒ}|  ||¡ d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)Ú.0Úliner   r   r   Ú
<listcomp>1   s    z+TestBase.assert_ir_line.<locals>.<listcomp>)ÚstrÚ
splitlinesÚassertIn)r   r    ÚmodÚlinesr   r   r   Úassert_ir_line0   s   zTestBase.assert_ir_linec                 C   s   t  t|ƒ¡ d S ©N)ÚllvmÚparse_assemblyr"   ©r   r%   r   r   r   Úassert_valid_ir4   s   zTestBase.assert_valid_irc                 C   s<   t  t j|dd¡}|  |j|j¡ |  t|ƒt|ƒ¡ |S )zAssert that the IR object pickles and unpickles correctly.
        The IR string is equal and that their type is equal
        éÿÿÿÿ)Úprotocol)ÚpickleÚloadsÚdumpsÚassertIsÚ	__class__ÚassertEqualr"   )r   ÚirobjectÚ	newobjectr   r   r   Úassert_pickle_correctly7   s   z TestBase.assert_pickle_correctlyc                 C   s   t  ¡ S r(   )r   ÚModule©r   r   r   r   Úmodule@   s   zTestBase.moduleNÚmy_funcc              	   C   s4   |p|   ¡ }t ttttt t¡f¡}t |||¡S r(   )r:   r   ÚFunctionTypeÚint32ÚdblÚPointerTypeÚFunction)r   r:   ÚnameÚfntyr   r   r   ÚfunctionC   s
   ÿzTestBase.functionr   c                 C   s   |p|   ¡ }| |¡S r(   )rC   Úappend_basic_block)r   ÚfuncrA   r   r   r   ÚblockI   s   
zTestBase.blockc                 C   s   g }|  |¡ d |¡S ©Nr   )Údescrr   )r   ÚthingÚbufr   r   r   rH   M   s   

zTestBase.descrc                 C   s   t  |¡}| dd¡}|S )Nz
    z
  )ÚtextwrapÚdedentÚreplace)r   Úasmr   r   r   Ú_normalize_asmR   s   
zTestBase._normalize_asmc                 C   ó   |   |¡}|  ||¡ d S r(   )rO   r   ©r   rH   rN   Úexpectedr   r   r   Úcheck_descr_regexX   ó   
zTestBase.check_descr_regexc                 C   rP   r(   )rO   r4   rQ   r   r   r   Úcheck_descr\   rT   zTestBase.check_descrc                 C   ó   |   |  |¡|¡ d S r(   )rU   rH   ©r   rF   rN   r   r   r   Úcheck_block`   ó   zTestBase.check_blockc                 C   rV   r(   )rS   rH   rW   r   r   r   Úcheck_block_regexc   rY   zTestBase.check_block_regexc                 C   s*   |   |¡}| ¡ }|  | ¡ | ¡ ¡ d S r(   )rO   Ú_stringify_bodyr4   r   ©r   r:   rN   rR   Úactualr   r   r   Úcheck_module_bodyf   s   
zTestBase.check_module_bodyc                 C   s*   |   |¡}| ¡ }|  | ¡ | ¡ ¡ dS )z6
        Check module metadata against *asm*.
        N)rO   Ú_stringify_metadatar4   r   r\   r   r   r   Úcheck_metadatak   s   
zTestBase.check_metadatac                 C   sD   |   |¡}|  |¡}| d¡d  d¡d }|  | ¡ | ¡ ¡ d S )NÚ{é   Ú}r   )rO   rH   Ú	partitionÚ
rpartitionr4   r   )r   rE   rN   rR   r]   r   r   r   Úcheck_func_bodys   s   

zTestBase.check_func_body)Nr;   rG   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r,   r7   r:   rC   rF   rH   rO   rS   rU   rX   rZ   r^   r`   rf   r   r   r   r   r      s$    	

r   c                   @   s   e Zd ZesdndZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )"ÚTestFunctionz=i32 @"my_func"(i32 %".1", i32 %".2", double %".3", ptr %".4")z>i32 @"my_func"(i32 %".1", i32 %".2", double %".3", i32* %".4")c                 C   s0   |   ¡ }|  |¡ ¡ }|  | ¡ d| j ¡ d S )Nz
declare %s)rC   rH   r   r4   Úproto©r   rE   rN   r   r   r   Útest_declare   s   zTestFunction.test_declarec                 C   s¤   |   ¡ }|j d¡ |j d¡ |j d¡ d|j_tjtddd}t |  ¡ |d¡}||j_	|  
|¡ ¡ }tsB|  |d	| j ¡ n	|  |d
| j ¡ |  |¡ d S )NÚoptsizeÚalwaysinlineÚ
convergentr   r   T©Úvar_argÚ__gxx_personality_v0zadeclare %s alwaysinline convergent optsize alignstack(16) personality ptr @"__gxx_personality_v0"zgdeclare %s alwaysinline convergent optsize alignstack(16) personality i8 (...)* @"__gxx_personality_v0")rC   Ú
attributesÚaddÚ
alignstackr   r<   Úint8r@   r:   ÚpersonalityrH   r   r   r4   rl   r7   )r   rE   Útp_persÚpersrN   r   r   r   Útest_declare_attributes‡   s*   ýÿýÿz$TestFunction.test_declare_attributesc                 C   s˜   |   ¡ }|jd  d¡ d|jd j_d|jd j_d|jd j_|jd  d¡ |j d	¡ |  |¡ 	¡ }t
s?|  |d
¡ n|  |d¡ |  |¡ d S )Nr   Úzeroexté   r   é
   é   é   ÚnonnullÚnoaliasz”declare noalias i32 @"my_func"(i32 zeroext %".1", i32 dereferenceable(5) dereferenceable_or_null(10) %".2", double %".3", ptr nonnull align 4 %".4")z•declare noalias i32 @"my_func"(i32 zeroext %".1", i32 dereferenceable(5) dereferenceable_or_null(10) %".2", double %".3", i32* nonnull align 4 %".4"))rC   ÚargsÚadd_attributeru   ÚdereferenceableÚdereferenceable_or_nullÚalignÚreturn_valuerH   r   r   r4   r7   rm   r   r   r   Útest_function_attributes¡   s    ÿÿz%TestFunction.test_function_attributesc                 C   sV   |   ¡ }|  |¡}| d| g ¡¡ |  |¡ ¡ }|  |d| j› d¡ |  |¡ d S )NÚdbgúdeclare z !dbg !0)	r:   rC   Úset_metadataÚadd_metadatarH   r   r4   rl   r7   ©r   r:   rE   rN   r   r   r   Útest_function_metadata¶   s   
ÿz#TestFunction.test_function_metadatac                 C   s@   |   ¡ }d|_|  |¡ ¡ }|  |d| j› d¡ |  |¡ d S )NÚ	a_sectionrŒ   z section "a_section")rC   ÚsectionrH   r   r4   rl   r7   rm   r   r   r   Útest_function_sectionÂ   s   ÿz"TestFunction.test_function_sectionc                 C   s\   |   ¡ }|  |¡}d|_| d| g ¡¡ |  |¡ ¡ }|  |d| j› d¡ |  	|¡ d S )Nr‘   r‹   rŒ   z section "a_section" !dbg !0)
r:   rC   r’   r   rŽ   rH   r   r4   rl   r7   r   r   r   r   Útest_function_section_metaÍ   s   
ÿz'TestFunction.test_function_section_metac                 C   sb   |   ¡ }|  |¡}|j d¡ | d| g ¡¡ |  |¡ ¡ }|  |d| j	› d¡ |  
|¡ d S )Nrp   r‹   rŒ   z alwaysinline !dbg !0)r:   rC   ru   rv   r   rŽ   rH   r   r4   rl   r7   r   r   r   r   Útest_function_attr_metaÚ   s   
ÿz$TestFunction.test_function_attr_metac                 C   sL   |   ¡ }|j d¡ d|_|  |¡ ¡ }|  |d| j› d¡ |  |¡ d S )Nro   r‘   rŒ   z optsize section "a_section")	rC   ru   rv   r’   rH   r   r4   rl   r7   rm   r   r   r   Útest_function_attr_sectionç   s   ÿz'TestFunction.test_function_attr_sectionc                 C   sh   |   ¡ }|  |¡}|j d¡ d|_| d| g ¡¡ |  |¡ ¡ }|  	|d| j
› d¡ |  |¡ d S )Nrp   r‘   r‹   rŒ   z) alwaysinline section "a_section" !dbg !0)r:   rC   ru   rv   r’   r   rŽ   rH   r   r4   rl   r7   r   r   r   r   Útest_function_attr_section_metaò   s   
ÿz,TestFunction.test_function_attr_section_metac                 C   sT   |   ¡ }|j d¡ | d¡}t |¡}| ¡  |  |¡}|  |dj	| j
d¡ d S )Nrp   Úmy_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )rl   )rC   ru   rv   rD   r   Ú	IRBuilderÚret_voidrH   rU   Úformatrl   )r   rE   rF   ÚbuilderrN   r   r   r   Útest_define   s   


úzTestFunction.test_definec                 C   sØ   |   ¡ }t ¡ }| dtg¡}| d|tg¡}| d||tg¡}| d¡}|  |  |¡ ¡ d¡ t	sI|  |  |¡ ¡ d¡ |  |  |¡ ¡ d¡ n|  |  |¡ ¡ d¡ |  |  |¡ ¡ d	¡ |  |  |¡ ¡ d
¡ d S )Nú	llvm.powizllvm.memsetzllvm.memcpyzllvm.assumezD            declare double @"llvm.powi.f64"(double %".1", i32 %".2")z\                declare void @"llvm.memset.p0.i32"(ptr %".1", i8 %".2", i32 %".3", i1 %".4")z`                declare void @"llvm.memcpy.p0.p0.i32"(ptr %".1", ptr %".2", i32 %".3", i1 %".4")z^                declare void @"llvm.memset.p0i8.i32"(i8* %".1", i8 %".2", i32 %".3", i1 %".4")zd                declare void @"llvm.memcpy.p0i8.p0i8.i32"(i8* %".1", i8* %".2", i32 %".3", i1 %".4")z1            declare void @"llvm.assume"(i1 %".1"))
r:   rx   Ú
as_pointerÚdeclare_intrinsicr>   r=   rU   rH   r   r   )r   r:   Úpint8ÚpowiÚmemsetÚmemcpyÚassumer   r   r   Útest_declare_intrinsics  s   
z$TestFunction.test_declare_intrinsicsc                 C   s4   |   ¡ }| dtg¡}| dtg¡}|  ||¡ d S )Nrž   )r:   r    r>   r2   )r   r:   r¢   Úpowi2r   r   r   Útest_redeclare_intrinsic'  ó   z%TestFunction.test_redeclare_intrinsicc                 C   ó   |   ¡ }|  |¡ d S r(   )rC   r7   )r   Úfnr   r   r   Útest_pickling-  ó   zTestFunction.test_picklingc                 C   ó`   |   ¡ }|  |¡}|j d¡ d}|  t|¡ |j d¡ W d   ƒ d S 1 s)w   Y  d S )Nrp   ú$Can't have alwaysinline and noinlineÚnoinline©r:   rC   ru   rv   ÚassertRaisesRegexÚ
ValueError©r   r:   rE   Úmsgr   r   r   Ú%test_alwaysinline_noinline_disallowed1  ó   
"ÿz2TestFunction.test_alwaysinline_noinline_disallowedc                 C   r®   )Nr°   r¯   rp   r±   r´   r   r   r   Ú%test_noinline_alwaysinline_disallowed:  r·   z2TestFunction.test_noinline_alwaysinline_disallowedN)rg   rh   ri   r   rl   rn   r|   rŠ   r   r“   r”   r•   r–   r—   r   r¦   r¨   r¬   r¶   r¸   r   r   r   r   rk   z   s(    ÿý	rk   c                   @   s”   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚTestIRc                 C   s8   |   ¡ }| tdƒtdƒg¡ |  d|¡ |  |¡ d S )Né{   é*   z!0 = !{ i32 123, i8 42 })r:   rŽ   r=   rx   r'   r,   r+   r   r   r   Útest_unnamed_metadataF  s   zTestIR.test_unnamed_metadatac                 C   s‚   |   ¡ }| tdƒdg¡}| tdƒ|g¡}| tdƒ|g¡}|  ||¡ | |||g¡ |  d|¡ |  d|¡ |  d|¡ d S )Nrº   ÚkerneléÈ  z!0 = !{ i32 123, !"kernel" }z!1 = !{ i64 456, !0 }z!2 = !{ !0, !1, !1 })r:   rŽ   r=   Úint64r2   r'   )r   r%   Úm0Úm1Úm2r   r   r   Útest_unnamed_metadata_2M  s   zTestIR.test_unnamed_metadata_2c                 C   sX   |   ¡ }| tdƒtdƒgtdƒgtdƒgg¡ |  d|¡ |  d|¡ |  d|¡ d S )Nrº   r¾   i  z!0 = !{ i32 456 }z!1 = !{ i32 789 }z!2 = !{ i32 123, !0, !1, !0 })r:   rŽ   r=   r'   r+   r   r   r   Útest_unnamed_metadata_3]  s
   (zTestIR.test_unnamed_metadata_3c                 C   s$   |   ¡ }| dg¡ |  d|¡ d S )Nz"\$z!0 = !{ !"\22\5c$" })r:   rŽ   r'   r+   r   r   r   Útest_metadata_stringe  s   zTestIR.test_metadata_stringc                 C   s²   |   ¡ }| tdƒg¡}| tdƒg¡}| d¡}| |¡ | |¡ | |¡ |  d|¡ |  |¡ |  || 	d¡¡ |  
t¡ | 	d¡ W d   ƒ d S 1 sRw   Y  d S )Nrº   r¾   Úfooz!foo = !{ !0, !1, !0 }Úbar)r:   rŽ   r=   r¿   Úadd_named_metadatarv   r'   r,   r2   Úget_named_metadataÚassertRaisesÚKeyError)r   r%   rÀ   rÁ   Únmdr   r   r   Útest_named_metadatak  s   




"ÿzTestIR.test_named_metadatac                 C   s¦   |   ¡ }| tdƒg¡}| d|¡ | dtdƒg¡ | ddg¡ | dg ¡ |  d|¡ |  d|¡ |  d|¡ |  d	|¡ |  d
|¡ |  d|¡ |  |¡ d S )Nrº   rÆ   r¾   r½   rÇ   z!foo = !{ !0, !1, !2 }z!0 = !{ i32 123 }z!1 = !{ i64 456 }z!2 = !{ !"kernel" }z!bar = !{ !3 }z
!3 = !{  })r:   rŽ   r=   rÈ   r¿   r'   r,   )r   r%   rÀ   r   r   r   Útest_named_metadata_2{  s   zTestIR.test_named_metadata_2c                 C   sx   |   ¡ }| t ¡ d ƒg¡ ts|  d|¡ n|  d|¡ |  |¡ |   ¡ }| d tdƒg¡ |  d|¡ |  |¡ d S )Nz!0 = !{ ptr null }z!0 = !{ i32* null }rº   z!0 = !{ null, i32 123 })r:   rŽ   r=   rŸ   r   r'   r,   r+   r   r   r   Útest_metadata_null‹  s   
zTestIR.test_metadata_nullc              	   C   sÄ   |   ¡ }| ddddœ¡}| dd| d g¡i¡}|jdt d¡|d	d
ddœdd}|jdd|d|d|dœdd t|ƒ}|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ |  |¡ d S )NÚDIFilerÆ   rÇ   ©ÚfilenameÚ	directoryÚDISubroutineTypeÚtypesÚDICompileUnitÚDW_LANG_PythonÚARTIQr   T)ÚlanguageÚfileÚproducerÚruntimeVersionÚisOptimized©Úis_distinctÚDISubprogramr;   é   F)rA   rÚ   r    ÚtypeÚisLocalÚunitú/!0 = !DIFile(directory: "bar", filename: "foo")z!1 = !{ null }z!!2 = !DISubroutineType(types: !1)zy!3 = distinct !DICompileUnit(file: !0, isOptimized: true, language: DW_LANG_Python, producer: "ARTIQ", runtimeVersion: 0)zd!4 = distinct !DISubprogram(file: !0, isLocal: false, line: 11, name: "my_func", type: !2, unit: !3))r:   Úadd_debug_inforŽ   r   ÚDITokenr"   r'   r,   )r   r%   Údi_fileÚdi_func_typeÚdi_compileunitÚstrmodr   r   r   Útest_debug_infoš  sP   þþûúúù
ÿýýzTestIR.test_debug_infoc                 C   s²   |   ¡ }| ddddœ¡}| ddddœ¡}| ddddœ¡}|jddddœdd}|  ||¡ |  t||||hƒd¡ t|ƒ}|  d|¡ |  d	|¡ |  d
|¡ |  |¡ d S )NrÐ   rÆ   rÇ   rÑ   TrÞ   r   rå   z/!1 = !DIFile(directory: "foo", filename: "bar")z8!2 = distinct !DIFile(directory: "bar", filename: "foo"))r:   ræ   r2   r4   Úlenr"   r'   r,   )r   r%   Údi1Údi2Údi3Údi4rë   r   r   r   Útest_debug_info_2Ç  sF   ÿÿÿÿÿÿÿýÿÿÿzTestIR.test_debug_info_2c                 C   s–  |   ¡ }| dddt d¡dœ¡}| dddt d¡dœ¡}| dddt d¡dœ¡}| dddt d¡dœ¡}| dddt d¡dœ¡}| dddt d¡dœ¡}| ddd	t d
¡dœ¡}| ddd	t d
¡dœ¡}	| ddd	t d
¡dœ¡}
|  ||¡ |  ||¡ |  ||¡ |  ||¡ |  ||	¡ |  ||
¡ |  t||||||||	|
h	ƒd¡ t|ƒ}|  d|¡ |  d|¡ |  d|¡ |  	|¡ d S )NÚDIBasicTypeÚi8r   ÚDW_ATE_unsigned©rA   ÚsizeÚencodingÚi32r	   Úi64r
   ÚDW_ATE_signedr   zA!0 = !DIBasicType(encoding: DW_ATE_unsigned, name: "i8", size: 8)zC!1 = !DIBasicType(encoding: DW_ATE_unsigned, name: "i32", size: 32)zA!2 = !DIBasicType(encoding: DW_ATE_signed, name: "i64", size: 64))
r:   ræ   r   rç   r2   r4   rí   r"   r'   r,   )r   r%   rî   rï   rð   rñ   Údi5Údi6Údi7Údi8Údi9rë   r   r   r   Útest_debug_info_3æ  s€   ýýýýýýýýý"ÿÿÿzTestIR.test_debug_info_3c              
   C   sÒ   |   ¡ }| dddt d¡dœ¡}| dddt d¡dœ¡}| dt d	¡d
|dt d¡dƒdœ¡ | dt d	¡d|dt d¡dƒdœ¡ t|ƒ}|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  |¡ d S )Nró   r=   r	   rû   rö   rx   r   ÚDIDerivedTypeÚDW_TAG_memberÚ	field_i32r   )ÚtagrA   ÚbaseTyper÷   Ú	extraDataÚfield_i8rb   zC!0 = !DIBasicType(encoding: DW_ATE_signed, name: "int32", size: 32)zA!1 = !DIBasicType(encoding: DW_ATE_signed, name: "int8", size: 8)zd!2 = !DIDerivedType(baseType: !0, extraData: i32 1, name: "field_i32", size: 32, tag: DW_TAG_member)za!3 = !DIDerivedType(baseType: !1, extraData: i8 2, name: "field_i8", size: 8, tag: DW_TAG_member))r:   ræ   r   rç   ÚIntTyper"   r'   r,   )r   r%   Údi_base_i32Ú
di_base_i8rë   r   r   r   Útest_debug_info_4'  sR   ýýûûÿÿþþzTestIR.test_debug_info_4c              
   C   s„  |   ¡ }t |t ¡ d¡}t t ¡ d¡|_| dddt d¡dœ¡}| d| d	i ¡|jd
|j|ddœdddœ¡}| 	d|¡ t
|ƒ}|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ t d¡dƒdt d¡dƒg}t d¡dƒdt d¡dƒg}| |¡}| |¡}| d¡}| |¡ | |¡ | ddddœ¡}	|jdt d ¡|	t d!¡| |g¡d"œdd}
| d#|
¡ d S )$NÚgvarr»   ró   Úfloatr	   ÚDW_ATE_floatrö   ÚDIGlobalVariableExpressionÚDIExpressionÚDIGlobalVariableT)rA   râ   ÚisDefinitionrÞ   )ÚexprÚvarr‹   zB!0 = !DIBasicType(encoding: DW_ATE_float, name: "float", size: 32)z!1 = !DIExpression()zK!2 = distinct !DIGlobalVariable(isDefinition: true, name: "gvar", type: !0)z3!3 = !DIGlobalVariableExpression(expr: !1, var: !2)z2@"gvar" = global float 0x4045000000000000, !dbg !3rb   zDwarf Versionr€   zDebug Info Versionr   zllvm.module.flagsrÐ   rÆ   rÇ   rÑ   rÖ   r×   Ú	FullDebug)rÙ   rÚ   ÚemissionKindÚglobalszllvm.dbg.cu)r:   r   ÚGlobalVariableÚ	FloatTypeÚConstantÚinitializerræ   rç   rA   r   r"   r'   r	  rŽ   rÈ   rv   )r   r%   r  Údi_floatÚdi_gvarrë   ÚdverÚdiverÚflagsrè   Údi_cur   r   r   Útest_debug_info_gvarR  sj   ý
ýüþÿÿÿÿ




þ
üûzTestIR.test_debug_info_gvarc                 C   sP   |   ¡ }| dddi¡ t|ƒ}d tdd„ d ¡ ƒ¡}|  d|› d	|¡ d S )
NÚDILocalVariablerA   u   aâˆ†r   c                 S   s   d| d›S )Nr   Ú02xr   )Úxr   r   r   Ú<lambda>œ  s    z7TestIR.test_debug_info_unicode_string.<locals>.<lambda>u   âˆ†z!0 = !DILocalVariable(name: "az"))r:   ræ   r"   r   r   Úencoder'   )r   r%   rë   rA   r   r   r   Útest_debug_info_unicode_string–  s
   z%TestIR.test_debug_info_unicode_stringc                 C   sŽ   |   ¡ }t |t t ¡ g ¡d¡}t | d¡¡}t ttg¡}tj|dddd}| 	|tdƒg¡ | 
¡  d}|  |t|ƒ¡ |  |¡ d S )	NrÆ   r   ú
mov $1, $2ú=r,rT©Úside_effectrº   z7call i32 asm sideeffect "mov $1, $2", "=r,r"( i32 123 ))r:   r   r@   r<   ÚVoidTyper™   rD   r=   Ú	InlineAsmÚcallrš   r   r"   r,   )r   r%   rÆ   rœ   ÚasmtyrN   Úpatr   r   r   Útest_inline_assemblyŸ  s   zTestIR.test_inline_assemblyc                 C   s„   |   ¡ }t |t t ¡ g ¡d¡}t | d¡¡}t ttg¡}|j|ddtdƒgdd | 	¡  d}|  
|t|ƒ¡ |  |¡ d S )	NrÆ   r   r*  r+  rº   Tr,  z8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))r:   r   r@   r<   r.  r™   rD   r=   rN   rš   r   r"   r,   )r   r%   rÆ   rœ   r1  r2  r   r   r   Útest_builder_asm«  s   zTestIR.test_builder_asmc                 C   sn   |   ¡ }t |t t ¡ g ¡d¡}t | d¡¡}| t d¡d¡ | 	¡  d}|  
|t|ƒ¡ |  |¡ d S )NrÆ   r   r
   Úraxzcall i64 asm "", "={rax}")r:   r   r@   r<   r.  r™   rD   Úload_regr	  rš   r   r"   r,   ©r   r%   rÆ   rœ   r2  r   r   r   Útest_builder_load_reg¶  s   zTestIR.test_builder_load_regc                 C   st   |   ¡ }t |t t ¡ g ¡d¡}t | d¡¡}| tdƒt 	d¡d¡ | 
¡  d}|  |t|ƒ¡ |  |¡ d S )NrÆ   r   rº   r
   r5  z0call void asm sideeffect "", "{rax}" ( i64 123 ))r:   r   r@   r<   r.  r™   rD   Ú	store_regr¿   r	  rš   r   r"   r,   r7  r   r   r   Útest_builder_store_regÀ  s   zTestIR.test_builder_store_regN)rg   rh   ri   r¼   rÃ   rÄ   rÅ   rÍ   rÎ   rÏ   rì   rò   r  r  r#  r)  r3  r4  r8  r:  r   r   r   r   r¹   D  s$    -A+D	
r¹   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestGlobalValuesc                 C   sÒ   |   ¡ }t |t t ¡ g ¡d¡}t |t t ¡ g ¡d¡ t |t ¡ d¡}|  | d¡|¡ |  | d¡|¡ |  	t
¡ | d¡ W d   ƒ n1 sNw   Y  ts_|  t|ƒd¡ d S |  t|ƒd¡ d S )NrÆ   rÇ   Ú
globdoubleÚkkkz.<ir.GlobalVariable 'globdouble' of type 'ptr'>z2<ir.GlobalVariable 'globdouble' of type 'double*'>)r:   r   r@   r<   r.  r  Ú
DoubleTyper4   Ú
get_globalrÊ   rË   r   Úrepr)r   r%   rÆ   r=  r   r   r   Útest_globals_accessÍ  s"   ÿ
ÿþz$TestGlobalValues.test_globals_accessc                 C   s€   |   ¡ }t t ¡ g ¡}t ||d¡}t ||d¡}t |t ¡ d¡}|  t|j	ƒt||fƒ¡ |  t|j
ƒt|||fƒ¡ dS )zr
        Accessing functions and global values through Module.functions
        and Module.global_values.
        rÆ   rÇ   r=  N)r:   r   r<   r.  r@   r  r?  r4   ÚsetÚ	functionsÚglobal_values)r   r%   ÚftyrÆ   rÇ   r=  r   r   r   Ú#test_functions_global_values_accessß  s    z4TestGlobalValues.test_functions_global_values_accessc                 C   s  |   ¡ }t |td¡}tj|tddd}t |td¡}tdƒ|_t |td¡}d|_t |td	¡}d
|_tj|tddd}d|_t |td¡}d
|_tdƒ|_d|_	t |td¡}	d
|	_tdƒ|	_d|	_
t |td¡}
d
|
_tdƒ|
_d|
_	d|
_
|  |d¡ dS )z7
        IR serialization of global variables.
        ÚaÚbr»   ©Ú	addrspacer   rº   ÚdTÚeÚinternalÚfr¾   Úgr   ÚhÚ	h_sectionÚir   Ú	i_sectionaß              @"a" = external global i8
            @"b" = external addrspace(42) global i8
            @"c" = global i32 123
            @"d" = external constant i32
            @"e" = internal global i32 undef
            @"f" = external unnamed_addr addrspace(456) global i32
            @"g" = internal global i32 123, align 16
            @"h" = internal global i32 123, section "h_section"
            @"i" = internal global i32 456, section "i_section", align 8
            N)r:   r   r  rx   r=   r  Úglobal_constantÚlinkageÚunnamed_addrrˆ   r’   r^   )r   r%   rH  rI  r   rL  rM  rO  rP  rQ  rS  r   r   r   Útest_global_variables_irì  s2   



z)TestGlobalValues.test_global_variables_irc                 C   rª   r(   )r:   r7   r+   r   r   r   Útest_pickle  r­   zTestGlobalValues.test_pickleN)rg   rh   ri   rB  rG  rX  rY  r   r   r   r   r<  Ë  s
    +r<  c                   @   r;  )
Ú	TestBlockc                 C   s4   |   ¡ }tj|dd}|  |j|¡ |  |j¡ d S )NÚstart©ÚparentrA   )rC   r   ÚBlockr2   r]  ÚassertFalseÚis_terminated©r   rE   rF   r   r   r   Útest_attributes  r©   zTestBlock.test_attributesc                 C   sD   | j dd}|  |  |¡d¡ |j ddg¡ |  |  |¡d¡ d S )Nr˜   ©rA   z
my_block:
rH  rI  zmy_block:
  a
  b
)rF   r4   rH   ÚinstructionsÚextend)r   rF   r   r   r   Ú
test_descr$  s   zTestBlock.test_descrc                 C   s”   | j dd}t |¡}|jjd d… \}}| ||d¡}| ||d¡}| ||d¡ t ||j	d||fd¡}|  
|d	¡ | ||¡ |  
|d
¡ d S )Nr˜   rc  rb   r   rL  rM  ÚsdivrO  z¥            my_block:
                %"c" = add i32 %".1", %".2"
                %"d" = sub i32 %".1", %".2"
                %"e" = mul i32 %"d", %".2"
            z¥            my_block:
                %"c" = add i32 %".1", %".2"
                %"f" = sdiv i32 %"c", %".2"
                %"e" = mul i32 %"f", %".2"
            )rF   r   r™   rC   r„   rv   r   ÚmulÚInstructionrâ   rX   rM   )r   rF   rœ   rH  rI  r   rL  rO  r   r   r   Útest_replace*  s   
zTestBlock.test_replacec                 C   s*   |   ¡ }tj|dd}|  t|ƒd¡ dS )z4
        Blocks should have a useful repr()
        r[  r\  z"<ir.Block 'start' of type 'label'>N)rC   r   r^  r4   rA  ra  r   r   r   Ú	test_repr@  s   zTestBlock.test_reprN)rg   rh   ri   rb  rf  rj  rk  r   r   r   r   rZ    s
    rZ  c                   @   sÌ  e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dUdV„ Z.dWdX„ Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2d_d`„ Z3dadb„ Z4dcdd„ Z5dedf„ Z6dgdh„ Z7didj„ Z8dkdl„ Z9dmdn„ Z:dodp„ Z;dqS )rÚTestBuildInstructionszN
    Test IR generation of LLVM instructions through the IRBuilder class.
    i   c                 C   sX   | j dd}t |¡}|jjd d… \}}| ||d¡}|  |d¡ |  t|ƒd¡ d S )Nr˜   rc  rb   ÚreszP            my_block:
                %"res" = add i32 %".1", %".2"
            z}<ir.Instruction 'res' of type 'i32', opname 'add', operands (<ir.Argument '.1' of type i32>, <ir.Argument '.2' of type i32>)>)	rF   r   r™   rC   r„   rv   rX   r4   rA  )r   rF   rœ   rH  rI  Úinstr   r   r   Útest_simpleP  s   

ÿz!TestBuildInstructions.test_simplec                 C   sŒ  | j dd}t |¡}|jjd d… \}}}| ||d¡ | ||d¡ | ||d¡ | ||d¡ | 	||d¡ | 
||d	¡ | ||d
¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ | ||d¡ |  t¡}| ||¡ W d   ƒ n1 sªw   Y  |  t|jƒd¡ |  |j¡ |  |d¡ d S )Nr˜   rc  r   r   rL  rM  rO  rP  rQ  rS  ÚjÚkÚlÚmÚnÚoÚpÚqÚrÚsÚtz1Operands must be the same type, got (i32, double)aD              my_block:
                %"c" = add i32 %".1", %".2"
                %"d" = fadd i32 %".1", %".2"
                %"e" = sub i32 %".1", %".2"
                %"f" = fsub i32 %".1", %".2"
                %"g" = mul i32 %".1", %".2"
                %"h" = fmul i32 %".1", %".2"
                %"i" = udiv i32 %".1", %".2"
                %"j" = sdiv i32 %".1", %".2"
                %"k" = fdiv i32 %".1", %".2"
                %"l" = urem i32 %".1", %".2"
                %"m" = srem i32 %".1", %".2"
                %"n" = frem i32 %".1", %".2"
                %"o" = or i32 %".1", %".2"
                %"p" = and i32 %".1", %".2"
                %"q" = xor i32 %".1", %".2"
                %"r" = shl i32 %".1", %".2"
                %"s" = ashr i32 %".1", %".2"
                %"t" = lshr i32 %".1", %".2"
            )rF   r   r™   rC   r„   rv   Úfaddr   Úfsubrh  ÚfmulÚudivrg  ÚfdivÚuremÚsremÚfremÚor_Úand_ÚxorÚshlÚashrÚlshrrÊ   r³   r4   r"   Ú	exceptionr_  r`  rX   )r   rF   rœ   rH  rI  ÚffÚcmr   r   r   Útest_binops_  s:   
ÿÿz!TestBuildInstructions.test_binopsc                 C   ób   | j dd}t |¡}|jjd d… \}}|j||ddd |j||ddd	gd |  |d
¡ d S )Nr˜   rc  rb   r   )Únuw©r!  rL  rŽ  Únswz†            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )rF   r   r™   rC   r„   rv   r   rX   ©r   rF   rœ   rH  rI  r   r   r   Útest_binop_flags  ó   
z&TestBuildInstructions.test_binop_flagsc                 C   r  )Nr˜   rc  rb   r   ©Úfastr  rL  ÚninfÚnszzŠ            my_block:
                %"c" = fadd fast i32 %".1", %".2"
                %"d" = fsub ninf nsz i32 %".1", %".2"
            )rF   r   r™   rC   r„   r{  r|  rX   r‘  r   r   r   Útest_binop_fastmath_flagsž  r“  z/TestBuildInstructions.test_binop_fastmath_flagsc                 C   sŽ   | j dd}t |¡}|jjd d… \}}| ||d¡ | ||d¡ | ||d¡ | ||d¡ | 	||d¡ | 
||d	¡ |  |d
¡ d S )Nr˜   rc  rb   r   rL  rM  rO  rP  rQ  að  my_block:
    %"c" = call {i32, i1} @"llvm.sadd.with.overflow.i32"(i32 %".1", i32 %".2")
    %"d" = call {i32, i1} @"llvm.smul.with.overflow.i32"(i32 %".1", i32 %".2")
    %"e" = call {i32, i1} @"llvm.ssub.with.overflow.i32"(i32 %".1", i32 %".2")
    %"f" = call {i32, i1} @"llvm.uadd.with.overflow.i32"(i32 %".1", i32 %".2")
    %"g" = call {i32, i1} @"llvm.umul.with.overflow.i32"(i32 %".1", i32 %".2")
    %"h" = call {i32, i1} @"llvm.usub.with.overflow.i32"(i32 %".1", i32 %".2")
            )rF   r   r™   rC   r„   Úsadd_with_overflowÚsmul_with_overflowÚssub_with_overflowÚuadd_with_overflowÚumul_with_overflowÚusub_with_overflowrX   r‘  r   r   r   Útest_binops_with_overflow¬  s   
z/TestBuildInstructions.test_binops_with_overflowc                 C   sl   | j dd}t |¡}|jjd d… \}}}| |d¡ | |d¡ | |d¡ |  |j	¡ |  
|d¡ d S )Nr˜   rc  r   rL  rM  rO  zœ            my_block:
                %"d" = sub i32 0, %".1"
                %"e" = xor i32 %".2", -1
                %"f" = fneg double %".3"
            )rF   r   r™   rC   r„   ÚnegÚnot_Úfnegr_  r`  rX   ©r   rF   rœ   rH  rI  r   r   r   r   Útest_unary_opsÀ  s   
z$TestBuildInstructions.test_unary_opsc                 C   s”   | j dd}t |¡}|jjd d… \}}t t d¡tj¡}t t d¡tj¡}| ||d¡}|  	|d¡ | 
||¡ | 
||¡ |  	|d¡ d S )Nr˜   rc  rb   r	   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )rF   r   r™   rC   r„   r  r	  Ú	Undefinedrv   rX   Úreplace_usage)r   rF   rœ   rH  rI  Úundef1Úundef2r   r   r   r   Útest_replace_operandÏ  s   
z*TestBuildInstructions.test_replace_operandc                 C   sz  | j dd}t |¡}|jjd d… \}}| d||d¡ | d||d¡ | d||d	¡ | d
||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d
||d¡ | d||d¡ | d||d¡ |  t¡ | d||d¡ W d   ƒ n1 sw   Y  |  t¡ | d||d¡ W d   ƒ n1 sªw   Y  |  	|j
¡ |  |d¡ d S )Nr˜   rc  rb   ú==r   ú!=rL  ú<rM  ú<=rO  ú>rP  ú>=rQ  rS  rp  rq  rr  rs  rt  ÚunoÚzzrÆ   aj              my_block:
                %"c" = icmp eq i32 %".1", %".2"
                %"d" = icmp ne i32 %".1", %".2"
                %"e" = icmp ult i32 %".1", %".2"
                %"f" = icmp ule i32 %".1", %".2"
                %"g" = icmp ugt i32 %".1", %".2"
                %"h" = icmp uge i32 %".1", %".2"
                %"i" = icmp eq i32 %".1", %".2"
                %"j" = icmp ne i32 %".1", %".2"
                %"k" = icmp slt i32 %".1", %".2"
                %"l" = icmp sle i32 %".1", %".2"
                %"m" = icmp sgt i32 %".1", %".2"
                %"n" = icmp sge i32 %".1", %".2"
            )rF   r   r™   rC   r„   Úicmp_unsignedÚicmp_signedrÊ   r³   r_  r`  rX   r‘  r   r   r   Útest_integer_comparisonsá  s.   
ÿÿz.TestBuildInstructions.test_integer_comparisonsc                 C   s^  | j dd}t |¡}|jjd d… \}}| d||d¡ | d||d¡ | d||d	¡ | d
||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d
||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ | d||d¡ |jd||dg d¢d |  |j¡ |  	|d ¡ d S )!Nr˜   rc  rb   rª  r   r«  rL  r¬  rM  r­  rO  r®  rP  r¯  rQ  rS  rp  rq  rr  rs  rt  ÚordÚur°  ÚvÚwr&  ÚoltÚy)Únnanr–  r—  Úarcpr•  r  a{              my_block:
                %"c" = fcmp oeq i32 %".1", %".2"
                %"d" = fcmp one i32 %".1", %".2"
                %"e" = fcmp olt i32 %".1", %".2"
                %"f" = fcmp ole i32 %".1", %".2"
                %"g" = fcmp ogt i32 %".1", %".2"
                %"h" = fcmp oge i32 %".1", %".2"
                %"i" = fcmp ueq i32 %".1", %".2"
                %"j" = fcmp une i32 %".1", %".2"
                %"k" = fcmp ult i32 %".1", %".2"
                %"l" = fcmp ule i32 %".1", %".2"
                %"m" = fcmp ugt i32 %".1", %".2"
                %"n" = fcmp uge i32 %".1", %".2"
                %"u" = fcmp ord i32 %".1", %".2"
                %"v" = fcmp uno i32 %".1", %".2"
                %"w" = fcmp ord i32 %".1", %".2"
                %"x" = fcmp uno i32 %".1", %".2"
                %"y" = fcmp nnan ninf nsz arcp fast olt i32 %".1", %".2"
            )
rF   r   r™   rC   r„   Úfcmp_orderedÚfcmp_unorderedr_  r`  rX   r‘  r   r   r   Útest_float_comparisons  s0   
ÿz,TestBuildInstructions.test_float_comparisonsc                 C   sz   | j dd}t td¡}t |¡}|jjd d… \}}|j|||ddd |  |j	¡ | 
¡  |  |j	¡ |  |d¡ d S )	Nr˜   rc  Trb   r   )r¼  r»  r  z„            my_block:
                %"c" = select arcp nnan i1 true, i32 %".1", i32 %".2"
                unreachable
            )rF   r   r  Úint1r™   rC   r„   Úselectr_  r`  ÚunreachableÚ
assertTruerX   )r   rF   rz  rœ   rH  rI  r   r   r   Útest_misc_ops3  s   
z#TestBuildInstructions.test_misc_opsc                 C   s†   | j dd}t |¡}|jjd d… \}}|j d¡}|j d¡}|jtddd}| ||¡ | ||¡ |  	|j
¡ |  |d	¡ d S )
Nr˜   rc  rb   Úb2Úb3Úmy_phir”  r  zj            my_block:
                %"my_phi" = phi fast i32 [%".1", %"b2"], [%".2", %"b3"]
            )rF   r   r™   rC   r„   rD   Úphir=   Úadd_incomingr_  r`  rX   )r   rF   rœ   rH  rI  Úbb2Úbb3rÈ  r   r   r   Útest_phiB  s   
zTestBuildInstructions.test_phic                 C   sv  | j dd}t |¡}|jjd d… \}}}|jtdd}|jtddd}|jt|dd}d	|_|  	|j
t t¡¡ | ||¡}	|  	|	j
t ¡ ¡ | ||¡}
|  	|
j
t ¡ ¡ | |d
¡}|  	|j
t¡ |j||dd}|  	|j
t ¡ ¡ |j|ddd}|  	|j
t¡ |j||ddd}|  	|j
t ¡ ¡ |j|dddd}|  	|j
t¡ ts²t t ¡ d ¡}n	t t t¡d ¡}| t td¡|¡ |  t¡ | ||¡ W d   ƒ n1 sÛw   Y  |  t¡ | |¡ W d   ƒ n1 sõw   Y  |  t¡}| ||¡ W d   ƒ n	1 sw   Y  ts*|  	t|jƒd¡ |  |d¡ d S |  	t|jƒd¡ |  |d¡ d S )Nr˜   rc  r   r   r»   rL  )r÷   rA   rM  r   rP  r   )rˆ   rS  Úseq_cstr€   )Úorderingrˆ   rq  )rÎ  rˆ   rA   r~   z*cannot store i32 to ptr: mismatching typesal                  my_block:
                    %"c" = alloca i32
                    %"d" = alloca i32, i32 42
                    %"e" = alloca double, i32 %".1", align 8
                    store double %".3", ptr %"e"
                    store i32 %".2", ptr %"c"
                    %"g" = load i32, ptr %"c"
                    store i32 %".2", ptr %"c", align 1
                    %"i" = load i32, ptr %"c", align 1
                    store atomic i32 %".2", ptr %"c" seq_cst, align 4
                    %"k" = load atomic i32, ptr %"c" seq_cst, align 4
                    store i32 5, ptr null
                z.cannot store i32 to double*: mismatching typesaw                  my_block:
                    %"c" = alloca i32
                    %"d" = alloca i32, i32 42
                    %"e" = alloca double, i32 %".1", align 8
                    store double %".3", double* %"e"
                    store i32 %".2", i32* %"c"
                    %"g" = load i32, i32* %"c"
                    store i32 %".2", i32* %"c", align 1
                    %"i" = load i32, i32* %"c", align 1
                    store atomic i32 %".2", i32* %"c" seq_cst, align 4
                    %"k" = load atomic i32, i32* %"c" seq_cst, align 4
                    store i32 5, i32* null
                )rF   r   r™   rC   r„   Úallocar=   r>   rˆ   r4   râ   r?   Ústorer.  ÚloadÚstore_atomicÚload_atomicr   r  rÊ   Ú	TypeErrorr"   r‰  rX   )r   rF   rœ   rH  rI  Úzr   rL  rM  ÚeerO  rP  rQ  rS  rp  rq  Úptrr‹  r   r   r   Útest_mem_opsQ  sX   
ÿÿÿÿÿz"TestBuildInstructions.test_mem_opsc                 C   s’   | j dd}t |¡}|jjd d… \}}|jt t¡dd}|j|t 	td¡|gdd}|  
|jt t¡¡ tsA|  |d¡ d S |  |d¡ d S )	Nr˜   rc  rb   r   r~   rL  z™                my_block:
                    %"c" = alloca ptr
                    %"d" = getelementptr ptr, ptr %"c", i32 5, i32 %".1"
                z                my_block:
                    %"c" = alloca i32*
                    %"d" = getelementptr i32*, i32** %"c", i32 5, i32 %".1"
                )rF   r   r™   rC   r„   rÏ  r?   r=   Úgepr  r4   râ   r   rX   ©r   rF   rœ   rH  rI  r   rL  r   r   r   Útest_gep›  s   
zTestBuildInstructions.test_gepc           	      C   s¬   | j dd}t |¡}|jjd d… \}}t ¡ }t t|||tg¡}|j	|| ¡ dd}|j
|dd„ dD ƒdd}|  |jt |¡¡ tsN|  |d	¡ d S |  |d
¡ d S )Nr˜   rc  rb   rL  c                 S   ó   g | ]}t  t|¡‘qS r   ©r   r  r=   ©r   r&  r   r   r   r!   ¹  ó    z<TestBuildInstructions.test_gep_castinstr.<locals>.<listcomp>©r   r   rM  z¹                my_block:
                    %"d" = bitcast i32 %".1" to ptr
                    %"e" = getelementptr {i64, ptr, ptr, ptr, i64}, ptr %"d", i32 0, i32 3
                zç                my_block:
                    %"d" = bitcast i32 %".1" to {i64, i8*, i8*, i8*, i64}*
                    %"e" = getelementptr {i64, i8*, i8*, i8*, i64}, {i64, i8*, i8*, i8*, i64}* %"d", i32 0, i32 3
                )rF   r   r™   rC   r„   rx   rŸ   ÚLiteralStructTyper¿   ÚbitcastrÙ  r4   râ   r?   r   rX   )	r   rF   rœ   rH  rI  Úint8ptrÚlsrL  rM  r   r   r   Útest_gep_castinstr°  s   
z(TestBuildInstructions.test_gep_castinstrc           
      C   sÈ   | j dd}t |¡}|jjd d… \}}d}t ¡ }t t|||tg¡}|j	||j|ddd}|j
|dd„ d	D ƒd
d}	|  |	jj|¡ |  |	jtj||d¡ ts\|  |d¡ d S |  |d¡ d S )Nr˜   rc  rb   r€   rJ  rL  c                 S   rÜ  r   rÝ  rÞ  r   r   r   r!   Ò  rß  zFTestBuildInstructions.test_gep_castinstr_addrspace.<locals>.<listcomp>rà  rM  zÓ                my_block:
                    %"d" = bitcast i32 %".1" to ptr addrspace(4)
                    %"e" = getelementptr {i64, ptr, ptr, ptr, i64}, ptr addrspace(4) %"d", i32 0, i32 3
                a                  my_block:
                    %"d" = bitcast i32 %".1" to {i64, i8*, i8*, i8*, i64} addrspace(4)*
                    %"e" = getelementptr {i64, i8*, i8*, i8*, i64}, {i64, i8*, i8*, i8*, i64} addrspace(4)* %"d", i32 0, i32 3
                )rF   r   r™   rC   r„   rx   rŸ   rá  r¿   râ  rÙ  r4   râ   rK  r?   r   rX   )
r   rF   rœ   rH  rI  rK  rã  rä  rL  rM  r   r   r   Útest_gep_castinstr_addrspaceÈ  s   
z2TestBuildInstructions.test_gep_castinstr_addrspacec           	      C   sü   | j dd}t |¡}|jjd d… \}}d}|jtjt|ddd}ts/|  	t
|jƒd¡ n	|  	t
|jƒd¡ |  	|jjj|¡ |j|t td	¡|gd
d}|  	|jj|¡ |j|t td¡gdd}|  	|jj|¡ tsv|  |d¡ d S |  |d¡ d S )Nr˜   rc  rb   r€   rJ  r   r×  zi32 addrspace(4)**r~   rL  r   rM  zÿ                my_block:
                    %"c" = alloca ptr addrspace(4)
                    %"d" = getelementptr ptr addrspace(4), ptr %"c", i32 5, i32 %".1"
                    %"e" = getelementptr i32, ptr addrspace(4) %"d", i32 10
                a                  my_block:
                    %"c" = alloca i32 addrspace(4)*
                    %"d" = getelementptr i32 addrspace(4)*, i32 addrspace(4)** %"c", i32 5, i32 %".1"
                    %"e" = getelementptr i32, i32 addrspace(4)* %"d", i32 10
                )rF   r   r™   rC   r„   rÏ  r?   r=   r   r4   r"   râ   ÚpointeerK  rÙ  r  rX   )	r   rF   rœ   rH  rI  rK  r   rL  rM  r   r   r   Útest_gep_addrspaceâ  s    
z(TestBuildInstructions.test_gep_addrspacec                 C   sÐ  | j dd}t |¡}|jjd d… \}}t ttg¡}t t|g¡}t 	|t 	td¡t 	td¡f¡}|j
|ddd}|j||ddd}	|j|	t 	td	¡d
dd}
|  |	j|¡ |  |
j|¡ |j|dd}|j|dd}|j
|ddd}|j
|d
dd}|j
|ddd}|j
|ddd}|j||d
dd}|j||ddd}|  |jt¡ |  |j|¡ |  |jt¡ |  |jt¡ |  |j|¡ |  |j|¡ |  t¡ | 
|d¡ W d   ƒ n1 sßw   Y  |  t¡ | 
|d¡ W d   ƒ n1 súw   Y  |  t¡ | 
|d¡ W d   ƒ n	1 sw   Y  |  t¡ | ||d¡ W d   ƒ n	1 s3w   Y  |  t¡ | ||d
¡ W d   ƒ n	1 sPw   Y  ts`|  |d¡ d S |  |d¡ d S )Nr˜   rc  rb   r€   Tr   r   rL  Fr   rM  r×  rp  rq  rr  )r   r   rs  )r   r   rt  ru  rv  )r   r   r~   a                  my_block:
                    %"c" = extractvalue {i32, i1} {i32 4, i1 true}, 0
                    %"d" = insertvalue {i32, i1} {i32 4, i1 true}, i32 %".1", 0
                    %"e" = insertvalue {i32, i1} %"d", i1 false, 1
                    %"ptr" = alloca {i8, {i32, i1}}
                    %"j" = load {i8, {i32, i1}}, ptr %"ptr"
                    %"k" = extractvalue {i8, {i32, i1}} %"j", 0
                    %"l" = extractvalue {i8, {i32, i1}} %"j", 1
                    %"m" = extractvalue {i8, {i32, i1}} %"j", 1, 0
                    %"n" = extractvalue {i8, {i32, i1}} %"j", 1, 1
                    %"o" = insertvalue {i8, {i32, i1}} %"j", {i32, i1} %"l", 1
                    %"p" = insertvalue {i8, {i32, i1}} %"j", i32 %".1", 1, 0
                a"                  my_block:
                    %"c" = extractvalue {i32, i1} {i32 4, i1 true}, 0
                    %"d" = insertvalue {i32, i1} {i32 4, i1 true}, i32 %".1", 0
                    %"e" = insertvalue {i32, i1} %"d", i1 false, 1
                    %"ptr" = alloca {i8, {i32, i1}}
                    %"j" = load {i8, {i32, i1}}, {i8, {i32, i1}}* %"ptr"
                    %"k" = extractvalue {i8, {i32, i1}} %"j", 0
                    %"l" = extractvalue {i8, {i32, i1}} %"j", 1
                    %"m" = extractvalue {i8, {i32, i1}} %"j", 1, 0
                    %"n" = extractvalue {i8, {i32, i1}} %"j", 1, 1
                    %"o" = insertvalue {i8, {i32, i1}} %"j", {i32, i1} %"l", 1
                    %"p" = insertvalue {i8, {i32, i1}} %"j", i32 %".1", 1, 0
                )rF   r   r™   rC   r„   rá  r=   rÀ  rx   r  Úextract_valueÚinsert_valuer4   râ   rÏ  rÑ  rÊ   rÔ  r   rX   )r   rF   rœ   rH  rI  Útp_innerÚtp_outerÚc_innerr   rL  rM  Úp_outerrp  rq  rr  rs  rt  ru  rv  r   r   r   Útest_extract_insert_value   sZ   

ÿþþþþþz/TestBuildInstructions.test_extract_insert_valuec                 C   s  | j dd}t |¡}|jjd d… \}}}}|j|tdd}|j|tdd}|j	|tdd}	| 
|td¡}
| |
td¡}| |td	¡}| |td
¡}| |td¡}| |td¡}| |td¡}| |t t¡d¡}| |td¡}|  |j¡ ts|  |d¡ d S |  |d¡ d S )Nr˜   rc  r€   r   rL  rM  ÚfbÚfcrP  rQ  ÚfdÚferS  rp  rq  aŸ                  my_block:
                    %"c" = trunc i32 %".1" to i8
                    %"d" = zext i8 %"c" to i32
                    %"e" = sext i8 %"c" to i32
                    %"fb" = fptrunc double %".3" to float
                    %"fc" = fpext float %"fb" to double
                    %"g" = fptoui double %".3" to i32
                    %"h" = fptosi double %".3" to i8
                    %"fd" = uitofp i32 %"g" to float
                    %"fe" = sitofp i8 %"h" to double
                    %"i" = ptrtoint ptr %".4" to i32
                    %"j" = inttoptr i32 %"i" to ptr
                    %"k" = bitcast i32 %".1" to float
                a                   my_block:
                    %"c" = trunc i32 %".1" to i8
                    %"d" = zext i8 %"c" to i32
                    %"e" = sext i8 %"c" to i32
                    %"fb" = fptrunc double %".3" to float
                    %"fc" = fpext float %"fb" to double
                    %"g" = fptoui double %".3" to i32
                    %"h" = fptosi double %".3" to i8
                    %"fd" = uitofp i32 %"g" to float
                    %"fe" = sitofp i8 %"h" to double
                    %"i" = ptrtoint i32* %".4" to i32
                    %"j" = inttoptr i32 %"i" to i8*
                    %"k" = bitcast i32 %".1" to float
                )rF   r   r™   rC   r„   Útruncrx   Úzextr=   ÚsextÚfptruncÚfltÚfpextr>   ÚfptouiÚfptosiÚuitofpÚsitofpÚptrtointÚinttoptrr?   râ  r_  r`  r   rX   )r   rF   rœ   rH  rI  Úfar×  r   rL  rM  rð  rñ  rP  rQ  rò  ró  rS  rp  rq  r   r   r   Útest_cast_opsM  s&   
z#TestBuildInstructions.test_cast_opsc                 C   s|   | j dd}t |¡}|jjd d… \}}|jtdd}| d||dd¡}|  |j	t¡ t
s6|  |d¡ d S |  |d	¡ d S )
Nr˜   rc  rb   r   rv   Ú	monotonicrL  z—                my_block:
                    %"c" = alloca i32
                    %"d" = atomicrmw add ptr %"c", i32 %".1" monotonic
                z˜                my_block:
                    %"c" = alloca i32
                    %"d" = atomicrmw add i32* %"c", i32 %".1" monotonic
                )rF   r   r™   rC   r„   rÏ  r=   Ú
atomic_rmwr4   râ   r   rX   rÚ  r   r   r   Útest_atomicrmw  s   
z$TestBuildInstructions.test_atomicrmwc                 C   sJ   | j dd}t |¡}|jjdd}| |¡ |  |j¡ |  |d¡ d S )Nr˜   rc  ÚtargetzE            my_block:
                br label %"target"
            )	rF   r   r™   rC   rD   ÚbranchrÃ  r`  rX   )r   rF   rœ   Ú	bb_targetr   r   r   Útest_branch“  s   

z!TestBuildInstructions.test_branchc                 C   sd   | j dd}t |¡}|jjdd}|jjdd}| t td¡||¡ |  |j	¡ |  
|d¡ d S )Nr˜   rc  Úb_trueÚb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )rF   r   r™   rC   rD   Úcbranchr  rÀ  rÃ  r`  rX   )r   rF   rœ   Úbb_trueÚbb_falser   r   r   Útest_cbranchž  s   
z"TestBuildInstructions.test_cbranchc                 C   s€   | j dd}t |¡}|jjdd}|jjdd}| t td¡||¡}| ddg¡ |  	|j
¡ |  |d¡ |  |jd	¡ d S )
Nr˜   rc  r	  r
  Fr~   r»   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )rF   r   r™   rC   rD   r  r  rÀ  Úset_weightsrÃ  r`  rX   r`   r:   )r   rF   rœ   r  r  Úbrr   r   r   Útest_cbranch_weightsª  s   
z*TestBuildInstructions.test_cbranch_weightsc                 C   sŠ   | j dd}t |¡}|jjdd}|jjdd}| t |j|¡¡}| |¡ | |¡ |  |j	¡ t
s=|  |d¡ d S |  |d¡ d S )Nr˜   rc  Úb_1Úb_2zŒ                my_block:
                    indirectbr ptr blockaddress(@"my_func", %"b_1"), [label %"b_1", label %"b_2"]
                zŒ                my_block:
                    indirectbr i8* blockaddress(@"my_func", %"b_1"), [label %"b_1", label %"b_2"]
                )rF   r   r™   rC   rD   Úbranch_indirectÚBlockAddressÚadd_destinationrÃ  r`  r   rX   )r   rF   rœ   Úbb_1Úbb_2Ú
indirectbrr   r   r   Útest_branch_indirectº  s   
ÿ

z*TestBuildInstructions.test_branch_indirectc                    sä   ‡ fdd„}ˆ j dd}t |¡}| ¡  ||dƒ ˆ j dd}t |¡}| tdƒ¡ ||dƒ ˆ j dd}t |¡}| ¡ }| d	|j d
¡¡ ||dƒ ˆ j dd}t |¡}| tdƒ¡}| d	|j d
¡¡ ||dƒ d S )Nc                    s   ˆ   | j¡ ˆ  | |¡ d S r(   )rÃ  r`  rX   )rF   Úexpected_irr9   r   r   ÚcheckÐ  s   z1TestBuildInstructions.test_returns.<locals>.checkr˜   rc  z;            my_block:
                ret void
            Úother_blockr~   z?            other_block:
                ret i32 5
            r‹   r   zD            my_block:
                ret void, !dbg !0
            é   zE            my_block:
                ret i32 6, !dbg !0
            )	rF   r   r™   rš   Úretr=   r   r:   rŽ   )r   r  rF   rœ   rn  r   r9   r   Útest_returnsÏ  s&   






z"TestBuildInstructions.test_returnsc           
      C   s¾   | j dd}t |¡}|jjd d… \}}|jjdd}|jjdd}|jjdd}|jjdd}| ||¡}	|	 t t	d¡|¡ |	 t t	d	¡|¡ |	 d|¡ |  
|j¡ |  |d
¡ d S )Nr˜   rc  rb   ÚonzeroÚononeÚontwoÚ	otherwiser   r   zœ            my_block:
                switch i32 %".1", label %"otherwise" [i32 0, label %"onzero" i32 1, label %"onone" i32 2, label %"ontwo"]
            )rF   r   r™   rC   r„   rD   ÚswitchÚadd_caser  r=   rÃ  r`  rX   )
r   rF   rœ   rH  rI  Ú	bb_onzeroÚbb_ononeÚbb_ontwoÚbb_elseÚswr   r   r   Útest_switch÷  s   
z!TestBuildInstructions.test_switchc                 C   s  | j dd}t |¡}|jjd d… \}}t tttf¡}tjttfdd}t t	ttf¡}t 
|jj|d¡}t 
|jj|d¡}	t 
|jj|d¡}
| |||fd	¡ | |	||fd
¡ | |
||fd¡ |j|||fddd | |||fd¡}|j d¡ |j|||fddd |j|||fddd |j|||fddd |j|||fddd |j|||fddd |j|||fddd |  |d¡ d S ) Nr˜   rc  rb   Trr   rO  rP  rQ  Úres_fÚres_gÚres_hÚ
res_f_fastÚfastcc)ÚcconvÚres_f_readonlyÚreadonlyÚres_fastr•  )ÚfastmathÚres_nnan_ninf)r»  r–  Úres_noinliner°   )ÚattrsÚres_alwaysinlinerp   Úres_noinline_ro)r°   r4  Úres_convergentrq   aT          my_block:
            %"res_f" = call float @"f"(i32 %".1", i32 %".2")
            %"res_g" = call double (i32, ...) @"g"(i32 %".2", i32 %".1")
            %"res_h" = call half @"h"(i32 %".1", i32 %".2")
            %"res_f_fast" = call fastcc float @"f"(i32 %".1", i32 %".2")
            %"res_f_readonly" = call float @"f"(i32 %".1", i32 %".2") readonly
            %"res_fast" = call fast float @"f"(i32 %".1", i32 %".2")
            %"res_nnan_ninf" = call ninf nnan float @"f"(i32 %".1", i32 %".2")
            %"res_noinline" = call float @"f"(i32 %".1", i32 %".2") noinline
            %"res_alwaysinline" = call float @"f"(i32 %".1", i32 %".2") alwaysinline
            %"res_noinline_ro" = call float @"f"(i32 %".1", i32 %".2") noinline readonly
            %"res_convergent" = call float @"f"(i32 %".1", i32 %".2") convergent
        )rF   r   r™   rC   r„   r<   rø  r=   r>   Úhlfr@   r:   r0  ru   rv   rX   )r   rF   rœ   rH  rI  Útp_fÚtp_gÚtp_hrO  rP  rQ  r3  r   r   r   Ú	test_call
  s,   
zTestBuildInstructions.test_callc                 C   s   | j dd}t |¡}t t ¡ t ¡ gd ¡}t |j|d¡}|jt	dd}|j 
d¡}| ||||f¡ ts@|  |d¡ d	S |  |d¡ d	S )
z9
        Function calls with metadata arguments.
        r˜   rc  r   zllvm.dbg.declarerH  r   z¯                my_block:
                    %"a" = alloca i32
                    call void @"llvm.dbg.declare"(metadata ptr %"a", metadata !0, metadata !0)
                z°                my_block:
                    %"a" = alloca i32
                    call void @"llvm.dbg.declare"(metadata i32* %"a", metadata !0, metadata !0)
                N)rF   r   r™   r<   r.  ÚMetaDataTyper@   r:   rÏ  r=   rŽ   r0  r   rX   )r   rF   rœ   Údbg_declare_tyÚdbg_declarerH  rI  r   r   r   Útest_call_metadata0  s   
ýz(TestBuildInstructions.test_call_metadatac                 C   sº   | j dd}t |¡}t t ¡ t ¡ tt ¡ f¡}t |jj	|d¡}|j
d  d¡ |jtdd}|jtdd}|j||t td¡|fd	d
dœd tsU|  |d¡ d S |  |d¡ d S )Nr˜   rc  Úfunr   ÚsretÚretvalÚotherr»   ©rG  rƒ   rƒ   ©r   rb   ©Ú	arg_attrszÖ            my_block:
                %"retval" = alloca i32
                %"other" = alloca i32
                call void @"fun"\(ptr noalias sret(\(i32\))? %"retval", i32 42, ptr noalias %"other"\)
            zÚ            my_block:
                %"retval" = alloca i32
                %"other" = alloca i32
                call void @"fun"\(i32\* noalias sret(\(i32\))? %"retval", i32 42, i32\* noalias %"other"\)
            )rF   r   r™   r<   r.  r=   rŸ   r@   rC   r:   r„   r…   rÏ  r0  r  r   rZ   )r   rF   rœ   Úfun_tyrF  rH  rI  r   r   r   Útest_call_attributesK  s&   
ÿþýz*TestBuildInstructions.test_call_attributesc                 C   sÄ   | j dd}t |¡}t t ¡ d¡}t |jj|d¡}| |d¡ |j|ddd |j|ddd |j|ddd |j|dd	d |j|dd
d |j|dg d |j|ddd |  	|d¡ d S )Nr˜   rc  r   Úmy_funF)ÚtailTrQ  ÚnotailÚmusttailznot a markeraI          my_block:
            call void @"my_fun"()
            call void @"my_fun"()
            tail call void @"my_fun"()
            tail call void @"my_fun"()
            notail call void @"my_fun"()
            musttail call void @"my_fun"()
            call void @"my_fun"()
            tail call void @"my_fun"()
        )
rF   r   r™   r<   r.  r@   rC   r:   r0  rX   ©r   rF   rœ   rN  rF  r   r   r   Útest_call_tailk  s   
z$TestBuildInstructions.test_call_tailc                 C   sx   |   ¡ }t |¡}t t ¡ d¡}t |jj|d¡}|  t	¡ |j
|dddid W d   ƒ d S 1 s5w   Y  d S )Nr   rF  r   rG  rL  )rF   r   r™   r<   r.  r@   rC   r:   rÊ   r³   r0  rT  r   r   r   Útest_invalid_call_attributes†  s   
"þz2TestBuildInstructions.test_invalid_call_attributesc           	      C   sŽ   | j dd}t |¡}|jjd d… \}}t tttf¡}t |jj	|d¡}|jj
dd}|jj
dd}| |||f||d¡ |  |d¡ d S )	Nr˜   rc  rb   rO  ÚnormalÚunwindr-  z£            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )rF   r   r™   rC   r„   r<   rø  r=   r@   r:   rD   ÚinvokerX   )	r   rF   rœ   rH  rI  r>  rO  Ú	bb_normalÚ	bb_unwindr   r   r   Útest_invoke  s   
z!TestBuildInstructions.test_invokec           	      C   sæ   | j dd}t |¡}t t ¡ t ¡ tt ¡ f¡}t |jj	|d¡}d|_
|jd  d¡ |jtdd}|jtdd}|jjd	d}|jjd
d}|j||t td¡|f||ddddddœd tsk|  |d¡ d S |  |d¡ d S )Nr˜   rc  rF  r1  r   rG  rH  rI  rW  rX  r»   r•  r°   rJ  rƒ   rK  )r2  r6  r9  rM  a+              my_block:
                %"retval" = alloca i32
                %"other" = alloca i32
                invoke fast fastcc void @"fun"\(ptr noalias sret(\(i32\))? %"retval", i32 42, ptr noalias %"other"\) noinline
                    to label %"normal" unwind label %"unwind"
            a/              my_block:
                %"retval" = alloca i32
                %"other" = alloca i32
                invoke fast fastcc void @"fun"\(i32\* noalias sret(\(i32\))? %"retval", i32 42, i32\* noalias %"other"\) noinline
                    to label %"normal" unwind label %"unwind"
            )rF   r   r™   r<   r.  r=   rŸ   r@   rC   r:   Úcalling_conventionr„   r…   rÏ  rD   rY  r  r   rZ   )	r   rF   rœ   rN  rF  rH  rI  rZ  r[  r   r   r   Útest_invoke_attributesž  s6   
ÿþøz,TestBuildInstructions.test_invoke_attributesc              
   C   s®   | j dd}t |¡}| t tt ¡ g¡d¡}t |j	j
t ¡ d¡}d|_| t |¡¡ | t t t |jd¡|g¡¡¡ | |¡ tsO|  |d¡ d S |  |d¡ d S )	Nr˜   rc  ÚlpÚ_ZTIiTr   zë                my_block:
                    %"lp" = landingpad {i32, ptr}
                        catch ptr @"_ZTIi"
                        filter [1 x ptr] [ptr @"_ZTIi"]
                    resume {i32, ptr} %"lp"
                zî                my_block:
                    %"lp" = landingpad {i32, i8*}
                        catch i8** @"_ZTIi"
                        filter [1 x i8**] [i8** @"_ZTIi"]
                    resume {i32, i8*} %"lp"
                )rF   r   r™   Ú
landingpadrá  r=   rx   rŸ   r  rC   r:   rU  Ú
add_clauseÚCatchClauseÚFilterClauser  Ú	ArrayTyperâ   Úresumer   rX   )r   rF   rœ   r_  Úint_typeinfor   r   r   Útest_landingpadÈ  s*   

ÿÿ
ÿÿÿ
z%TestBuildInstructions.test_landingpadc                 C   sV   | j dd}t |¡}|jjd d… \}}|jd||dd}| |¡ |  |d¡ d S )Nr˜   rc  rb   r®  r   z…            my_block:
                %"c" = icmp sgt i32 %".1", %".2"
                call void @"llvm.assume"(i1 %"c")
            )rF   r   r™   rC   r„   r³  r¥   rX   r£  r   r   r   Útest_assumeå  s   

z!TestBuildInstructions.test_assumec                 C   sŽ  | j dd}t |¡}|jjd d… \}}d|_d|_t |jd¡}t |tj	¡}t 
d¡}|j|||dƒdd}|j|||d	ƒd
d}|  |d¡ | d¡}| |¡ | |¡ t |d	dg¡}|j|||dd |  |d¡ | d¡}| |¡ | |¡ |j||dd |  |d¡ | d¡}| |¡ | |¡ |j||dƒdd}	|j||d	ƒdd}
|  |d¡ | | |	|
¡¡ |  |j¡ d S )NÚinsert_blockrc  rb   rH  rI  r	   r   Úvec1r   Úvec2z§insert_block:
    %"vec1" = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %"a", i32 0
    %"vec2" = insertelement <2 x i32> %"vec1", i32 %"b", i32 1
            Úshuffle_blockÚshufzŽ            shuffle_block:
                %"shuf" = shufflevector <2 x i32> %"vec2", <2 x i32> %"vec2", <2 x i32> <i32 1, i32 0>
            Ú	add_blockÚsumz[            add_block:
                %"sum" = add <2 x i32> %"vec2", %"vec2"
            Úextract_blockÚex1Úex2z¥            extract_block:
              %"ex1" = extractelement <2 x i32> %"vec2", i32 0
              %"ex2" = extractelement <2 x i32> %"vec2", i32 1
            )rF   r   r™   rC   r„   rA   Ú
VectorTyperâ   r  r¥  r	  Úinsert_elementrX   rD   r  Úposition_at_endÚshuffle_vectorrv   Úextract_elementr  r,   r:   )r   rF   rœ   rH  rI  ÚvectyÚvecÚidxtyÚmaskr   rL  r   r   r   Útest_vector_opsñ  s<   










z%TestBuildInstructions.test_vector_opsc                 C   óJ   | j dd}t |¡}t td¡}|j|dd}| |¡ |  |d¡ d S )Nr˜   rc  r~   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )rF   r   r™   r  r¿   Ú
bitreverser  rX   ©r   rF   rœ   rH  r   r   r   r   Útest_bitreverse+  ó   

z%TestBuildInstructions.test_bitreversec                 C   óp   | j dd}t |¡}t td¡}|  t¡}|j|dd W d   ƒ n1 s(w   Y  |  dt	|j
ƒ¡ d S )Nr˜   rc  r~   r   ú#expected an integer type, got float)rF   r   r™   r  rø  rÊ   rÔ  r  r$   r"   r‰  ©r   rF   rœ   rH  Úraisesr   r   r   Útest_bitreverse_wrongtype7  ó   
ÿþz/TestBuildInstructions.test_bitreverse_wrongtypec                 C   sì   | j dd}t |¡}|  t¡}| dd ¡ W d   ƒ n1 s!w   Y  |  dt|jƒ¡ |  t¡}| d d¡ W d   ƒ n1 sEw   Y  |  dt|jƒ¡ | dd ¡ | dd¡ | d	d¡ | d
¡ | 	¡  |  
|d¡ d S )Nr˜   rc  r  z#Invalid fence ordering "monotonic"!zInvalid fence ordering "None"!ÚacquireÚreleaseÚsinglethreadÚacq_relrÍ  zç            my_block:
                fence acquire
                fence syncscope("singlethread") release
                fence syncscope("singlethread") acq_rel
                fence seq_cst
                ret void
            )rF   r   r™   rÊ   r³   Úfencer$   r"   r‰  rš   rX   )r   rF   rœ   r†  r   r   r   Ú
test_fenceB  s,   
ÿþÿþ
z TestBuildInstructions.test_fencec                 C   sl   | j dd}t |¡}|  t¡ | d¡ W d   ƒ n1 s w   Y  | d¡ | ¡  |  |d¡ d S )Nr˜   rc  zso
many linesz
my commentzX            my_block:
                ; my comment
                ret void
            )rF   r   r™   rÊ   ÚAssertionErrorÚcommentrš   rX   ©r   rF   rœ   r   r   r   Útest_comment]  s   
ÿ
z"TestBuildInstructions.test_commentc                 C   r~  )Nr˜   rc  r~   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )rF   r   r™   r  r=   Úbswapr  rX   r€  r   r   r   Ú
test_bswapj  r‚  z TestBuildInstructions.test_bswapc                 C   r~  )Nr˜   rc  r~   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )rF   r   r™   r  Úint16Úctpopr  rX   r€  r   r   r   Ú
test_ctpopv  r‚  z TestBuildInstructions.test_ctpopc                 C   óX   | j dd}t |¡}t td¡}t td¡}|j||dd}| |¡ |  |d¡ d S )Nr˜   rc  r~   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	rF   r   r™   r  r•  rÀ  Úctlzr  rX   r£  r   r   r   Ú	test_ctlz‚  ó   

zTestBuildInstructions.test_ctlzc                 C   r~  )Nr˜   rc  g      @rI  z•            my_block:
                %"b" = call i16 @"llvm.convert.to.fp16.f32"(float 0x4014000000000000)
                ret i16 %"b"
            )rF   r   r™   r  rø  Úconvert_to_fp16r  rX   r‘  r   r   r   Útest_convert_to_fp16_f32  r‚  z.TestBuildInstructions.test_convert_to_fp16_f32c                 C   rƒ  )Nr˜   rc  r~   rI  úexpected a float type, got i16)rF   r   r™   r  r•  rÊ   rÔ  rœ  r$   r"   r‰  r…  r   r   r   Ú"test_convert_to_fp16_f32_wrongtype›  rˆ  z8TestBuildInstructions.test_convert_to_fp16_f32_wrongtypec                 C   sL   | j dd}t |¡}t td¡}|j|dtd}| |¡ |  |d¡ d S )Nr˜   rc  r~   rI  ©rA   Útozˆ            my_block:
                %"b" = call float @"llvm.convert.from.fp16.f32"(i16 5)
                ret float %"b"
            )	rF   r   r™   r  r•  Úconvert_from_fp16rø  r  rX   r‘  r   r   r   Útest_convert_from_fp16_f32¦  s   

z0TestBuildInstructions.test_convert_from_fp16_f32c                 C   rƒ  )Nr˜   rc  ç      @rI  zexpected a float return type©rF   r   r™   r  rø  rÊ   rÔ  r¢  r$   r"   r‰  r…  r   r   r   Ú!test_convert_from_fp16_f32_notype²  rˆ  z7TestBuildInstructions.test_convert_from_fp16_f32_notypec                 C   sr   | j dd}t |¡}t td¡}|  t¡}|j|dtd W d   ƒ n1 s)w   Y  |  dt	|j
ƒ¡ d S )Nr˜   rc  r¤  rI  r   zexpected an i16 type, got floatr¥  r…  r   r   r   Ú$test_convert_from_fp16_f32_wrongtype½  ó   
ÿþz:TestBuildInstructions.test_convert_from_fp16_f32_wrongtypec                 C   sr   | j dd}t |¡}t td¡}|  t¡}|j|dtd W d   ƒ n1 s)w   Y  |  	dt
|jƒ¡ d S )Nr˜   rc  r¤  rI  r   rž  )rF   r   r™   r  rø  rÊ   rÔ  r¢  r•  r$   r"   r‰  r…  r   r   r   Ú%test_convert_from_fp16_f32_wrongtype2È  r¨  z;TestBuildInstructions.test_convert_from_fp16_f32_wrongtype2c                 C   r˜  )Nr˜   rc  r~   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	rF   r   r™   r  r¿   rÀ  Úcttzr  rX   r£  r   r   r   Ú	test_cttzÓ  r›  zTestBuildInstructions.test_cttzc                 C   ó~   | j dd}t |¡}t td¡}t td¡}|  t¡}|j||dd W d   ƒ n1 s/w   Y  |  	dt
|jƒ¡ d S )Nr˜   rc  r~   r   r   zexpected an i1 type, got i32)rF   r   r™   r  r¿   r=   rÊ   rÔ  rª  r$   r"   r‰  ©r   rF   rœ   rH  rI  r†  r   r   r   Útest_cttz_wrongflagà  ó   
ÿþz)TestBuildInstructions.test_cttz_wrongflagc                 C   r¬  )Nr˜   rc  r~   r   r   r„  )rF   r   r™   r  rø  rÀ  rÊ   rÔ  rª  r$   r"   r‰  r­  r   r   r   Útest_cttz_wrongtypeì  r¯  z)TestBuildInstructions.test_cttz_wrongtypec                 C   sf   | j dd}t |¡}t td¡}t td¡}t td¡}|j|||dd}| |¡ |  |d¡ d S )Nr˜   rc  r~   r   rb   ÚfmazÅ            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )rF   r   r™   r  rø  r±  r  rX   )r   rF   rœ   rH  rI  r   r±  r   r   r   Útest_fmaø  s   

zTestBuildInstructions.test_fmac                 C   sŒ   | j dd}t |¡}t td¡}t td¡}t td¡}|  t¡}|j|||dd W d   ƒ n1 s6w   Y  |  dt	|j
ƒ¡ d S )Nr˜   rc  r~   r   rb   r±  z(expected an floating point type, got i32)rF   r   r™   r  r=   rÊ   rÔ  r±  r$   r"   r‰  ©r   rF   rœ   rH  rI  r   r†  r   r   r   Útest_fma_wrongtype  ó   
ÿþz(TestBuildInstructions.test_fma_wrongtypec                 C   sŒ   | j dd}t |¡}t td¡}t td¡}t td¡}|  t¡}|j|||dd W d   ƒ n1 s6w   Y  |  	dt
|jƒ¡ d S )Nr˜   rc  r~   r   rb   r±  z7expected types to be the same, got float, double, float)rF   r   r™   r  rø  r>   rÊ   rÔ  r±  r$   r"   r‰  r³  r   r   r   Útest_fma_mixedtypes  rµ  z)TestBuildInstructions.test_fma_mixedtypesc                 C   s$   dd„ }dD ]	}t  ||ƒ¡ qd S )Nc                 S   sn  t  t  d¡t  d¡ ¡ t  d¡g¡}t  ¡ }t j||dd}| ¡ }| ¡ }| ¡ }t  ¡ }| |¡ | 	|¡ | |¡ | 
t  d¡¡}| t  |jd¡|¡ | 
t  d¡¡}	|	 t  |	jd¡|¡ |jd  | ¡ | |jd |g¡}
| |
¡}| |	|¡}|	 ||¡ | |t  |jd¡¡}| ||¡ | d||jd ¡}| |||¡ | |¡ | |¡ t|ƒS )Nr	   rp  rc  r   r   r¬  )r   r<   r	  rŸ   r8   r@   rD   r™   rv  r  rÈ  rÉ  r  râ   r„   r…   rÙ  rÑ  rv   r²  r  r  r"   )Ú	attr_namerB   r:   rE   Úbb_entryÚbb_loopÚbb_exitrœ   ÚindexÚaccumr×  ÚvalueÚaddedÚindexp1Úcondr   r   r   Úgen_code!  s8   ÿ





z;TestBuildInstructions.test_arg_attributes.<locals>.gen_code)ÚbyrefÚbyvalÚelementtypeÚimmargÚinallocaÚinregÚnestrƒ   Ú	nocaptureÚnofreer‚   ÚnoundefÚpreallocatedÚreturnedÚsignextÚ
swiftasyncÚ
swifterrorÚ	swiftselfr}   )r)   r*   )r   rÁ  r·  r   r   r   Útest_arg_attributes   s   (êz)TestBuildInstructions.test_arg_attributesN)<rg   rh   ri   rj   ÚmaxDiffro  rŒ  r’  r˜  rŸ  r¤  r©  r´  r¿  rÄ  rÌ  rØ  rÛ  rå  ræ  rè  rï  r  r  r  r  r  r  r   r,  rA  rE  rO  rU  rV  r\  r^  rh  ri  r}  r  r‡  rŽ  r’  r”  r—  rš  r  rŸ  r£  r¦  r§  r©  r«  r®  r°  r²  r´  r¶  rÒ  r   r   r   r   rl  I  st    1%-JM2(& 	*:rl  c                   @   sh   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestBuilderMiscz=
    Test various other features of the IRBuilder class.
    c                 C   s\   | j dd}t |¡}|  |j|j¡ |  |jtj¡ |  |j|jj¡ |  |jtj	¡ d S )Nr[  rc  )
rF   r   r™   r2   rC   r]  ÚassertIsInstancer@   r:   r8   r‘  r   r   r   rb  h  s   
zTestBuilderMisc.test_attributesc              	   C   s,  | j dd}t |¡}|jjd d… \}}| ||d¡ |jdd}| |¡6 | ||d¡ | 	¡  | 
||d¡ W d   ƒ n1 sEw   Y  | ||d¡ | |¡ W d   ƒ n1 s`w   Y  | ||d	¡ | |¡ | ||d
¡ W d   ƒ n1 sƒw   Y  |  |d¡ |  |d¡ d S )Nr˜   rc  rb   r   rÆ   rL  rM  rO  rP  rQ  z¦            my_block:
                %"c" = add i32 %".1", %".2"
                %"e" = sub i32 %".1", %".2"
                %"g" = mul i32 %".1", %".2"
            zÄ            foo:
                %"d" = fadd i32 %".1", %".2"
                %"f" = fsub i32 %".1", %".2"
                %"h" = fmul i32 %".1", %".2"
                br label %"foo"
            )rF   r   r™   rC   r„   rv   rD   Ú
goto_blockr{  Úgoto_entry_blockr   r|  r  rh  r}  rX   )r   rF   rœ   rH  rI  Úbb_newr   r   r   Útest_goto_blockp  s&   

ÿûÿzTestBuilderMisc.test_goto_blockc                 C   sØ   | j dd}t |¡}t td¡}| ||d¡}| |¡}| ||d¡ W d   ƒ n1 s/w   Y  |  |j |¡ | ||d¡}| |¡ | ||d¡ | |¡ W d   ƒ n1 s^w   Y  |  	|j
d¡ d S )	NÚonerc  r   rH  rI  r   rL  aÝ              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                %"c" = add i1 0, 0
                br i1 %"c", label %"one.endif.if", label %"one.endif.endif"
            one.endif.if:
                %"d" = add i1 0, 0
                br label %"one"
            one.endif.endif:
            )rF   r   r™   r  rÀ  rv   Úif_thenr2   r  rf   rC   )r   rF   rœ   rÕ  rH  Úbbendr   r   r   r   Útest_if_then  s   
ÿþzTestBuilderMisc.test_if_thenc              	   C   sº   | j dd}t |¡}t td¡}| ||d¡}| |¡+ | ||d¡}| |¡ | ||d¡ W d   ƒ n1 s<w   Y  W d   ƒ n1 sKw   Y  | ¡  |  |j	d¡ d S )NrÚ  rc  r   rH  rI  r   aÐ              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"one.if.if", label %"one.if.endif"
            one.endif:
                ret void
            one.if.if:
                %"c" = add i1 0, 0
                br label %"one.if.endif"
            one.if.endif:
                br label %"one.endif"
            )
rF   r   r™   r  rÀ  rv   rÛ  rš   rf   rC   )r   rF   rœ   rÕ  rH  rI  r   r   r   Útest_if_then_nested«  s   
ÿ€þz#TestBuilderMisc.test_if_then_nestedc              	   C   sÔ   d}| j |d}t |¡}t td¡}| ||d¡}| |¡+ | ||d¡}| |¡ | ||d¡ W d   ƒ n1 s>w   Y  W d   ƒ n1 sMw   Y  | ¡  |  |j	dj
||d d… d	 d
¡ d S )NÚPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongrc  r   rH  rI  r   a              {full_label}:
                %"a" = add i1 0, 0
                br i1 %"a", label %"{label}.if", label %"{label}.endif"
            {label}.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"{label}.if.if", label %"{label}.if.endif"
            {label}.endif:
                ret void
            {label}.if.if:
                %"c" = add i1 0, 0
                br label %"{label}.if.endif"
            {label}.if.endif:
                br label %"{label}.endif"
            é   z..)Ú
full_labelÚlabel)rF   r   r™   r  rÀ  rv   rÛ  rš   rf   rC   r›   )r   rá  rF   rœ   rÕ  rH  rI  r   r   r   Útest_if_then_long_labelÆ  s    
ÿ€þ
òz'TestBuilderMisc.test_if_then_long_labelc                    ó<   ‡ fdd„}|dƒ}ˆ   |jd¡ |dƒ}ˆ   |jd¡ d S )Nc                    s`   ˆ j dd}t |¡}t td¡}|j|| d W d   ƒ n1 s#w   Y  ˆ  |d¡ |S )NrÚ  rc  r   ©Úlikelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )rF   r   r™   r  rÀ  rÛ  rX   )ræ  rF   rœ   rÕ  r9   r   r   r  â  s   
ÿz2TestBuilderMisc.test_if_then_likely.<locals>.checkTúC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FúC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            ©r`   r:   ©r   r  rœ   r   r9   r   Útest_if_then_likelyá  s
   z#TestBuilderMisc.test_if_then_likelyc              	   C   s\  | j dd}t |¡}t td¡}| ||d¡}| |¡<\}}| | ||d¡ W d   ƒ n1 s4w   Y  | | ||d¡ W d   ƒ n1 sMw   Y  W d   ƒ n1 s\w   Y  | |¡7\}}| | |¡ W d   ƒ n1 s{w   Y  | | ¡  W d   ƒ n1 s‘w   Y  W d   ƒ n1 s w   Y  |  	|j
d¡ d S )NrÚ  rc  r   rH  rI  r   a)              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.else"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.else:
                %"c" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                br i1 %"a", label %"one.endif.if", label %"one.endif.else"
            one.endif.if:
                br label %"one"
            one.endif.else:
                ret void
            one.endif.endif:
            )rF   r   r™   r  rÀ  rv   Úif_elser  rš   rf   rC   )r   rF   rœ   rÕ  rH  Úthenr$  r   r   r   Útest_if_elseö  s.   
ÿÿ€ýÿ
ÿ€ýzTestBuilderMisc.test_if_elsec                    rä  )Nc              	      sÀ   ˆ j dd}t |¡}t td¡}|j|| d7\}}| | |¡ W d   ƒ n1 s-w   Y  | | ¡  W d   ƒ n1 sCw   Y  W d   ƒ n1 sRw   Y  ˆ  |j	d¡ |S )NrÚ  rc  r   rå  zý                one:
                    br i1 0, label %"one.if", label %"one.else", !prof !0
                one.if:
                    br label %"one"
                one.else:
                    ret void
                one.endif:
                )
rF   r   r™   r  rÀ  rì  r  rš   rf   rC   )ræ  rF   rœ   rÕ  rí  r$  r9   r   r   r  	  s   
ÿ
ÿ€ý	z2TestBuilderMisc.test_if_else_likely.<locals>.checkTrç  Frè  ré  rê  r   r9   r   Útest_if_else_likely	  s
   z#TestBuilderMisc.test_if_else_likelyc           	      C   s  |   ¡ }t ¡ }t td¡}|jdd}|jdd}|jdd}| |¡ | ||d¡ | |¡ | ||d¡ | ||d¡ | |¡ | ||d	¡}| ||d
¡ | |¡ | ||d¡}| 	|¡ | ||d¡ | 
|¡ | ||d¡ |  |d¡ |  |d¡ |  |d¡ dS )zI
        Test IRBuilder.position_{before,after,at_start,at_end}.
        r   rÚ  rc  ÚtwoÚthreerH  rs  rt  ru  rv  rI  rw  r   z‰            one:
                %"a" = add i32 0, 0
                %"c" = add i32 0, 0
                %"b" = add i32 0, 0
            zÑ            two:
                %"o" = add i32 0, 0
                %"q" = add i32 0, 0
                %"p" = add i32 0, 0
                %"m" = add i32 0, 0
                %"n" = add i32 0, 0
            z            three:
            N)rC   r   r™   r  r=   rD   Úposition_at_startrv   rv  Úposition_afterÚposition_beforerX   )	r   rE   rœ   rÕ  Úbb_oneÚbb_twoÚbb_threeru  rI  r   r   r   Útest_positioning7	  s.   





z TestBuilderMisc.test_positioningc           	      C   s´   |   ¡ }t ¡ }|jdd}| |¡ t td¡}| ||d¡}| ¡ }|  	|j
¡ | |¡ |  |j
¡ | ||d¡}| ||d¡}| |¡ | ¡  |  	|j
¡ |  |d¡ d S )NÚentryrc  iÒ  rH  rI  r   zˆ            entry:
                %"a" = add i32 1234, 1234
                %"b" = mul i32 %"a", %"a"
                ret void
        )rC   r   r™   rD   rv  r  r=   rv   rš   rÃ  r`  Úremover_  rh  rX   )	r   rE   rœ   Úblkrq  rH  ÚretvoidrI  r   r   r   r   Útest_instruction_removalg	  s    


z(TestBuilderMisc.test_instruction_removalc                 C   s\   | j dd}t |¡}|j g ¡|_|jt t¡dd t	s&|  
|d¡ d S |  
|d¡ d S )Nr˜   rc  r   zY                my_block:
                    %"c" = alloca ptr, !dbg !0
                zZ                my_block:
                    %"c" = alloca i32*, !dbg !0
                )rF   r   r™   r:   rŽ   Údebug_metadatarÏ  r?   r=   r   rX   r‘  r   r   r   Útest_metadata~	  s   
zTestBuilderMisc.test_metadataN)rg   rh   ri   rj   rb  rÙ  rÝ  rÞ  rã  rë  rî  rï  rø  rý  rÿ  r   r   r   r   rÔ  c  s    $0rÔ  c                   @   sŒ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )"Ú	TestTypesc                 C   s,   t |tjƒr|j}t |tjƒst |tjƒ S r(   )Ú
isinstancer   r?   rç  Ú	LabelType)r   Útyr   r   r   Úhas_logical_equality‘	  s   ÿzTestTypes.has_logical_equalityc                 C   s´   t  ¡ }t  ¡ t  ¡ t  tttf¡t  ttf¡t jttfddt  ttf¡ttttt	t  
td¡t  
t	d¡t  
t	d¡t  ttf¡t  ttf¡| d¡| d¡g}|dd„ |D ƒ7 }|S )	z3
        A bunch of mutually unequal types
        Trr   r~   r€   ÚMyType1ÚMyType2c                 S   s(   g | ]}t |tjtjfƒst |¡‘qS r   )r  r   r.  r  r?   )r   Útpr   r   r   r!   ¨	  s    ÿz,TestTypes.assorted_types.<locals>.<listcomp>)r   ÚContextr  r.  r<   rÀ  rx   r=   rø  r>   re  rá  Úget_identified_type)r   ÚcontextrÕ   r   r   r   Úassorted_types–	  s   
ÿözTestTypes.assorted_typesc                 C   s6   |   ¡ }|D ]}|  |¡}|  |¡r|  ||¡ qd S r(   )r  r7   r  r4   )r   rÕ   r  Únewtyr   r   r   r¬   ­	  s   

€ýzTestTypes.test_picklingc                 C   sÂ   |   ¡ }t ||¡D ]\}}||ur&|  ||k||f¡ |  ||k||f¡ q
|D ]5}t |¡}|  |¡rJ|  ||k||f¡ |  ||k||f¡ q)|  ||k||f¡ |  ||k||f¡ q)d S r(   )r  Ú	itertoolsÚproductr_  rÃ  Úcopyr  )r   rÕ   rH  rI  r  rI  r   r   r   Útest_comparisons´	  s   €

ùzTestTypes.test_comparisonsc              	      s¤  t  ¡ t jddt  t¡t jtddt  t¡t jtdddœ}‡ fdd„}‡ fdd„}| ¡ D ]}ˆ  ¡ D ]}t|t jƒsB|||ƒ q5|||ƒ q/||d |d	 ƒ ||d |d
 ƒ ||d |d ƒ ||d |d ƒ ||d |d ƒ ||d	 |d
 ƒ ||d	 |d ƒ ||d	 |d ƒ ||d	 |d ƒ ||d
 |d ƒ ||d
 |d ƒ ||d
 |d ƒ ||d |d ƒ ||d |d ƒ ||d |d ƒ d S )Nr   rJ  )Úop_a0Úop_a1Útp_i1_a0Útp_i1_a1Útp_i8_a0Útp_i8_a1c                    óT   ˆ   | |k| |f¡ ˆ   || k|| f¡ ˆ  | |k| |f¡ ˆ  || k|| f¡ d S r(   )rÃ  r_  ©Úptr1Úptr2r9   r   r   Ú	assert_eqÕ	  ó   z1TestTypes.test_ptr_comparisons.<locals>.assert_eqc                    r  r(   )r_  rÃ  r  r9   r   r   Ú	assert_neÜ	  r  z1TestTypes.test_ptr_comparisons.<locals>.assert_ner  r  r  r  r  r  )r   r?   rÀ  rx   Úvaluesr  r  )r   Úptrsr  r  r×  rI  r   r9   r   Útest_ptr_comparisonsÄ	  s<   	
ú	
€zTestTypes.test_ptr_comparisonsc                 C   sð  t  ¡ }t jdd}|  |j¡ |  |j¡ |  t|ƒd¡ |  t|ƒd¡ | ¡ }| ¡ }|jdd}|  |j¡ |  |j¡ |  |j¡ |  t|ƒd¡ |  t|ƒd¡ |  t|ƒd¡ t  d¡ ¡ }t  d¡jdd}|  |j ¡ |  |j ¡ tr|  t|ƒd¡ |  t|ƒd	¡ n|  t|ƒd¡ |  t|ƒd¡ | ¡ }| ¡ }	|jdd}
|  |j ¡ |  |	j ¡ |  |
j ¡ trÞ|  t|ƒd
¡ |  t|	ƒd¡ |  t|
ƒd¡ d S |  t|ƒd¡ |  t|	ƒd¡ |  t|
ƒd¡ d S )Nrb   rJ  r×  zptr addrspace(2)r   zptr addrspace(3)r	   úi32*zi32 addrspace(2)*úi32**zi32 addrspace(2)**zi32 addrspace(2)* addrspace(3)*)	r   r?   rÃ  Ú	is_opaquer4   r"   rŸ   r	  r   )r   r×  r  Úptr_ptrÚptr2_ptrÚ	ptr2_ptr3ÚtptrÚtptr2Útptr_ptrÚ	tptr2_ptrÚ
tptr2_ptr3r   r   r   Útest_pointersÿ	  sJ   zTestTypes.test_pointersc                 C   sˆ   |   t ¡ jd¡ |   tjddjd¡ ts-|   t t¡jd¡ |   t td¡jd¡ d S |   t t¡jd¡ |   t td¡jd¡ d S )NÚp0r   rJ  Úp1Úp0i1Úp1i1)r4   r   r?   Úintrinsic_namer   rÀ  r9   r   r   r   Útest_ptr_intrinsic_name7
  s   z!TestTypes.test_ptr_intrinsic_namec              
   C   s$  |   ttƒd¡ |   tt d¡ƒd¡ |   ttƒd¡ |   ttƒd¡ |   tt ¡ ƒd¡ |   tt td¡ƒd¡ |   tt ttf¡ƒd	¡ |   tt tttf¡ƒd
¡ |   ttjtdddƒd¡ |   ttjttfddƒd¡ |   ttjtttfddƒd¡ t	s|   tt 
t¡ƒd¡ |   tt 
t 
t¡¡ƒd¡ n|   tt 
t¡ƒd¡ |   tt 
t 
t¡¡ƒd¡ |   tt td¡ƒd¡ t	sã|   tt t 
t¡d¡ƒd¡ |   tt 
t td¡¡ƒd¡ n|   tt t 
t¡d¡ƒd¡ |   tt 
t td¡¡ƒd¡ |   tt tf¡ƒd¡ |   tt ttf¡ƒd¡ t	s3|   tt t 
t¡t ttf¡f¡ƒd¡ n|   tt t 
t¡t ttf¡f¡ƒd¡ |   ttjtfddƒd¡ |   ttjttfddƒd¡ t ¡ }| d¡}|   t|ƒd ¡ | d!¡}|   t|ƒd"¡ | d#¡}|   t|ƒd$¡ d%S )&z:
        Test the string representation of types.
        Úi1é   Úi29r  ÚdoubleÚvoidr   zi1 ()z
i1 (float)zi1 (float, double)Trr   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)r×  r!  r"  r~   z[5 x i1]z	[5 x ptr]z	[5 x i1*]z	[5 x i1]*z{i1}z{i1, float}z{ptr, {i32, i8}}z{i1*, {i32, i8}})Úpackedz<{i1}>z<{i1, float}>ÚMyTypez	%"MyType"zMyType\z%"MyType\5c"zMyType"z%"MyType\22"N)r4   r"   rÀ  r   r	  rø  r>   r.  r<   r   r?   r=   re  rá  rx   r  r	  )r   r
  ÚmytypeÚmytype1Úmytype2r   r   r   Útest_strA
  s€   ÿÿÿÿÿÿ ÿÿ
ÿþ
ÿþÿÿ


zTestTypes.test_strc                 C   s4   t | j|  ¡ ƒD ]}|  t|ƒtt |¡ƒ¡ qd S r(   )Úfilterr  r  r4   Úhashr  )r   Útypr   r   r   Ú	test_hash}
  s   ÿzTestTypes.test_hashc                    s„  ‡ fdd„}‡ fdd„}t  t¡}tdƒD ]}|||tƒ q||ƒ t  td¡}tdƒD ]}|||tƒ q,||ƒ t  tt  ttf¡f¡}||dtƒ ||dt  ttf¡ƒ ˆ  t	¡ | 
t  td	¡¡ W d   ƒ n1 sow   Y  ||ƒ t  ¡ }t  |d
¡}| tt  ttf¡¡ ||dtƒ ||dt  ttf¡ƒ ˆ  t	¡ | 
t  td	¡¡ W d   ƒ n1 s·w   Y  ||ƒ d S )Nc                    s"   |   t t|¡¡}ˆ  ||¡ d S r(   )rÙ  r   r  r=   r4   )r  rS  rR   r]   r9   r   r   Úcheck_constant‚
  s   z*TestTypes.test_gep.<locals>.check_constantc                    sF   t  td¡}ˆ  t¡ |  |¡ W d   ƒ d S 1 sw   Y  d S )Ng      ð?)r   r  r>   rÊ   rÔ  rÙ  )r  r»  r9   r   r   Úcheck_index_type†
  s   "ÿz,TestTypes.test_gep.<locals>.check_index_typer~   r   r   r   rb   r9  )r   r?   r>   Úrangere  rÀ  rá  rx   rÊ   Ú
IndexErrorrÙ  r  r=   r  ÚIdentifiedStructTypeÚset_body)r   rB  rC  r  rS  r
  r   r9   r   rÛ  
  s4   
ÿÿzTestTypes.test_gepc                    st   t  d¡‰‡ ‡fdd„}|tdƒ |tdƒ |tdƒ |t td¡dƒ |t td¡dƒ |t tt	t	f¡d	ƒ d S )
Nú%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                    ó   ˆ   |  ˆ¡|¡ d S r(   )r4   Úget_abi_size©r  rR   ©r   Útdr   r   r  ¨
  rY   z&TestTypes.test_abi_size.<locals>.checkr   r€   r   r~   é   r   ©
r)   Úcreate_target_datarx   r=   r¿   r   re  rá  r>   rø  ©r   r  r   rL  r   Útest_abi_size¥
  ó   



zTestTypes.test_abi_sizec                    st   t  d¡‰‡ ‡fdd„}|tdƒ |tdƒ |tdƒ |t td¡dƒ |t td¡dƒ |t tt	t	f¡dƒ d S )NrH  c                    rI  r(   )r$   Úget_abi_alignmentrK  rL  r   r   r  ´
  rY   z+TestTypes.test_abi_alignment.<locals>.check)r   rb   r€   )r€   )r   r~   rO  rQ  r   rL  r   Útest_abi_alignment±
  rS  zTestTypes.test_abi_alignmentc                 C   s„   t  ¡ }| d¡}t j|d}|  |j¡ |  |¡ t|ƒ}| t  	d¡t  	d¡t  
¡ ¡ |  |j¡ |  |¡ |  |t|ƒ¡ d S )Nr9  ©r
  r	   r
   )r   r  r	  r8   rÃ  r#  r,   r"   rG  r	  r  r_  ÚassertNotEqual)r   r
  r:  r:   Úoldstrr   r   r   Útest_identified_struct½
  s   


z TestTypes.test_identified_structc                 C   s¦   t  d¡}t ¡ }| dd¡}tj|d}|  |j¡ |  |¡ t	|ƒ}| 
t d¡t d¡t ¡ ¡ |  | |d|¡d¡ |  |j¡ |  |¡ |  |t	|ƒ¡ d S )	NrH  r9  TrV  r   r
   r   rb   )r)   rP  r   r  r	  r8   rÃ  r#  r,   r"   rG  r	  r  r4   Úget_element_offsetr_  rW  )r   rM  r
  r:  r:   rX  r   r   r   Útest_identified_struct_packedÉ
  s   


z'TestTypes.test_identified_struct_packedc                 C   sD   t  ¡ }| d¡}t  d¡g|_t d¡}|  |j||dd¡ d S )Nr9  r	   rH  rV  r€   )	r   r  r	  r	  Úelementsr)   rP  r4   rJ  )r   r
  r:  rM  r   r   r   Ú$test_target_data_non_default_context×
  s
   

z.TestTypes.test_target_data_non_default_contextc                 C   s&   t  t  d¡d¡}|  t|ƒd¡ d S )Nr	   r   z	<8 x i32>)r   rt  r	  r4   r"   )r   ry  r   r   r   Útest_vectorÞ
  ó   zTestTypes.test_vectorN)rg   rh   ri   r  r  r¬   r  r   r,  r2  r=  rA  rÛ  rR  rU  rY  r[  r]  r^  r   r   r   r   r   	  s"    ;8
<$r   c                 C   s   t  t| ¡S r(   rÝ  )rS  r   r   r   Úc32ã
  s   r`  c                   @   sü   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=S )>ÚTestConstantc                 C   sÊ   t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  td	¡}|  t|ƒd
¡ t  tt j¡}|  t|ƒd¡ t  td ¡}|  t|ƒd¡ d S )Nr»   zi32 42r   zi1 1r   zi1 0Túi1 trueFzi1 falsezi1 undef)r   r  r=   r4   r"   rÀ  r¥  ©r   r   r   r   r   Útest_integersé
  s   zTestConstant.test_integersc                 C   s®   t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  td¡}|  t|ƒd¡ t  tt j¡}|  t|ƒd¡ t  td ¡}|  t|ƒd¡ d S )	Nç      ø?zfloat 0x3ff8000000000000g      ø¿zfloat 0xbff8000000000000zdouble 0x3ff8000000000000zdouble 0xbff8000000000000zdouble undefz
double 0.0)r   r  rø  r4   r"   r>   r¥  rc  r   r   r   Ú
test_realsù
  s   zTestConstant.test_realsc                 C   sú  t  t  td¡tdƒtdƒtdƒf¡}|  t|ƒd¡ t  t  td¡tdƒtt jƒf¡}|  t|ƒd¡ t j tdƒtdƒtt jƒf¡}|  t|ƒd¡ |  	t
¡}t j tdƒt  td	¡f¡ W d   ƒ n1 sjw   Y  |  t|jƒd
¡ t  t  td¡t j¡}|  t|ƒd¡ t  t  td¡d ¡}|  t|ƒd¡ t  t  td¡tdƒ¡}|  t|ƒd¡ t  t  td¡tdƒ¡}|  t|ƒd¡ t  t  td¡dt jdf¡}|  t|ƒd¡ |  	t¡ t  t  td¡d¡ W d   ƒ d S 1 söw   Y  d S )Nr   r~   r  r€   z[3 x i32] [i32 5, i32 6, i32 4]rb   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]re  z$all elements must have the same typez[2 x i32] undefz[2 x i32] zeroinitializerrá   s   foobar_123€z[11 x i8] c"foobar_123\80"s    ÿz[4 x i8] c"\00\01\04\ff"z#[3 x i32] [i32 5, i32 undef, i32 6])r~   r  )r   r  re  r=   r`  r4   r"   r¥  Úliteral_arrayrÊ   rÔ  rø  r‰  rx   Ú	bytearrayr³   )r   r   r†  r   r   r   Útest_arrays  s2   &" ÿÿ"ÿzTestConstant.test_arraysc                 C   sR   t  t  d¡d¡}g d¢}t  ||¡}d d tdj|ƒ¡¡}|  t|ƒ|¡ d S )Nr	   r   )r   rb   r€   r   r   r  é	   é   z<8 x i32> <{}>z, zi32 {})	r   rt  r	  r  r›   r   r   r4   r"   )r   ry  Úvalsrz  Úvec_reprr   r   r   r^  %  s   ÿzTestConstant.test_vectorc                 C   s$   t  t  d¡d ¡j}|  |d¡ d S )Nr	   r   )r   r  r	  Úconstantr4   )r   rn  r   r   r   Útest_non_nullable_int-  s   z"TestConstant.test_non_nullable_intc                 C   s¨  t  ttf¡}t  t|f¡}t  |t  t  ¡ d¡t  td¡f¡}|  t|ƒd¡ t j 	t  t  ¡ d¡t  td¡f¡}|  |j
|¡ |  t|ƒd¡ t j 	t  t  ¡ d¡t  tt j¡f¡}|  |j
|¡ |  t|ƒd¡ t  |t j¡}|  t|ƒd¡ t  |d ¡}|  t|ƒd¡ t  |d¡}|  t|ƒd¡ t  |d|f¡}|  t|ƒd	¡ t  |d
¡}|  t|ƒt|ƒ¡ |  t¡ t  |d¡ W d   ƒ d S 1 sÍw   Y  d S )Nre  Tú/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializer©re  Tr»   úL{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}}©r»   rq  ©r€   r~   r  )r   rá  rø  rÀ  r=   r  r  r4   r"   Úliteral_structrâ   r¥  rÊ   r³   )r   Úst1Úst2r   Úc1Úc2Úc3r   r   r   Útest_structs1  sJ   
ÿ
ÿ
ÿ
ÿÿ
ÿ
ÿ"ÿzTestConstant.test_structsc                 C   s0   t  d¡}t  t  ||g¡t j¡}|  |¡ d S )Nr   )r   r	  r  rá  r¥  r7   )r   rô   Ústr   r   r   Ú&test_undefined_literal_struct_picklingS  s   
z3TestConstant.test_undefined_literal_struct_picklingc                 C   s<  t dƒ}|  |tj¡ |  t|ƒd¡ tdƒ}|  |tj¡ |  t|ƒd¡ t td¡}|t	dƒt	dƒt	dƒgƒ}|  t|ƒd	¡ |g d
¢ƒ}|  t|ƒd	¡ |dƒ}|  t|ƒd¡ |  
t¡ |g d¢ƒ W d  ƒ n1 sqw   Y  t ttf¡}t t|f¡}|dƒ}|  t|ƒd¡ |dƒ}|  t|ƒd¡ dS )z@
        Instantiating a type should create a constant.
        r»   zi8 42Trb  r   r€   r~   r  z[3 x i32] [i32 4, i32 5, i32 6]rt  Nz[3 x i32] zeroinitializer)r€   r~   r  rk  rq  rp  rs  rr  )rx   rÕ  r   r  r4   r"   rÀ  re  r=   r`  rÊ   r³   rá  rø  )r   r   Úatrv  rw  r   r   r   Útest_type_instantiatonX  s,   ÿz#TestConstant.test_type_instantiatonc                 C   s   t dƒ}|  t|ƒd¡ dS )z8
        Constants should have a useful repr().
        r»   z!<ir.Constant type='i32' value=42>N)r=   r4   rA  rc  r   r   r   rk  v  s   zTestConstant.test_reprc                 C   sz   t  t  t  d¡d¡ttdƒƒ¡}|  ¡ }t  ||jd¡}d|_	||_
t t|ƒ¡}t t|ƒ¡}|  t|ƒt|ƒ¡ d S )Nr   é   Ú
myconstantT)r   r  re  r	  rh  rD  r:   r  râ   rU  r  r)   r*   r"   r4   )r   r   rs  ÚgvÚparsedÚreparsedr   r   r   Útest_encoding_problem}  s   
ÿz"TestConstant.test_encoding_problemc                 C   s  |   ¡ }t ttf¡}t ||d¡}| dd„ dD ƒ¡}ts'|  t	|ƒd¡ n|  t	|ƒd¡ |  |j
t t¡¡ t |d ¡}|  t¡ | t td¡g¡ W d   ƒ n1 sYw   Y  t | ¡ d ¡}| t td¡g¡}ts{|  t	|ƒd¡ n|  t	|ƒd	¡ |  |j
t t¡¡ d S )
Nr  c                 S   rÜ  r   rÝ  rÞ  r   r   r   r!     rß  z)TestConstant.test_gep.<locals>.<listcomp>©r   r   z<getelementptr ({float, i1}, ptr @"myconstant", i32 0, i32 1)zEgetelementptr ({float, i1}, {float, i1}* @"myconstant", i32 0, i32 1)r   z,getelementptr ({float, i1}, ptr null, i32 0)z5getelementptr ({float, i1}, {float, i1}* null, i32 0))r:   r   rá  rø  rÀ  r  rÙ  r   r4   r"   râ   r?   r  rÊ   rÔ  r=   rŸ   )r   rs  r  r‚  r   ÚconstÚ	const_ptrry  r   r   r   rÛ  Œ  s4   
ÿ
ÿÿ
ÿ
ÿzTestConstant.test_gepc                 C   s    |   ¡ }t ttf¡}d}tj||d|d}|  |j|¡ | dd„ dD ƒ¡}|  |j	j|¡ t
s:|  t|ƒd¡ n|  t|ƒd¡ |  |j	tjt|d¡ d S )	Nr€   r  rJ  c                 S   rÜ  r   rÝ  rÞ  r   r   r   r!   ®  rß  z=TestConstant.test_gep_addrspace_globalvar.<locals>.<listcomp>r†  zIgetelementptr ({float, i1}, ptr addrspace(4) @"myconstant", i32 0, i32 1)zRgetelementptr ({float, i1}, {float, i1} addrspace(4)* @"myconstant", i32 0, i32 1))r:   r   rá  rø  rÀ  r  r4   rK  rÙ  râ   r   r"   r?   )r   rs  r  rK  r‚  r   r   r   r   Útest_gep_addrspace_globalvar§  s   
ÿ
ÿz)TestConstant.test_gep_addrspace_globalvarc                 C   ó&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   ztrunc (i64 1 to i32))r   r  r¿   rô  r=   r4   r"   rc  r   r   r   Ú
test_truncº  r_  zTestConstant.test_truncc                 C   rŠ  )Nr   zzext (i32 1 to i64))r   r  r=   rõ  r¿   r4   r"   rc  r   r   r   Ú	test_zext¾  r_  zTestConstant.test_zextc                 C   rŠ  )Nr-   zsext (i32 -1 to i64))r   r  r=   rö  r¿   r4   r"   rc  r   r   r   Ú	test_sextÂ  r_  zTestConstant.test_sextc                 C   rŠ  )Nr   z*fptrunc (float 0x3ff0000000000000 to half))r   r  rø  r÷  r=  r4   r"   rc  r   r   r   Útest_fptruncÆ  r_  zTestConstant.test_fptruncc                 C   rŠ  )Nr   z*fpext (float 0x3ff0000000000000 to double))r   r  rø  rù  r>   r4   r"   rc  r   r   r   Ú
test_fpextÊ  r_  zTestConstant.test_fpextc                 C   sP   |   ¡ }t |td¡}| t ¡ ¡}ts|  t	|ƒd¡ d S |  t	|ƒd¡ d S )Nr  z"bitcast (ptr @"myconstant" to ptr)z$bitcast (i32* @"myconstant" to i64*))
r:   r   r  r=   râ  r¿   rŸ   r   r4   r"   )r   rs  r‚  r   r   r   r   Útest_bitcastÎ  s   zTestConstant.test_bitcastc                 C   rŠ  )Nr   z(fptoui (float 0x3ff0000000000000 to i32))r   r  rø  rú  r=   r4   r"   rc  r   r   r   Útest_fptoui×  r_  zTestConstant.test_fptouic                 C   rŠ  )Nr   zuitofp (i32 1 to float))r   r  r=   rü  rø  r4   r"   rc  r   r   r   Útest_uitofpÛ  r_  zTestConstant.test_uitofpc                 C   rŠ  )Nr   z(fptosi (float 0x3ff0000000000000 to i32))r   r  rø  rû  r=   r4   r"   rc  r   r   r   Útest_fptosiß  r_  zTestConstant.test_fptosic                 C   rŠ  )Nr   zsitofp (i32 1 to float))r   r  r=   rý  rø  r4   r"   rc  r   r   r   Útest_sitofpã  r_  zTestConstant.test_sitofpc                 C   sr   t  t ¡ d ¡}t  td¡}| t¡}|  t|jt¡ |  t|jt¡ t	s/|  
t|ƒd¡ d S |  
t|ƒd¡ d S )Nr   zptrtoint (ptr null to i32)zptrtoint (i64* null to i32))r   r  r¿   rŸ   r=   rþ  rÊ   rÔ  rø  r   r4   r"   )r   r×  rÚ  r   r   r   r   Útest_ptrtoint_1ç  s   
zTestConstant.test_ptrtoint_1c                 C   s”   |   ¡ }t |td¡}| t¡}ts&|  t|ƒd¡ |  	t
d|jt ¡ ¡ n|  t|ƒd¡ |  	t
d|jt ¡ ¡ t td¡}|  	t
d|jt¡ d S )Nr  z#ptrtoint (ptr @"myconstant" to i64)z0can only ptrtoint\(\) to integer type, not 'ptr'z$ptrtoint (i32* @"myconstant" to i64)z2can only ptrtoint\(\) to integer type, not 'i64\*'r   z5can only call ptrtoint\(\) on pointer type, not 'i32')r:   r   r  r=   rþ  r¿   r   r4   r"   r²   rÔ  rŸ   r  )r   rs  r‚  r   ry  r   r   r   Útest_ptrtoint_2ó  s2   
üüüzTestConstant.test_ptrtoint_2c                 C   sv   t  td¡}t  td¡}| t ¡ ¡}|  t|jt¡ |  t|jt ¡ ¡ t	s1|  
t|ƒd¡ d S |  
t|ƒd¡ d S )Nr   g…ëQ¸	@zinttoptr (i32 1 to ptr)zinttoptr (i32 1 to i64*))r   r  r=   rø  rÿ  r¿   rŸ   rÊ   rÔ  r   r4   r"   )r   rÚ  Úpir   r   r   r   Útest_inttoptr  s   zTestConstant.test_inttoptrc                 C   ó$   t  td¡}|  t| ¡ ƒd¡ d S )Nr   zsub (i32 0, i32 1))r   r  r=   r4   r"   r   ©r   rÚ  r   r   r   Útest_neg  ó   zTestConstant.test_negc                 C   r™  )Nr   zxor (i32 1, i32 -1))r   r  r=   r4   r"   r¡  rš  r   r   r   Útest_not  rœ  zTestConstant.test_notc                 C   r™  )Nr   zfneg (float 0x3ff0000000000000))r   r  rø  r4   r"   r¢  rš  r   r   r   Ú	test_fneg#  rœ  zTestConstant.test_fnegc           
      C   s0  t  td¡}t  td¡}|jd|jd|jd|jd|jd|jd|j	d	|j
d
|jd|jd|jd|jd|jdi}| ¡ D ]\}}|  t||ƒƒ|d ¡ q9dddddddœ}| ¡ D ]\}}t| ||¡ƒ}d| d }	|  ||	¡ qWdddddddœ}| ¡ D ]\}}t| ||¡ƒ}d| d }	|  ||	¡ q}d S )Nr   rb   r†  rˆ  r‡  rv   r   rh  r~  rg  r€  r  ÚorÚandr…  z (i32 1, i32 2)ÚeqÚneÚugtÚugeÚultÚule©rª  r«  r®  r¯  r¬  r­  zicmp ÚsgtÚsgeÚsltÚsle)r   r  r=   r†  rˆ  r‡  rv   r   rh  r~  rg  r€  r  rƒ  r„  r…  Úitemsr4   r"   r²  r³  )
r   rÚ  rð  Úoracler«   ÚiropÚcoprÀ  r]   rR   r   r   r   Útest_int_binops'  s2   üÿÿýzTestConstant.test_int_binopsc           
   
   C   s  t  td¡}t  td¡}|jd|jd|jd|jd|jdi}| ¡ D ]\}}t	||ƒƒ}|d }|  
||¡ q!d	d
dddddœ}| ¡ D ]\}}	t	| ||¡ƒ}d|	 d }|  
||¡ qCdddddddœ}| ¡ D ]\}}	t	| ||¡ƒ}d|	 d }|  
||¡ qid S )Nr   rb   r{  r|  r}  r  r‚  z5 (float 0x3ff0000000000000, float 0x4000000000000000)ÚoeqrÚ  ÚogtÚoger¹  Úoler§  zfcmp ÚueqÚuner£  r¤  r¥  r¦  )r   r  rø  r{  r|  r}  r  r‚  r¬  r"   r4   r½  r¾  )
r   rÚ  rð  r­  r«   r®  r]   rR   r¯  rÀ  r   r   r   Útest_flt_binopsC  s0   ÿÿÿüzTestConstant.test_flt_binopsN)!rg   rh   ri   rd  rf  ri  r^  ro  r{  r}  r  rk  r…  rÛ  r‰  r‹  rŒ  r  rŽ  r  r  r‘  r’  r“  r”  r•  r–  r˜  r›  r  rž  r°  r·  r   r   r   r   ra  ç
  s>    "	ra  c                   @   ó   e Zd Zdd„ ZdS )ÚTestTransformsc                 C   s¦   t  ¡ }t  |t  t  ¡ d¡d¡}t  |t  t  ¡ d¡d¡}t  ¡ }| | ¡ ¡ | |d¡}|  	|j
|¡ t  |||¡}|  ||¡ |  |j
|¡ |  	|j
|¡ d S )Nr   rÆ   rÇ   )r   r8   r@   r<   r.  r™   rv  rD   r0  r4   ÚcalleeÚreplace_all_callsr$   rW  )r   r%   rÆ   rÇ   rœ   r0  Úmodifiedr   r   r   Útest_call_transformc  s   z"TestTransforms.test_call_transformN)rg   rh   ri   r½  r   r   r   r   r¹  b  ó    r¹  c                   @   r¸  )ÚTestSingletonc                 C   sP   |   tjtj ¡ ¡ |   tjt tj¡¡ |   tjt tj¡¡ |  tj¡ d S r(   )r2   r   r¥  r  Ú
_Undefinedr  Údeepcopyr7   r9   r   r   r   Útest_undefinedr  s   zTestSingleton.test_undefinedN)rg   rh   ri   rÂ  r   r   r   r   r¿  q  r¾  r¿  Ú__main__)(rj   r  r  r/   r   rK   Úunittestr   r   Úllvmliter   r   r)   r   r	  rÀ  rx   r•  r=   r¿   ÚHalfTyper=  r  rø  r?  r>   r   rk   r¹   r<  rZ  rl  rÔ  r   r`  ra  r¹  r¿  rg   Úmainr   r   r   r   Ú<module>   sl    




^ K   
Q-          $  .  V  }ÿ