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