
    J/Ph                        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
j        d          Z e
j        d          Z e
j        d	          Z e
j        d
          Z e
j        d          Z e
j                    Z e
j                    Z e
j                    Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de          Z!d Z" G d de          Z# G d d e          Z$ G d! d"e          Z%e&d#k    r ej'                     dS dS )$z
IR Construction Tests
    N   )TestCase)ir)binding)opaque_pointers_enabled          @   c                   v    e Zd ZdZd Zd Zd Zd Zd Zdd	Z	ddZ
d Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TestBasez!
    Utilities for IR tests.
    c                     d }d                     t          ||                    }t          j        dd|          }|                     ||           dS )zr
        Assert *pattern* is in *text*, ignoring any whitespace differences
        (including newlines).
        c                 `    |                                  s|                                 sd| z   S | S )N\)isalnumisspace)cs    V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/llvmlite/tests/test_ir.pyescapez%TestBase.assertInText.<locals>.escape)   s/    99;;  qyy{{  axH     z\s+z\\s*N)joinmapresubassertRegex)selfpatterntextr   regexs        r   assertInTextzTestBase.assertInText#   s]    	 	 	
 ''#fg..//vw00u%%%%%r   c                     d t          |                                          D             }|                     ||           d S )Nc                 6    g | ]}|                                 S  )strip).0lines     r   
<listcomp>z+TestBase.assert_ir_line.<locals>.<listcomp>3   s     @@@$@@@r   )str
splitlinesassertIn)r   r'   modliness       r   assert_ir_linezTestBase.assert_ir_line2   sA    @@#c((*=*=*?*?@@@dE"""""r   c                 H    t          j        t          |                     d S N)llvmparse_assemblyr)   r   r,   s     r   assert_valid_irzTestBase.assert_valid_ir6   s    CHH%%%%%r   c                     t          j        t          j        |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	newobjects      r   assert_pickle_correctlyz TestBase.assert_pickle_correctly9   sd     Lh!D!D!DEE	h()*=>>>XI777r   c                 (    t          j                    S r0   )r   Moduler   s    r   modulezTestBase.moduleB   s    y{{r   Nmy_funcc           	          |p|                                  }t          j        t          t          t          t          t          j        t                    f          }t          j        |||          S r0   )rD   r   FunctionTypeint32dblPointerTypeFunction)r   rD   namefntys       r   functionzTestBase.functionE   sS    (4;;==uueS')~e'<'<'> ? ?{64...r   r   c                 X    |p|                                  }|                    |          S r0   )rN   append_basic_block)r   funcrL   s      r   blockzTestBase.blockK   s(    &t}}&&t,,,r   c                 Z    g }|                     |           d                    |          S Nr   )descrr   )r   thingbufs      r   rU   zTestBase.descrO   s)    Cwws||r   c                 Z    t          j        |          }|                    dd          }|S )Nz
    z
  )textwrapdedentreplace)r   asms     r   _normalize_asmzTestBase._normalize_asmT   s)    oc""kk(F++
r   c                 \    |                      |          }|                     ||           d S r0   )r]   r   r   rU   r\   expecteds       r   check_descr_regexzTestBase.check_descr_regexZ   1    &&s++)))))r   c                 \    |                      |          }|                     ||           d S r0   )r]   r=   r_   s       r   check_descrzTestBase.check_descr^   rb   r   c                 X    |                      |                     |          |           d S r0   )rd   rU   r   rR   r\   s      r   check_blockzTestBase.check_blockb   s*    E**C00000r   c                 X    |                      |                     |          |           d S r0   )ra   rU   rf   s      r   check_block_regexzTestBase.check_block_regexe   s*    tzz%00#66666r   c                     |                      |          }|                                }|                     |                                |                                           d S r0   )r]   _stringify_bodyr=   r%   r   rD   r\   r`   actuals        r   check_module_bodyzTestBase.check_module_bodyh   sT    &&s++'')))9)9:::::r   c                     |                      |          }|                                }|                     |                                |                                           dS )z6
        Check module metadata against *asm*.
        N)r]   _stringify_metadatar=   r%   rl   s        r   check_metadatazTestBase.check_metadatam   sV     &&s++++--)9)9:::::r   c                 6   |                      |          }|                     |          }|                    d          d                             d          d         }|                     |                                |                                           d S )N{   }r   )r]   rU   	partition
rpartitionr=   r%   )r   rQ   r\   r`   rm   s        r   check_func_bodyzTestBase.check_func_bodyu   s    &&s++D!!!!#&&q)44S99!<)9)9:::::r   )NrE   rT   )__name__
__module____qualname____doc__r!   r.   r4   r@   rD   rN   rR   rU   r]   ra   rd   rg   ri   rn   rq   rx   r$   r   r   r   r      s        & & &# # #& & &    / / / /- - - -  
  * * ** * *1 1 17 7 7; ; ;
; ; ;; ; ; ; ;r   r   c                   t    e Zd ZerdndZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Z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                     |                                  }|                     |                                          }|                     |                                d| j        z             d S )Nz
declare %s)rN   rU   r%   r=   protor   rQ   r\   s      r   test_declarezTestFunction.test_declare   sW    }}jj$$&&lTZ&?@@@@@r   c                    |                                  }|j                            d           |j                            d           |j                            d           d|j        _        t	          j        t          dd          }t	          j        |                                 |d          }||j        _	        | 
                    |                                          }t          r|                     |d	| j        z             n|                     |d
| j        z             |                     |           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")rN   
attributesadd
alignstackr   rG   int8rK   rD   personalityrU   r%   r   r=   r   r@   )r   rQ   tp_perspersr\   s        r   test_declare_attributesz$TestFunction.test_declare_attributes   s7   }}I&&&N+++L)))%'"/$D999{4;;=='3IJJ&*#jj$$&&" 	)SJ "Z() ) ) ) SD "Z() ) ) 	$$T*****r   c                 L   |                                  }|j        d                             d           d|j        d         j        _        d|j        d         j        _        d|j        d         j        _        |j        d                             d           |j                            d	           |                     |          	                                }t          r|                     |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"))rN   argsadd_attributer   dereferenceabledereferenceable_or_nullalignreturn_valuerU   r%   r   r=   r@   r   s      r   test_function_attributesz%TestFunction.test_function_attributes   s   }}	!""9---23	!/:<	!7()	!%	!""9---''	222jj$$&&" 	S x    S y   	$$T*****r   c                 `   |                                  }|                     |          }|                    d|                    g                      |                     |                                          }|                     |d| j         d           |                     |           d S )Ndbgdeclare z !dbg !0)	rD   rN   set_metadataadd_metadatarU   r%   r=   r   r@   r   rD   rQ   r\   s       r   test_function_metadataz#TestFunction.test_function_metadata   s    }}V$$%!4!4R!8!8999jj$$&&8DJ888	 	 	 	$$T*****r   c                     |                                  }d|_        |                     |                                          }|                     |d| j         d           |                     |           d S )N	a_sectionr   z section "a_section")rN   sectionrU   r%   r=   r   r@   r   s      r   test_function_sectionz"TestFunction.test_function_section   sy    }}"jj$$&&DDJDDD	 	 	 	$$T*****r   c                 n   |                                  }|                     |          }d|_        |                    d|                    g                      |                     |                                          }|                     |d| j         d           | 	                    |           d S )Nr   r   r   z section "a_section" !dbg !0)
rD   rN   r   r   r   rU   r%   r=   r   r@   r   s       r   test_function_section_metaz'TestFunction.test_function_section_meta   s    }}V$$"%!4!4R!8!8999jj$$&&LDJLLL	 	 	 	$$T*****r   c                    |                                  }|                     |          }|j                            d           |                    d|                    g                      |                     |                                          }|                     |d| j	         d           | 
                    |           d S )Nr   r   r   z alwaysinline !dbg !0)rD   rN   r   r   r   r   rU   r%   r=   r   r@   r   s       r   test_function_attr_metaz$TestFunction.test_function_attr_meta   s    }}V$$N+++%!4!4R!8!8999jj$$&&EDJEEE	 	 	 	$$T*****r   c                 &   |                                  }|j                            d           d|_        |                     |                                          }|                     |d| j         d           |                     |           d S )Nr   r   r   z optsize section "a_section")	rN   r   r   r   rU   r%   r=   r   r@   r   s      r   test_function_attr_sectionz'TestFunction.test_function_attr_section   s    }}I&&&"jj$$&&LDJLLL	N 	N 	N 	$$T*****r   c                    |                                  }|                     |          }|j                            d           d|_        |                    d|                    g                      |                     |                                          }| 	                    |d| j
         d           |                     |           d S )Nr   r   r   r   z) alwaysinline section "a_section" !dbg !0)rD   rN   r   r   r   r   r   rU   r%   r=   r   r@   r   s       r   test_function_attr_section_metaz,TestFunction.test_function_attr_section_meta   s    }}V$$N+++"%!4!4R!8!8999jj$$&&YDJYYY	 	 	 	$$T*****r   c                 d   |                                  }|j                            d           |                    d          }t	          j        |          }|                                 |                     |          }|                     |d	                    | j
                             d S )Nr   my_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )r   )rN   r   r   rP   r   	IRBuilderret_voidrU   rd   formatr   )r   rQ   rR   builderr\   s        r   test_definezTestFunction.test_define  s    }}N+++''
33,u%%jj  TZ((	* 	* 	* 	* 	*r   c                    |                                  }t                                          }|                    dt          g          }|                    d|t
          g          }|                    d||t
          g          }|                    d          }|                     |                     |                                          d           t          rw|                     |                     |                                          d           |                     |                     |                                          d           nv|                     |                     |                                          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.p0i8.i32"(ptr %".1", i8 %".2", i32 %".3", i1 %".4")zd                declare void @"llvm.memcpy.p0i8.p0i8.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"))
rD   r   
as_pointerdeclare_intrinsicrI   rH   rd   rU   r%   r   )r   rD   pint8powimemsetmemcpyassumes          r   test_declare_intrinsicsz$TestFunction.test_declare_intrinsics  s   !!''cU;;))-%HH))-%9NOO))-88D))//11 4H 	I 	I 	I # 		iTZZ//5577 :b c c cTZZ//5577 :h i i i i TZZ//5577 :b c c cTZZ//5577 :h i i iF++1133 65 	6 	6 	6 	6 	6r   c                     |                                  }|                    dt          g          }|                    dt          g          }|                     ||           d S )Nr   )rD   r   rI   r;   )r   rD   r   powi2s       r   test_redeclare_intrinsicz%TestFunction.test_redeclare_intrinsic-  sW    ''cU;;((se<<dE"""""r   c                 X    |                                  }|                     |           d S r0   )rN   r@   )r   fns     r   test_picklingzTestFunction.test_pickling3  s)    ]]__$$R(((((r   c                 ,   |                                  }|                     |          }|j                            d           d}|                     t
          |          5  |j                            d           d d d            d S # 1 swxY w Y   d S )Nr   $Can't have alwaysinline and noinlinenoinlinerD   rN   r   r   assertRaisesRegex
ValueErrorr   rD   rQ   msgs       r   %test_alwaysinline_noinline_disallowedz2TestFunction.test_alwaysinline_noinline_disallowed7  s    }}V$$N+++4##J44 	, 	,O
+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,   !B		BBc                 ,   |                                  }|                     |          }|j                            d           d}|                     t
          |          5  |j                            d           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r   s       r   %test_noinline_alwaysinline_disallowedz2TestFunction.test_noinline_alwaysinline_disallowed@  s    }}V$$J'''4##J44 	0 	0O///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0r   N)ry   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r   r   r~   r~   |   s       
 #	MKKL 

A A A+ + +6+ + +,
+ 
+ 
+	+ 	+ 	++ + ++ + +	+ 	+ 	++ + +* * * 6 6 60# # #) ) ), , ,0 0 0 0 0r   r~   c                   h    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZdS )TestIRc                     |                                  }|                    t          d          t          d          g           |                     d|           |                     |           d S )N{   *   z!0 = !{ i32 123, i8 42 })rD   r   rH   r   r.   r4   r3   s     r   test_unnamed_metadatazTestIR.test_unnamed_metadataL  se    kkmm%**d2hh/0006<<<S!!!!!r   c                    |                                  }|                    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 })rD   r   rH   int64r;   r.   )r   r,   m0m1m2s        r   test_unnamed_metadata_2zTestIR.test_unnamed_metadata_2S  s    kkmmuSzz8455uSzz2.//uSzz2.//b""b"&&&:C@@@3S9992C88888r   c                 R   |                                  }|                    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 })rD   r   rH   r.   r3   s     r   test_unnamed_metadata_3zTestIR.test_unnamed_metadata_3c  s    kkmm%**uSzzlU3ZZL5::,OPPP/555/555;SAAAAAr   c                     |                                  }|                    dg           |                     d|           d S )Nz"\$z!0 = !{ !"\22\5c$" })rD   r   r.   r3   s     r   test_metadata_stringzTestIR.test_metadata_stringk  sB    kkmm'###4c:::::r   c                    |                                  }|                    t          d          g          }|                    t          d          g          }|                    d          }|                    |           |                    |           |                    |           |                     d|           |                     |           |                     ||	                    d                     | 
                    t                    5  |	                    d           d d d            d S # 1 swxY w Y   d S )Nr   r   fooz!foo = !{ !0, !1, !0 }bar)rD   r   rH   r   add_named_metadatar   r.   r4   r;   get_named_metadataassertRaisesKeyError)r   r,   r   r   nmds        r   test_named_metadatazTestIR.test_named_metadataq  s^   kkmmuSzzl++uSzzl++$$U++4c:::S!!!c311%88999x(( 	* 	*""5)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   E  EEc                 t   |                                  }|                    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 = !{  })rD   r   rH   r   r   r.   r4   )r   r,   r   s      r   test_named_metadata_2zTestIR.test_named_metadata_2  s/   kkmmuSzzl++ub)))uuSzzl333uxj111ub)))4c:::/555/55513777,c222L#...S!!!!!r   c                    |                                  }|                    t                                          d           g           t          r|                     d|           n|                     d|           |                     |           |                                  }|                    d t          d          g           |                     d|           |                     |           d S )Nz!0 = !{ ptr null }z!0 = !{ i32* null }r   z!0 = !{ null, i32 123 })rD   r   rH   r   r   r.   r4   r3   s     r   test_metadata_nullzTestIR.test_metadata_null  s    kkmm%**,,T223444" 	< 4c:::: 5s;;;S!!!kkmm$c

+,,,5s;;;S!!!!!r   c           
      z   |                                  }|                    dddd          }|                    dd|                    d g          i          }|                    dt          j        d          |d	d
dd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DISubprogramrE      F)rL   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))rD   add_debug_infor   r   DITokenr)   r.   r4   )r   r,   di_filedi_func_typedi_compileunitstrmods         r   test_debug_infozTestIR.test_debug_info  s    kkmm$$X0
 0
   ))*<S%%tf--?
   ++O
#344>
 >
  ,   	> ",
 ,
  	 	 	 	 SM"	$ 	$ 	$,f555?HHH D #	$ 	$ 	$ 	 " #	$ 	$ 	$ 	S!!!!!r   c                 @   |                                  }|                    dddd          }|                    dddd          }|                    ddd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"))rD   r  r;   r=   lenr)   r.   r4   )r   r,   di1di2di3di4r  s          r   test_debug_info_2zTestIR.test_debug_info_2  sw   kkmm  .3/4"$ "$% %   .3/4"$ "$% %   .3/4"$ "$% %   .3/4"$ "$15 ! 7 7 	c3c3S122A666SM"	$ 	$ 	$M"	$ 	$ 	$ %&,	. 	. 	.S!!!!!r   c                    |                                  }t          j        |t          j                    d          }t          j        t          j                    d          |_        |                    dddt          j        d          d          }|                    d|                    d	i           |                    d
|j        |ddd          d          }|	                    d|           t          |          }|                     d|           |                     d|           |                     d|           |                     d|           |                     d|            t          j        d          d          d t          j        d          d          g} t          j        d          d          d t          j        d          d          g}|                    |          }|                    |          }|                    d          }|                    |           |                    |           |                    dddd          }	|                    dt          j        d           |	t          j        d!          |                    |g          d"d          }
|                    d#|
           d S )$Ngvarr   DIBasicTypefloatr
   DW_ATE_float)rL   sizeencodingDIGlobalVariableExpressionDIExpressionDIGlobalVariableT)rL   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 !3rt   zDwarf Versionr   zDebug Info Versionr   zllvm.module.flagsr   r   r   r   r   r   	FullDebug)r   r  emissionKindglobalszllvm.dbg.cu)rD   r   GlobalVariable	FloatTypeConstantinitializerr  r  rL   r   r)   r.   IntTyper   r   r   )r   r,   r  di_floatdi_gvarr  dverdiverflagsr  di_cus              r   test_debug_info_gvarzTestIR.test_debug_info_gvar  s
    kkmm blnnf==;r|~~r::%%m
>226
 6
  
 $$%A&&~r::%%&8	  $; ;  	 & ! !D
 D
   	%))) S 78>	@ 	@ 	@2F;;; <=C	E 	E 	E '(.	0 	0 	0 &'-	/ 	/ 	/ 
2q!!?NBJrNN14E4EFB""$8."*R..:K:KL%%  ''&&':;;		$		%$$X0
 0
   ""?
#344J{33''	22	5
 5

  #   	}e44444r   c                    |                                  }|                    dddi           t          |          }d                    t	          d d                                                    }|                     d| d|           d S )	NDILocalVariablerL   u   a∆r   c                     d| dS )Nr   02xr$   )xs    r   <lambda>z7TestIR.test_debug_info_unicode_string.<locals>.<lambda>7  s    \!\\\ r   u   ∆z!0 = !DILocalVariable(name: "az"))rD   r  r)   r   r   encoder.   )r   r,   r  rL   s       r   test_debug_info_unicode_stringz%TestIR.test_debug_info_unicode_string1  s    kkmm,vv.>???Swws115<<>>BBCCETEEEvNNNNNr   c                 D   |                                  }t          j        |t          j        t          j                    g           d          }t          j        |                    d                    }t          j        t          t          g          }t          j        |ddd          }|	                    |t          d          g           |
                                 d}|                     |t          |                     |                     |           d S )	Nr   r   
mov $1, $2=r,rTside_effectr   8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))rD   r   rK   rG   VoidTyper   rP   rH   	InlineAsmcallr   r!   r)   r4   )r   r,   r   r   asmtyr\   pats          r   test_inline_assemblyzTestIR.test_inline_assembly:  s    kkmmk#rr{}}bAA5II,s55b99::w//l5,DIIIS5::,'''H#s3xx(((S!!!!!r   c                    |                                  }t          j        |t          j        t          j                    g           d          }t          j        |                    d                    }t          j        t          t          g          }|                    |ddt          d          gd           |	                                 d}| 
                    |t          |                     |                     |           d S )	Nr   r   r@  rA  r   TrB  rD  )rD   r   rK   rG   rE  r   rP   rH   r\   r   r!   r)   r4   )r   r,   r   r   rH  rI  s         r   test_builder_asmzTestIR.test_builder_asmF  s    kkmmk#rr{}}bAA5II,s55b99::w//E<%**4PPPH#s3xx(((S!!!!!r   c                    |                                  }t          j        |t          j        t          j                    g           d          }t          j        |                    d                    }|                    t          j        d          d           |	                                 d}| 
                    |t          |                     |                     |           d S )Nr   r   r   raxzcall i64 asm "", "={rax}")rD   r   rK   rG   rE  r   rP   load_regr/  r   r!   r)   r4   r   r,   r   r   rI  s        r   test_builder_load_regzTestIR.test_builder_load_regQ  s    kkmmk#rr{}}bAA5II,s55b99::B///)#s3xx(((S!!!!!r   c                    |                                  }t          j        |t          j        t          j                    g           d          }t          j        |                    d                    }|                    t          d          t          j	        d          d           |
                                 d}|                     |t          |                     |                     |           d S )Nr   r   r   r   rN  z0call void asm sideeffect "", "{rax}" ( i64 123 ))rD   r   rK   rG   rE  r   rP   	store_regr   r/  r   r!   r)   r4   rP  s        r   test_builder_store_regzTestIR.test_builder_store_reg[  s    kkmmk#rr{}}bAA5II,s55b99::%**bjnne<<<@#s3xx(((S!!!!!r   N)ry   rz   r{   r   r   r   r   r   r   r   r  r  r6  r>  rJ  rL  rQ  rT  r$   r   r   r   r   J  s        " " "9 9 9 B B B; ; ;* * * " " " " " " +" +" +"Z" " ">B5 B5 B5HO O O
" 
" 
"	" 	" 	"" " "" " " " "r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TestGlobalValuesc                 4   |                                  }t          j        |t          j        t          j                    g           d          }t          j        |t          j        t          j                    g           d           t          j        |t          j                    d          }|                     |                    d          |           |                     |                    d          |           | 	                    t                    5  |                    d           d d d            n# 1 swxY w Y   t          r%|                     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*'>)rD   r   rK   rG   rE  r+  
DoubleTyper=   
get_globalr   r   r   repr)r   r,   r   rX  s       r   test_globals_accessz$TestGlobalValues.test_globals_accessh  s   kkmmk#rr{}}bAA5II
C;;UCCC&sBMOO\JJ
..44455zBBBx(( 	" 	"NN5!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" # 	FT*--MO O O O O Z  DF F F F Fs   D>>EEc                    |                                  }t          j        t          j                    g           }t          j        ||d          }t          j        ||d          }t          j        |t          j                    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   rX  N)rD   r   rG   rE  rK   r+  rZ  r=   set	functionsglobal_values)r   r,   ftyr   r   rX  s         r   #test_functions_global_values_accessz4TestGlobalValues.test_functions_global_values_access{  s    
 kkmmobkmmR00k#sE**k#sE**&sBMOO\JJ
S]++S#s__===S.//c3
5K1L1LMMMMMr   c                 t   |                                  }t          j        |t          d          }t          j        |t          dd          }t          j        |t          d          }t	          d          |_        t          j        |t          d          }d|_        t          j        |t          d	          }d
|_        t          j        |t          dd          }d|_        t          j        |t          d          }d
|_        t	          d          |_        d|_	        t          j        |t          d          }	d
|	_        t	          d          |	_        d|	_
        t          j        |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)rD   r   r+  r   rH   r.  global_constantlinkageunnamed_addrr   r   rn   )r   r,   re  rf  r   ri  rj  rl  rm  rn  rp  s              r   test_global_variables_irz)TestGlobalValues.test_global_variables_ir  ss    kkmmc4--c4;;;c5#..c

c5#.. c5#..	c5#===c5#..	c

c5#..	c

	c5#..	c

	s 
% 
	 
	 
	 
	 
	r   c                 X    |                                  }|                     |           d S r0   )rD   r@   r3   s     r   test_picklezTestGlobalValues.test_pickle  s)    kkmm$$S)))))r   N)ry   rz   r{   r]  rc  ru  rw  r$   r   r   rV  rV  f  sW        F F F&N N N) ) )V* * * * *r   rV  c                   &    e Zd Zd Zd Zd Zd ZdS )	TestBlockc                     |                                  }t          j        |d          }|                     |j        |           |                     |j                   d S )NstartparentrL   )rN   r   Blockr;   r}  assertFalseis_terminatedr   rQ   rR   s      r   test_attributeszTestBlock.test_attributes  sV    }}7333elD))),-----r   c                    |                      d          }|                     |                     |          d           |j                            ddg           |                     |                     |          d           d S )Nr   rL   z
my_block:
re  rf  zmy_block:
  a
  b
)rR   r=   rU   instructionsextend)r   rR   s     r   
test_descrzTestBlock.test_descr  s{    



++E**M:::!!3*---E**,CDDDDDr   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||d          }|                    ||d          }|                    ||d           t          j        ||j	        d||fd          }| 
                    |d	           |                    ||           | 
                    |d
           d S )Nr   r  rt   r   ri  rj  sdivrl  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"
            )rR   r   r   rN   r   r   r   mulInstructionr	  rg   r[   )r   rR   r   re  rf  r   ri  rl  s           r   test_replacezTestBlock.test_replace  s    



++,u%%$RaR(1KK1c""KK1c""Aq#N5!&&1a&#>> ! 	 	 	 	a ! 	 	 	 	 	r   c                     |                                  }t          j        |d          }|                     t	          |          d           dS )z4
        Blocks should have a useful repr()
        r{  r|  z"<ir.Block 'start' of type 'label'>N)rN   r   r~  r=   r\  r  s      r   	test_reprzTestBlock.test_repr  sH     }}7333e&JKKKKKr   N)ry   rz   r{   r  r  r  r  r$   r   r   ry  ry    sX        . . .E E E  ,L L L L Lr   ry  c                   `   e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d:S );TestBuildInstructionszN
    Test IR generation of LLVM instructions through the IRBuilder class.
    i  c                 (   |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||d          }|                     |d           |                     t          |          d           d S )Nr   r  rt   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>)>)	rR   r   r   rN   r   r   rg   r=   r\  )r   rR   r   re  rf  insts         r   test_simplez!TestBuildInstructions.test_simple  s    



++,u%%$RaR(1{{1a'' ! 	 	 	
 	d<	= 	= 	= 	= 	=r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}}|                    ||d           |                    ||d           |                    ||d           |                    ||d           |	                    ||d           |
                    ||d	           |                    ||d
           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                    ||d           |                     t0                    5 }|                    ||           d d d            n# 1 swxY w Y   |                     t5          |j                  d           |                     |j                   |                     |d           d S )Nr   r  r   r   ri  rj  rl  rm  rn  rp  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"
            )rR   r   r   rN   r   r   faddr   fsubr  fmuludivr  fdivuremsremfremor_and_xorshlashrlshrr   r   r=   r)   	exceptionr  r  rg   )r   rR   r   re  rf  ffcms          r   test_binopsz!TestBuildInstructions.test_binops  s   



++,u%%#(!,1bAq#Q3Aq#Q3Aq#Q3Q3Q3Q3Q3Q3Q3Aq#Q3Aq#Aq#Q3Q3z** 	bKK2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	R\**L	N 	N 	N,--- ! 	 	 	 	 	s   ;HH"%H"c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||dd           |                    ||ddd	g           |                     |d
           d S )Nr   r  rt   r   )nuwr4  ri  r  nswz            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )rR   r   r   rN   r   r   r   rg   r   rR   r   re  rf  s        r   test_binop_flagsz&TestBuildInstructions.test_binop_flags,  s    



++,u%%$RaR(1Aq#X...Aq#eU^444 ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||dd           |                    ||ddd	g           |                     |d
           d S )Nr   r  rt   r   fastr  ri  ninfnszz            my_block:
                %"c" = fadd fast i32 %".1", %".2"
                %"d" = fsub ninf nsz i32 %".1", %".2"
            )rR   r   r   rN   r   r  r  rg   r  s        r   test_binop_fastmath_flagsz/TestBuildInstructions.test_binop_fastmath_flags:  s    



++,u%%$RaR(1Q3i000Q3vuo666 ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||d           |                    ||d           |                    ||d           |                    ||d           |	                    ||d           |
                    ||d	           |                     |d
           d S )Nr   r  rt   r   ri  rj  rl  rm  rn  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")
            )rR   r   r   rN   r   sadd_with_overflowsmul_with_overflowssub_with_overflowuadd_with_overflowumul_with_overflowusub_with_overflowrg   r  s        r   test_binops_with_overflowz/TestBuildInstructions.test_binops_with_overflowH  s    



++,u%%$RaR(1""1a---""1a---""1a---""1a---""1a---""1a--- ! 	 	 	 	 	r   c                 n   |                      d          }t          j        |          }|j        j        d d         \  }}}|                    |d           |                    |d           |                    |d           |                     |j	                   | 
                    |d           d S )Nr   r  r   ri  rj  rl  z            my_block:
                %"d" = sub i32 0, %".1"
                %"e" = xor i32 %".2", -1
                %"f" = fneg double %".3"
            )rR   r   r   rN   r   negnot_fnegr  r  rg   r   rR   r   re  rf  r   s         r   test_unary_opsz$TestBuildInstructions.test_unary_ops\  s    



++,u%%"'+1aAsQQ,--- ! 	 	 	 	 	r   c                 *   |                      d          }t          j        |          }|j        j        d d         \  }}t          j        t          j        d          t          j                  }t          j        t          j        d          t          j                  }|                    ||d          }| 	                    |d           |
                    ||           |
                    ||           | 	                    |d           d S )Nr   r  rt   r
   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )rR   r   r   rN   r   r-  r/  	Undefinedr   rg   replace_usage)r   rR   r   re  rf  undef1undef2r   s           r   test_replace_operandz*TestBuildInstructions.test_replace_operandk  s    



++,u%%$RaR(1RZ^^R\::RZ^^R\::KK,, ! 	 	 	 	
"""	""" ! 	 	 	 	 	r   c                 P   |                      d          }t          j        |          }|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                    5  |                    d||d           d d d            n# 1 swxY w Y   |                     t                    5  |                    d||d           d d d            n# 1 swxY w Y   | 	                    |j
                   |                     |d           d S )Nr   r  rt   ==r   !=ri  <rj  <=rl  >rm  >=rn  rp  r  r  r  r  r  unozzr   aj              my_block:
                %"c" = icmp eq i32 %".1", %".2"
                %"d" = icmp ne i32 %".1", %".2"
                %"e" = icmp ult i32 %".1", %".2"
                %"f" = icmp ule i32 %".1", %".2"
                %"g" = icmp ugt i32 %".1", %".2"
                %"h" = icmp uge i32 %".1", %".2"
                %"i" = icmp eq i32 %".1", %".2"
                %"j" = icmp ne i32 %".1", %".2"
                %"k" = icmp slt i32 %".1", %".2"
                %"l" = icmp sle i32 %".1", %".2"
                %"m" = icmp sgt i32 %".1", %".2"
                %"n" = icmp sge i32 %".1", %".2"
            )rR   r   r   rN   r   icmp_unsignedicmp_signedr   r   r  r  rg   r  s        r   test_integer_comparisonsz.TestBuildInstructions.test_integer_comparisons}  s   



++,u%%$RaR(1dAq#...dAq#...c1a---dAq#...c1a---dAq#...D!Q,,,D!Q,,,CAs+++D!Q,,,CAs+++D!Q,,,z** 	3 	3q!T222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3z** 	3 	3q!T222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3,--- ! 	 	 	 	 	s$   <F!!F%(F%G++G/2G/c                     |                      d          }t          j        |          }|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           |                    d||dg d           |                     |j                   | 	                    |d            d S )!Nr   r  rt   r  r   r  ri  r  rj  r  rl  r  rm  r  rn  rp  r  r  r  r  r  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"
            )
rR   r   r   rN   r   fcmp_orderedfcmp_unorderedr  r  rg   r  s        r   test_float_comparisonsz,TestBuildInstructions.test_float_comparisons  sM   



++,u%%$RaR(1T1a---T1a---S!Q,,,T1a---S!Q,,,T1a---tQ3///tQ3///sAq#...tQ3///sAq#...tQ3///UAq#...UAq#...uaC000uaC000uaC%L%L%L 	 	N 	N 	N,--- ! 	 	 	 	 	r   c                    |                      d          }t          j        t          d          }t          j        |          }|j        j        d d         \  }}|                    |||dd           |                     |j	                   |
                                 |                     |j	                   |                     |d           d S )	Nr   r  Trt   r   )r  r  r  z            my_block:
                %"c" = select arcp nnan i1 true, i32 %".1", i32 %".2"
                unreachable
            )rR   r   r-  int1r   rN   r   selectr  r  unreachable
assertTruerg   )r   rR   r  r   re  rf  s         r   test_misc_opsz#TestBuildInstructions.test_misc_ops  s    



++Kd##,u%%$RaR(1q!Q+;<<<,---+,,, ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|j                            d          }|j                            d          }|                    t          dd          }|                    ||           |                    ||           | 	                    |j
                   |                     |d	           d S )
Nr   r  rt   b2b3my_phir  r  zj            my_block:
                %"my_phi" = phi fast i32 [%".1", %"b2"], [%".2", %"b3"]
            )rR   r   r   rN   r   rP   phirH   add_incomingr  r  rg   )r   rR   r   re  rf  bb2bb3r  s           r   test_phizTestBuildInstructions.test_phi  s    



++,u%%$RaR(111$7711$77kk%k;;C   C   ,--- ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}}|                    t          d          }|                    t          dd          }|                    t          |d          }d	|_        | 	                    |j
        t          j        t                               |                    ||          }	| 	                    |	j
        t          j                               |                    ||          }
| 	                    |
j
        t          j                               |                    |d
          }| 	                    |j
        t                     |                    ||d          }| 	                    |j
        t          j                               |                    |dd          }| 	                    |j
        t                     |                    ||dd          }| 	                    |j
        t          j                               |                    |ddd          }| 	                    |j
        t                     t"          r't          j        t          j                    d           }n,t          j        t          j        t                    d           }|                    t          j        t          d          |           |                     t(                    5  |                    ||           d d d            n# 1 swxY w Y   |                     t(                    5  |                    |           d d d            n# 1 swxY w Y   |                     t(                    5 }|                    ||           d d d            n# 1 swxY w Y   t"          r@| 	                    t+          |j                  d           |                     |d           d S | 	                    t+          |j                  d           |                     |d           d S )Nr   r  r   r   r   ri  )r   rL   rj  r   rm  r   )r   rp  seq_cstr   )orderingr   r  )r  r   rL   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
                )rR   r   r   rN   r   allocarH   rI   r   r=   r	  rJ   storerE  loadstore_atomicload_atomicr   r-  r   	TypeErrorr)   r  rg   )r   rR   r   re  rf  zr   ri  rj  eerl  rm  rn  rp  r  r  ptrr  s                     r   test_mem_opsz"TestBuildInstructions.test_mem_ops  s   



++,u%%"'+1aNN5sN++NN5rN44NN3QSN11!4!4555]]1a  "+--000MM!Q///LLC  '''MM!QaM((///LLCqL))'''  A	 CC///IQSII'''" 	;+bn..55CC+bnU33T::Cbk%++S111y)) 	  	 MM!Q	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 y)) 	 	LLOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 y)) 	 RMM!Q	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  # !	S..IK K KU %      S..MO O OU %     s6   (MMM0NNN7OO!Oc                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    t          j        t                    d          }|                    |t          j	        t          d          |gd          }| 
                    |j        t          j        t                               t          r|                     |d           d S |                     |d           d S )	Nr   r  rt   r   r   ri  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"
                )rR   r   r   rN   r   r  rJ   rH   gepr-  r=   r	  r   rg   r   rR   r   re  rf  r   ri  s          r   test_gepzTestBuildInstructions.test_gep8  s   



++,u%%$RaR(1NN2>%00sN;;KKBKq1115CK@@!6!6777" 	U %      U %     r   c                 \   |                      d          }t          j        |          }|j        j        d d         \  }}t
                                          }t          j        t          |||t          g          }|	                    ||                                d          }|
                    |d dD             d          }|                     |j        t          j        |                     t          r|                     |d           d S |                     |d	           d S )
Nr   r  rt   ri  c                 B    g | ]}t          j        t          |          S r$   r   r-  rH   r&   r;  s     r   r(   z<TestBuildInstructions.test_gep_castinstr.<locals>.<listcomp>W  $    BBBaBKq11BBBr   r   r   rj  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
                )rR   r   r   rN   r   r   r   LiteralStructTyper   bitcastr  r=   r	  rJ   r   rg   )	r   rR   r   re  rf  int8ptrlsri  rj  s	            r   test_gep_castinstrz(TestBuildInstructions.test_gep_castinstrN  s+    



++,u%%$RaR(1//##!5'7GU"KLLOOAr}}SO99KKBB6BBBKMM!8!8999" 	U %      U %     r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}d}t
                                          }t          j        t          |||t          g          }|	                    ||                    |          d          }|
                    |d dD             d	          }	|                     |	j        j        |           |                     |	j        t          j        ||                     t          r|                     |d
           d S |                     |d           d S )Nr   r  rt   r   rg  ri  c                 B    g | ]}t          j        t          |          S r$   r  r  s     r   r(   zFTestBuildInstructions.test_gep_castinstr_addrspace.<locals>.<listcomp>q  r  r   r  rj  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
                )rR   r   r   rN   r   r   r   r  r   r  r  r=   r	  rh  rJ   r   rg   )
r   rR   r   re  rf  rh  r  r  ri  rj  s
             r   test_gep_castinstr_addrspacez2TestBuildInstructions.test_gep_castinstr_addrspaceg  sV    



++,u%%$RaR(1	//##!5'7GU"KLLOOAr}}y}AAOLLKKBB6BBBKMM)95559!M!M!MNNN" 	U %      U %     r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}d}|                    t          j        t          |          d          }t          r)| 	                    t          |j                  d           n(| 	                    t          |j                  d           | 	                    |j        j        j        |           |                    |t          j        t          d	          |gd
          }| 	                    |j        j        |           |                    |t          j        t          d          gd          }| 	                    |j        j        |           t          r|                     |d           d S |                     |d           d S )Nr   r  rt   r   rg  r   r  zi32 addrspace(4)**r   ri  r   rj  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
                )rR   r   r   rN   r   r  rJ   rH   r   r=   r)   r	  pointeerh  r  r-  rg   )	r   rR   r   re  rf  rh  r   ri  rj  s	            r   test_gep_addrspacez(TestBuildInstructions.test_gep_addrspace  s   



++,u%%$RaR(1	NN2>%9EEECNPP" 	@S[[%0000S[[*>???19===KKBKq1115CK@@)9555KKBKr223#K>>)9555" 	U %      U %     r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}t          j        t          t          g          }t          j        t          |g          }t          j	        |t          j	        t          d          t          j	        t          d          f          }|
                    |dd          }|                    ||dd          }	|                    |	t          j	        t          d	          d
d          }
|                     |	j        |           |                     |
j        |           |                    |d          }|                    |d          }|
                    |dd          }|
                    |d
d          }|
                    |dd          }|
                    |dd          }|                    ||d
d          }|                    ||dd          }|                     |j        t                     |                     |j        |           |                     |j        t                     |                     |j        t                     |                     |j        |           |                     |j        |           |                     t"                    5  |
                    |d           d d d            n# 1 swxY w Y   |                     t"                    5  |
                    |d           d d d            n# 1 swxY w Y   |                     t"                    5  |
                    |d           d d d            n# 1 swxY w Y   |                     t"                    5  |                    ||d           d d d            n# 1 swxY w Y   |                     t"                    5  |                    ||d
           d d d            n# 1 swxY w Y   t$          r|                     |d           d S |                     |d           d S )Nr   r  rt   r   Tr   r   ri  Fr   rj  r  r  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}}, 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
                )rR   r   r   rN   r   r  rH   r  r   r-  extract_valueinsert_valuer=   r	  r  r  r   r  r   rg   )r   rR   r   re  rf  tp_innertp_outerc_innerr   ri  rj  p_outerr  r  r  r  r  r  r  s                      r   test_extract_insert_valuez/TestBuildInstructions.test_extract_insert_value  sl   



++,u%%$RaR(1'66'x(899+hUA)>)>)+T4)@)@)B C C !!'13!77  !QS 99  BKe$<$<ac JJ******...66LLsL++!!!QS!11!!!QS!11!!!V#!66!!!V#!66  Aqs 33  AvC 88&&&***'''&&&******y)) 	. 	.!!'1---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. y)) 	3 	3!!'6222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 y)) 	. 	.!!'1---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. y)) 	* 	*  Aq)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* y)) 	0 	0  !Q///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0
 # 	U %      U %     sZ   'L

LL/MMM7NN!N?O##O'*O'P,,P03P0c                    |                      d          }t          j        |          }|j        j        d d         \  }}}}|                    |t          d          }|                    |t          d          }|	                    |t          d          }	|
                    |t          d          }
|                    |
t          d          }|                    |t          d	          }|                    |t          d
          }|                    |t          d          }|                    |t          d          }|                    |t          d          }|                    |t          j        t                    d          }|                    |t          d          }|                     |j                   t0          r|                     |d           d S |                     |d           d S )Nr   r  r   r   ri  rj  fbfcrm  rn  fdferp  r  r  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
                )rR   r   r   rN   r   truncr   zextrH   sextfptruncfltfpextrI   fptouifptosiuitofpsitofpptrtointinttoptrrJ   r  r  r  r   rg   )r   rR   r   re  rf  far  r   ri  rj  r%  r&  rm  rn  r'  r(  rp  r  r  s                      r   test_cast_opsz#TestBuildInstructions.test_cast_ops  s   



++,u%%(-bqb11b#MM!TM,,LLEL,,LLEL,,__Rd++]]2sD))NN2uc**NN2tS))^^AsD))^^AsD))S%--Qt 4 4c::OOAsC((,---" 	U %       U %     r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    t          d          }|                    d||dd          }|                     |j	        t                     t          r|                     |d           d S |                     |d	           d S )
Nr   r  rt   r   r   	monotonicri  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
                )rR   r   r   rN   r   r  rH   
atomic_rmwr=   r	  r   rg   r	  s          r   test_atomicrmwz$TestBuildInstructions.test_atomicrmw#  s    



++,u%%$RaR(1NN5sN++uaK=='''" 	U %      U %     r   c                    |                      d          }t          j        |          }|j                            d          }|                    |           |                     |j                   |                     |d           d S )Nr   r  targetzE            my_block:
                br label %"target"
            )	rR   r   r   rN   rP   branchr  r  rg   )r   rR   r   	bb_targets       r   test_branchz!TestBuildInstructions.test_branch8  s    



++,u%%$77X7FF	y!!!+,,, ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j                            d          }|j                            d          }|                    t          j        t          d          ||           |                     |j	                   | 
                    |d           d S )Nr   r  b_trueb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )rR   r   r   rN   rP   cbranchr-  r  r  r  rg   )r   rR   r   bb_truebb_falses        r   test_cbranchz"TestBuildInstructions.test_cbranchC  s    



++,u%%"5585DD#66I6FFD%00'8DDD+,,, ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j                            d          }|j                            d          }|                    t          j        t          d          ||          }|                    ddg           | 	                    |j
                   |                     |d           |                     |j        d	           d S )
Nr   r  rA  rB  Fr   r   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )rR   r   r   rN   rP   rC  r-  r  set_weightsr  r  rg   rq   rD   )r   rR   r   rD  rE  brs         r   test_cbranch_weightsz*TestBuildInstructions.test_cbranch_weightsO  s    



++,u%%"5585DD#66I6FF__R[u55wII
2w+,,, ! 	 	 	 	GN - 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j                            d          }|j                            d          }|                    t          j        |j        |                    }|                    |           |                    |           |                     |j	                   t          r|                     |d           d S |                     |d           d S )Nr   r  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"]
                )rR   r   r   rN   rP   branch_indirectBlockAddressadd_destinationr  r  r   rg   )r   rR   r   bb_1bb_2
indirectbrs         r   test_branch_indirectz*TestBuildInstructions.test_branch_indirect_  s   



++,u%%222>>222>>,,OG,d335 5
""4(((""4(((+,,," 		U %     
 U %     r   c                 R     fd}                      d          }t          j        |          }|                                  ||d                                 d          }t          j        |          }|                    t          d                      ||d                                 d          }t          j        |          }|                                }|                    d|j                            d	                      ||d
                                 d          }t          j        |          }|                    t          d                    }|                    d|j                            d	                      ||d           d S )Nc                 h                         | j                                       | |           d S r0   )r  r  rg   )rR   expected_irr   s     r   checkz1TestBuildInstructions.test_returns.<locals>.checkv  s4    OOE/000UK00000r   r   r  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
            )	rR   r   r   r   retrH   r   rD   r   )r   rX  rR   r   r  s   `    r   test_returnsz"TestBuildInstructions.test_returnsu  s   	1 	1 	1 	1 	1 



++,u%%e  	 	 	
 


..,u%%E!HHe  	 	 	 



++,u%%!!%!:!:2!>!>???e  	 	 	
 



++,u%%{{588$$%!:!:2!>!>???e  	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|j                            d          }|j                            d          }|j                            d          }|j                            d          }|                    ||          }	|	                    t          j        t          d          |           |	                    t          j        t          d	          |           |	                    d|           | 
                    |j                   |                     |d
           d S )Nr   r  rt   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"]
            )rR   r   r   rN   r   rP   switchadd_caser-  rH   r  r  rg   )
r   rR   r   re  rf  	bb_onzerobb_ononebb_ontwobb_elsesws
             r   test_switchz!TestBuildInstructions.test_switch  sE   



++,u%%$RaR(1$77X7FF	#66G6DD#66G6DD"55;5GG^^Aw''
BKq))9555
BKq))8444
Ax   +,,, ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}t          j        t          t          t          f          }t          j        t          t          fd          }t          j        t          t          t          f          }t          j
        |j        j        |d          }t          j
        |j        j        |d          }	t          j
        |j        j        |d          }
|                    |||fd	           |                    |	||fd
           |                    |
||fd           |                    |||fdd           |                    |||fd          }|j                            d           |                    |||fdd           |                    |||fdd           |                    |||fdd           |                    |||fdd           |                    |||fdd           |                    |||fdd           |                     |d           d S ) Nr   r  rt   Tr   rl  rm  rn  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_alwaysinliner   res_noinline_ro)r   rr  res_convergentr   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
        )rR   r   r   rN   r   rG   r-  rH   rI   hlfrK   rD   rG  r   r   rg   )r   rR   r   re  rf  tp_ftp_gtp_hrl  rm  rn  rq  s               r   	test_callzTestBuildInstructions.test_call  sT   



++,u%%$RaR(1sUEN33sUHd;;;sUEN33K(/s;;K(/s;;K(/s;;QA(((QA(((QA(((QAH=== a!Q1ABB!%%j111QA
V<<<QA:JKKKQAjAAAQA 2.IIIQA 1 :F 	G 	G 	GQA 0EEE ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }t          j        t          j                    t          j                    gdz            }t          j        |j        |d          }|                    t          d          }|j        
                    d          }|                    ||||f           t          r|                     |d           d	S |                     |d           d	S )
z9
        Function calls with metadata arguments.
        r   r  r   zllvm.dbg.declarere  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)rR   r   r   rG   rE  MetaDataTyperK   rD   r  rH   r   rG  r   rg   )r   rR   r   dbg_declare_tydbg_declarere  rf  s          r   test_call_metadataz(TestBuildInstructions.test_call_metadata  s    



++,u%%9J9J8Ka8OPPkN    NN5sN++N''++[1a),,," 	U %      U %     r   c                    |                      d          }t          j        |          }t          j        t          j                    t
                                          t
          t
                                          f          }t          j        |j        j	        |d          }|j
        d                             d           |                    t
          d          }|                    t
          d          }|                    ||t          j        t
          d          |fd	d
d           t          r|                     |d           d S |                     |d           d S )Nr   r  funr   sretretvalotherr   r  r   r   r   rt   	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"\)
            )rR   r   r   rG   rE  rH   r   rK   rN   rD   r   r   r  rG  r-  r   ri   )r   rR   r   fun_tyr  r  r  s          r   test_call_attributesz*TestBuildInstructions.test_call_attributes  s`   



++,u%%KMME,,..u7G7G7I7IJL Lk'*165AA!!&)))H55u733R[++U3&  	 	
 	
 	
 # 	""5 +      ""5 +     r   c                    |                      d          }t          j        |          }t          j        t          j                    d          }t          j        |j        j        |d          }|                    |d           |                    |dd           |                    |dd           |                    |dd           |                    |dd	           |                    |dd
           |                    |dg            |                    |dd           | 	                    |d           d S )Nr   r  r$   my_funF)tailTr  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"()
        )
rR   r   r   rG   rE  rK   rN   rD   rG  rg   r   rR   r   r  r  s        r   test_call_tailz$TestBuildInstructions.test_call_tail  s9   



++,u%%33k'*168DDS"S"5)))S"4(((S"6***S"8,,,S":...S"2&&&S">222 
! 
	 
	 
	 
	 
	r   c                 |   |                                  }t          j        |          }t          j        t          j                    d          }t          j        |j        j        |d          }|                     t                    5  |
                    |dddi           d d d            d S # 1 swxY w Y   d S )Nr$   r  r   r  r  )rR   r   r   rG   rE  rK   rN   rD   r   r   rG  r  s        r   test_invalid_call_attributesz2TestBuildInstructions.test_invalid_call_attributes.  s    

,u%%33k'*165AAz** 	9 	9LLbQKL888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s   	B11B58B5c                    |                      d          }t          j        |          }|j        j        d d         \  }}t          j        t          t          t          f          }t          j        |j        j	        |d          }|j        
                    d          }|j        
                    d          }|                    |||f||d           |                     |d           d S )	Nr   r  rt   rl  normalunwindrk  z            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )rR   r   r   rN   r   rG   r-  rH   rK   rD   rP   invokerg   )	r   rR   r   re  rf  r|  rl  	bb_normal	bb_unwinds	            r   test_invokez!TestBuildInstructions.test_invoke7  s    



++,u%%$RaR(1sUEN33K(/s;;$77X7FF	$77X7FF	q1a&)Y@@@ ! 	 	 	 	 	r   c                 \   |                      d          }t          j        |          }t          j        t          j                    t
                                          t
          t
                                          f          }t          j        |j        j	        |d          }d|_
        |j        d                             d           |                    t
          d          }|                    t
          d          }|j                            d	          }|j                            d
          }|                    ||t          j        t
          d          |f||dddddd           t"          r|                     |d           d S |                     |d           d S )Nr   r  r  ro  r   r  r  r  r  r  r   r  r   r  r   r  )rp  rt  rw  r  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"
            )rR   r   r   rG   rE  rH   r   rK   rN   rD   calling_conventionr   r   r  rP   r  r-  r   ri   )	r   rR   r   r  r  r  r  r  r  s	            r   test_invoke_attributesz,TestBuildInstructions.test_invoke_attributesF  s   



++,u%%KMME,,..u7G7G7I7IJL Lk'*165AA!)!!&)))H55u733$77X7FF	$77X7FF	R[++U3&  	 	
 	
 	
 # 	""5 +      ""5 +     r   c           
         |                      d          }t          j        |          }|                    t          j        t
          t                                          g          d          }t          j        |j	        j
        t                                          d          }d|_        |                    t          j        |                     |                    t          j        t          j        t          j        |j        d          |g                               |                    |           t&          r|                     |d           d S |                     |d           d S )	Nr   r  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"
                )rR   r   r   
landingpadr  rH   r   r   r+  rN   rD   rr  
add_clauseCatchClauseFilterClauser-  	ArrayTyper	  resumer   rg   )r   rR   r   r  int_typeinfos        r   test_landingpadz%TestBuildInstructions.test_landingpadq  sn   



++,u%% 4e6:oo6G6G6I !J !JKOQ Q()9)@)-):):GE E'+$
bn\22333
bobk",q3" 3"$0>'3 '3 4 4 	5 	5 	5r" 	U %      U %     r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}|                    d||d          }|                    |           |                     |d           d S )Nr   r  rt   r  r   z            my_block:
                %"c" = icmp sgt i32 %".1", %".2"
                call void @"llvm.assume"(i1 %"c")
            )rR   r   r   rN   r   r  r   rg   r  s         r   test_assumez!TestBuildInstructions.test_assume  s    



++,u%%$RaR(1Q44q ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }|j        j        d d         \  }}d|_        d|_        t          j        |j        d          }t          j        |t          j	                  }t          j
        d          }|                    || |d          d          }|                    || |d	          d
          }|                     |d           |                    d          }|                    |           |                    |           t          j        |d	dg          }|                    |||d           |                     |d           |                    d          }|                    |           |                    |           |                    ||d           |                     |d           |                    d          }|                    |           |                    |           |                    | |d          d          }	|                    | |d	          d          }
|                     |d           |                    |                    |	|
                     |                     |j                   d S )Ninsert_blockr  rt   re  rf  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
            )rR   r   r   rN   r   rL   
VectorTyper	  r-  r  r/  insert_elementrg   rP   r=  position_at_endshuffle_vectorr   extract_elementr[  r4   rD   )r   rR   r   re  rf  vectyvecidxtymaskr   ri  s              r   test_vector_opsz%TestBuildInstructions.test_vector_ops  s   


//,u%%$RaR(1afa((k%..
2$$S!UU1XXF$CC$$S!UU1XXF$CC ! 	 	 	 **?;;u&&&{51a&))sCF;;; ! 	 	 	
 **;77u&&&C5))) ! 	 	 	
 **?;;u&&&##Cq#>>##Cq#>> ! 	 	 	 	GKK1%%&&&W^,,,,,r   c                    |                      d          }t          j        |          }t          j        t          d          }|                    |d          }|                    |           |                     |d           d S )Nr   r  r   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )rR   r   r   r-  r   
bitreverser[  rg   r   rR   r   re  r   s        r   test_bitreversez%TestBuildInstructions.test_bitreverse  s    



++,u%%Kq!!qs++A ! 	 	 	 	 	r   c                 p   |                      d          }t          j        |          }t          j        t          d          }|                     t                    5 }|                    |d           d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   r  r   r   #expected an integer type, got float)rR   r   r   r-  r-  r   r  r  r+   r)   r  r   rR   r   re  raisess        r   test_bitreverse_wrongtypez/TestBuildInstructions.test_bitreverse_wrongtype  s    



++,u%%KQy)) 	,Vqs+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,1 !!	# 	# 	# 	# 	#   BB
Bc                    |                      d          }t          j        |          }|                     t                    5 }|                    dd            d d d            n# 1 swxY w Y   |                     dt          |j                             |                     t                    5 }|                    d d           d d d            n# 1 swxY w Y   |                     dt          |j                             |                    dd            |                    dd           |                    d	d           |                    d
           |	                                 | 
                    |d           d S )Nr   r  r8  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
            )rR   r   r   r   r   fencer+   r)   r  r   rg   )r   rR   r   r  s       r   
test_fencez TestBuildInstructions.test_fence  s   



++,u%%z** 	-fMM+t,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-3 !!	# 	# 	# z** 	-fMM$,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-. !!	# 	# 	# 	i&&&i000i000i    ! 	 	 	 	 	s$   A((A,/A,5CCCc                 f   |                      d          }t          j        |          }|                     t                    5  |                    d           d d d            n# 1 swxY w Y   |                    d           |                                 |                     |d           d S )Nr   r  zso
many linesz
my commentzX            my_block:
                ; my comment
                ret void
            )rR   r   r   r   AssertionErrorcommentr   rg   r   rR   r   s      r   test_commentz"TestBuildInstructions.test_comment  s    



++,u%%~.. 	. 	.OO,---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.%%% ! 	 	 	 	 	s   A''A+.A+c                    |                      d          }t          j        |          }t          j        t          d          }|                    |d          }|                    |           |                     |d           d S )Nr   r  r   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )rR   r   r   r-  rH   bswapr[  rg   r  s        r   
test_bswapz TestBuildInstructions.test_bswap      



++,u%%Kq!!MM!#M&&A ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }t          j        t          d          }|                    |d          }|                    |           |                     |d           d S )Nr   r  r   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )rR   r   r   r-  int16ctpopr[  rg   r  s        r   
test_ctpopz TestBuildInstructions.test_ctpop   r  r   c                 H   |                      d          }t          j        |          }t          j        t          d          }t          j        t
          d          }|                    ||d          }|                    |           |                     |d           d S )Nr   r  r   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	rR   r   r   r-  r  r  ctlzr[  rg   r  s         r   	test_ctlzzTestBuildInstructions.test_ctlz,      



++,u%%Kq!!Ka  LLACL((A ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }t          j        t          d          }|                    |d          }|                    |           |                     |d           d S )Nr   r  g      @rf  z            my_block:
                %"b" = call i16 @"llvm.convert.to.fp16.f32"(float 0x4014000000000000)
                ret i16 %"b"
            )rR   r   r   r-  r-  convert_to_fp16r[  rg   r  s        r   test_convert_to_fp16_f32z.TestBuildInstructions.test_convert_to_fp16_f329  s    



++,u%%KS!!##AC#00A ! 	 	 	 	 	r   c                 p   |                      d          }t          j        |          }t          j        t          d          }|                     t                    5 }|                    |d           d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   r  r   rf  expected a float type, got i16)rR   r   r   r-  r  r   r  r  r+   r)   r  r  s        r   "test_convert_to_fp16_f32_wrongtypez8TestBuildInstructions.test_convert_to_fp16_f32_wrongtypeE  s    



++,u%%Kq!!y)) 	1V##AC#000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1, !!	# 	# 	# 	# 	#r  c                    |                      d          }t          j        |          }t          j        t          d          }|                    |dt                    }|                    |           |                     |d           d S )Nr   r  r   rf  rL   toz            my_block:
                %"b" = call float @"llvm.convert.from.fp16.f32"(i16 5)
                ret float %"b"
            )	rR   r   r   r-  r  convert_from_fp16r-  r[  rg   r  s        r   test_convert_from_fp16_f32z0TestBuildInstructions.test_convert_from_fp16_f32P  s    



++,u%%Kq!!%%acc%::A ! 	 	 	 	 	r   c                 p   |                      d          }t          j        |          }t          j        t          d          }|                     t                    5 }|                    |d           d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   r        @rf  zexpected a float return typerR   r   r   r-  r-  r   r  r  r+   r)   r  r  s        r   !test_convert_from_fp16_f32_notypez7TestBuildInstructions.test_convert_from_fp16_f32_notype\  s    



++,u%%KS!!y)) 	3V%%ac%222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3* !!	# 	# 	# 	# 	#r  c                 |   |                      d          }t          j        |          }t          j        t          d          }|                     t                    5 }|                    |dt                     d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   r  r  rf  r  zexpected an i16 type, got floatr  r  s        r   $test_convert_from_fp16_f32_wrongtypez:TestBuildInstructions.test_convert_from_fp16_f32_wrongtypeg  s    



++,u%%KS!!y)) 	;V%%acc%:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;- !!	# 	# 	# 	# 	#   B		BBc                 |   |                      d          }t          j        |          }t          j        t          d          }|                     t                    5 }|                    |dt                     d d d            n# 1 swxY w Y   | 	                    dt          |j                             d S )Nr   r  r  rf  r  r  )rR   r   r   r-  r-  r   r  r  r  r+   r)   r  r  s        r   %test_convert_from_fp16_f32_wrongtype2z;TestBuildInstructions.test_convert_from_fp16_f32_wrongtype2r  s    



++,u%%KS!!y)) 	=V%%ace%<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=, !!	# 	# 	# 	# 	#r  c                 H   |                      d          }t          j        |          }t          j        t          d          }t          j        t
          d          }|                    ||d          }|                    |           |                     |d           d S )Nr   r  r   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	rR   r   r   r-  r   r  cttzr[  rg   r  s         r   	test_cttzzTestBuildInstructions.test_cttz}  r  r   c                    |                      d          }t          j        |          }t          j        t          d          }t          j        t
          d          }|                     t                    5 }|                    ||d           d d d            n# 1 swxY w Y   | 	                    dt          |j                             d S )Nr   r  r   r   r   zexpected an i1 type, got i32)rR   r   r   r-  r   rH   r   r  r  r+   r)   r  r   rR   r   re  rf  r  s         r   test_cttz_wrongflagz)TestBuildInstructions.test_cttz_wrongflag  s    



++,u%%Kq!!Kq!!y)) 	)VLLACL(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)* !!	# 	# 	# 	# 	#   9BB"%B"c                    |                      d          }t          j        |          }t          j        t          d          }t          j        t
          d          }|                     t                    5 }|                    ||d           d d d            n# 1 swxY w Y   | 	                    dt          |j                             d S )Nr   r  r   r   r   r  )rR   r   r   r-  r-  r  r   r  r  r+   r)   r  r  s         r   test_cttz_wrongtypez)TestBuildInstructions.test_cttz_wrongtype  s    



++,u%%KQKa  y)) 	)VLLACL(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)1 !!	# 	# 	# 	# 	#r  c                 ~   |                      d          }t          j        |          }t          j        t          d          }t          j        t          d          }t          j        t          d          }|                    |||d          }|                    |           |                     |d           d S )Nr   r  r   r   rt   fmaz            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )rR   r   r   r-  r-  r  r[  rg   )r   rR   r   re  rf  r   r  s          r   test_fmazTestBuildInstructions.test_fma  s    



++,u%%KQKQKQkk!Qk..C ! 	 	 	 	 	r   c                    |                      d          }t          j        |          }t          j        t          d          }t          j        t          d          }t          j        t          d          }|                     t                    5 }|                    |||d           d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   r  r   r   rt   r  z(expected an floating point type, got i32)rR   r   r   r-  rH   r   r  r  r+   r)   r  r   rR   r   re  rf  r   r  s          r   test_fma_wrongtypez(TestBuildInstructions.test_fma_wrongtype  s   



++,u%%Kq!!Kq!!Kq!!y)) 	-VKK1aeK,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-6 !!	# 	# 	# 	# 	#   B99B= B=c                    |                      d          }t          j        |          }t          j        t          d          }t          j        t
          d          }t          j        t          d          }|                     t                    5 }|                    |||d           d d d            n# 1 swxY w Y   | 	                    dt          |j                             d S )Nr   r  r   r   rt   r  z7expected types to be the same, got float, double, float)rR   r   r   r-  r-  rI   r   r  r  r+   r)   r  r  s          r   test_fma_mixedtypesz)TestBuildInstructions.test_fma_mixedtypes  s   



++,u%%KQKQKQy)) 	-VKK1aeK,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-E !!	# 	# 	# 	# 	#r
  c                 P    d }dD ]}t          j         ||                      d S )Nc                    t          j        t          j        d          t          j        d                                          t          j        d          g          }t          j                    }t          j        ||d          }|                                }|                                }|                                }t          j                    }|                    |           |	                    |           |                    |           |
                    t          j        d                    }|                    t          j        |j        d          |           |
                    t          j        d                    }	|	                    t          j        |	j        d          |           |j        d                             |            |                    |j        d         |g          }
|                    |
          }|                    |	|          }|	                    ||           |                    |t          j        |j        d                    }|                    ||           |                    d||j        d                   }|                    |||           |                    |           |                    |           t-          |          S )Nr
   r  r  r   r   r  )r   rG   r/  r   rB   rK   rP   r   r  r=  r  r  r-  r	  r   r   r  r  r   r  rC  r[  r)   )	attr_namerM   rD   rQ   bb_entrybb_loopbb_exitr   indexaccumr  valueaddedindexp1conds                  r   gen_codez;TestBuildInstructions.test_arg_attributes.<locals>.gen_code  sd   ?2:b>>BJrNN4M4M4O4O46JrNN4D E EDY[[F;vt%888D..00H--//G--//GlnnG##H---NN7#####G,,,KK
2//Er{5:q998DDDKK
2//Er{5:q998DDDIaL&&y111++dilUG44CLL%%EKKu--Eug...kk%UZ)C)CDDGw000((gty|DDDOOD'7333##G,,,KKv;;r   )byrefbyvalelementtypeimmarginallocainregnestr   	nocapturenofreer   noundefpreallocatedreturnedsignext
swiftasync
swifterror	swiftselfr   )r1   r2   )r   r  r  s      r   test_arg_attributesz)TestBuildInstructions.test_arg_attributes  sM    &	 &	 &	P
 	5 	5I,  3 34444-	5 	5r   N)<ry   rz   r{   r|   maxDiffr  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r#  r6  r:  r?  rF  rJ  rT  r\  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   r  r  r	  r  r*  r$   r   r   r  r    sp         G= = =/ / /b      (    $# # #J+ + +Z    I I IV  ,  2  6  @L L L\1 1 1f  *	 	 	
 
 
     ,& & &P  &$ $ $L  8  B  69 9 9  ) ) )V  <
 
 
8- 8- 8-t
 
 
	# 	# 	#  6  
 
 

 
 
  
 
 
	# 	# 	#
 
 
	# 	# 	#	# 	# 	#	# 	# 	#  
# 
# 
#
# 
# 
#  # # ## # #?5 ?5 ?5 ?5 ?5r   r  c                   T    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )TestBuilderMiscz=
    Test various other features of the IRBuilder class.
    c                 x   |                      d          }t          j        |          }|                     |j        |j                   |                     |j        t          j                   |                     |j        |j        j                   |                     |j        t          j	                   d S )Nr{  r  )
rR   r   r   r;   rN   r}  assertIsInstancerK   rD   rB   r  s      r   r  zTestBuilderMisc.test_attributes  s    


((,u%%g&555g.<<<gnel&9:::gnbi88888r   c                 V   |                      d          }t          j        |          }|j        j        d d         \  }}|                    ||d           |                    d          }|                    |          5  |                    ||d           |	                                5  |
                    ||d           d d d            n# 1 swxY w Y   |                    ||d           |                    |           d d d            n# 1 swxY w Y   |                    ||d	           |                    |          5  |                    ||d
           d d d            n# 1 swxY w Y   |                     |d           |                     |d           d S )Nr   r  rt   r   r   ri  rj  rl  rm  rn  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"
            )rR   r   r   rN   r   r   rP   
goto_blockr  goto_entry_blockr   r  r=  r  r  rg   )r   rR   r   re  rf  bb_news         r   test_goto_blockzTestBuilderMisc.test_goto_block  sm   



++,u%%$RaR(1Aq#+++77'' 	# 	#LLAs###))++ ' 'Aq#&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' 'LLAs###NN6"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	Aq#'' 	$ 	$LLAs###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ ! 	 	 	 	 " 	 	 	 	 	sH   ,D0CDC	DC	/DDDE22E69E6c                    |                      d          }t          j        |          }t          j        t          d          }|                    ||d          }|                    |          5 }|                    ||d           d d d            n# 1 swxY w Y   |                     |j         |           |                    ||d          }|                    |          5  |                    ||d           |                    |           d d d            n# 1 swxY w Y   | 	                    |j
        d           d S )	Noner  r   re  rf  r   ri  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:
            )rR   r   r   r-  r  r   if_thenr;   r=  rx   rN   )r   rR   r   r  re  bbendr   s          r   test_if_thenzTestBuilderMisc.test_if_then7  s   


&&,u%%Ka  KK1c""__Q 	#5KK1c"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	gmU+++KK1c""__Q 	" 	"KK1c"""NN5!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	W- 0 	 	 	 	 	s$   1BBB'-D  D$'D$c                 *   |                      d          }t          j        |          }t          j        t          d          }|                    ||d          }|                    |          5  |                    ||d          }|                    |          5  |                    ||d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                                 |                     |j	        d           d S )Nr6  r  r   re  rf  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"
            )
rR   r   r   r-  r  r   r7  r   rx   rN   )r   rR   r   r  re  rf  s         r   test_if_then_nestedz#TestBuilderMisc.test_if_then_nestedU  s   


&&,u%%Ka  KK1c""__Q 	' 	'Aq#&&A## ' 'Aq#&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	W- 0 	 	 	 	 	s6   1-CC6CC	C	C	
CC Cc           	      n   d}|                      |          }t          j        |          }t          j        t          d          }|                    ||d          }|                    |          5  |                    ||d          }|                    |          5  |                    ||d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                                 |                     |j	        d
                    ||d d         d	z   
                     d S )NPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongr  r   re  rf  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)rR   r   r   r-  r  r   r7  r   rx   rN   r   )r   r?  rR   r   r  re  rf  s          r   test_if_then_long_labelz'TestBuilderMisc.test_if_then_long_labelp  s    




++,u%%Ka  KK1c""__Q 	' 	'Aq#&&A## ' 'Aq#&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	W- 0 *JssOd4JKK	M 	M 	M 	M 	Ms6   3-C C8CC	CC	CC"Cc                       fd} |d          }                      |j        d            |d          }                      |j        d           d S )Nc                                         d          }t          j        |          }t          j        t          d          }|                    ||           5  	 d d d            n# 1 swxY w Y                       |d           |S )Nr6  r  r   likelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )rR   r   r   r-  r  r7  rg   )rE  rR   r   r  r   s       r   rX  z2TestBuilderMisc.test_if_then_likely.<locals>.check  s    JJEJ**El5))GD!$$A622                U %    Ns   A++A/2A/TC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            rq   rD   r   rX  r   s   `  r   test_if_then_likelyz#TestBuilderMisc.test_if_then_likely  s    
	 
	 
	 
	 
	 %++GN - 	 	 	 %,,GN - 	 	 	 	 	r   c                 0   |                      d          }t          j        |          }t          j        t          d          }|                    ||d          }|                    |          5 \  }}|5  |                    ||d           d d d            n# 1 swxY w Y   |5  |                    ||d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    |          5 \  }}|5  |                    |           d d d            n# 1 swxY w Y   |5  |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | 	                    |j
        d           d S )Nr6  r  r   re  rf  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:
            )rR   r   r   r-  r  r   if_elser=  r   rx   rN   )r   rR   r   r  re  thenra  s          r   test_if_elsezTestBuilderMisc.test_if_else  s   


&&,u%%Ka  KK1c""__Q 	'#4D) ' 'Aq#&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'Aq#&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' __Q 	##4D) & &u%%%& & & & & & & & & & & & & & & # #  """# # # # # # # # # # # # # # #	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	W- 0 	 	 	 	 	s   1C#7BC#B	C#"B	#C#(C C#C	C#C	C##C'*C'E0	D+E0+D/	/E02D/	3E08EE0E	E0 E	!E00E47E4c                       fd} |d          }                      |j        d            |d          }                      |j        d           d S )Nc                                         d          }t          j        |          }t          j        t          d          }|                    ||           5 \  }}|5  |                    |           d d d            n# 1 swxY w Y   |5  |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y                       |j	        d           |S )Nr6  r  r   rD  z                one:
                    br i1 0, label %"one.if", label %"one.else", !prof !0
                one.if:
                    br label %"one"
                one.else:
                    ret void
                one.endif:
                )
rR   r   r   r-  r  rL  r=  r   rx   rN   )rE  rR   r   r  rM  ra  r   s         r   rX  z2TestBuilderMisc.test_if_else_likely.<locals>.check  s   JJEJ**El5))GD!$$A622 '6GtY * *NN5)))* * * * * * * * * * * * * * * ' '$$&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '' ' ' ' ' ' ' ' ' ' ' ' ' ' '
   !1 4    NsZ   C
#B9C
B			C
B		C
B3'C
3B7	7C
:B7	;C

CCTrF  FrG  rH  rI  s   `  r   test_if_else_likelyz#TestBuilderMisc.test_if_else_likely  s    	 	 	 	 	& %++GN - 	 	 	 %,,GN - 	 	 	 	 	r   c                    |                                  }t          j                    }t          j        t          d          }|                    d          }|                    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   r6  r  twothreere  r  r  r  r  rf  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)rN   r   r   r-  rH   rP   position_at_startr   r  position_afterposition_beforerg   )	r   rQ   r   r  bb_onebb_twobb_threer  rf  s	            r   test_positioningz TestBuilderMisc.test_positioning  s     }},..Kq!!((e(44((e(44***88!!&)))Aq#'''Aq#Aq#!!&)))KK1c""Aq#'''KK1c""q!!!Aq#"""Aq# " 	 	 	 	 " 	 	 	 	 $ 	 	 	 	 	r   c                    |                                  }t          j                    }|                    d          }|                    |           t          j        t          d          }|                    ||d          }|                                }| 	                    |j
                   |                    |           |                     |j
                   |                    ||d          }|                    ||d          }|                    |           |                                 | 	                    |j
                   |                     |d           d S )Nentryr  i  re  rf  r   z            entry:
                %"a" = add i32 1234, 1234
                %"b" = mul i32 %"a", %"a"
                ret void
        )rN   r   r   rP   r  r-  rH   r   r   r  r  remover  r  rg   )	r   rQ   r   blkr  re  retvoidrf  r   s	            r   test_instruction_removalz(TestBuilderMisc.test_instruction_removal	  sE   }},..%%7%33$$$Kt$$KK1c""""$$)***w*+++KK1c""KK1c""q)***  	 	 	 	 	r   c                 ^   |                      d          }t          j        |          }|j                            g           |_        |                    t          j        t                    d           t          r| 
                    |d           d S | 
                    |d           d S )Nr   r  r   zY                my_block:
                    %"c" = alloca ptr, !dbg !0
                zZ                my_block:
                    %"c" = alloca i32*, !dbg !0
                )rR   r   r   rD   r   debug_metadatar  rJ   rH   r   rg   r  s      r   test_metadatazTestBuilderMisc.test_metadata(	  s    



++,u%%!(!<!<R!@!@r~e,,3777" 		U %     
 U %     r   N)ry   rz   r{   r|   r  r4  r9  r;  rA  rJ  rN  rQ  r[  ra  rd  r$   r   r   r-  r-    s         9 9 9  :  <  6M M M6  *" " "H  :. . .`  .    r   r-  c                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )	TestTypesc                     t          |t          j                  r!|j        }t          |t          j                  !t          |t          j                   S r0   )
isinstancer   rJ   r  	LabelType)r   tys     r   has_logical_equalityzTestTypes.has_logical_equality<	  sH    R^,, 	B R^,, 	b",////r   c                 <   t          j                    }t          j                    t          j                    t          j        t
          t          t          f          t          j        t
          t          f          t          j        t
          t          fd          t          j        t          t          f          t
          t          t          t          t          t          j
        t          d          t          j
        t          d          t          j
        t          d          t          j        t
          t          f          t          j        t          t
          f          |                    d          |                    d          g}|d |D             z  }|S )z3
        A bunch of mutually unequal types
        Tr   r   r   MyType1MyType2c                     g | ]<}t          |t          j        t          j        f          (t          j        |          =S r$   )rh  r   rE  ri  rJ   )r&   tps     r   r(   z,TestTypes.assorted_types.<locals>.<listcomp>S	  sP     F F F#Bbl(CDDF".$$ F F Fr   )r   Contextri  rE  rG   r  r   rH   r-  rI   r  r  get_identified_type)r   contextr   s      r   assorted_typeszTestTypes.assorted_typesA	  s,   
 *,,LNNBKMMOD4,//w1O1OOD4'4888OD4'**$sCLa  ",sA"6"6S!8L8L $..0DdFJFL 1M 1M''	22''	22
 	 F Fu F F F 	F r   c                     |                                  }|D ]B}|                     |          }|                     |          r|                     ||           Cd S r0   )rt  r@   rk  r=   )r   r   rj  newtys       r   r   zTestTypes.test_picklingX	  sl    ##%% 	, 	,B0044E((,, ,  +++	, 	,r   c                    |                                  }t          j        ||          D ]A\  }}||ur8|                     ||k    ||f           |                     ||k    ||f           B|D ]}t          j        |          }|                     |          r9|                     ||k    ||f           |                     ||k    ||f           d|                     ||k    ||f           |                     ||k    ||f           d S r0   )rt  	itertoolsproductr  r  copyrk  )r   r   re  rf  rp  r  s         r   test_comparisonszTestTypes.test_comparisons_	  s-   ##%%%eU33 	0 	0DAqzz  a!Q000QA/// 	: 	:BIbMME((,, :eb%[999  ur5k::::  ur5k:::eb%[9999	: 	:r   c                 $   |                      t          t                    d           |                      t          t          j        d                    d           |                      t          t
                    d           |                      t          t                    d           |                      t          t          j                              d           |                      t          t          j        t          d                    d           |                      t          t          j        t          t
          f                    d	           |                      t          t          j        t          t
          t          f                    d
           |                      t          t          j        t          dd                    d           |                      t          t          j        t          t
          fd                    d           |                      t          t          j        t          t
          t          fd                    d           t          r|                      t          t          j
        t                              d           |                      t          t          j
        t          j
        t                                        d           n|                      t          t          j
        t                              d           |                      t          t          j
        t          j
        t                                        d           |                      t          t          j        t          d                    d           t          r|                      t          t          j        t          j
        t                    d                    d           |                      t          t          j
        t          j        t          d                              d           n|                      t          t          j        t          j
        t                    d                    d           |                      t          t          j
        t          j        t          d                              d           |                      t          t          j        t          f                    d           |                      t          t          j        t          t
          f                    d           t          rm|                      t          t          j        t          j
        t                    t          j        t          t          f          f                    d           nl|                      t          t          j        t          j
        t                    t          j        t          t          f          f                    d           |                      t          t          j        t          fd                    d           |                      t          t          j        t          t
          fd                    d           t          j                    }|                    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)Tr   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)r  zi32*zi32**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)r=   r)   r  r   r/  r-  rI   rE  rG   r   rJ   rH   r  r  r   rq  rr  )r   rs  mytypemytype1mytype2s        r   test_strzTestTypes.test_stro	  s    	TD)))RZ^^,,e444S7+++S8,,,R[]]++V444R_T26677AAAR_TC6::;;\JJJR_TC:>>??-	/ 	/ 	/R_T2tDDDEE#	% 	% 	%R_TC64HHHII*	, 	, 	,R_TC:tLLLMM2	4 	4 	4 # 	&S!6!677???Su0E0E!F!FGGOOOOS!6!677@@@Su0E0E!F!FGG$& & &R\$2233Z@@@" 	*SbnT.B.BA!F!FGG(* * *ST10E0E!F!FGGOOOOSbnT.B.BA!F!FGG(* * *ST10E0E!F!FGG(* * *R14'::;;VDDDR14+>>??OOO" 	$S!5t$$b&:E4=&I&I7K "L "L M M"$ $ $ $ S!5t$$b&:E4=&I&I7K "L "L M M"$ $ $ 	R14'$GGGHH!	# 	# 	#R14+dKKKLL(	* 	* 	* *,,,,X66Vm444--j99W'8999--j99W'899999r   c           	          t          | j        |                                           D ]D}|                     t	          |          t	          t          j        |                               Ed S r0   )filterrk  rt  r=   hashrz  )r   typs     r   	test_hashzTestTypes.test_hash	  sc    $3T5H5H5J5JKK 	> 	>CT#YYTYs^^(<(<====	> 	>r   c                      fd} fd}t          j        t                    }t          d          D ]} |||t                      ||           t          j        t
          d          }t          d          D ]} |||t
                      ||           t          j        t          t          j        t
          t          f          f          } ||dt                      ||dt          j        t
          t          f                                          t                    5  |
                    t          j        t          d                     d d d            n# 1 swxY w Y    ||           t          j                    }t          j        |d          }|                    t          t          j        t
          t          f                      ||dt                      ||dt          j        t
          t          f                                          t                    5  |
                    t          j        t          d                     d d d            n# 1 swxY w Y    ||           d S )	Nc                     |                      t          j        t          |                    }                    ||           d S r0   )r  r   r-  rH   r=   )rp  rp  r`   rm   r   s       r   check_constantz*TestTypes.test_gep.<locals>.check_constant	  s<    VVBKq1122FVX.....r   c                     t          j        t          d          }                    t                    5  |                     |           d d d            d S # 1 swxY w Y   d S )Ng      ?)r   r-  rI   r   r  r  )rp  r  r   s     r   check_index_typez,TestTypes.test_gep.<locals>.check_index_type	  s    KS))E""9--  u                 s   AA Ar   r   r   r   rt   r  )r   rJ   rI   ranger  r  r  r   r   
IndexErrorr  r-  rH   rq  IdentifiedStructTypeset_body)r   r  r  rp  rp  rs  s   `     r   r
  zTestTypes.test_gep	  s   	/ 	/ 	/ 	/ 	/	 	 	 	 	
 ^C  q 	' 	'AN2q#&&&&\$""q 	( 	(AN2q$''''!3(<dD\(J(J"KLLr1c"""r1b2D$<@@AAAz** 	* 	*FF2;ua(()))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	**,,$Wh77
C-tTl;;<<<r1c"""r1b2D$<@@AAAz** 	* 	*FF2;ua(()))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s$   -.E''E+.E+5.I//I36I3c                     t          j        d           fd} |t          d            |t          d            |t          d            |t          j        t          d          d            |t          j        t          d          d            |t          j        t          t          t          f          d           d S )	N%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                 Z                         |                               |           d S r0   )r=   get_abi_sizerp  r`   r   tds     r   rX  z&TestTypes.test_abi_size.<locals>.check	  s+    R__R00(;;;;;r   r   r   r   r      r	   
r1   create_target_datar   rH   r   r   r  r  rI   r-  r   rX  r  s   ` @r   test_abi_sizezTestTypes.test_abi_size	  s    $%LMM	< 	< 	< 	< 	< 	<dAeQeQbl4##Q'''bl5!$$b)))b"Cc?33R88888r   c                     t          j        d           fd} |t          d            |t          d            |t          d            |t          j        t          d          d            |t          j        t          d          d            |t          j        t          t          t          f          d           d S )Nr  c                 Z                         |                               |           d S r0   )r+   get_abi_alignmentr  s     r   rX  z+TestTypes.test_abi_alignment.<locals>.check	  s+    MM"..r22H=====r   )r   rt   r   )r   )r   r   r  r  s   ` @r   test_abi_alignmentzTestTypes.test_abi_alignment	  s    $%LMM	> 	> 	> 	> 	> 	>dIeTeTbl4##Y///bl5!$$d+++b"Cc?33T:::::r   c                 8   t          j                    }|                    d          }t          j        |          }|                     |j                   |                     |           t          |          }|                    t          j	        d          t          j	        d          t          j
                               |                     |j                   |                     |           |                     |t          |                     d S )Nr  rs  r
   r   )r   rq  rr  rB   r  	is_opaquer4   r)   r  r/  r,  r  assertNotEqual)r   rs  r  rD   oldstrs        r   test_identified_structz TestTypes.test_identified_struct	  s    *,,,,X667+++()))V$$$V
2
2GGG)***V$$$FCKK00000r   c                    t          j        d          }t          j                    }|                    dd          }t          j        |          }|                     |j                   |                     |           t          |          }|
                    t          j        d          t          j        d          t          j                               |                     |                    |d|          d           |                     |j                   |                     |           |                     |t          |                     d S )	Nr  r  Tr  r	   r   r   rt   )r1   r  r   rq  rr  rB   r  r  r4   r)   r  r/  r,  r=   get_element_offsetr  r  )r   r  rs  r  rD   r  s         r   test_identified_struct_packedz'TestTypes.test_identified_struct_packed	  s   $%LMM*,,,,Xt<<7+++()))V$$$V
2
2GGG222q'BBAFFF)***V$$$FCKK00000r   c                    t          j                    }|                    d          }t          j        d          g|_        t          j        d          }|                     |                    ||          d           d S )Nr  r
   r  r  r   )	r   rq  rr  r/  elementsr1   r  r=   r  )r   rs  r  r  s       r   $test_target_data_non_default_contextz.TestTypes.test_target_data_non_default_context
  sr    *,,,,X66:b>>*$%LMM,,R,AA1EEEEEr   c                     t          j        t          j        d          d          }|                     t	          |          d           d S )Nr
   r   z	<8 x i32>)r   r  r/  r=   r)   )r   r  s     r   test_vectorzTestTypes.test_vector
  s=    bjnna00U[11111r   N)ry   rz   r{   rk  rt  r   r{  r  r  r
  r  r  r  r  r  r  r$   r   r   rf  rf  :	  s        0 0 0
  ., , ,: : : =: =: =:~> > >" " "H
9 
9 
9
; 
; 
;
1 
1 
11 1 1F F F2 2 2 2 2r   rf  c                 6    t          j        t          |           S r0   r  )rp  s    r   c32r  
  s    ;ua   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z dS ) TestConstantc                 p   t          j        t          d          }|                     t	          |          d           t          j        t
          d          }|                     t	          |          d           t          j        t
          d          }|                     t	          |          d           t          j        t
          d          }|                     t	          |          d           t          j        t
          d	          }|                     t	          |          d
           t          j        t
          t           j                  }|                     t	          |          d           t          j        t
          d           }|                     t	          |          d           d S )Nr   zi32 42r   zi1 1r   zi1 0Ti1 trueFzi1 falsezi1 undef)r   r-  rH   r=   r)   r  r  r   r   s     r   test_integerszTestConstant.test_integers
  sE   Kr""Q***Ka  Q(((Ka  Q(((Kd##Q+++Ke$$Q,,,Kbl++Q,,,Kd##Q(((((r   c                    t          j        t          d          }|                     t	          |          d           t          j        t          d          }|                     t	          |          d           t          j        t
          d          }|                     t	          |          d           t          j        t
          d          }|                     t	          |          d           t          j        t
          t           j                  }|                     t	          |          d           t          j        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-  r=   r)   rI   r  r  s     r   
test_realszTestConstant.test_reals*
  s   KS!!Q!;<<<KT""Q!;<<<KS!!Q!<===KT""Q!<===KR\**Q000KT""Q.....r   c                 T   t          j        t          j        t          d          t	          d          t	          d          t	          d          f          }|                     t          |          d           t          j        t          j        t          d          t	          d          t	          t           j                  f          }|                     t          |          d           t           j                            t	          d          t	          d          t	          t           j                  f          }|                     t          |          d           | 	                    t                    5 }t           j                            t	          d          t          j        t          d	          f           d d d            n# 1 swxY w Y   |                     t          |j                  d
           t          j        t          j        t          d          t           j                  }|                     t          |          d           t          j        t          j        t          d          d           }|                     t          |          d           t          j        t          j        t          d          t          d                    }|                     t          |          d           t          j        t          j        t          d          t          d                    }|                     t          |          d           t          j        t          j        t          d          dt           j        df          }|                     t          |          d           | 	                    t                    5  t          j        t          j        t          d          d           d d d            d S # 1 swxY w Y   d S )Nr   r   rZ  r   z[3 x i32] [i32 5, i32 6, i32 4]rt   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]r  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   rZ  )r   r-  r  rH   r  r=   r)   r  literal_arrayr   r  r-  r  r   	bytearrayr   )r   r   r  s      r   test_arrayszTestConstant.test_arrays9
  s   KUA..QQQ0HIIQ!BCCCKUA..QR\9J9J0KLLQ!?@@@K%%s1vvs1vvs2<7H7H&IJJQ!FGGGy)) 	GVK%%s1vvr{3/D/D&EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	GV-..?	A 	A 	A KUA..==Q!2333KUA..55Q!<===KT2..	:K0L0LMMQ!>???KT1--y9L/M/MNNQ!<===KUA..BL!0DEEQ!FGGGz** 	8 	8KUA..777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s%   AGGG".PP!$P!c                 B   t          j        t          j        d          d          }g d}t          j        ||          }d                    d                    t          dj        |                              }|                     t          |          |           d S )Nr
   r   )r   rt   r   r   r   rZ  	      z<8 x i32> <{}>z, zi32 {})	r   r  r/  r-  r   r   r   r=   r)   )r   r  valsr  vec_reprs        r   r  zTestConstant.test_vectorV
  s    bjnna00'''k%&&#**IIc(/400113 3S8,,,,,r   c                     t          j        t          j        d          d           j        }|                     |d           d S )Nr
   r   )r   r-  r/  constantr=   )r   r  s     r   test_non_nullable_intz"TestConstant.test_non_nullable_int^
  s:    ;rz"~~t44=1%%%%%r   c                    t          j        t          t          f          }t          j        t          |f          }t          j        |t          j        t          j                    d          t          j        t          d          f          }|                     t          |          d           t           j        	                    t          j        t          j                    d          t          j        t          d          f          }|                     |j
        |           |                     t          |          d           t           j        	                    t          j        t          j                    d          t          j        t          t           j                  f          }|                     |j
        |           |                     t          |          d           t          j        |t           j                  }|                     t          |          d           t          j        |d           }|                     t          |          d           t          j        |d          }|                     t          |          d           t          j        |d|f          }|                     t          |          d	           t          j        |d
          }|                     t          |          t          |                     |                     t                    5  t          j        |d           d d d            d S # 1 swxY w Y   d S )Nr  T/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializerr  Tr   L{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}}r   r  r   r   rZ  )r   r  r-  r  rH   r-  r,  r=   r)   literal_structr	  r  r   r   )r   st1st2r   c1c2c3s          r   test_structszTestConstant.test_structsb
  s   "C;//"E3<00Kbk",..#>> k$557 8 8QJ	L 	L 	LK&&BLNNC(H(H(*D$(?(?(A B B%%%QJ	L 	L 	LK&&BLNNC(H(H(*D",(G(G(I J J%%%QK	M 	M 	MKR\**Q!4555KT""Q!>???[k**RJ	L 	L 	L[r2h''R $J 	L 	L 	L[/00R#b''***z** 	( 	(KY'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   =M  M$'M$c                     t          j        d          }t          j        t          j        ||g          t           j                  }|                     |           d S )Nr   )r   r/  r-  r  r  r@   )r   i8sts      r   &test_undefined_literal_struct_picklingz3TestConstant.test_undefined_literal_struct_pickling
  sK    Z]][-r2h77FF$$R(((((r   c                    t          d          }|                     |t          j                   |                     t          |          d           t          d          }|                     |t          j                   |                     t          |          d           t          j        t          d          } |t          d          t          d          t          d          g          }|                     t          |          d	            |g d
          }|                     t          |          d	            |d          }|                     t          |          d           | 
                    t                    5   |g d           ddd           n# 1 swxY w Y   t          j        t          t          f          }t          j        t          |f          } |d          }|                     t          |          d            |d          }|                     t          |          d           dS )z@
        Instantiating a type should create a constant.
        r   zi8 42Tr  r   r   r   rZ  z[3 x i32] [i32 4, i32 5, i32 6]r  Nz[3 x i32] zeroinitializer)r   r   rZ  r  r  r  r  r  )r   r/  r   r-  r=   r)   r  r  rH   r  r   r   r  r-  )r   r   atr  r  s        r   test_type_instantiatonz#TestConstant.test_type_instantiaton
  sP    HHa---Q)))JJa---Q+++\%##BAAA'((Q!BCCCByyyMMQ!BCCCBtHHQ!<===z** 	 	B|||	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 "C;//"E3<00CQ #* 	, 	, 	,C!""Q #I 	K 	K 	K 	K 	Ks   F))F-0F-c                 j    t          d          }|                     t          |          d           dS )z8
        Constants should have a useful repr().
        r   z!<ir.Constant type='i32' value=42>N)rH   r=   r\  r  s     r   r  zTestConstant.test_repr
  s2     "IIa"EFFFFFr   c                    t          j        t          j        t          j        d          d          t	          t          d                              }|                                 }t          j        ||j        d          }d|_	        ||_
        t          j        t          |                    }t          j        t          |                    }|                     t          |          t          |                     d S )Nr      
myconstantT)r   r-  r  r/  r  r  rD   r+  r	  rr  r.  r1   r2   r)   r=   )r   r   r  gvparsedreparseds         r   test_encoding_problemz"TestConstant.test_encoding_problem
  s    KRZ]]C88!%**--/ /KKMMq!&,77! $SVV,,&s6{{33Vc(mm44444r   c                 l   |                                  }t          j        t          t          f          }t          j        ||d          }|                    d dD                       }t          r$|                     t          |          d           n#|                     t          |          d           |                     |j
        t          j        t                               t          j        |d           }|                     t                    5  |                    t          j        t          d          g           d d d            n# 1 swxY w Y   t          j        |                                d           }|                    t          j        t          d          g          }t          r$|                     t          |          d           n#|                     t          |          d           |                     |j
        t          j        t                               d S )	Nr  c                 B    g | ]}t          j        t          |          S r$   r  r  s     r   r(   z)TestConstant.test_gep.<locals>.<listcomp>
  $    :::aBKq)):::r   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))rD   r   r  r-  r  r+  r  r   r=   r)   r	  rJ   r-  r   r  rH   r   )r   r  rp  r  r   const	const_ptrr  s           r   r
  zTestConstant.test_gep
  s1   KKMM!3+..q"l33FF::6:::;;" 	fSVV[] ] ] ] SVVdf f f!5!5666B%%y)) 	/ 	/IIr{5!,,-...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ K66	]]BKq11233" 	VSWWKM M M M SWWTV V V!5!566666s   /EEEc                 Z   |                                  }t          j        t          t          f          }d}t          j        ||d|          }|                     |j        |           |                    d dD                       }|                     |j	        j        |           t          r$|                     t          |          d           n#|                     t          |          d           |                     |j	        t          j        t          |                     d S )Nr   r  rg  c                 B    g | ]}t          j        t          |          S r$   r  r  s     r   r(   z=TestConstant.test_gep_addrspace_globalvar.<locals>.<listcomp>
  r  r   r  zIgetelementptr ({float, i1}, ptr addrspace(4) @"myconstant", i32 0, i32 1)zRgetelementptr ({float, i1}, {float, i1} addrspace(4)* @"myconstant", i32 0, i32 1))rD   r   r  r-  r  r+  r=   rh  r  r	  r   r)   rJ   )r   r  rp  rh  r  r   s         r   test_gep_addrspace_globalvarz)TestConstant.test_gep_addrspace_globalvar
  s&   KKMM!3+..	q"liHHHy111FF::6:::;;)9555" 	MSVVJL L L L SVVKM M M 		!J!J!JKKKKKr   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   ztrunc (i64 1 to i32))r   r-  r   r)  rH   r=   r)   r  s     r   
test_trunczTestConstant.test_trunc
  sD    Kq!!''..Q!788888r   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   zzext (i32 1 to i64))r   r-  rH   r*  r   r=   r)   r  s     r   	test_zextzTestConstant.test_zext
  sD    Kq!!&&u--Q!677777r   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr6   zsext (i32 -1 to i64))r   r-  rH   r+  r   r=   r)   r  s     r   	test_sextzTestConstant.test_sext
  sD    Kr""''..Q!788888r   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   z*fptrunc (float 0x3ff0000000000000 to half))r   r-  r-  r,  r{  r=   r)   r  s     r   test_fptrunczTestConstant.test_fptrunc
  sD    KQ'',,Q!MNNNNNr   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   z*fpext (float 0x3ff0000000000000 to double))r   r-  r-  r.  rI   r=   r)   r  s     r   
test_fpextzTestConstant.test_fpext
  sD    KQ%%c**Q!MNNNNNr   c                 Z   |                                  }t          j        |t          d          }|                    t
                                                    }t          r%|                     t          |          d           d S |                     t          |          d           d S )Nr  z"bitcast (ptr @"myconstant" to ptr)z$bitcast (i32* @"myconstant" to i64*))
rD   r   r+  rH   r  r   r   r   r=   r)   )r   r  r  r   s       r   test_bitcastzTestConstant.test_bitcast  s    KKMMq%66JJu''))**" 	MSVV%IJJJJJSVV%KLLLLLr   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   z(fptoui (float 0x3ff0000000000000 to i32))r   r-  r-  r/  rH   r=   r)   r  s     r   test_fptouizTestConstant.test_fptoui  D    KQ&&u--Q!KLLLLLr   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   zuitofp (i32 1 to float))r   r-  rH   r1  r-  r=   r)   r  s     r   test_uitofpzTestConstant.test_uitofp  D    Kq!!((--Q!:;;;;;r   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   z(fptosi (float 0x3ff0000000000000 to i32))r   r-  r-  r0  rH   r=   r)   r  s     r   test_fptosizTestConstant.test_fptosi  r  r   c                     t          j        t          d                              t                    }|                     t          |          d           d S )Nr   zsitofp (i32 1 to float))r   r-  rH   r2  r-  r=   r)   r  s     r   test_sitofpzTestConstant.test_sitofp  r   r   c                    t          j        t                                          d           }t          j        t          d          }|                    t                    }|                     t          |j        t                     |                     t          |j        t                     t          r%| 
                    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   rH   r3  r   r  r-  r   r=   r)   )r   r  r6  r   s       r   test_ptrtoint_1zTestConstant.test_ptrtoint_1  s    k%**,,d33k%##LL)S\5999)S\3777" 	DSVV%ABBBBBSVV%BCCCCCr   c                    |                                  }t          j        |t          d          }|                    t
                    }t          r]|                     t          |          d           | 	                    t          d|j        t
                                                     n\|                     t          |          d           | 	                    t          d|j        t
                                                     t          j        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')rD   r   r+  rH   r3  r   r   r=   r)   r   r  r   r-  )r   r  r  r   r  s        r   test_ptrtoint_2zTestConstant.test_ptrtoint_2)  s$   KKMMq%66KK" 	$SVV%JKKK""C  ""	$ $ $ $ SVV%KLLL""E  ""	$ $ $ [""DK		 	 	 	 	r   c                     t          j        t          d          }t          j        t          d          }|                    t
                                                    }|                     t          |j        t
                     |                     t          |j        t
                                                     t          r%| 
                    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-  rH   r-  r4  r   r   r   r  r   r=   r)   )r   r6  pir   s       r   test_inttoptrzTestConstant.test_inttoptrF  s    k%##[d##LL))++,,)S\5999)R[%2B2B2D2DEEE" 	ASVV%>?????SVV%?@@@@@r   c                     t          j        t          d          }|                     t	          |                                          d           d S )Nr   zsub (i32 0, i32 1))r   r-  rH   r=   r)   r  r   r6  s     r   test_negzTestConstant.test_negS  s>    k%##SWWYY)=>>>>>r   c                     t          j        t          d          }|                     t	          |                                          d           d S )Nr   zxor (i32 1, i32 -1))r   r-  rH   r=   r)   r  r  s     r   test_notzTestConstant.test_notW  s>    k%##SXXZZ*?@@@@@r   c                     t          j        t          d          }|                     t	          |                                          d           d S )Nr   zfneg (float 0x3ff0000000000000))r   r-  r-  r=   r)   r  r  s     r   	test_fnegzTestConstant.test_fneg[  s>    k#q!!SXXZZ*KLLLLLr   c                 J   t          j        t          d          }t          j        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 ]4\  }}|                     t%           ||                    |dz              5ddddddd}|                                D ]F\  }}t%          |                    ||                    }d|z   dz   }	|                     ||	           Gddddddd}|                                D ]F\  }}t%          |                    ||                    }d|z   dz   }	|                     ||	           Gd S )Nr   rt   r  r  r  r   r   r  r  r  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-  rH   r  r  r  r   r   r  r  r  r  r  r  r  r  itemsr=   r)   r  r  )
r   r6  rS  oracler   iropcopr  rm   r`   s
             r   test_int_binopszTestConstant.test_int_binops_  s   k%##k%##'ECHfch'ECGecg(FCHfch(FCGdch'E	#
  	E 	EHBSC\\42C+CDDDD Du5? ? 	/ 	/IC**34455F~(99HVX.... DEUD D 	/ 	/ICc2233F~(99HVX....	/ 	/r   c           
         t          j        t          d          }t          j        t          d          }|j        d|j        d|j        d|j        d|j        di}|                                D ]8\  }}t           ||                    }|dz   }| 
                    ||           9d	d
ddddd}|                                D ]F\  }}	t          |                    ||                    }d|	z   dz   }| 
                    ||           Gddddddd}|                                D ]F\  }}	t          |                    ||                    }d|	z   dz   }| 
                    ||           Gd S )Nr   rt   r  r  r  r  r  z5 (float 0x3ff0000000000000, float 0x4000000000000000)oeqr6  ogtoger  oler  zfcmp uequner  r  r  r  )r   r-  r-  r  r  r  r  r  r!  r)   r=   r  r  )
r   r6  rS  r"  r   r#  rm   r`   r$  r  s
             r   test_flt_binopszTestConstant.test_flt_binops{  s   k#q!!k#q!!(FCHfch(FCHf6 	/ 	/HBC\\F  < =HVX.... UeE+ + 	/ 	/IC))#s3344F~ *F GHVX.... UeE+ + 	/ 	/IC++C5566F~ *F GHVX....		/ 	/r   N)!ry   rz   r{   r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r-  r$   r   r   r  r  
  s       ) ) ) / / /8 8 8:- - -& & & (  (  (D) ) )
K K K<G G G5 5 57 7 7:L L L(9 9 98 8 89 9 9O O OO O OM M MM M M< < <M M M< < <D D D  :A A A? ? ?A A AM M M/ / /8/ / / / /r   r  c                       e Zd Zd ZdS )TestTransformsc                    t          j                    }t          j        |t          j        t          j                    d          d          }t          j        |t          j        t          j                    d          d          }t          j                    }|                    |                                           |                    |d          }| 	                    |j
        |           t          j        |||          }|                     ||           |                     |j
        |           | 	                    |j
        |           d S )Nr$   r   r   )r   rB   rK   rG   rE  r   r  rP   rG  r=   calleereplace_all_callsr+   r  )r   r,   r   r   r   rG  modifieds          r   test_call_transformz"TestTransforms.test_call_transform  s   ikkk#rr{}}bAA5IIk#rr{}}bAA5II,.. 6 6 8 8999||C$$c***'S#66dH%%%DK---c*****r   N)ry   rz   r{   r4  r$   r   r   r/  r/    s#        + + + + +r   r/  c                       e Zd Zd ZdS )TestSingletonc                    |                      t          j        t          j                                                   |                      t          j        t          j        t          j                             |                      t          j        t          j        t          j                             |                     t          j                   d S r0   )r;   r   r  values
_Undefinedrz  deepcopyr@   rC   s    r   test_undefinedzTestSingleton.test_undefined  s    blBI$8$8$:$:;;;blDIbl$;$;<<<blDM",$?$?@@@$$R\22222r   N)ry   rz   r{   r;  r$   r   r   r6  r6    s#        3 3 3 3 3r   r6  __main__)(r|   rz  rx  r8   r   rY   unittestr   r   llvmliter   r   r1   r   r/  r  r   r  rH   r   HalfTyper{  r,  r-  rZ  rI   r   r~   r   rV  ry  r  r-  rf  r  r  r/  r6  ry   mainr$   r   r   <module>rA     s\          				               $ $ $ $ $ $ - , , , , , rz!}}rz!}}
2
2
2bkmmblnnbmoo[; [; [; [; [;x [; [; [;|K0 K0 K0 K0 K08 K0 K0 K0\Y" Y" Y" Y" Y"X Y" Y" Y"xO* O* O* O* O*x O* O* O*d*L *L *L *L *L *L *L *LZd5 d5 d5 d5 d5H d5 d5 d5P)j j j j jh j j jZ	W2 W2 W2 W2 W2 W2 W2 W2t! ! !/ / / / /8 / / /D+ + + + +X + + +3 3 3 3 3H 3 3 3 zHMOOOOO r   