U
    ¬9%e œ ã                   @   sp  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 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rle &¡  dS )$z
IR Construction Tests
é    Né   )ÚTestCase)Úir)Úbindingé   é   é    é@   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   úU/var/www/html/Darija-Ai-API/env/lib/python3.8/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>0   s     z+TestBase.assert_ir_line.<locals>.<listcomp>)ÚstrÚ
splitlinesÚassertIn)r   r   ÚmodÚlinesr   r   r   Úassert_ir_line/   s    zTestBase.assert_ir_linec                 C   s   t  t|ƒ¡ d S ©N)ÚllvmÚparse_assemblyr!   ©r   r$   r   r   r   Úassert_valid_ir3   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   ZirobjectZ	newobjectr   r   r   Úassert_pickle_correctly6   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'   )r7   r   ÚFunctionTypeÚint32ÚdblÚPointerTypeÚFunction)r   r7   ÚnameÚfntyr   r   r   ÚfunctionB   s
    ÿzTestBase.functionr   c                 C   s   |p
|   ¡ }| |¡S r'   )r@   Úappend_basic_block)r   Úfuncr>   r   r   r   ÚblockH   s    zTestBase.blockc                 C   s   g }|  |¡ d |¡S )Nr   )Údescrr   )r   ÚthingÚbufr   r   r   rD   L   s    
zTestBase.descrc                 C   s   t  |¡}| dd¡}|S )Nz
    z
  )ÚtextwrapÚdedentÚreplace)r   Úasmr   r   r   Ú_normalize_asmQ   s    
zTestBase._normalize_asmc                 C   s   |   |¡}|  ||¡ d S r'   )rK   r   ©r   rD   rJ   Úexpectedr   r   r   Úcheck_descr_regexW   s    
zTestBase.check_descr_regexc                 C   s   |   |¡}|  ||¡ d S r'   )rK   r3   rL   r   r   r   Úcheck_descr[   s    
zTestBase.check_descrc                 C   s   |   |  |¡|¡ d S r'   )rO   rD   ©r   rC   rJ   r   r   r   Úcheck_block_   s    zTestBase.check_blockc                 C   s   |   |  |¡|¡ d S r'   )rN   rD   rP   r   r   r   Úcheck_block_regexb   s    zTestBase.check_block_regexc                 C   s*   |   |¡}| ¡ }|  | ¡ | ¡ ¡ d S r'   )rK   Z_stringify_bodyr3   r   ©r   r7   rJ   rM   Úactualr   r   r   Úcheck_module_bodye   s    
zTestBase.check_module_bodyc                 C   s*   |   |¡}| ¡ }|  | ¡ | ¡ ¡ dS )z6
        Check module metadata against *asm*.
        N)rK   Z_stringify_metadatar3   r   rS   r   r   r   Úcheck_metadataj   s    
zTestBase.check_metadatac                 C   sD   |   |¡}|  |¡}| d¡d  d¡d }|  | ¡ | ¡ ¡ d S )NÚ{é   Ú}r   )rK   rD   Ú	partitionÚ
rpartitionr3   r   )r   rB   rJ   rM   rT   r   r   r   Úcheck_func_bodyr   s    

zTestBase.check_func_body)Nr8   )Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r+   r4   r7   r@   rC   rD   rK   rN   rO   rQ   rR   rU   rV   r\   r   r   r   r   r
      s"   	

r
   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„ 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", i32* %".4")c                 C   s0   |   ¡ }|  |¡ ¡ }|  | ¡ d| j ¡ d S )Nz
declare %s)r@   rD   r   r3   Úproto©r   rB   rJ   r   r   r   Útest_declare}   s    zTestFunction.test_declarec                 C   s€   |   ¡ }|j d¡ |j d¡ d|j_tjtddd}t |  ¡ |d¡}||j_	|  
|¡ ¡ }|  |d| j ¡ |  |¡ d S )	NÚoptsizeÚalwaysinliner   r   T©Zvar_argZ__gxx_personality_v0z\declare %s alwaysinline optsize alignstack(16) personality i8 (...)* @"__gxx_personality_v0")r@   Ú
attributesÚaddZ
alignstackr   r9   Úint8r=   r7   ZpersonalityrD   r   r3   rb   r4   )r   rB   Ztp_persZpersrJ   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	¡ |  |¡ 	¡ }|  
|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", i32* nonnull align 4 %".4"))r@   ÚargsÚadd_attributerh   ZdereferenceableZdereferenceable_or_nullÚalignZreturn_valuerD   r   r3   r4   rc   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)	r7   r@   Úset_metadataÚadd_metadatarD   r   r3   rb   r4   ©r   r7   rB   rJ   r   r   r   Útest_function_metadata¤   s    
ÿz#TestFunction.test_function_metadatac                 C   s@   |   ¡ }d|_|  |¡ ¡ }|  |d| j› d¡ |  |¡ d S )NÚ	a_sectionrx   z section "a_section")r@   ÚsectionrD   r   r3   rb   r4   rc   r   r   r   Útest_function_section°   s    ÿz"TestFunction.test_function_sectionc                 C   s\   |   ¡ }|  |¡}d|_| d| g ¡¡ |  |¡ ¡ }|  |d| j› d¡ |  	|¡ d S )Nr}   rw   rx   z section "a_section" !dbg !0)
r7   r@   r~   ry   rz   rD   r   r3   rb   r4   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 )Nrf   rw   rx   z alwaysinline !dbg !0)r7   r@   rh   ri   ry   rz   rD   r   r3   rb   r4   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 )Nre   r}   rx   z optsize section "a_section")	r@   rh   ri   r~   rD   r   r3   rb   r4   rc   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 )Nrf   r}   rw   rx   z) alwaysinline section "a_section" !dbg !0)r7   r@   rh   ri   r~   ry   rz   rD   r   r3   rb   r4   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 )Nrf   Úmy_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )rb   )r@   rh   ri   rA   r   Ú	IRBuilderÚret_voidrD   rO   Úformatrb   )r   rB   rC   ÚbuilderrJ   r   r   r   Útest_defineî   s    



úzTestFunction.test_definec                 C   s¦   |   ¡ }t ¡ }| dtg¡}| d|tg¡}| d||tg¡}| d¡}|  |  |¡ ¡ d¡ |  |  |¡ ¡ d¡ |  |  |¡ ¡ d¡ |  |  |¡ ¡ d¡ d S )	Nú	llvm.powizllvm.memsetzllvm.memcpyzllvm.assumezD            declare double @"llvm.powi.f64"(double %".1", i32 %".2")zZ            declare void @"llvm.memset.p0i8.i32"(i8* %".1", i8 %".2", i32 %".3", i1 %".4")z`            declare void @"llvm.memcpy.p0i8.p0i8.i32"(i8* %".1", i8* %".2", i32 %".3", i1 %".4")z1            declare void @"llvm.assume"(i1 %".1"))	r7   rj   Ú
as_pointerÚdeclare_intrinsicr;   r:   rO   rD   r   )r   r7   Zpint8ÚpowiZmemsetZmemcpyÚassumer   r   r   Útest_declare_intrinsicsþ   s    
z$TestFunction.test_declare_intrinsicsc                 C   s4   |   ¡ }| dtg¡}| dtg¡}|  ||¡ d S )NrŠ   )r7   rŒ   r;   r1   )r   r7   r   Zpowi2r   r   r   Útest_redeclare_intrinsic  s    z%TestFunction.test_redeclare_intrinsicc                 C   s   |   ¡ }|  |¡ d S r'   )r@   r4   )r   Úfnr   r   r   Útest_pickling  s    zTestFunction.test_picklingc              	   C   sJ   |   ¡ }|  |¡}|j d¡ d}|  t|¡ |j d¡ W 5 Q R X d S )Nrf   ú$Can't have alwaysinline and noinlineÚnoinline©r7   r@   rh   ri   ÚassertRaisesRegexÚ
ValueError©r   r7   rB   Úmsgr   r   r   Ú%test_alwaysinline_noinline_disallowed  s    
z2TestFunction.test_alwaysinline_noinline_disallowedc              	   C   sJ   |   ¡ }|  |¡}|j d¡ d}|  t|¡ |j d¡ W 5 Q R X d S )Nr”   r“   rf   r•   r˜   r   r   r   Ú%test_noinline_alwaysinline_disallowed"  s    
z2TestFunction.test_noinline_alwaysinline_disallowedN)r]   r^   r_   rb   rd   rk   rv   r|   r   r€   r   r‚   rƒ   r‰   r   r   r’   rš   r›   r   r   r   r   ra   y   s    	ra   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S ) ÚTestIRc                 C   s8   |   ¡ }| tdƒtdƒg¡ |  d|¡ |  |¡ d S )Né{   é*   z!0 = !{ i32 123, i8 42 })r7   rz   r:   rj   r&   r+   r*   r   r   r   Útest_unnamed_metadata.  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 })r7   rz   r:   Úint64r1   r&   )r   r$   Úm0Úm1Úm2r   r   r   Útest_unnamed_metadata_25  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 })r7   rz   r:   r&   r*   r   r   r   Útest_unnamed_metadata_3E  s
    (zTestIR.test_unnamed_metadata_3c                 C   s$   |   ¡ }| dg¡ |  d|¡ d S )Nz"\$z!0 = !{ !"\22\5c$" })r7   rz   r&   r*   r   r   r   Útest_metadata_stringM  s    zTestIR.test_metadata_stringc              	   C   sœ   |   ¡ }| tdƒg¡}| tdƒg¡}| d¡}| |¡ | |¡ | |¡ |  d|¡ |  |¡ |  || 	d¡¡ |  
t¡ | 	d¡ W 5 Q R X d S )Nr   r¡   Úfooz!foo = !{ !0, !1, !0 }Úbar)r7   rz   r:   r¢   Úadd_named_metadatari   r&   r+   r1   Zget_named_metadataÚassertRaisesÚKeyError)r   r$   r£   r¤   Znmdr   r   r   Útest_named_metadataS  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 = !{  })r7   rz   r:   r«   r¢   r&   r+   )r   r$   r£   r   r   r   Útest_named_metadata_2c  s    zTestIR.test_named_metadata_2c                 C   sf   |   ¡ }| t ¡ d ƒg¡ |  d|¡ |  |¡ |   ¡ }| d tdƒg¡ |  d|¡ |  |¡ d S )Nz!0 = !{ i32* null }r   z!0 = !{ null, i32 123 })r7   rz   r:   r‹   r&   r+   r*   r   r   r   Útest_metadata_nulls  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Ú	directoryZDISubroutineTypeÚtypesÚDICompileUnitÚDW_LANG_PythonZARTIQr   T)ÚlanguageÚfileZproducerZruntimeVersionZisOptimized©Zis_distinctZDISubprogramr8   é   F)r>   r¹   r   ÚtypeZ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))r7   Úadd_debug_inforz   r   ÚDITokenr!   r&   r+   )r   r$   Údi_fileZdi_func_typeZdi_compileunitÚstrmodr   r   r   Útest_debug_info  sR    þ 
þûúúù
ÿýý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º   rp   r¾   z/!1 = !DIFile(directory: "foo", filename: "bar")z8!2 = distinct !DIFile(directory: "bar", filename: "foo"))r7   r¿   r1   r3   Úlenr!   r&   r+   )r   r$   Zdi1Zdi2Zdi3Zdi4rÂ   r   r   r   Útest_debug_info_2¬  sF    ÿÿÿÿÿÿÿýÿÿÿzTestIR.test_debug_info_2c              
   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ž   ZDIBasicTypeÚfloatr   ZDW_ATE_float)r>   ÚsizeÚencodingZDIGlobalVariableExpressionZDIExpressionZDIGlobalVariableT)r>   r¼   ZisDefinitionrº   )ÚexprÚvarrw   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 !3rX   zDwarf Versionro   zDebug Info Versionrp   zllvm.module.flagsr±   r©   rª   r²   r¶   r·   Z	FullDebug)r¸   r¹   ZemissionKindÚglobalszllvm.dbg.cu)r7   r   ÚGlobalVariableÚ	FloatTypeÚConstantÚinitializerr¿   rÀ   r>   ry   r!   r&   ÚIntTyperz   r«   ri   )r   r$   rÆ   Zdi_floatZdi_gvarrÂ   ZdverZdiverÚflagsrÁ   Zdi_cur   r   r   Útest_debug_info_gvarË  sj    ý
ýüþÿÿÿÿ




þ
üûzTestIR.test_debug_info_gvarc                 C   sP   |   ¡ }| dddi¡ t|ƒ}d tdd„ d ¡ ƒ¡}|  d|› d	|¡ d S )
NZDILocalVariabler>   u   aâˆ†r   c                 S   s   d| d›S )Nr   Ú02xr   )Úxr   r   r   Ú<lambda>  ó    z7TestIR.test_debug_info_unicode_string.<locals>.<lambda>u   âˆ†z!0 = !DILocalVariable(name: "az"))r7   r¿   r!   r   r   Úencoder&   )r   r$   rÂ   r>   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©Zside_effectr   ú8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))r7   r   r=   r9   ÚVoidTyper…   rA   r:   Z	InlineAsmÚcallr†   r   r!   r+   )r   r$   r©   rˆ   ÚasmtyrJ   Ú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Ü   rÝ   )r7   r   r=   r9   rÞ   r…   rA   r:   rJ   r†   r   r!   r+   )r   r$   r©   rˆ   rà   rá   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}")r7   r   r=   r9   rÞ   r…   rA   Zload_regrÑ   r†   r   r!   r+   ©r   r$   r©   rˆ   rá   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	   rä   z0call void asm sideeffect "", "{rax}" ( i64 123 ))r7   r   r=   r9   rÞ   r…   rA   Z	store_regr¢   rÑ   r†   r   r!   r+   rå   r   r   r   Útest_builder_store_reg9  s    zTestIR.test_builder_store_regN)r]   r^   r_   rŸ   r¦   r§   r¨   r®   r¯   r°   rÃ   rÅ   rÓ   rÙ   râ   rã   ræ   rç   r   r   r   r   rœ   ,  s   -D	
rœ   c                   @   s,   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 5 Q R X |  t|ƒd¡ d S )Nr©   rª   Ú
globdoubleZkkkz2<ir.GlobalVariable 'globdouble' of type 'double*'>)r7   r   r=   r9   rÞ   rÍ   Ú
DoubleTyper3   Z
get_globalr¬   r­   Úrepr)r   r$   r©   ré   r   r   r   Útest_globals_accessF  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)r7   r   r9   rÞ   r=   rÍ   rê   r3   ÚsetZ	functionsZglobal_values)r   r$   Zftyr©   rª   ré   r   r   r   Ú#test_functions_global_values_accessS  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ÚeZinternalÚfr¡   Úgr   ÚhZ	h_sectionÚir   Z	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)r7   r   rÍ   rj   r:   rÐ   Úglobal_constantÚlinkageZunnamed_addrru   r~   rU   )r   r$   rï   rð   r   ró   rô   rõ   rö   r÷   rø   r   r   r   Útest_global_variables_ir`  s2    



z)TestGlobalValues.test_global_variables_irc                 C   s   |   ¡ }|  |¡ d S r'   )r7   r4   r*   r   r   r   Útest_pickle‹  s    zTestGlobalValues.test_pickleN)r]   r^   r_   rì   rî   rû   rü   r   r   r   r   rè   D  s   +rè   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	TestBlockc                 C   s4   |   ¡ }tj|dd}|  |j|¡ |  |j¡ d S )NÚstart©Úparentr>   )r@   r   ÚBlockr1   r   ÚassertFalseÚis_terminated©r   rB   rC   r   r   r   Útest_attributes’  s    zTestBlock.test_attributesc                 C   sD   | j dd}|  |  |¡d¡ |j ddg¡ |  |  |¡d¡ d S )Nr„   ©r>   z
my_block:
rï   rð   zmy_block:
  a
  b
)rC   r3   rD   ZinstructionsÚextend)r   rC   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„   r  rX   r   ró   rô   Úsdivrõ   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"
            )rC   r   r…   r@   rs   ri   r   ÚmulÚInstructionr¼   rQ   rI   )r   rC   rˆ   rï   rð   r   ró   rõ   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)r@   r   r  r3   rë   r  r   r   r   Ú	test_repr´  s    zTestBlock.test_reprN)r]   r^   r_   r  r  r  r  r   r   r   r   rý     s   rý   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„   r  rX   Ú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>)>)	rC   r   r…   r@   rs   ri   rQ   r3   rë   )r   rC   rˆ   rï   rð   Úinstr   r   r   Útest_simpleÄ  s    

ÿz!TestBuildInstructions.test_simplec              	   C   sx  | 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 5 Q R X |  t|jƒd¡ |  |j¡ |  |d¡ d S )Nr„   r  rp   r   ró   rô   rõ   rö   r÷   rø   Ú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"
            )rC   r   r…   r@   rs   ri   Úfaddr   Úfsubr
  ÚfmulÚudivr	  ÚfdivÚuremÚsremÚfremÚor_Úand_ÚxorÚshlÚashrÚlshrr¬   r—   r3   r!   Ú	exceptionr  r  rQ   )r   rC   rˆ   rï   rð   ÚffÚcmr   r   r   Útest_binopsÓ  s8    
ÿz!TestBuildInstructions.test_binopsc                 C   sb   | j dd}t |¡}|jjd d… \}}|j||ddd |j||ddd	gd |  |d
¡ d S )Nr„   r  rX   r   )Únuw©rÒ   ró   r/  Znswz†            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )rC   r   r…   r@   rs   ri   r   rQ   ©r   rC   rˆ   rï   rð   r   r   r   Útest_binop_flags  s    
z&TestBuildInstructions.test_binop_flagsc                 C   sb   | j dd}t |¡}|jjd d… \}}|j||ddd |j||ddd	gd |  |d
¡ d S )Nr„   r  rX   r   ©Úfastr0  ró   ÚninfÚnszzŠ            my_block:
                %"c" = fadd fast i32 %".1", %".2"
                %"d" = fsub ninf nsz i32 %".1", %".2"
            )rC   r   r…   r@   rs   r  r  rQ   r1  r   r   r   Útest_binop_fastmath_flags  s    
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„   r  rX   r   ró   rô   rõ   rö   r÷   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")
            )rC   r   r…   r@   rs   Zsadd_with_overflowZsmul_with_overflowZssub_with_overflowZuadd_with_overflowZumul_with_overflowZusub_with_overflowrQ   r1  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„   r  rp   ró   rô   rõ   zœ            my_block:
                %"d" = sub i32 0, %".1"
                %"e" = xor i32 %".2", -1
                %"f" = fneg double %".3"
            )rC   r   r…   r@   rs   ÚnegÚnot_Úfnegr  r  rQ   ©r   rC   rˆ   rï   rð   r   r   r   r   Útest_unary_ops4  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„   r  rX   r   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )rC   r   r…   r@   rs   rÏ   rÑ   Ú	Undefinedri   rQ   Zreplace_usage)r   rC   rˆ   rï   rð   Zundef1Zundef2r   r   r   r   Útest_replace_operandC  s    
z*TestBuildInstructions.test_replace_operandc              	   C   sR  | 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 5 Q R X |  t¡ | d||d¡ W 5 Q R X |  	|j
¡ |  |d¡ d S )Nr„   r  rX   ú==r   ú!=ró   ú<rô   ú<=rõ   ú>rö   ú>=r÷   rø   r  r  r  r  r  Ú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"
            )rC   r   r…   r@   rs   Úicmp_unsignedÚicmp_signedr¬   r—   r  r  rQ   r1  r   r   r   Útest_integer_comparisonsU  s*    
z.TestBuildInstructions.test_integer_comparisonsc              
   C   sd  | 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ddd d!d"gd# |  |j¡ |  	|d$¡ d S )%Nr„   r  rX   r@  r   rA  ró   rB  rô   rC  rõ   rD  rö   rE  r÷   rø   r  r  r  r  r  ÚordÚurF  ÚvÚwrÕ   ÚoltÚyÚnnanr5  r6  Úarcpr4  r0  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"
            )
rC   r   r…   r@   rs   Úfcmp_orderedÚfcmp_unorderedr  r  rQ   r1  r   r   r   Útest_float_comparisonsz  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„   r  TrX   r   )rR  rQ  r0  z„            my_block:
                %"c" = select arcp nnan i1 true, i32 %".1", i32 %".2"
                unreachable
            )rC   r   rÏ   Úint1r…   r@   rs   Úselectr  r  ZunreachableÚ
assertTruerQ   )r   rC   r  rˆ   rï   rð   r   r   r   Útest_misc_ops§  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„   r  rX   Úb2Zb3Zmy_phir3  r0  zj            my_block:
                %"my_phi" = phi fast i32 [%".1", %"b2"], [%".2", %"b3"]
            )rC   r   r…   r@   rs   rA   Úphir:   Úadd_incomingr  r  rQ   )r   rC   rˆ   rï   rð   Zbb2Zbb3r[  r   r   r   Útest_phi¶  s    
zTestBuildInstructions.test_phic              	   C   sÔ  | 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¡ | ||¡ W 5 Q R X |  t¡ | |¡ W 5 Q R X |  t¡}| ||¡ W 5 Q R X |  	t|jƒd¡ |  |d¡ d S )Nr„   r  rp   r   rž   ró   )rÈ   r>   rô   r   rö   r   )ru   rø   Úseq_cstro   )Úorderingru   r  )r_  ru   r>   z.cannot store i32 to double*: mismatching typesa              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
            )rC   r   r…   r@   rs   Úallocar:   r;   ru   r3   r¼   r<   ÚstorerÞ   ÚloadZstore_atomicZload_atomicr¬   Ú	TypeErrorr!   r+  rQ   )r   rC   rˆ   rï   rð   Úzr   ró   rô   Úeerõ   rö   r÷   rø   r  r  r-  r   r   r   Útest_mem_opsÅ  s@    
ÿ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¡¡ |  |d¡ d S )Nr„   r  rX   r   rm   ró   z            my_block:
                %"c" = alloca i32*
                %"d" = getelementptr i32*, i32** %"c", i32 5, i32 %".1"
            )rC   r   r…   r@   rs   r`  r<   r:   ÚgeprÏ   r3   r¼   rQ   ©r   rC   rˆ   rï   rð   r   ró   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 |¡¡ |  |d	¡ d S )
Nr„   r  rX   ró   c                 S   s   g | ]}t  t|¡‘qS r   ©r   rÏ   r:   ©r   rÕ   r   r   r   r      s     z<TestBuildInstructions.test_gep_castinstr.<locals>.<listcomp>©r   rp   rô   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
            )rC   r   r…   r@   rs   rj   r‹   ÚLiteralStructTyper¢   Úbitcastrg  r3   r¼   r<   rQ   )	r   rC   rˆ   rï   rð   Úint8ptrÚlsró   rô   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¡ |  |d¡ d S )Nr„   r  rX   ro   rñ   ró   c                 S   s   g | ]}t  t|¡‘qS r   rj  rk  r   r   r   r      s     zFTestBuildInstructions.test_gep_castinstr_addrspace.<locals>.<listcomp>rl  rô   zñ            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
            )rC   r   r…   r@   rs   rj   r‹   rm  r¢   rn  rg  r3   r¼   rò   r<   rQ   )
r   rC   rˆ   rï   rð   rò   ro  rp  ró   rô   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	|j
ƒd¡ |  |j
jj|¡ |j|t td¡|gd	d}|  |j
j|¡ |j|t td
¡gdd}|  |j
j|¡ |  |d¡ d S )Nr„   r  rX   ro   rñ   r   zi32 addrspace(4)**rm   ró   rn   rô   zý            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
            )rC   r   r…   r@   rs   r`  r<   r:   r3   r!   r¼   Úpointeerò   rg  rÏ   rQ   )	r   rC   rˆ   rï   rð   rò   r   ró   rô   r   r   r   Útest_gep_addrspace(  s    
z(TestBuildInstructions.test_gep_addrspacec              	   C   sP  | 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 5 Q R X |  t¡ | 
|d¡ W 5 Q R X |  t¡ | 
|d¡ W 5 Q R X |  t¡ | ||d¡ W 5 Q R X |  t¡ | ||d
¡ W 5 Q R X |  |d¡ d S )Nr„   r  rX   ro   Tr   r   ró   Fr   rô   Úptrr  r  r  )r   r   r  )r   r   r  r  r  )r   r   rm   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
            )rC   r   r…   r@   rs   rm  r:   rV  rj   rÏ   Zextract_valueZinsert_valuer3   r¼   r`  rb  r¬   rc  rQ   )r   rC   rˆ   rï   rð   Ztp_innerZtp_outerZc_innerr   ró   rô   Zp_outerr  r  r  r  r  r  r  r   r   r   Útest_extract_insert_value;  sL    

ÿ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¡ |  |d¡ d S )Nr„   r  ro   r   ró   rô   ÚfbÚfcrö   r÷   ÚfdÚferø   r  r  ah              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
            )rC   r   r…   r@   rs   Útruncrj   Úzextr:   ÚsextÚfptruncÚfltÚfpextr;   ÚfptouiÚfptosiÚuitofpÚsitofpÚptrtointÚinttoptrr<   rn  r  r  rQ   )r   rC   rˆ   rï   rð   Úfaru  r   ró   rô   rw  rx  rö   r÷   ry  rz  rø   r  r  r   r   r   Útest_cast_opsx  s"    
z#TestBuildInstructions.test_cast_opsc                 C   sh   | j dd}t |¡}|jjd d… \}}|jtdd}| d||dd¡}|  |j	t¡ |  
|d¡ d S )	Nr„   r  rX   r   ri   Ú	monotonicró   zˆ            my_block:
                %"c" = alloca i32
                %"d" = atomicrmw add i32* %"c", i32 %".1" monotonic
            )rC   r   r…   r@   rs   r`  r:   Z
atomic_rmwr3   r¼   rQ   rh  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„   r  ÚtargetzE            my_block:
                br label %"target"
            )	rC   r   r…   r@   rA   ÚbranchrX  r  rQ   )r   rC   rˆ   Z	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„   r  Úb_trueÚb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )rC   r   r…   r@   rA   ÚcbranchrÏ   rV  rX  r  rQ   )r   rC   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„   r  rŽ  r  Frm   rž   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )rC   r   r…   r@   rA   r  rÏ   rV  Zset_weightsrX  r  rQ   rV   r7   )r   rC   rˆ   r‘  r’  Úbrr   r   r   Útest_cbranch_weights½  s    
z*TestBuildInstructions.test_cbranch_weightsc                 C   sv   | j dd}t |¡}|jjdd}|jjdd}| t |j|¡¡}| |¡ | |¡ |  |j	¡ |  
|d¡ d S )Nr„   r  Zb_1Zb_2z€            my_block:
                indirectbr i8* blockaddress(@"my_func", %"b_1"), [label %"b_1", label %"b_2"]
            )rC   r   r…   r@   rA   Zbranch_indirectZBlockAddressZadd_destinationrX  r  rQ   )r   rC   rˆ   Zbb_1Zbb_2Z
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'   )rX  r  rQ   )rC   Zexpected_irr6   r   r   ÚcheckÝ  s    z1TestBuildInstructions.test_returns.<locals>.checkr„   r  z;            my_block:
                ret void
            Zother_blockrm   z?            other_block:
                ret i32 5
            rw   r   zD            my_block:
                ret void, !dbg !0
            é   zE            my_block:
                ret i32 6, !dbg !0
            )	rC   r   r…   r†   Úretr:   ry   r7   rz   )r   r—  rC   rˆ   r  r   r6   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„   r  rX   ZonzeroZononeZontwoÚ	otherwiser   r   zœ            my_block:
                switch i32 %".1", label %"otherwise" [i32 0, label %"onzero" i32 1, label %"onone" i32 2, label %"ontwo"]
            )rC   r   r…   r@   rs   rA   ÚswitchZadd_caserÏ   r:   rX  r  rQ   )
r   rC   rˆ   rï   rð   Z	bb_onzeroZbb_ononeZbb_ontwoZbb_elseÚswr   r   r   Útest_switch  s    
z!TestBuildInstructions.test_switchc                 C   sz  | 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 |  |d¡ d S )Nr„   r  rX   Trg   rõ   rö   r÷   Úres_fZres_gZres_hZ
res_f_fastÚfastcc)ÚcconvÚres_f_readonlyÚreadonlyZres_fastr4  )ÚfastmathZres_nnan_ninf)rQ  r5  Zres_noinliner”   )ÚattrsZres_alwaysinlinerf   Zres_noinline_ro)r”   r£  a          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
        )rC   r   r…   r@   rs   r9   r  r:   r;   Úhlfr=   r7   rß   rh   ri   rQ   )r   rC   rˆ   rï   rð   Útp_fZtp_gZtp_hrõ   rö   r÷   r¢  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¡ |  |d¡ dS )	z9
        Function calls with metadata arguments.
        r„   r  rp   zllvm.dbg.declarerï   r   z             my_block:
                %"a" = alloca i32
                call void @"llvm.dbg.declare"(metadata i32* %"a", metadata !0, metadata !0)
            N)rC   r   r…   r9   rÞ   ZMetaDataTyper=   r7   r`  r:   rz   rß   rQ   )r   rC   rˆ   Zdbg_declare_tyZdbg_declarerï   rð   r   r   r   Útest_call_metadata;  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 |  |d¡ d S )Nr„   r  Úfunr   ÚsretÚretvalÚotherrž   ©r«  rr   rr   ©r   rX   ©Ú	arg_attrszÆ        my_block:
            %"retval" = alloca i32
            %"other" = alloca i32
            call void @"fun"\(i32\* noalias sret(\(i32\))? %"retval", i32 42, i32\* noalias %"other"\)
        )rC   r   r…   r9   rÞ   r:   r‹   r=   r@   r7   rs   rt   r`  rß   rÏ   rR   )r   rC   rˆ   Úfun_tyrª  r¬  r­  r   r   r   Útest_call_attributesO  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„   r  r   Zmy_funF)ÚtailTr´  ZnotailZ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"()
        )
rC   r   r…   r9   rÞ   r=   r@   r7   rß   rQ   ©r   rC   rˆ   r²  rª  r   r   r   Útest_call_tailg  s    
z$TestBuildInstructions.test_call_tailc              	   C   sb   |   ¡ }t |¡}t t ¡ d¡}t |jj|d¡}|  t	¡ |j
|dddid W 5 Q R X d S )Nr   rª  r   r«  r°  )rC   r   r…   r9   rÞ   r=   r@   r7   r¬   r—   rß   rµ  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„   r  rX   rõ   ÚnormalÚunwindrŸ  z£            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )rC   r   r…   r@   rs   r9   r  r:   r=   r7   rA   ÚinvokerQ   )	r   rC   rˆ   rï   rð   r§  rõ   Ú	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 |  |d¡ d S )Nr„   r  rª  r   r   r«  r¬  r­  r¸  r¹  rž   r4  r”   r®  rr   r¯  )r¡  r¤  r¥  r±  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"
        )rC   r   r…   r9   rÞ   r:   r‹   r=   r@   r7   Zcalling_conventionrs   rt   r`  rA   rº  rÏ   rR   )	r   rC   rˆ   r²  rª  r¬  r­  r»  r¼  r   r   r   Útest_invoke_attributesš  s4    
 ÿþø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¡¡¡ | |¡ |  |d¡ d S )Nr„   r  ÚlpZ_ZTIiTr   zÖ            my_block:
                %"lp" = landingpad {i32, i8*}
                    catch i8** @"_ZTIi"
                    filter [1 x i8**] [i8** @"_ZTIi"]
                resume {i32, i8*} %"lp"
            )rC   r   r…   Z
landingpadrm  r:   rj   r‹   rÍ   r@   r7   rù   Z
add_clauseZCatchClauseZFilterClauserÏ   Ú	ArrayTyper¼   ÚresumerQ   )r   rC   rˆ   r¿  Z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„   r  rX   rD  r   z…            my_block:
                %"c" = icmp sgt i32 %".1", %".2"
                call void @"llvm.assume"(i1 %"c")
            )rC   r   r…   r@   rs   rI  rŽ   rQ   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 )NZinsert_blockr  rX   rï   rð   r   r   Zvec1r   Z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
            Zshuffle_blockZshufzŽ            shuffle_block:
                %"shuf" = shufflevector <2 x i32> %"vec2", <2 x i32> %"vec2", <2 x i32> <i32 1, i32 0>
            Z	add_blockÚsumz[            add_block:
                %"sum" = add <2 x i32> %"vec2", %"vec2"
            Zextract_blockZex1Zex2z¥            extract_block:
              %"ex1" = extractelement <2 x i32> %"vec2", i32 0
              %"ex2" = extractelement <2 x i32> %"vec2", i32 1
            )rC   r   r…   r@   rs   r>   Ú
VectorTyper¼   rÏ   r>  rÑ   Zinsert_elementrQ   rA   rŒ  Úposition_at_endZshuffle_vectorri   Zextract_elementr™  r+   r7   )r   rC   rˆ   rï   rð   ÚvectyÚvecZidxtyÚmaskr   ró   r   r   r   Útest_vector_opsÛ  s<    










z%TestBuildInstructions.test_vector_opsc                 C   sJ   | j dd}t |¡}t td¡}|j|dd}| |¡ |  |d¡ d S )Nr„   r  rm   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )rC   r   r…   rÏ   r¢   Ú
bitreverser™  rQ   ©r   rC   rˆ   rï   r   r   r   r   Útest_bitreverse  s    

z%TestBuildInstructions.test_bitreversec              	   C   s\   | j dd}t |¡}t td¡}|  t¡}|j|dd W 5 Q R X |  dt	|j
ƒ¡ d S )Nr„   r  rm   r   ú#expected an integer type, got float)rC   r   r…   rÏ   r  r¬   rc  rË  r#   r!   r+  ©r   rC   rˆ   rï   Úraisesr   r   r   Útest_bitreverse_wrongtype!  s    
þz/TestBuildInstructions.test_bitreverse_wrongtypec              	   C   sÄ   | j dd}t |¡}|  t¡}| dd ¡ W 5 Q R X |  dt|jƒ¡ |  t¡}| d d¡ W 5 Q R X |  dt|jƒ¡ | dd ¡ | dd¡ | d	d¡ | d
¡ | 	¡  |  
|d¡ d S )Nr„   r  r‰  z#Invalid fence ordering "monotonic"!zInvalid fence ordering "None"!ÚacquireÚreleaseZsinglethreadZacq_relr^  zç            my_block:
                fence acquire
                fence syncscope("singlethread") release
                fence syncscope("singlethread") acq_rel
                fence seq_cst
                ret void
            )rC   r   r…   r¬   r—   Zfencer#   r!   r+  r†   rQ   )r   rC   rˆ   rÐ  r   r   r   Ú
test_fence,  s(    
þþ
z TestBuildInstructions.test_fencec              	   C   sX   | j dd}t |¡}|  t¡ | d¡ W 5 Q R X | d¡ | ¡  |  |d¡ d S )Nr„   r  zso
many linesz
my commentzX            my_block:
                ; my comment
                ret void
            )rC   r   r…   r¬   ÚAssertionErrorÚcommentr†   rQ   ©r   rC   rˆ   r   r   r   Útest_commentG  s    

z"TestBuildInstructions.test_commentc                 C   sJ   | j dd}t |¡}t td¡}|j|dd}| |¡ |  |d¡ d S )Nr„   r  rm   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )rC   r   r…   rÏ   r:   Zbswapr™  rQ   rÌ  r   r   r   Ú
test_bswapT  s    

z TestBuildInstructions.test_bswapc                 C   sJ   | j dd}t |¡}t td¡}|j|dd}| |¡ |  |d¡ d S )Nr„   r  rm   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )rC   r   r…   rÏ   Úint16Zctpopr™  rQ   rÌ  r   r   r   Ú
test_ctpop`  s    

z TestBuildInstructions.test_ctpopc                 C   sX   | j dd}t |¡}t td¡}t td¡}|j||dd}| |¡ |  |d¡ d S )Nr„   r  rm   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	rC   r   r…   rÏ   rÚ  rV  Zctlzr™  rQ   r<  r   r   r   Ú	test_ctlzl  s    

zTestBuildInstructions.test_ctlzc                 C   sJ   | j dd}t |¡}t td¡}|j|dd}| |¡ |  |d¡ d S )Nr„   r  g      @rð   z•            my_block:
                %"b" = call i16 @"llvm.convert.to.fp16.f32"(float 0x4014000000000000)
                ret i16 %"b"
            )rC   r   r…   rÏ   r  Úconvert_to_fp16r™  rQ   r1  r   r   r   Útest_convert_to_fp16_f32y  s    

z.TestBuildInstructions.test_convert_to_fp16_f32c              	   C   s\   | j dd}t |¡}t td¡}|  t¡}|j|dd W 5 Q R X |  dt	|j
ƒ¡ d S )Nr„   r  rm   rð   úexpected a float type, got i16)rC   r   r…   rÏ   rÚ  r¬   rc  rÝ  r#   r!   r+  rÏ  r   r   r   Ú"test_convert_to_fp16_f32_wrongtype…  s    
þz8TestBuildInstructions.test_convert_to_fp16_f32_wrongtypec                 C   sL   | j dd}t |¡}t td¡}|j|dtd}| |¡ |  |d¡ d S )Nr„   r  rm   rð   ©r>   Útozˆ            my_block:
                %"b" = call float @"llvm.convert.from.fp16.f32"(i16 5)
                ret float %"b"
            )	rC   r   r…   rÏ   rÚ  Úconvert_from_fp16r  r™  rQ   r1  r   r   r   Útest_convert_from_fp16_f32  s    

z0TestBuildInstructions.test_convert_from_fp16_f32c              	   C   s\   | j dd}t |¡}t td¡}|  t¡}|j|dd W 5 Q R X |  dt	|j
ƒ¡ d S )Nr„   r  ç      @rð   zexpected a float return type©rC   r   r…   rÏ   r  r¬   rc  rã  r#   r!   r+  rÏ  r   r   r   Ú!test_convert_from_fp16_f32_notypeœ  s    
þz7TestBuildInstructions.test_convert_from_fp16_f32_notypec              	   C   s^   | j dd}t |¡}t td¡}|  t¡}|j|dtd W 5 Q R X |  dt	|j
ƒ¡ d S )Nr„   r  rå  rð   rá  zexpected an i16 type, got floatræ  rÏ  r   r   r   Ú$test_convert_from_fp16_f32_wrongtype§  s    
þz:TestBuildInstructions.test_convert_from_fp16_f32_wrongtypec              	   C   s^   | j dd}t |¡}t td¡}|  t¡}|j|dtd W 5 Q R X |  	dt
|jƒ¡ d S )Nr„   r  rå  rð   rá  rß  )rC   r   r…   rÏ   r  r¬   rc  rã  rÚ  r#   r!   r+  rÏ  r   r   r   Ú%test_convert_from_fp16_f32_wrongtype2²  s    
þz;TestBuildInstructions.test_convert_from_fp16_f32_wrongtype2c                 C   sX   | j dd}t |¡}t td¡}t td¡}|j||dd}| |¡ |  |d¡ d S )Nr„   r  rm   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	rC   r   r…   rÏ   r¢   rV  Úcttzr™  rQ   r<  r   r   r   Ú	test_cttz½  s    

zTestBuildInstructions.test_cttzc              	   C   sj   | j dd}t |¡}t td¡}t td¡}|  t¡}|j||dd W 5 Q R X |  	dt
|jƒ¡ d S )Nr„   r  rm   rp   r   zexpected an i1 type, got i32)rC   r   r…   rÏ   r¢   r:   r¬   rc  rê  r#   r!   r+  ©r   rC   rˆ   rï   rð   rÐ  r   r   r   Útest_cttz_wrongflagÊ  s    
þz)TestBuildInstructions.test_cttz_wrongflagc              	   C   sj   | j dd}t |¡}t td¡}t td¡}|  t¡}|j||dd W 5 Q R X |  	dt
|jƒ¡ d S )Nr„   r  rm   r   r   rÎ  )rC   r   r…   rÏ   r  rV  r¬   rc  rê  r#   r!   r+  rì  r   r   r   Útest_cttz_wrongtypeÖ  s    
þ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„   r  rm   r   rX   ÚfmazÅ            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )rC   r   r…   rÏ   r  rï  r™  rQ   )r   rC   rˆ   rï   rð   r   rï  r   r   r   Útest_fmaâ  s    

zTestBuildInstructions.test_fmac              	   C   sx   | j dd}t |¡}t td¡}t td¡}t td¡}|  t¡}|j|||dd W 5 Q R X |  dt	|j
ƒ¡ d S )Nr„   r  rm   r   rX   rï  z(expected an floating point type, got i32)rC   r   r…   rÏ   r:   r¬   rc  rï  r#   r!   r+  ©r   rC   rˆ   rï   rð   r   rÐ  r   r   r   Útest_fma_wrongtypeð  s    
þz(TestBuildInstructions.test_fma_wrongtypec              	   C   sx   | j dd}t |¡}t td¡}t td¡}t td¡}|  t¡}|j|||dd W 5 Q R X |  	dt
|jƒ¡ d S )Nr„   r  rm   r   rX   rï  z7expected types to be the same, got float, double, float)rC   r   r…   rÏ   r  r;   r¬   rc  rï  r#   r!   r+  rñ  r   r   r   Útest_fma_mixedtypesý  s    
þ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   rÄ  r  r   r   rB  )r   r9   rÑ   r‹   r5   r=   rA   r…   rÆ  rŒ  r[  r\  rÏ   r¼   rs   rt   rg  rb  ri   rH  r  r™  r!   )Ú	attr_namer?   r7   rB   Zbb_entryZbb_loopZbb_exitrˆ   ÚindexÚaccumru  ÚvalueÚaddedZindexp1Úcondr   r   r   Úgen_code  s8    ÿ





z;TestBuildInstructions.test_arg_attributes.<locals>.gen_code)ZbyrefZbyvalZelementtypeZimmargZinallocaZinregÚnestrr   Z	nocaptureZnofreerq   ZnoundefZpreallocatedÚreturnedZsignextZ
swiftasyncZ
swifterrorZ	swiftselfrl   )r(   r)   )r   rú  rô  r   r   r   Útest_arg_attributes
  s    (z)TestBuildInstructions.test_arg_attributesN)<r]   r^   r_   r`   ZmaxDiffr  r.  r2  r7  r8  r=  r?  rJ  rU  rY  r]  rf  ri  rq  rr  rt  rv  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Ü  rÞ  rà  rä  rç  rè  ré  rë  rí  rî  rð  rò  ró  rý  r   r   r   r   r  ½  sr   1%-1=!($	!:r  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þ   r  )
rC   r   r…   r1   r@   r   ÚassertIsInstancer=   r7   r5   r×  r   r   r   r  R  s    
zTestBuilderMisc.test_attributesc              
   C   sð   | j dd}t |¡}|jjd d… \}}| ||d¡ |jdd}| |¡N | ||d¡ | 	¡  | 
||d¡ W 5 Q R X | ||d¡ | |¡ W 5 Q R X | ||d	¡ | |¡ | ||d
¡ W 5 Q R X |  |d¡ |  |d¡ d S )Nr„   r  rX   r   r©   ró   rô   rõ   rö   r÷   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"
            )rC   r   r…   r@   rs   ri   rA   Z
goto_blockr  Zgoto_entry_blockr   r  rŒ  r
  r  rQ   )r   rC   rˆ   rï   rð   Zbb_newr   r   r   Útest_goto_blockZ  s     

zTestBuilderMisc.test_goto_blockc              	   C   s°   | j dd}t |¡}t td¡}| ||d¡}| |¡}| ||d¡ W 5 Q R X |  |j |¡ | ||d¡}| |¡ | ||d¡ | |¡ W 5 Q R X |  	|j
d¡ d S )	NÚoner  r   rï   rð   r   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 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:
            )rC   r   r…   rÏ   rV  ri   Úif_thenr1   rŒ  r\   r@   )r   rC   rˆ   rd  rï   Zbbendr   r   r   r   Útest_if_thenw  s    
zTestBuilderMisc.test_if_thenc              
   C   s’   | j dd}t |¡}t td¡}| ||d¡}| |¡8 | ||d¡}| |¡ | ||d¡ W 5 Q R X W 5 Q R X | ¡  |  |j	d¡ d S )Nr  r  r   rï   rð   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"
            )
rC   r   r…   rÏ   rV  ri   r  r†   r\   r@   )r   rC   rˆ   rd  rï   rð   r   r   r   Útest_if_then_nested•  s    
"z#TestBuilderMisc.test_if_then_nestedc              
   C   s¬   d}| j |d}t |¡}t td¡}| ||d¡}| |¡8 | ||d¡}| |¡ | ||d¡ W 5 Q R X W 5 Q R X | ¡  |  |j	dj
||d d… d	 d
¡ d S )NZPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongr  r   rï   rð   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)rC   r   r…   rÏ   rV  ri   r  r†   r\   r@   r‡   )r   r  rC   rˆ   rd  rï   rð   r   r   r   Útest_if_then_long_label°  s    
" òz'TestBuilderMisc.test_if_then_long_labelc                    s<   ‡ fdd„}|dƒ}ˆ   |jd¡ |dƒ}ˆ   |jd¡ d S )Nc              	      sL   ˆ j dd}t |¡}t td¡}|j|| d W 5 Q R X ˆ  |d¡ |S )Nr  r  r   ©Úlikelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )rC   r   r…   rÏ   rV  r  rQ   )r
  rC   rˆ   rd  r6   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 }
            ©rV   r7   ©r   r—  rˆ   r   r6   r   Útest_if_then_likelyË  s
    z#TestBuilderMisc.test_if_then_likelyc              
   C   sä   | j dd}t |¡}t td¡}| ||d¡}| |¡F\}}| | ||d¡ W 5 Q R X | | ||d¡ W 5 Q R X W 5 Q R X | |¡<\}}| | |¡ W 5 Q R X | | ¡  W 5 Q R X W 5 Q R X |  	|j
d¡ d S )Nr  r  r   rï   rð   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:
            )rC   r   r…   rÏ   rV  ri   Úif_elserŒ  r†   r\   r@   )r   rC   rˆ   rd  rï   Úthenr›  r   r   r   Útest_if_elseà  s    
"zTestBuilderMisc.test_if_elsec                    s<   ‡ fdd„}|dƒ}ˆ   |jd¡ |dƒ}ˆ   |jd¡ d S )Nc              
      s„   ˆ j dd}t |¡}t td¡}|j|| d<\}}| | |¡ W 5 Q R X | | ¡  W 5 Q R X W 5 Q R X ˆ  |j	d¡ |S )Nr  r  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:
                )
rC   r   r…   rÏ   rV  r  rŒ  r†   r\   r@   )r
  rC   rˆ   rd  r  r›  r6   r   r   r—    s    
	z2TestBuilderMisc.test_if_else_likely.<locals>.checkTr  Fr  r  r  r   r6   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  r  ÚtwoÚthreerï   r  r  r  r  rð   r  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)r@   r   r…   rÏ   r:   rA   Zposition_at_startri   rÆ  Zposition_afterZposition_beforerQ   )	r   rB   rˆ   rd  Zbb_oneZbb_twoZbb_threer  rð   r   r   r   Útest_positioning!  s.    





z TestBuilderMisc.test_positioningc           	      C   s´   |   ¡ }t ¡ }|jdd}| |¡ t td¡}| ||d¡}| ¡ }|  	|j
¡ | |¡ |  |j
¡ | ||d¡}| ||d¡}| |¡ | ¡  |  	|j
¡ |  |d¡ d S )NÚentryr  iÒ  rï   rð   r   zˆ            entry:
                %"a" = add i32 1234, 1234
                %"b" = mul i32 %"a", %"a"
                ret void
        )r@   r   r…   rA   rÆ  rÏ   r:   ri   r†   rX  r  Úremover  r
  rQ   )	r   rB   rˆ   Zblkr  rï   Zretvoidrð   r   r   r   r   Útest_instruction_removalQ  s     


z(TestBuilderMisc.test_instruction_removalc                 C   sH   | j dd}t |¡}|j g ¡|_|jt t¡dd |  	|d¡ d S )Nr„   r  r   zN            my_block:
                %"c" = alloca i32*, !dbg !0
            )
rC   r   r…   r7   rz   Zdebug_metadatar`  r<   r:   rQ   r×  r   r   r   Útest_metadatah  s
    
zTestBuilderMisc.test_metadataN)r]   r^   r_   r`   r  r   r  r  r  r  r  r  r  r  r  r   r   r   r   rþ  M  s   $0rþ  c                   @   sl   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S )Ú	TestTypesc                 C   s"   t |tjƒr|j}q t |tjƒ S r'   )Ú
isinstancer   r<   rs  Ú	LabelType)r   Útyr   r   r   Úhas_logical_equalityu  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
        Trg   rm   ro   ZMyType1Z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Þ   r9   rV  rj   r:   r  r;   rÀ  rm  Úget_identified_type)r   Úcontextrµ   r   r   r   Úassorted_typesz  s0          
 
 
 ÿözTestTypes.assorted_typesc                 C   s6   |   ¡ }|D ]$}|  |¡}|  |¡r|  ||¡ qd S r'   )r$  r4   r  r3   )r   rµ   r  Znewtyr   r   r   r’   ‘  s
    

zTestTypes.test_picklingc                 C   sÂ   |   ¡ }t ||¡D ]8\}}||k	r|  ||k||f¡ |  ||k||f¡ q|D ]j}t |¡}|  |¡r”|  ||k||f¡ |  ||k||f¡ qR|  ||k||f¡ |  ||k||f¡ qRd S r'   )r$  Ú	itertoolsÚproductr  rX  Úcopyr  )r   rµ   rï   rð   r   r­  r   r   r   Útest_comparisons˜  s    

zTestTypes.test_comparisonsc              
   C   sx  |   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t 	t
¡ƒd¡ |   tt 	t 	t
¡¡ƒd¡ |   tt td¡ƒd¡ |   tt t 	t¡d¡ƒd¡ |   tt 	t td¡¡ƒd¡ |   tt tf¡ƒd¡ |   tt ttf¡ƒd¡ |   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é   Zi29rÇ   ÚdoubleÚvoidr   zi1 ()z
i1 (float)zi1 (float, double)Trg   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)zi32*zi32**rm   z[5 x i1]z	[5 x i1*]z	[5 x i1]*z{i1}z{i1, float}z{i1*, {i32, i8}})Úpackedz<{i1}>z<{i1, float}>ÚMyTypez	%"MyType"zMyType\z%"MyType\5c"zMyType"z%"MyType\22"N)r3   r!   rV  r   rÑ   r  r;   rÞ   r9   r<   r:   rÀ  rm  rj   r!  r"  )r   r#  ÚmytypeZmytype1Zmytype2r   r   r   Útest_str¨  sb    ÿÿÿÿÿÿ
 ÿþÿÿ


zTestTypes.test_strc                 C   s4   t | j|  ¡ ƒD ]}|  t|ƒtt |¡ƒ¡ qd S r'   )Úfilterr  r$  r3   Ú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ƒ qX||ƒ t  tt  ttf¡f¡}||dtƒ ||dt  ttf¡ƒ ˆ  t	¡ | 
t  td	¡¡ W 5 Q R X ||ƒ t  ¡ }t  |d
¡}| tt  ttf¡¡ ||dtƒ ||dt  ttf¡ƒ ˆ  t	¡ | 
t  td	¡¡ W 5 Q R X ||ƒ d S )Nc                    s"   |   t t|¡¡}ˆ  ||¡ d S r'   )rg  r   rÏ   r:   r3   )r   rø   rM   rT   r6   r   r   Úcheck_constantÚ  s    z*TestTypes.test_gep.<locals>.check_constantc              	      s0   t  td¡}ˆ  t¡ |  |¡ W 5 Q R X d S )Ng      ð?)r   rÏ   r;   r¬   rc  rg  )r   rõ  r6   r   r   Úcheck_index_typeÞ  s    z,TestTypes.test_gep.<locals>.check_index_typerm   rp   r   r   rX   r.  )r   r<   r;   ÚrangerÀ  rV  rm  rj   r¬   Ú
IndexErrorrg  rÏ   r:   r!  ZIdentifiedStructTypeÚset_body)r   r5  r6  r   rø   r#  r   r6   r   ri  Ù  s0    
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                    s   ˆ   |  ˆ¡|¡ d S r'   )r3   Úget_abi_size©r   rM   ©r   Útdr   r   r—   	  s    z&TestTypes.test_abi_size.<locals>.checkr   ro   r   rm   é   r   ©
r(   Úcreate_target_datarj   r:   r¢   r   rÀ  rm  r;   r  ©r   r—  r   r=  r   Útest_abi_sizeý  s    



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 )Nr:  c                    s   ˆ   |  ˆ¡|¡ d S r'   )r#   Zget_abi_alignmentr<  r=  r   r   r—  	  s    z+TestTypes.test_abi_alignment.<locals>.check)r   rX   ro   )ro   )r   rm   r@  rB  r   r=  r   Útest_abi_alignment		  s    



zTestTypes.test_abi_alignmentc                 C   s„   t  ¡ }| d¡}t j|d}|  |j¡ |  |¡ t|ƒ}| t  	d¡t  	d¡t  
¡ ¡ |  |j¡ |  |¡ |  |t|ƒ¡ d S )Nr.  ©r#  r   r	   )r   r!  r"  r5   rX  Z	is_opaquer+   r!   r9  rÑ   rÎ   r  ÚassertNotEqual)r   r#  r/  r7   Zoldstrr   r   r   Útest_identified_struct	  s    


z TestTypes.test_identified_structc                 C   sD   t  ¡ }| d¡}t  d¡g|_t d¡}|  |j||dd¡ d S )Nr.  r   r:  rE  ro   )	r   r!  r"  rÑ   Úelementsr(   rA  r3   r;  )r   r#  r/  r>  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   rÅ  rÑ   r3   r!   )r   rÇ  r   r   r   Útest_vector(	  s    zTestTypes.test_vectorN)r]   r^   r_   r  r$  r’   r(  r0  r4  ri  rC  rD  rG  rI  rJ  r   r   r   r   r  s  s   -$r  c                 C   s   t  t| ¡S r'   rj  )rø   r   r   r   Úc32-	  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#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:   r3   r!   rV  r>  ©r   r   r   r   r   Útest_integers3	  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  r3   r!   r;   r>  rN  r   r   r   Ú
test_realsC	  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 5 Q R X |  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 5 Q R X d S )Nrp   rm   r˜  ro   z[3 x i32] [i32 5, i32 6, i32 4]rX   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]rP  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])rm   r˜  )r   rÏ   rÀ  r:   rK  r3   r!   r>  Zliteral_arrayr¬   rc  r  r+  rj   Ú	bytearrayr—   )r   r   rÐ  r   r   r   Útest_arraysR	  s.    &" &ÿzTestConstant.test_arraysc                 C   s^   t  t  d¡d¡}dddddddd	g}t  ||¡}d
 d tdj|ƒ¡¡}|  t|ƒ|¡ d S )Nr   r   r   rX   ro   rp   r˜  é	   é   z<8 x i32> <{}>z, zi32 {})	r   rÅ  rÑ   rÏ   r‡   r   r   r3   r!   )r   rÇ  ÚvalsrÈ  Zvec_reprr   r   r   rJ  o	  s    ÿzTestConstant.test_vectorc                 C   s$   t  t  d¡d ¡j}|  |d¡ d S )Nr   r   )r   rÏ   rÑ   Úconstantr3   )r   rW  r   r   r   Útest_non_nullable_intw	  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 5 Q R X d S )NrP  Tú/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializer©rP  Trž   úL{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}}©rž   rZ  )ro   rm   r˜  )r   rm  r  rV  r:   rÏ   rÎ   r3   r!   Zliteral_structr¼   r>  r¬   r—   )r   Úst1Úst2r   Úc1Úc2Úc3r   r   r   Útest_structs{	  sH    
ÿ
ÿ
ÿ
ÿÿ
ÿ
ÿzTestConstant.test_structsc                 C   s0   t  d¡}t  t  ||g¡t j¡}|  |¡ d S )Nr   )r   rÑ   rÏ   rm  r>  r4   )r   Úi8Ústr   r   r   Ú&test_undefined_literal_struct_pickling	  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	¡ |dddgƒ}|  t|ƒd	¡ |d
ƒ}|  t|ƒd¡ |  
t¡ |ddddgƒ W 5 Q R X 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 42TrM  rp   ro   rm   r˜  z[3 x i32] [i32 4, i32 5, i32 6]Nz[3 x i32] zeroinitializerrU  rZ  rY  r\  r[  )rj   rÿ  r   rÏ   r3   r!   rV  rÀ  r:   rK  r¬   r—   rm  r  )r   r   Úatr]  r^  r   r   r   Útest_type_instantiaton¢	  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:   r3   rë   rN  r   r   r   r  À	  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Ï   rÀ  rÑ   rR  r7  r7   rÍ   r¼   rù   rÐ   r(   r)   r!   r3   )r   r   r  ÚgvÚparsedZ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|ƒd¡ |  |j	t 
t¡¡ t |d ¡}|  t¡ | t td¡g¡ W 5 Q R X t | ¡ d ¡}| t td¡g¡}|  t|ƒd¡ |  |j	t 
t¡¡ d S )Nri  c                 S   s   g | ]}t  t|¡‘qS r   rj  rk  r   r   r   r    Ú	  s     z)TestConstant.test_gep.<locals>.<listcomp>©r   r   zEgetelementptr ({float, i1}, {float, i1}* @"myconstant", i32 0, i32 1)r   z5getelementptr ({float, i1}, {float, i1}* null, i32 0))r7   r   rm  r  rV  rÍ   rg  r3   r!   r¼   r<   rÏ   r¬   rc  r:   r‹   )r   r  r   rj  r   ÚconstZ	const_ptrr`  r   r   r   ri  Ö	  s"    
ÿ
ÿzTestConstant.test_gepc                 C   sŠ   |   ¡ }t ttf¡}d}tj||d|d}|  |j|¡ | dd„ dD ƒ¡}|  |j	j|¡ |  t
|ƒd¡ |  |j	tjt|d¡ d S )Nro   ri  rñ   c                 S   s   g | ]}t  t|¡‘qS r   rj  rk  r   r   r   r    ð	  s     z=TestConstant.test_gep_addrspace_globalvar.<locals>.<listcomp>rm  zRgetelementptr ({float, i1}, {float, i1} addrspace(4)* @"myconstant", i32 0, i32 1))r7   r   rm  r  rV  rÍ   r3   rò   rg  r¼   r!   r<   )r   r  r   rò   rj  r   r   r   r   Útest_gep_addrspace_globalvaré	  s    
ÿz)TestConstant.test_gep_addrspace_globalvarc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   ztrunc (i64 1 to i32))r   rÏ   r¢   r{  r:   r3   r!   rN  r   r   r   Ú
test_trunc÷	  s    zTestConstant.test_truncc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   zzext (i32 1 to i64))r   rÏ   r:   r|  r¢   r3   r!   rN  r   r   r   Ú	test_zextû	  s    zTestConstant.test_zextc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr,   zsext (i32 -1 to i64))r   rÏ   r:   r}  r¢   r3   r!   rN  r   r   r   Ú	test_sextÿ	  s    zTestConstant.test_sextc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   z*fptrunc (float 0x3ff0000000000000 to half))r   rÏ   r  r~  r¦  r3   r!   rN  r   r   r   Útest_fptrunc
  s    zTestConstant.test_fptruncc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   z*fpext (float 0x3ff0000000000000 to double))r   rÏ   r  r€  r;   r3   r!   rN  r   r   r   Ú
test_fpext
  s    zTestConstant.test_fpextc                 C   s8   |   ¡ }t |td¡}| t ¡ ¡}|  t|ƒd¡ d S )Nri  z$bitcast (i32* @"myconstant" to i64*))	r7   r   rÍ   r:   rn  r¢   r‹   r3   r!   )r   r  rj  r   r   r   r   Útest_bitcast
  s    zTestConstant.test_bitcastc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   z(fptoui (float 0x3ff0000000000000 to i32))r   rÏ   r  r  r:   r3   r!   rN  r   r   r   Útest_fptoui
  s    zTestConstant.test_fptouic                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   zuitofp (i32 1 to float))r   rÏ   r:   rƒ  r  r3   r!   rN  r   r   r   Útest_uitofp
  s    zTestConstant.test_uitofpc                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   z(fptosi (float 0x3ff0000000000000 to i32))r   rÏ   r  r‚  r:   r3   r!   rN  r   r   r   Útest_fptosi
  s    zTestConstant.test_fptosic                 C   s&   t  td¡ t¡}|  t|ƒd¡ d S )Nr   zsitofp (i32 1 to float))r   rÏ   r:   r„  r  r3   r!   rN  r   r   r   Útest_sitofp
  s    zTestConstant.test_sitofpc                 C   sZ   t  t ¡ d ¡}t  td¡}| t¡}|  t|jt¡ |  t|jt¡ |  	t
|ƒd¡ d S )Nr   zptrtoint (i64* null to i32))r   rÏ   r¢   r‹   r:   r…  r¬   rc  r  r3   r!   )r   ru  r  r   r   r   r   Útest_ptrtoint_1!
  s    
zTestConstant.test_ptrtoint_1c                 C   sh   |   ¡ }t |td¡}| t¡}|  t|ƒd¡ |  t	d|jt 
¡ ¡ t td¡}|  t	d|jt¡ d S )Nri  z$ptrtoint (i32* @"myconstant" to i64)z2can only ptrtoint\(\) to integer type, not 'i64\*'r   z5can only call ptrtoint\(\) on pointer type, not 'i32')r7   r   rÍ   r:   r…  r¢   r3   r!   r–   rc  r‹   rÏ   )r   r  rj  r   r`  r   r   r   Útest_ptrtoint_2*
  s"    
üüzTestConstant.test_ptrtoint_2c                 C   s^   t  td¡}t  td¡}| t ¡ ¡}|  t|jt¡ |  t|jt ¡ ¡ |  	t
|ƒd¡ d S )Nr   g…ëQ¸	@zinttoptr (i32 1 to i64*))r   rÏ   r:   r  r†  r¢   r‹   r¬   rc  r3   r!   )r   r  Úpir   r   r   r   Útest_inttoptr=
  s    zTestConstant.test_inttoptrc                 C   s$   t  td¡}|  t| ¡ ƒd¡ d S )Nr   zsub (i32 0, i32 1))r   rÏ   r:   r3   r!   r9  ©r   r  r   r   r   Útest_negF
  s    zTestConstant.test_negc                 C   s$   t  td¡}|  t| ¡ ƒd¡ d S )Nr   zxor (i32 1, i32 -1))r   rÏ   r:   r3   r!   r:  r~  r   r   r   Útest_notJ
  s    zTestConstant.test_notc                 C   s$   t  td¡}|  t| ¡ ƒd¡ d S )Nr   zfneg (float 0x3ff0000000000000))r   rÏ   r  r3   r!   r;  r~  r   r   r   Ú	test_fnegN
  s    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 ¡ qrdddddddœ}| ¡ D ]0\}}t| ||¡ƒ}d| d }	|  ||	¡ q®dddddddœ}| ¡ D ]0\}}t| ||¡ƒ}d| d }	|  ||	¡ qúd S )Nr   rX   r(  r*  r)  ri   r   r
  r   r	  r"  r#  ÚorÚandr'  z (i32 1, i32 2)ÚeqÚneÚugtÚugeÚultÚule©r@  rA  rD  rE  rB  rC  zicmp ZsgtZsgeZsltZsle)r   rÏ   r:   r(  r*  r)  ri   r   r
  r   r	  r"  r#  r%  r&  r'  Úitemsr3   r!   rH  rI  )
r   r  r  Úoracler‘   ÚiropÚcoprù  rT   rM   r   r   r   Útest_int_binopsR
  s\                    ü   ÿ   ÿ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 }|  
||¡ qBd	d
dddddœ}| ¡ D ]0\}}	t	| ||¡ƒ}d|	 d }|  
||¡ q†dddddddœ}| ¡ D ]0\}}	t	| ||¡ƒ}d|	 d }|  
||¡ qÒd S )Nr   rX   r  r  r  r!  r$  z5 (float 0x3ff0000000000000, float 0x4000000000000000)Zoeqr  ZogtZogerO  ZolerŠ  zfcmp ZueqZuner†  r‡  rˆ  r‰  )r   rÏ   r  r  r  r  r!  r$  r‹  r!   r3   rS  rT  )
r   r  r  rŒ  r‘   r  rT   rM   rŽ  rù  r   r   r   Útest_flt_binopsn
  s8       ÿ ÿ ÿzTestConstant.test_flt_binopsN)!r]   r^   r_   rO  rQ  rS  rJ  rX  rb  re  rg  r  rl  ri  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r}  r  r€  r  r  r  r   r   r   r   rL  1	  s<   "		rL  c                   @   s   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   r5   r=   r9   rÞ   r…   rÆ  rA   rß   r3   ZcalleeZreplace_all_callsr#   rF  )r   r$   r©   rª   rˆ   rß   Úmodifiedr   r   r   Útest_call_transformŽ
  s    z"TestTransforms.test_call_transformN)r]   r^   r_   r“  r   r   r   r   r‘  
  s   r‘  c                   @   s   e Zd Zdd„ ZdS )ÚTestSingletonc                 C   sP   |   tjtj ¡ ¡ |   tjt tj¡¡ |   tjt tj¡¡ |  tj¡ d S r'   )r1   r   r>  ÚvaluesZ
_Undefinedr'  Údeepcopyr4   r6   r   r   r   Útest_undefined
  s    zTestSingleton.test_undefinedN)r]   r^   r_   r—  r   r   r   r   r”  œ
  s   r”  Ú__main__)'r`   r'  r%  r.   r   rG   Zunittestr   r   Zllvmliter   r   r(   rÑ   rV  rj   rÚ  r:   r¢   ZHalfTyper¦  rÎ   r  rê   r;   r
   ra   rœ   rè   rý   r  rþ  r  rK  rL  r‘  r”  r]   Úmainr   r   r   r   Ú<module>   s`   




^ 4  L-           ( ;  ^
