B
    Ꮚ\C                @   s  d Z ddlmZm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
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jd dk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 )&z
IR Construction Tests
    )print_functionabsolute_importN   )TestCase)ir)binding          @      c               @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zd!ddZ	d"ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd  Zd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   5lib/python3.7/site-packages/llvmlite/tests/test_ir.pyescape+   s    z%TestBase.assertInText.<locals>.escape z\s+z\\s*N)joinmapresubZassertRegexpMatches)selfpatterntextr   Z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>5   s    z+TestBase.assert_ir_line.<locals>.<listcomp>)str
splitlinesassertIn)r   r    modlinesr   r   r   assert_ir_line4   s    zTestBase.assert_ir_linec             C   s   t t| d S )N)llvmparse_assemblyr"   )r   r%   r   r   r   assert_valid_ir8   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
        )Zprotocol)pickleloadsdumpsassertIs	__class__assertEqualr"   )r   ZirobjectZ	newobjectr   r   r   assert_pickle_correctly;   s    z TestBase.assert_pickle_correctlyc             C   s   t  S )N)r   Module)r   r   r   r   moduleD   s    zTestBase.moduleNmy_funcc          	   C   s8   |p
|   }tttttttf}t|   ||S )N)r4   r   FunctionTypeint32dblPointerTypeFunction)r   r4   nameZfntyr   r   r   functionG   s    zTestBase.functionr   c             C   s   |p
|   }||S )N)r<   append_basic_block)r   funcr;   r   r   r   blockL   s    zTestBase.blockc             C   s   g }| | d|S )Nr   )descrr   )r   thingZbufr   r   r   r@   P   s    
zTestBase.descrc             C   s   t |}|dd}|S )Nz
    z
  )textwrapdedentreplace)r   asmr   r   r   _normalize_asmU   s    
zTestBase._normalize_asmc             C   s   |  |}| || d S )N)rF   r1   )r   r@   rE   expectedr   r   r   check_descr[   s    
zTestBase.check_descrc             C   s   |  | || d S )N)rH   r@   )r   r?   rE   r   r   r   check_block_   s    zTestBase.check_blockc             C   s*   |  |}| }| | |  d S )N)rF   Z_stringify_bodyr1   r   )r   r4   rE   rG   actualr   r   r   check_module_bodyb   s    
zTestBase.check_module_bodyc             C   s*   |  |}| }| | |  dS )z6
        Check module metadata against *asm*.
        N)rF   Z_stringify_metadatar1   r   )r   r4   rE   rG   rJ   r   r   r   check_metadatag   s    
zTestBase.check_metadatac             C   sD   |  |}| |}|dd dd }| | |  d S )N{r   }r   )rF   r@   	partition
rpartitionr1   r   )r   r>   rE   rG   rJ   r   r   r   check_func_bodyo   s    

zTestBase.check_func_body)Nr5   )Nr   )__name__
__module____qualname____doc__r   r'   r*   r2   r4   r<   r?   r@   rF   rH   rI   rK   rL   rQ   r   r   r   r   r       s   	

r   c               @   sP   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S )TestFunctionz>i32 @"my_func"(i32 %".1", i32 %".2", double %".3", i32* %".4")c             C   s0   |   }| | }| | d| j  d S )Nz
declare %s)r<   r@   r   r1   proto)r   r>   rE   r   r   r   test_declarez   s    zTestFunction.test_declarec             C   s   |   }|jd |jd d|j_tjtddd}t|  |d}||j_	| 
| }| |d| j  | | d S )	NZoptsizealwaysinliner	   r   T)var_argZ__gxx_personality_v0z\declare %s alwaysinline optsize alignstack(16) personality i8 (...)* @"__gxx_personality_v0")r<   
attributesaddZ
alignstackr   r6   int8r:   r4   Zpersonalityr@   r   r1   rW   r2   )r   r>   Ztp_persZpersrE   r   r   r   test_declare_attributes   s    
z$TestFunction.test_declare_attributesc             C   s   |   }|jd d d|jd j_d|jd j_d|jd j_|jd d |jd	 | |	 }| 
|d
 | | d S )Nr   Zzeroext   r   
         ZnonnullZnoaliaszdeclare noalias i32 @"my_func"(i32 zeroext %".1", i32 dereferenceable(5) dereferenceable_or_null(10) %".2", double %".3", i32* nonnull align 4 %".4"))r<   argsZadd_attributer[   ZdereferenceableZdereferenceable_or_nullalignZreturn_valuer@   r   r1   r2   )r   r>   rE   r   r   r   test_function_attributes   s    z%TestFunction.test_function_attributesc             C   sL   |   }| |}|d|g  | | }| |d | | d S )NdbgzNdeclare i32 @"my_func"(i32 %".1", i32 %".2", double %".3", i32* %".4") !dbg !0)r4   r<   set_metadataadd_metadatar@   r   r1   r2   )r   r4   r>   rE   r   r   r   test_function_metadata   s    
z#TestFunction.test_function_metadatac             C   sT   |   }|jd |d}t|}|  | |}| |dj	| j
d d S )NrY   my_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )rW   )r<   r[   r\   r=   r   	IRBuilderret_voidr@   rH   formatrW   )r   r>   r?   builderrE   r   r   r   test_define   s    


zTestFunction.test_definec             C   s   |   }t }|dtg}|d|tg}|d||tg}|d}| | | d | | | d | | | d | | | d d S )	Nz	llvm.powizllvm.memsetzllvm.memcpyzllvm.assumezD            declare double @"llvm.powi.f64"(double %".1", i32 %".2")ze            declare void @"llvm.memset.p0i8.i32"(i8* %".1", i8 %".2", i32 %".3", i32 %".4", i1 %".5")zk            declare void @"llvm.memcpy.p0i8.p0i8.i32"(i8* %".1", i8* %".2", i32 %".3", i32 %".4", i1 %".5")z1            declare void @"llvm.assume"(i1 %".1"))	r4   r]   
as_pointerdeclare_intrinsicr8   r7   rH   r@   r   )r   r4   Zpint8powiZmemsetZmemcpyassumer   r   r   test_declare_intrinsics   s    
z$TestFunction.test_declare_intrinsicsc             C   s4   |   }|dtg}|dtg}| || d S )Nz	llvm.powi)r4   rq   r8   r/   )r   r4   rr   Zpowi2r   r   r   test_redeclare_intrinsic   s    z%TestFunction.test_redeclare_intrinsicc             C   s   |   }| | d S )N)r<   r2   )r   fnr   r   r   test_pickling   s    zTestFunction.test_picklingN)rR   rS   rT   rW   rX   r^   re   ri   ro   rt   ru   rw   r   r   r   r   rV   v   s   rV   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eed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 })r4   rh   r7   r]   r'   r*   )r   r%   mdr   r   r   test_unnamed_metadata   s    zTestIR.test_unnamed_metadatac             C   s   |   }|tddg}|td|g}|td|g}| || ||||g}| d| | d| | d| d S )Nry   kerneli  z!0 = !{ i32 123, !"kernel" }z!1 = !{ i64 456, !0 }z!2 = !{ !0, !1, !1 })r4   rh   r7   int64r/   r'   )r   r%   m0m1Zm2Zm3r   r   r   test_unnamed_metadata_2   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 )Nry   i  i  z!0 = !{ i32 456 }z!1 = !{ i32 789 }z!2 = !{ i32 123, !0, !1, !0 })r4   rh   r7   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$" })r4   rh   r'   )r   r%   r   r   r   test_metadata_string   s    zTestIR.test_metadata_stringc          	   C   s   |   }|tdg}|tdg}|d}|| || || | d| | | | ||	d | 
t |	d W d Q R X d S )Nry   i  fooz!foo = !{ !0, !1, !0 }bar)r4   rh   r7   r~   add_named_metadatar\   r'   r*   r/   Zget_named_metadataassertRaisesKeyError)r   r%   r   r   Znmdr   r   r   test_named_metadata   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 )Nry   r   i  r}   r   z!foo = !{ !0, !1, !2 }z!0 = !{ i32 123 }z!1 = !{ i64 456 }z!2 = !{ !"kernel" }z!bar = !{ !3 }z
!3 = !{  })r4   rh   r7   r   r~   r'   r*   )r   r%   r   r   r   r   test_named_metadata_2  s    zTestIR.test_named_metadata_2c             C   sf   |   }|t d g}| d| | | |   }|d tdg}| d| | | d S )Nz!0 = !{ i32* null }ry   z!0 = !{ null, i32 123 })r4   rh   r7   rp   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	directoryZDISubroutineTypetypesZDICompileUnitZDW_LANG_PythonZARTIQr   T)ZlanguagefileZproducerZruntimeVersionZisOptimized)is_distinctZDISubprogramr5      F)r;   r   r    typeZisLocalZunitz/!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))r4   add_debug_inforh   r   ZDITokenr"   r'   r*   )r   r%   Zdi_fileZdi_func_typeZdi_compileunitZdi_funcstrmodr   r   r   test_debug_info+  s>    
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   r   T)r   rb   z/!0 = !DIFile(directory: "bar", filename: "foo")z/!1 = !DIFile(directory: "foo", filename: "bar")z8!2 = distinct !DIFile(directory: "bar", filename: "foo"))r4   r   r/   r1   lenr"   r'   r*   )r   r%   Zdi1Zdi2Zdi3Zdi4r   r   r   r   test_debug_info_2W  s0    


zTestIR.test_debug_info_2zpy2 onlyc             C   s<   |   }|ddtdd}| dt| | | d S )NZDIBasicTyper   ry   )r;   sizez)!0 = !DIBasicType(name: "foo", size: 123))r4   r   Zlongr'   r"   r*   )r   r%   Zdir   r   r   test_debug_info_py2_longv  s    
zTestIR.test_debug_info_py2_longc             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   z
mov $1, $2z=r,rT)side_effectry   z8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))r4   r   r:   r6   VoidTyperk   r=   r7   Z	InlineAsmcallrl   r   r"   r*   )r   r%   r   rn   asmtyrE   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   z
mov $1, $2z=r,rry   T)r   z8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))r4   r   r:   r6   r   rk   r=   r7   rE   rl   r   r"   r*   )r   r%   r   rn   r   r   r   r   r   test_builder_asm  s    zTestIR.test_builder_asmc             C   s|   |   }t|tt g d}t|d}tttg}|t	dd |
  d}| |t| | | d S )Nr   r   r   raxzcall i64 asm "", "={rax}")r4   r   r:   r6   r   rk   r=   r7   Zload_regIntTyperl   r   r"   r*   )r   r%   r   rn   r   r   r   r   r   test_builder_load_reg  s    zTestIR.test_builder_load_regc             C   s   |   }t|tt g d}t|d}tt tg}|t	dt
dd |  d}| |t| | | d S )Nr   r   ry   r   r   z0call void asm sideeffect "", "{rax}" ( i64 123 ))r4   r   r:   r6   r   rk   r=   r7   Z	store_regr~   r   rl   r   r"   r*   )r   r%   r   rn   r   r   r   r   r   test_builder_store_reg  s    zTestIR.test_builder_store_regN)rR   rS   rT   r|   r   r   r   r   r   r   r   r   unittestZ
skipUnlessPY2r   r   r   r   r   r   r   r   r   rx      s   ,
rx   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestGlobalValuesc          	   C   s   |   }t|tt g d}t|tt g d t|t d}| |d| | |d| | 	t
 |d W d Q R X | t|d d S )Nr   r   
globdoubleZkkkz2<ir.GlobalVariable 'globdouble' of type 'double*'>)r4   r   r:   r6   r   GlobalVariable
DoubleTyper1   Z
get_globalr   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)r4   r   r6   r   r:   r   r   r1   setZ	functionsZglobal_values)r   r%   Z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|_	| 
|d dS )z7
        IR serialization of global variables.
        abrz   )	addrspacer   ry   dTeZinternalfi  gr	   aV              @"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
            N)r4   r   r   r]   r7   initializerglobal_constantZlinkageZunnamed_addrrd   rK   )	r   r%   r   r   r   r   r   r   r   r   r   r   test_global_variables_ir  s"    

z)TestGlobalValues.test_global_variables_irc             C   s   |   }| | d S )N)r4   r2   )r   r%   r   r   r   test_pickle  s    zTestGlobalValues.test_pickleN)rR   rS   rT   r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	TestBlockc             C   s4   |   }tj|dd}| |j| | |j d S )Nstart)parentr;   )r<   r   Blockr/   r   assertFalseis_terminated)r   r>   r?   r   r   r   test_attributes  s    zTestBlock.test_attributesc             C   sD   | j dd}| | |d |jddg | | |d d S )Nrj   )r;   z
my_block:
r   r   zmy_block:
  a
  b
)r?   r1   r@   Zinstructionsextend)r   r?   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 )Nrj   )r;   r   r   r   r   sdivr   z            my_block:
                %"c" = add i32 %".1", %".2"
                %"d" = sub i32 %".1", %".2"
                %"e" = mul i32 %"d", %".2"
            z            my_block:
                %"c" = add i32 %".1", %".2"
                %"f" = sdiv i32 %"c", %".2"
                %"e" = mul i32 %"f", %".2"
            )r?   r   rk   r<   rc   r\   r   mulZInstructionr   rI   rD   )r   r?   rn   r   r   r   r   r   r   r   r   test_replace  s    
zTestBlock.test_replacec             C   s*   |   }tj|dd}| t|d dS )z4
        Blocks should have a useful repr()
        r   )r   r;   z"<ir.Block 'start' of type 'label'>N)r<   r   r   r1   r   )r   r>   r?   r   r   r   	test_repr  s    zTestBlock.test_reprN)rR   rS   rT   r   r   r   r   r   r   r   r   r     s   r   c               @   sl  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/dYS )Z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 )Nrj   )r;   r   Z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>)>)	r?   r   rk   r<   rc   r\   rI   r1   r   )r   r?   rn   r   r   instr   r   r   test_simple!  s    

z!TestBuildInstructions.test_simplec          	   C   sx  | j dd}t|}|jjd d \}}}|||d |||d |||d |||d |	||d |
||d	 |||d
 |||d |||d |||d |||d |||d |||d |||d |||d |||d |||d |||d | t}||| W d Q R X | t|jd | |j | |d d S )Nrj   )r;   rb   r   r   r   r   r   hi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"
            )r?   r   rk   r<   rc   r\   faddr   fsubr   fmulZudivr   ZfdivZuremZsremZfremor_and_xorZshlZashrZlshrr   
ValueErrorr1   r"   	exceptionr   r   rI   )r   r?   rn   r   r   Zffcmr   r   r   test_binops/  s8    
z!TestBuildInstructions.test_binopsc             C   sb   | j dd}t|}|jjd d \}}|j||ddd |j||ddd	gd | |d
 d S )Nrj   )r;   r   r   )nuw)flagsr   r   Znswz            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )r?   r   rk   r<   rc   r\   r   rI   )r   r?   rn   r   r   r   r   r   test_binop_flags`  s    
z&TestBuildInstructions.test_binop_flagsc             C   sb   | j dd}t|}|jjd d \}}|j||ddd |j||ddd	gd | |d
 d S )Nrj   )r;   r   r   )fast)r   r   ninfnszz            my_block:
                %"c" = fadd fast i32 %".1", %".2"
                %"d" = fsub ninf nsz i32 %".1", %".2"
            )r?   r   rk   r<   rc   r   r   rI   )r   r?   rn   r   r   r   r   r   test_binop_fastmath_flagsn  s    
z/TestBuildInstructions.test_binop_fastmath_flagsc             C   s   | j dd}t|}|jjd d \}}|||d |||d |||d |||d |	||d |
||d	 | |d
 d S )Nrj   )r;   r   r   r   r   r   r   r   aD              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")
            )r?   r   rk   r<   rc   Zsadd_with_overflowZsmul_with_overflowZssub_with_overflowZuadd_with_overflowZumul_with_overflowZusub_with_overflowrI   )r   r?   rn   r   r   r   r   r   test_binops_with_overflow|  s    
z/TestBuildInstructions.test_binops_with_overflowc             C   s^   | j dd}t|}|jjd d \}}||d ||d | |j | 	|d d S )Nrj   )r;   r   r   r   zs            my_block:
                %"c" = sub i32 0, %".1"
                %"d" = xor i32 %".2", -1
            )
r?   r   rk   r<   rc   negnot_r   r   rI   )r   r?   rn   r   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 )Nrj   )r;   r   r
   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )r?   r   rk   r<   rc   Constantr   	Undefinedr\   rI   Zreplace_usage)r   r?   rn   r   r   Zundef1Zundef2r   r   r   r   test_replace_operand  s    
z*TestBuildInstructions.test_replace_operandc          	   C   sR  | j dd}t|}|jjd d \}}|d||d |d||d |d||d	 |d
||d |d||d |d||d |d||d |d||d |d||d |d
||d |d||d |d||d | t |d||d W d Q R X | t |d||d W d Q R X | 	|j
 | |d d S )Nrj   )r;   r   z==r   z!=r   <r   z<=r   >r   z>=r   r   r   r   r   r   r   unoZ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"
            )r?   r   rk   r<   rc   Zicmp_unsignedicmp_signedr   r   r   r   rI   )r   r?   rn   r   r   r   r   r   test_integer_comparisons  s,    
z.TestBuildInstructions.test_integer_comparisonsc          
   C   sd  | j dd}t|}|jjd d \}}|d||d |d||d |d||d	 |d
||d |d||d |d||d |d||d |d||d |d||d |d
||d |d||d |d||d |d||d |d||d |d||d |d||d |jd||dddd d!d"gd# | |j | 	|d$ d S )%Nrj   )r;   r   z==r   z!=r   r   r   z<=r   r   r   z>=r   r   r   r   r   r   r   ordur   vwxZoltynnanr   r   Z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"
            )
r?   r   rk   r<   rc   Zfcmp_orderedZfcmp_unorderedr   r   rI   )r   r?   rn   r   r   r   r   r   test_float_comparisons  s.    
z,TestBuildInstructions.test_float_comparisonsc             C   sv   | j dd}ttd}t|}|jjd d \}}||||d | |j	 |
  | |j	 | |d d S )Nrj   )r;   Tr   r   zz            my_block:
                %"c" = select i1 true, i32 %".1", i32 %".2"
                unreachable
            )r?   r   r   int1rk   r<   rc   Zselectr   r   Zunreachable
assertTruerI   )r   r?   r   rn   r   r   r   r   r   test_misc_ops   s    
z#TestBuildInstructions.test_misc_opsc             C   s   | j dd}t|}|jjd d \}}|jd}|jd}|td}||| ||| | 	|j
 | |d d S )Nrj   )r;   r   Zb2Zb3Zmy_phize            my_block:
                %"my_phi" = phi i32 [%".1", %"b2"], [%".2", %"b3"]
            )r?   r   rk   r<   rc   r=   phir7   Zadd_incomingr   r   rI   )r   r?   rn   r   r   Zbb2Zbb3r   r   r   r   test_phi  s    
zTestBuildInstructions.test_phic          	   C   s  | j dd}t|}|jjd d \}}}|jtdd}|jtddd}|jt|dd}d	|_| 	|j
tt |||}	| 	|	j
t  |||}
| 	|
j
t  ||d
}| 	|j
t |j||dd}| 	|j
t  |j|ddd}| 	|j
t |j||ddd}| 	|j
t  |j|dddd}| 	|j
t | t ||| W d Q R X | t || W d Q R X | t}||| W d Q R X | 	t|jd | |d d S )Nrj   )r;   rb   r   rz   r   )r   r;   r   r   r   r   )rd   r   seq_cstra   )orderingrd   r   )r  rd   r;   z.cannot store i32 to double*: mismatching typesa              my_block:
                %"c" = alloca i32
                %"d" = alloca i32, i32 42
                %"e" = alloca double, i32 %".1", align 8
                store double %".3", double* %"e"
                store i32 %".2", i32* %"c"
                %"g" = load i32, i32* %"c"
                store i32 %".2", i32* %"c", align 1
                %"i" = load i32, i32* %"c", align 1
                store atomic i32 %".2", i32* %"c" seq_cst, align 4
                %"k" = load atomic i32, i32* %"c" seq_cst, align 4
            )r?   r   rk   r<   rc   allocar7   r8   rd   r1   r   r9   Zstorer   loadZstore_atomicZload_atomicr   	TypeErrorr"   r   rI   )r   r?   rn   r   r   zr   r   r   Zeer   r   r   r   r   r   r   r   r   r   test_mem_ops  s@    
z"TestBuildInstructions.test_mem_opsc             C   s~   | j dd}t|}|jjd d \}}|jttdd}|j|t	td|gdd}| 
|jtt | |d d S )Nrj   )r;   r   r   r_   r   z            my_block:
                %"c" = alloca i32*
                %"d" = getelementptr i32*, i32** %"c", i32 5, i32 %".1"
            )r?   r   rk   r<   rc   r  r9   r7   gepr   r1   r   rI   )r   r?   rn   r   r   r   r   r   r   r   test_gepO  s    
zTestBuildInstructions.test_gepc       	      C   s   | j dd}t|}|jjd d \}}t }tt|||tg}|j	|| dd}|j
|dd dD dd}| |jt| | |d	 d S )
Nrj   )r;   r   r   c             S   s   g | ]}t t|qS r   )r   r   r7   )r   r   r   r   r   r!   f  s    z<TestBuildInstructions.test_gep_castinstr.<locals>.<listcomp>)r   rb   r   z            my_block:
                %"d" = bitcast i32 %".1" to {i64, i8*, i8*, i8*, i64}*
                %"e" = getelementptr {i64, i8*, i8*, i8*, i64}, {i64, i8*, i8*, i8*, i64}* %"d", i32 0, i32 3
            )r?   r   rk   r<   rc   r]   rp   LiteralStructTyper~   bitcastr	  r1   r   r9   rI   )	r   r?   rn   r   r   int8ptrlsr   r   r   r   r   test_gep_castinstr]  s    
z(TestBuildInstructions.test_gep_castinstrc       
      C   s   | j dd}t|}|jjd d \}}d}t }tt|||tg}|j	||j|ddd}|j
|dd d	D d
d}	| |	jj| | |	jtj||d | |d d S )Nrj   )r;   r   ra   )r   r   c             S   s   g | ]}t t|qS r   )r   r   r7   )r   r   r   r   r   r!   x  s    zFTestBuildInstructions.test_gep_castinstr_addrspace.<locals>.<listcomp>)r   rb   r   z            my_block:
                %"d" = bitcast i32 %".1" to {i64, i8*, i8*, i8*, i64} addrspace(4)*
                %"e" = getelementptr {i64, i8*, i8*, i8*, i64}, {i64, i8*, i8*, i8*, i64} addrspace(4)* %"d", i32 0, i32 3
            )r?   r   rk   r<   rc   r]   rp   r  r~   r  r	  r1   r   r   r9   rI   )
r   r?   rn   r   r   r   r  r  r   r   r   r   r   test_gep_castinstr_addrspacen  s    
z2TestBuildInstructions.test_gep_castinstr_addrspacec       	      C   s   | j dd}t|}|jjd d \}}d}|jtjt|ddd}| t	|j
d | |j
jj| |j|ttd|gd	d}| |j
j| |j|ttd
gdd}| |j
j| | |d d S )Nrj   )r;   r   ra   )r   r   zi32 addrspace(4)**r_   r   r`   r   z            my_block:
                %"c" = alloca i32 addrspace(4)*
                %"d" = getelementptr i32 addrspace(4)*, i32 addrspace(4)** %"c", i32 5, i32 %".1"
                %"e" = getelementptr i32, i32 addrspace(4)* %"d", i32 10
            )r?   r   rk   r<   rc   r  r9   r7   r1   r"   r   pointeer   r	  r   rI   )	r   r?   rn   r   r   r   r   r   r   r   r   r   test_gep_addrspace  s    
z(TestBuildInstructions.test_gep_addrspacec          	   C   sP  | j dd}t|}|jjd d \}}tttg}tt|g}t	|t	tdt	tdf}|j
|ddd}|j||ddd}	|j|	t	td	d
dd}
| |	j| | |
j| |j|dd}|j|dd}|j
|ddd}|j
|d
dd}|j
|ddd}|j
|ddd}|j||d
dd}|j||ddd}| |jt | |j| | |jt | |jt | |j| | |j| | t |
|d W d Q R X | t |
|d W d Q R X | t |
|d W d Q R X | t |||d W d Q R X | t |||d
 W d Q R X | |d d S )Nrj   )r;   r   ra   Tr   r   r   Fr   r   ptrr   r   r   )r   r   r   )r   r   r   r   r   )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}}, {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
            )r?   r   rk   r<   rc   r  r7   r   r]   r   Zextract_valueZinsert_valuer1   r   r  r  r   r  rI   )r   r?   rn   r   r   Ztp_innerZtp_outerZc_innerr   r   r   Zp_outerr   r   r   r   r   r   r   r   r   r   test_extract_insert_value  sL    
z/TestBuildInstructions.test_extract_insert_valuec             C   s   | j dd}t|}|jjd d \}}}}|j|tdd}|j|tdd}|j	|tdd}	|
|td}
||
td}||td	}||td
}||td}||td}||td}||ttd}||td}| |j | |d d S )Nrj   )r;   ra   r   r   r   fbfcr   r   fdfer   r   r   ah              my_block:
                %"c" = trunc i32 %".1" to i8
                %"d" = zext i8 %"c" to i32
                %"e" = sext i8 %"c" to i32
                %"fb" = fptrunc double %".3" to float
                %"fc" = fpext float %"fb" to double
                %"g" = fptoui double %".3" to i32
                %"h" = fptosi double %".3" to i8
                %"fd" = uitofp i32 %"g" to float
                %"fe" = sitofp i8 %"h" to double
                %"i" = ptrtoint i32* %".4" to i32
                %"j" = inttoptr i32 %"i" to i8*
                %"k" = bitcast i32 %".1" to float
            )r?   r   rk   r<   rc   Ztruncr]   Zzextr7   ZsextZfptruncfltZfpextr8   ZfptouiZfptosiZuitofpZsitofpZptrtointinttoptrr9   r  r   r   rI   )r   r?   rn   r   r   Zfar  r   r   r   r  r  r   r   r  r  r   r   r   r   r   r   test_cast_ops  s$    
z#TestBuildInstructions.test_cast_opsc             C   sh   | j dd}t|}|jjd d \}}|jtdd}|d||dd}| |j	t | 
|d d S )	Nrj   )r;   r   r   r\   	monotonicr   z            my_block:
                %"c" = alloca i32
                %"d" = atomicrmw add i32* %"c", i32 %".1" monotonic
            )r?   r   rk   r<   rc   r  r7   Z
atomic_rmwr1   r   rI   )r   r?   rn   r   r   r   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 )Nrj   )r;   targetzE            my_block:
                br label %"target"
            )	r?   r   rk   r<   r=   branchr   r   rI   )r   r?   rn   Z	bb_targetr   r   r   test_branch  s    

z!TestBuildInstructions.test_branchc             C   sd   | j dd}t|}|jjdd}|jjdd}|ttd|| | |j	 | 
|d d S )Nrj   )r;   b_trueb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )r?   r   rk   r<   r=   cbranchr   r   r   r   rI   )r   r?   rn   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 )
Nrj   )r;   r!  r"  Fr_   rz   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )r?   r   rk   r<   r=   r#  r   r   Zset_weightsr   r   rI   rL   r4   )r   r?   rn   r$  r%  brr   r   r   test_cbranch_weights  s    
z*TestBuildInstructions.test_cbranch_weightsc             C   sv   | j dd}t|}|jjdd}|jjdd}|t|j|}|| || | |j	 | 
|d d S )Nrj   )r;   Zb_1Zb_2z            my_block:
                indirectbr i8* blockaddress(@"my_func", %"b_1"), [label %"b_1", label %"b_2"]
            )r?   r   rk   r<   r=   Zbranch_indirectZBlockAddressZadd_destinationr   r   rI   )r   r?   rn   Zbb_1Zbb_2Z
indirectbrr   r   r   test_branch_indirect&  s    


z*TestBuildInstructions.test_branch_indirectc                s    fdd} j dd}t|}|  ||d  j dd}t|}|td ||d  j dd}t|}| }|d	|jd
 ||d  j dd}t|}|td}|d	|jd
 ||d d S )Nc                s     | j  | | d S )N)r   r   rI   )r?   Zexpected_ir)r   r   r   check5  s    z1TestBuildInstructions.test_returns.<locals>.checkrj   )r;   z;            my_block:
                ret void
            Zother_blockr_   z?            other_block:
                ret i32 5
            rf   r   zD            my_block:
                ret void, !dbg !0
               zE            my_block:
                ret i32 6, !dbg !0
            )	r?   r   rk   rl   retr7   rg   r4   rh   )r   r*  r?   rn   r   r   )r   r   test_returns4  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 )Nrj   )r;   r   ZonzeroZononeZontwo	otherwiser   r   z            my_block:
                switch i32 %".1", label %"otherwise" [i32 0, label %"onzero" i32 1, label %"onone" i32 2, label %"ontwo"]
            )r?   r   rk   r<   rc   r=   ZswitchZadd_caser   r7   r   r   rI   )
r   r?   rn   r   r   Z	bb_onzeroZbb_ononeZbb_ontwoZ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	|jj
|d}t	|jj
|d}||||fd ||||fd	 |j|||fd
dd ||||fd}	|	jd |j|||fddd |j|||fddd | |d d S )Nrj   )r;   r   T)rZ   r   r   res_fZres_gZ
res_f_fastZfastcc)Zcconvres_f_readonlyreadonlyZres_fastr   )ZfastmathZres_nnan_ninf)r   r   a              my_block:
                %"res_f" = call float @"f"(i32 %".1", i32 %".2")
                %"res_g" = call double (i32, ...) @"g"(i32 %".2", i32 %".1")
                %"res_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")
            )r?   r   rk   r<   rc   r6   r  r7   r8   r:   r4   r   r[   r\   rI   )
r   r?   rn   r   r   tp_fZtp_gr   r   r2  r   r   r   	test_callo  s     
zTestBuildInstructions.test_callc             C   s|   | j dd}t|}tt t gd }t|j|d}|jt	dd}|j
d}|||||f | |d dS )	z9
        Function calls with metadata arguments.
        rj   )r;   rb   zllvm.dbg.declarer   r   z            my_block:
                %"a" = alloca i32
                call void @"llvm.dbg.declare"(metadata i32* %"a", metadata !0, metadata !0)
            N)r?   r   rk   r6   r   ZMetaDataTyper:   r4   r  r7   rh   r   rI   )r   r?   rn   Zdbg_declare_tyZdbg_declarer   r   r   r   r   test_call_metadata  s    
z(TestBuildInstructions.test_call_metadatac       	      C   s   | j dd}t|}|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 )	Nrj   )r;   r   r   ZnormalZunwindr1  z            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )r?   r   rk   r<   rc   r6   r  r7   r:   r4   r=   ZinvokerI   )	r   r?   rn   r   r   r4  r   Z	bb_normalZ	bb_unwindr   r   r   test_invoke  s    
z!TestBuildInstructions.test_invokec          
   C   s   | j dd}t|}|ttt gd}t|j	j
t d}d|_|t| |ttt|jd|g || | |d d S )Nrj   )r;   lpZ_ZTIiTr   z            my_block:
                %"lp" = landingpad {i32, i8*}
                    catch i8** @"_ZTIi"
                    filter [1 x i8**] [i8** @"_ZTIi"]
                resume {i32, i8*} %"lp"
            )r?   r   rk   Z
landingpadr  r7   r]   rp   r   r<   r4   r   Z
add_clauseZCatchClauseZFilterClauser   	ArrayTyper   ZresumerI   )r   r?   rn   r8  Zint_typeinfor   r   r   test_landingpad  s    

z%TestBuildInstructions.test_landingpadc             C   sV   | j dd}t|}|jjd d \}}|jd||dd}|| | |d d S )Nrj   )r;   r   r   r   z            my_block:
                %"c" = icmp sgt i32 %".1", %".2"
                call void @"llvm.assume"(i1 %"c")
            )r?   r   rk   r<   rc   r   rs   rI   )r   r?   rn   r   r   r   r   r   r   test_assume  s    

z!TestBuildInstructions.test_assumec             C   s  | j dd}t|}|jjd d \}}d|_d|_t|jd}t|tj	}t
d}|j|||ddd}|j|||d	d
d}| |d |d}|| || t|d	dg}|j|||dd}	| |d |d}|| || |j||dd}
| |d |d}|| || |j||ddd}|j||d	dd}| |d |||| | |j d S )NZinsert_block)r;   r   r   r   r
   r   Zvec1r   Zvec2z            insert_block:
                %"vec1" = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %"a", i32 0
                %"vec2" = insertelement <2 x i32> %"vec1", i32 %"b", i32 1
            Zshuffle_blockZshufz            shuffle_block:
                %"shuf" = shufflevector <2 x i32> %"vec2", <2 x i32> %"vec2", <2 x i32> <i32 1, i32 0>
            Z	add_blocksumz[            add_block:
                %"sum" = add <2 x i32> %"vec2", %"vec2"
            Zextract_blockZex1Zex2z            extract_block:
              %"ex1" = extractelement <2 x i32> %"vec2", i32 0
              %"ex2" = extractelement <2 x i32> %"vec2", i32 1
            )r?   r   rk   r<   rc   r;   
VectorTyper   r   r   r   Zinsert_elementrI   r=   r  position_at_endZshuffle_vectorr\   Zextract_elementr,  r*   r4   )r   r?   rn   r   r   vectyvecZidxtymaskZshuffZvaddr   r   r   r   r   test_vector_ops  sD    










z%TestBuildInstructions.test_vector_opsc             C   sJ   | j dd}t|}ttd}|j|dd}|| | |d d S )Nrj   )r;   r_   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )r?   r   rk   r   r~   
bitreverser,  rI   )r   r?   rn   r   r   r   r   r   test_bitreverse   s    

z%TestBuildInstructions.test_bitreversec          	   C   s\   | j dd}t|}ttd}| t}|j|dd W d Q R X | dt	|j
 d S )Nrj   )r;   r_   r   z#expected an integer type, got float)r?   r   rk   r   r  r   r  rC  r$   r"   r   )r   r?   rn   r   raisesr   r   r   test_bitreverse_wrongtype  s    
z/TestBuildInstructions.test_bitreverse_wrongtypec          	   C   s   | j dd}t|}| t}|dd  W d Q R X | dt|j | t}|d d W d Q R X | dt|j |dd  |dd |d	d |d
 |	  | 
|d d S )Nrj   )r;   r  z#Invalid fence ordering "monotonic"!zInvalid fence ordering "None"!acquirereleaseZsinglethreadZacq_relr  z            my_block:
                fence acquire
                fence syncscope("singlethread") release
                fence syncscope("singlethread") acq_rel
                fence seq_cst
                ret void
            )r?   r   rk   r   r   Zfencer$   r"   r   rl   rI   )r   r?   rn   rE  r   r   r   
test_fence  s&    

z TestBuildInstructions.test_fencec             C   sJ   | j dd}t|}ttd}|j|dd}|| | |d d S )Nrj   )r;   r_   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )r?   r   rk   r   r7   Zbswapr,  rI   )r   r?   rn   r   r   r   r   r   
test_bswap2  s    

z TestBuildInstructions.test_bswapc             C   sJ   | j dd}t|}ttd}|j|dd}|| | |d d S )Nrj   )r;   r_   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )r?   r   rk   r   int16Zctpopr,  rI   )r   r?   rn   r   r   r   r   r   
test_ctpop>  s    

z TestBuildInstructions.test_ctpopc             C   sX   | j dd}t|}ttd}ttd}|j||dd}|| | |d d S )Nrj   )r;   r_   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	r?   r   rk   r   rK  r   Zctlzr,  rI   )r   r?   rn   r   r   r   r   r   r   	test_ctlzJ  s    

zTestBuildInstructions.test_ctlzc             C   sX   | j dd}t|}ttd}ttd}|j||dd}|| | |d d S )Nrj   )r;   r_   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	r?   r   rk   r   r~   r   cttzr,  rI   )r   r?   rn   r   r   r   r   r   r   	test_cttzW  s    

zTestBuildInstructions.test_cttzc          	   C   sj   | j dd}t|}ttd}ttd}| t}|j||dd W d Q R X | 	dt
|j d S )Nrj   )r;   r_   rb   r   zexpected an i1 type, got i32)r?   r   rk   r   r~   r7   r   r  rN  r$   r"   r   )r   r?   rn   r   r   rE  r   r   r   test_cttz_wrongflagd  s    
z)TestBuildInstructions.test_cttz_wrongflagc          	   C   sj   | j dd}t|}ttd}ttd}| t}|j||dd W d Q R X | 	dt
|j d S )Nrj   )r;   r_   r   r   z#expected an integer type, got float)r?   r   rk   r   r  r   r   r  rN  r$   r"   r   )r   r?   rn   r   r   rE  r   r   r   test_cttz_wrongtypep  s    
z)TestBuildInstructions.test_cttz_wrongtypec             C   sf   | j dd}t|}ttd}ttd}ttd}|j|||dd}|| | |d d S )Nrj   )r;   r_   r   r   fmaz            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )r?   r   rk   r   r  rR  r,  rI   )r   r?   rn   r   r   r   rR  r   r   r   test_fma|  s    

zTestBuildInstructions.test_fmac          	   C   sx   | j dd}t|}ttd}ttd}ttd}| t}|j|||dd W d Q R X | dt	|j
 d S )Nrj   )r;   r_   r   r   rR  z(expected an floating point type, got i32)r?   r   rk   r   r7   r   r  rR  r$   r"   r   )r   r?   rn   r   r   r   rE  r   r   r   test_fma_wrongtype  s    
z(TestBuildInstructions.test_fma_wrongtypec          	   C   sx   | j dd}t|}ttd}ttd}ttd}| t}|j|||dd W d Q R X | 	dt
|j d S )Nrj   )r;   r_   r   r   rR  z7expected types to be the same, got float, double, float)r?   r   rk   r   r  r8   r   r  rR  r$   r"   r   )r   r?   rn   r   r   r   rE  r   r   r   test_fma_mixedtypes  s    
z)TestBuildInstructions.test_fma_mixedtypesN)0rR   rS   rT   rU   ZmaxDiffr   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r  r  r   r&  r(  r)  r-  r0  r5  r6  r7  r:  r;  rB  rD  rF  rI  rJ  rL  rM  rO  rP  rQ  rS  rT  rU  r   r   r   r   r     sZ   1%,1=!(:r   c               @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )TestBuilderMiscz=
    Test various other features of the IRBuilder class.
    c             C   s\   | j dd}t|}| |j|j | |jtj | |j|jj | |jtj	 d S )Nr   )r;   )
r?   r   rk   r/   r<   r   assertIsInstancer:   r4   r3   )r   r?   rn   r   r   r   r     s    
zTestBuilderMisc.test_attributesc          
   C   s   | j dd}t|}|jjd d \}}|||d |jdd}||N |||d |	  |
||d W d Q R X |||d || W d Q R X |||d	 || |||d
 W d Q R X | |d | |d d S )Nrj   )r;   r   r   r   r   r   r   r   r   z            my_block:
                %"c" = add i32 %".1", %".2"
                %"e" = sub i32 %".1", %".2"
                %"g" = mul i32 %".1", %".2"
            z            foo:
                %"d" = fadd i32 %".1", %".2"
                %"f" = fsub i32 %".1", %".2"
                %"h" = fmul i32 %".1", %".2"
                br label %"foo"
            )r?   r   rk   r<   rc   r\   r=   Z
goto_blockr   Zgoto_entry_blockr   r   r  r   r   rI   )r   r?   rn   r   r   Zbb_newr   r   r   test_goto_block  s$    

zTestBuilderMisc.test_goto_blockc       	   	   C   s   | j dd}t|}ttd}|||d}||}|||d}W d Q R X | |j | |||d}|| |||d}|| W d Q R X | 	|j
d d S )	None)r;   r   r   r   r   r   a              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                %"c" = add i1 0, 0
                br i1 %"c", label %"one.endif.if", label %"one.endif.endif"
            one.endif.if:
                %"d" = add i1 0, 0
                br label %"one"
            one.endif.endif:
            )r?   r   rk   r   r   r\   if_thenr/   r  rQ   r<   )	r   r?   rn   r  r   bbendr   r   r   r   r   r   test_if_then  s    
zTestBuilderMisc.test_if_thenc          
   C   s   | j dd}t|}ttd}|||d}||8}|||d}||}|||d}W d Q R X W d Q R X |  | |j	d d S )NrY  )r;   r   r   r   r   a              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"one.if.if", label %"one.if.endif"
            one.endif:
                ret void
            one.if.if:
                %"c" = add i1 0, 0
                br label %"one.if.endif"
            one.if.endif:
                br label %"one.endif"
            )
r?   r   rk   r   r   r\   rZ  rl   rQ   r<   )r   r?   rn   r  r   r[  r   r   r   r   r   test_if_then_nested  s    
"z#TestBuilderMisc.test_if_then_nestedc       	   
   C   s   d}| j |d}t|}ttd}|||d}||8}|||d}||}|||d}W d Q R X W d Q R X |  | |j	dj
||d d d	 d
 d S )NZPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong)r;   r   r   r   r   a              {full_label}:
                %"a" = add i1 0, 0
                br i1 %"a", label %"{label}.if", label %"{label}.endif"
            {label}.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"{label}.if.if", label %"{label}.if.endif"
            {label}.endif:
                ret void
            {label}.if.if:
                %"c" = add i1 0, 0
                br label %"{label}.if.endif"
            {label}.if.endif:
                br label %"{label}.endif"
               z..)
full_labelZlabel)r?   r   rk   r   r   r\   rZ  rl   rQ   r<   rm   )	r   r_  r?   rn   r  r   r[  r   r   r   r   r   test_if_then_long_label	  s    
"z'TestBuilderMisc.test_if_then_long_labelc                s<    fdd}|d}  |jd |d}  |jd d S )Nc          	      sL    j dd}t|}ttd}|j|| d W d Q R X  |d |S )NrY  )r;   r   )likelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )r?   r   rk   r   r   rZ  rI   )ra  r?   rn   r  )r   r   r   r*  %  s    

z2TestBuilderMisc.test_if_then_likely.<locals>.checkTzC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FzC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            )rL   r4   )r   r*  rn   r   )r   r   test_if_then_likely$  s    z#TestBuilderMisc.test_if_then_likelyc       	   
   C   s   | j dd}t|}ttd}|||d}||F\}}| |||d}W d Q R X | |||d}W d Q R X W d Q R X ||<\}}| || W d Q R X | |  W d Q R X W d Q R X | 	|j
d d S )NrY  )r;   r   r   r   r   a)              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.else"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.else:
                %"c" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                br i1 %"a", label %"one.endif.if", label %"one.endif.else"
            one.endif.if:
                br label %"one"
            one.endif.else:
                ret void
            one.endif.endif:
            )r?   r   rk   r   r   r\   if_elser  rl   rQ   r<   )	r   r?   rn   r  r   thenr.  r   r   r   r   r   test_if_else9  s     
"zTestBuilderMisc.test_if_elsec                s<    fdd}|d}  |jd |d}  |jd d S )Nc          
      s    j dd}t|}ttd}|j|| d<\}}| || W d Q R X | |  W d Q R X W d Q R X  |j	d |S )NrY  )r;   r   )ra  z                one:
                    br i1 0, label %"one.if", label %"one.else", !prof !0
                one.if:
                    br label %"one"
                one.else:
                    ret void
                one.endif:
                )
r?   r   rk   r   r   rc  r  rl   rQ   r<   )ra  r?   rn   r  rd  r.  )r   r   r   r*  ^  s    
z2TestBuilderMisc.test_if_else_likely.<locals>.checkTzC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FzC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            )rL   r4   )r   r*  rn   r   )r   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   rY  )r;   ZtwoZthreer   r   r   r   r   r   r   r   z            one:
                %"a" = add i32 0, 0
                %"c" = add i32 0, 0
                %"b" = add i32 0, 0
            z            two:
                %"o" = add i32 0, 0
                %"q" = add i32 0, 0
                %"p" = add i32 0, 0
                %"m" = add i32 0, 0
                %"n" = add i32 0, 0
            z            three:
            N)r<   r   rk   r   r7   r=   Zposition_at_startr\   r>  Zposition_afterZposition_beforerI   )r   r>   rn   r  Zbb_oneZbb_twoZbb_threer   r   r   r   r   r   r   r   r   r   r   test_positioningz  s4    





z TestBuilderMisc.test_positioningc             C   sH   | j dd}t|}|jg |_|jttdd}| 	|d d S )Nrj   )r;   r   zN            my_block:
                %"c" = alloca i32*, !dbg !0
            )
r?   r   rk   r4   rh   Zdebug_metadatar  r9   r7   rI   )r   r?   rn   r   r   r   r   test_metadata  s    
zTestBuilderMisc.test_metadataN)rR   rS   rT   rU   r   rX  r\  r]  r`  rb  re  rf  rg  rh  r   r   r   r   rV    s   $0rV  c               @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )	TestTypesc             C   s&   xt |tjr|j}qW t |tj S )N)
isinstancer   r9   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
        T)rZ   r_   ra   ZMyType1ZMyType2c             S   s(   g | ] }t |tjtjfst|qS r   )rj  r   r   rk  r9   )r   tpr   r   r   r!     s    z,TestTypes.assorted_types.<locals>.<listcomp>)r   Contextrk  r   r6   r   r]   r7   r  r8   r9  r  get_identified_type)r   contextr   r   r   r   assorted_types  s    
zTestTypes.assorted_typesc             C   s:   |   }x,|D ]$}| |}| |r| || qW d S )N)rr  r2   rm  r1   )r   r   rl  Znewtyr   r   r   rw     s
    


zTestTypes.test_picklingc             C   s   |   }xHt||D ]8\}}||k	r| ||k||f | ||k||f qW xr|D ]j}t|}| |r| ||k||f | ||k||f qX| ||k||f | ||k||f qXW d S )N)rr  	itertoolsproductr   r   copyrm  )r   r   r   r   rn  otherr   r   r   test_comparisons  s    


zTestTypes.test_comparisonsc          
   C   sx  |  ttd |  ttdd |  ttd |  ttd |  tt d |  tttdd |  ttttfd	 |  tttttfd
 |  ttjtdddd |  ttjttfddd |  ttjtttfddd |  tt	t
d |  tt	t	t
d |  tttdd |  ttt	tdd |  tt	ttdd |  tttfd |  ttttfd |  ttt	ttt
tffd |  ttjtfddd |  ttjttfddd t }|d}|  t|d |d}|  t|d |d }|  t|d! d"S )#z:
        Test the string representation of types.
        Zi1   Zi29floatZdoubleZvoidr   zi1 ()z
i1 (float)zi1 (float, double)T)rZ   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)zi32*zi32**r_   z[5 x i1]z	[5 x i1*]z	[5 x i1]*z{i1}z{i1, float}z{i1*, {i32, i8}})Zpackedz<{i1}>z<{i1, float}>MyTypez	%"MyType"zMyType\z%"MyType\5c"zMyType"z%"MyType\22"N)r1   r"   r   r   r   r  r8   r   r6   r9   r7   r9  r  r]   ro  rp  )r   rq  mytypeZmytype1Zmytype2r   r   r   test_str  sH    



zTestTypes.test_strc             C   s8   x2t | j|  D ]}| t|tt| qW d S )N)filterrm  rr  r1   hashru  )r   typr   r   r   	test_hash  s    zTestTypes.test_hashc          	      sd   fdd} fdd}t t}xtdD ]}|||t q,W || t td}xtdD ]}|||t q^W || t tt ttff}||dt ||dt ttf  t	 |
t td	 W d Q R X || t  }t |d
}|tt ttf ||dt ||dt ttf  t	 |
t td	 W d Q R X || d S )Nc                s"   |  tt|} || d S )N)r	  r   r   r7   r1   )rn  r   rG   rJ   )r   r   r   check_constant  s    z*TestTypes.test_gep.<locals>.check_constantc          	      s0   t td} t | | W d Q R X d S )Ng      ?)r   r   r8   r   r  r	  )rn  index)r   r   r   check_index_type  s    z,TestTypes.test_gep.<locals>.check_index_typer_   rb   r   r   r   rz  )r   r9   r8   ranger9  r   r  r]   r   
IndexErrorr	  r   r7   ro  ZIdentifiedStructTypeset_body)r   r  r  rn  r   rq  r   )r   r   r
    s0    
zTestTypes.test_gepc                st   t d fdd}|td |td |td |ttdd |ttdd |ttt	t	fd	 d S )
Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                s     | | d S )N)r1   get_abi_size)rn  rG   )r   tdr   r   r*  =  s    z&TestTypes.test_abi_size.<locals>.checkr   ra   r   r_      r	   )
r(   create_target_datar]   r7   r~   r   r9  r  r8   r  )r   r*  r   )r   r  r   test_abi_size;  s    



zTestTypes.test_abi_sizec                st   t d fdd}|td |td |td |ttdd |ttdd |ttt	t	fd d S )Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                s     | | d S )N)r$   Zget_abi_alignment)rn  rG   )r   r  r   r   r*  H  s    z+TestTypes.test_abi_alignment.<locals>.check)r   r   ra   )ra   )r   r_   )
r(   r  r]   r7   r~   r   r9  r  r8   r  )r   r*  r   )r   r  r   test_abi_alignmentF  s    



zTestTypes.test_abi_alignmentc             C   s   t  }|d}t j|d}| |j | | t|}|t 	dt 	dt 
  | |j | | | |t| d S )Nrz  )rq  r
   r   )r   ro  rp  r3   r   Z	is_opaquer*   r"   r  r   	FloatTyper   assertNotEqual)r   rq  r{  r4   Zoldstrr   r   r   test_identified_structQ  s    


z TestTypes.test_identified_structc             C   sP   t  }|d}t dg|_t j|d}td}| |j	||dd d S )Nrz  r
   )rq  z%e-m:e-i64:64-f80:128-n8:16:32:64-S128ra   )
r   ro  rp  r   elementsr3   r(   r  r1   r  )r   rq  r{  r4   r  r   r   r   $test_target_data_non_default_context]  s    

z.TestTypes.test_target_data_non_default_contextc             C   s.   t  }t t dd}| t|d d S )Nr
   r   z	<8 x i32>)r   ro  r=  r   r1   r"   )r   rq  r?  r   r   r   test_vectore  s    zTestTypes.test_vectorN)rR   rS   rT   rm  rr  rw   rw  r|  r  r
  r  r  r  r  r  r   r   r   r   ri    s   +#ri  c             C   s   t t| S )N)r   r   r7   )r   r   r   r   <lambda>k  s    r  c               @   st   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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 )Nrz   zi32 42r   zi1 1r   zi1 0Tzi1 trueFzi1 falsezi1 undef)r   r   r7   r1   r"   r   r   )r   r   r   r   r   test_integersp  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 )	Ng      ?zfloat 0x3ff8000000000000g      zfloat 0xbff8000000000000zdouble 0x3ff8000000000000zdouble 0xbff8000000000000zdouble undefz
double 0.0)r   r   r  r1   r"   r8   r   )r   r   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 Q R X | t|jd
 t t tdt j}| t|d t t tdd }| t|d t t tdtd}| t|d t t tdtd}| t|d t t tddt jdf}| t|d | 	t t t tdd W d Q R X d S )Nrb   r_   r+  ra   z[3 x i32] [i32 5, i32 6, i32 4]r   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]g      ?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   r9  r7   c32r1   r"   r   Zliteral_arrayr   r  r  r   r]   	bytearrayr   )r   r   rE  r   r   r   test_arrays  s,    &" &zTestConstant.test_arraysc             C   s^   t t dd}dddddddd	g}t ||}d
dtdj|}| t|| d S )Nr
   r   r   r   ra   rb   r+  	      z<8 x i32> <{}>z, zi32 {})	r   r=  r   r   rm   r   r   r1   r"   )r   r?  Zvalsr@  Zvec_reprr   r   r   r    s    zTestConstant.test_vectorc          	   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 Q R X d S )Ng      ?Tz/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializer)g      ?Trz   zL{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}})rz   )g      ?T)ra   r_   r+  )r   r  r  r   r7   r   r  r1   r"   Zliteral_structr   r   r   r   )r   st1st2r   Zc1c2Zc3r   r   r   test_structs  s2    zTestConstant.test_structsc             C   s0   t d}t t ||gt j}| | d S )Nr   )r   r   r   r  r   r2   )r   Zi8str   r   r   &test_undefined_literal_struct_pickling  s    
z3TestConstant.test_undefined_literal_struct_picklingc          	   C   s.  t d}| |tj | t|d td}| |tj | t|d ttd}|t	dt	dt	dg}| t|d	 |dddg}| t|d	 |d
}| t|d | 
t |ddddg W d
Q R X tttf}tt|f}|d}| t|d |d}| t|d d
S )z@
        Instantiating a type should create a constant.
        rz   zi8 42Tzi1 truerb   ra   r_   r+  z[3 x i32] [i32 4, i32 5, i32 6]Nz[3 x i32] zeroinitializerr  )g      ?Tz/{float, i1} {float 0x3ff8000000000000, i1 true})rz   )g      ?TzL{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}})r]   rW  r   r   r1   r"   r   r9  r7   r  r   r   r  r  )r   r   Zatr  r  r   r   r   test_type_instantiaton  s*    z#TestConstant.test_type_instantiatonc             C   s   t d}| t|d dS )z8
        Constants should have a useful repr().
        rz   z!<ir.Constant type='i32' value=42>N)r7   r1   r   )r   r   r   r   r   r     s    zTestConstant.test_reprc             C   sz   t t t ddttd}|  }t ||jd}d|_	||_
tt|}tt|}| t|t| d S )Nr      
myconstantT)r   r   r9  r   r  r  r4   r   r   r   r   r(   r)   r"   r1   )r   r   r   gvZparsedZreparsedr   r   r   test_encoding_problem  s    z"TestConstant.test_encoding_problemc       	   	   C   s   |   }tttf}t||d}|dd dD }| t|d | |j	t
t t|d }| t |ttdg}W d Q R X t| d }|ttdg}| t|d | |j	t
t d S )Nr  c             S   s   g | ]}t t|qS r   )r   r   r7   )r   r   r   r   r   r!     s    z)TestConstant.test_gep.<locals>.<listcomp>)r   r   zEgetelementptr ({float, i1}, {float, i1}* @"myconstant", i32 0, i32 1)r   z5getelementptr ({float, i1}, {float, i1}* null, i32 0))r4   r   r  r  r   r   r	  r1   r"   r   r9   r   r   r  r7   rp   )	r   r   rn  r  r   ZconstZc_wrongZ	const_ptrr  r   r   r   r
  	  s    

zTestConstant.test_gepc             C   s   |   }tttf}d}tj||d|d}| |j| |dd dD }| |j	j| | t
|d | |j	tjt|d d S )Nra   r  )r   c             S   s   g | ]}t t|qS r   )r   r   r7   )r   r   r   r   r   r!   $  s    z=TestConstant.test_gep_addrspace_globalvar.<locals>.<listcomp>)r   r   zRgetelementptr ({float, i1}, {float, i1} addrspace(4)* @"myconstant", i32 0, i32 1))r4   r   r  r  r   r   r1   r   r	  r   r"   r9   )r   r   rn  r   r  r   r   r   r   test_gep_addrspace_globalvar  s    
z)TestConstant.test_gep_addrspace_globalvarc             C   s8   |   }t|td}|t }| t|d d S )Nr  z$bitcast (i32* @"myconstant" to i64*))	r4   r   r   r7   r  r~   rp   r1   r"   )r   r   r  r   r   r   r   test_bitcast*  s    zTestConstant.test_bitcastc             C   s*   t tdt }| t|d d S )Nr   zinttoptr (i32 0 to i64*))r   r   r7   r  r~   rp   r1   r"   )r   r   r   r   r   test_inttoptr0  s    zTestConstant.test_inttoptrN)rR   rS   rT   r  r  r  r  r  r  r  r   r  r
  r  r  r  r   r   r   r   r  n  s   r  c               @   s   e Zd Zdd ZdS )TestTransformsc             C   s   t  }t |t t  dd}t |t t  dd}t  }||  ||d}| 	|j
| t |||}| || | |j
| | 	|j
| d S )Nr   r   r   )r   r3   r:   r6   r   rk   r>  r=   r   r1   ZcalleeZreplace_all_callsr$   r  )r   r%   r   r   rn   r   Zmodifiedr   r   r   test_call_transform6  s    z"TestTransforms.test_call_transformN)rR   rS   rT   r  r   r   r   r   r  5  s   r  c               @   s   e Zd Zdd ZdS )TestSingletonc             C   sP   |  tjtj  |  tjttj |  tjttj | tj d S )N)r/   r   r   valuesZ
_Undefinedru  deepcopyr2   )r   r   r   r   test_undefinedE  s    zTestSingleton.test_undefinedN)rR   rS   rT   r  r   r   r   r   r  D  s   r  __main__)+rU   Z
__future__r   r   sysru  rs  r,   r   rB   r   r   r   Zllvmliter   r   r(   r   r   r]   rK  r7   r~   r  r  r   r8   version_infor   r   rV   rx   r   r   r   rV  ri  r  r  r  r  rR   mainr   r   r   r   <module>   sZ   




Vb V@-          7 H
