
    sh                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSK	Jr  SSK	Jr  \
R                  " S5      r\
R                  " S5      r\
R                  " S	5      r\
R                  " S
5      r\
R                  " S5      r\
R(                  " 5       r\
R,                  " 5       r\
R0                  " 5       r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r  " S S\5      r!S r" " S S\5      r# " S S \5      r$ " S! S"\5      r%\&S#:X  a  \RN                  " 5         gg)$z
IR Construction Tests
    N   )TestCase)ir)binding)opaque_pointers_enabled          @   c                       \ rS rSrSrS rS rS rS rS r	SS	 jr
SS
 jrS rS rS rS rS rS rS rS rS rSrg)TestBase   z
Utilities for IR tests.
c                     S nSR                  [        X15      5      n[        R                  " SSU5      nU R	                  X$5        g)zZ
Assert *pattern* is in *text*, ignoring any whitespace differences
(including newlines).
c                 d    U R                  5       (       d  U R                  5       (       d  SU -   $ U $ )N\)isalnumisspace)cs    j/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/llvmlite/tests/test_ir.pyescape%TestBase.assertInText.<locals>.escape)   s%    99;;qyy{{axH     z\s+z\\s*N)joinmapresubassertRegex)selfpatterntextr   regexs        r   assertInTextTestBase.assertInText#   s<    	
 ''#f./vw0%r   c                     [        U5      R                  5        Vs/ s H  oR                  5       PM     nnU R                  WU5        g s  snf N)str
splitlinesstripassertIn)r   linemodliness       r   assert_ir_lineTestBase.assert_ir_line2   s=    *-c(*=*=*?@*?$*?@dE" As   A
c                 B    [         R                  " [        U5      5        g r&   )llvmparse_assemblyr'   r   r,   s     r   assert_valid_irTestBase.assert_valid_ir6   s    CH%r   c                     [         R                  " [         R                  " USS95      nU R                  UR                  UR                  5        U R                  [        U5      [        U5      5        U$ )zoAssert 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_correctly TestBase.assert_pickle_correctly9   sU     LLh!DE	h(()*=*=>XI7r   c                 ,    [         R                  " 5       $ r&   )r   Moduler   s    r   moduleTestBase.moduleB   s    yy{r   Nc           	          U=(       d    U R                  5       n[        R                  " [        [        [        [        [        R
                  " [        5      45      n[        R                  " XU5      $ r&   )rF   r   FunctionTypeint32dblPointerTypeFunction)r   rF   namefntys       r   functionTestBase.functionE   sJ    (4;;=uueS')~~e'<'> ?{{6..r   c                 V    U=(       d    U R                  5       nUR                  U5      $ r&   )rP   append_basic_block)r   funcrN   s      r   blockTestBase.blockK   s#    &t}}&&t,,r   c                 J    / nUR                  U5        SR                  U5      $ Nr   )descrr   )r   thingbufs      r   rY   TestBase.descrO   s!    Cwws|r   c                 V    [         R                  " U5      nUR                  SS5      nU$ )Nz
    z
  )textwrapdedentreplace)r   asms     r   _normalize_asmTestBase._normalize_asmT   s%    ooc"kk(F+
r   c                 H    U R                  U5      nU R                  X5        g r&   )rb   r   r   rY   ra   expecteds       r   check_descr_regexTestBase.check_descr_regexZ        &&s+)r   c                 H    U R                  U5      nU R                  X5        g r&   )rb   r>   re   s       r   check_descrTestBase.check_descr^   ri   r   c                 F    U R                  U R                  U5      U5        g r&   )rk   rY   r   rU   ra   s      r   check_blockTestBase.check_blockb   s    E*C0r   c                 F    U R                  U R                  U5      U5        g r&   )rg   rY   rn   s      r   check_block_regexTestBase.check_block_regexe   s    tzz%0#6r   c                     U R                  U5      nUR                  5       nU R                  UR                  5       UR                  5       5        g r&   )rb   _stringify_bodyr>   r)   r   rF   ra   rf   actuals        r   check_module_bodyTestBase.check_module_bodyh   s=    &&s+''))9:r   c                     U R                  U5      nUR                  5       nU R                  UR                  5       UR                  5       5        g)z&
Check module metadata against *asm*.
N)rb   _stringify_metadatar>   r)   rv   s        r   check_metadataTestBase.check_metadatam   s?     &&s+++-)9:r   c                     U R                  U5      nU R                  U5      nUR                  S5      S   R                  S5      S   nU R	                  UR                  5       UR                  5       5        g )N{   }r   )rb   rY   	partition
rpartitionr>   r)   )r   rT   ra   rf   rw   s        r   check_func_bodyTestBase.check_func_bodyu   sb    &&s+D!!!#&q)44S9!<)9:r    )Nmy_funcrX   )__name__
__module____qualname____firstlineno____doc__r#   r.   r4   rA   rF   rP   rU   rY   rb   rg   rk   ro   rr   rx   r|   r   __static_attributes__r   r   r   r   r      sW    &#&/-
**17;
;;r   r   c                       \ rS rSr\(       a  SOSrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)TestFunction|   z=i32 @"my_func"(i32 %".1", i32 %".2", double %".3", ptr %".4")z>i32 @"my_func"(i32 %".1", i32 %".2", double %".3", i32* %".4")c                     U R                  5       nU R                  U5      R                  5       nU R                  UR                  5       SU R                  -  5        g )Nz
declare %s)rP   rY   r)   r>   protor   rT   ra   s      r   test_declareTestFunction.test_declare   sC    }}jj$$&lTZZ&?@r   c                 |   U R                  5       nUR                  R                  S5        UR                  R                  S5        UR                  R                  S5        SUR                  l        [        R
                  " [        SSS9n[        R                  " U R                  5       US5      nX1R                  l	        U R                  U5      R                  5       n[        (       a   U R                  US	U R                  -  5        OU R                  US
U R                  -  5        U R                  U5        g )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")rP   
attributesadd
alignstackr   rI   int8rM   rF   personalityrY   r)   r   r>   r   rA   )r   rT   tp_perspersra   s        r   test_declare_attributes$TestFunction.test_declare_attributes   s    }}I&N+L)%'"//$D9{{4;;='3IJ&*#jj$$&""SJ "ZZ() SD "ZZ() 	$$T*r   c                 F   U R                  5       nUR                  S   R                  S5        SUR                  S   R                  l        SUR                  S   R                  l        SUR                  S   R                  l        UR                  S   R                  S5        UR                  R                  S	5        U R                  U5      R                  5       n[        (       a  U R                  US
5        OU R                  US5        U R                  U5        g )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"))rP   argsadd_attributer   dereferenceabledereferenceable_or_nullalignreturn_valuerY   r)   r   r>   rA   r   s      r   test_function_attributes%TestFunction.test_function_attributes   s    }}		!""9-23		!/:<		!7()		!%		!""9-''	2jj$$&""S x S y 	$$T*r   c                 (   U R                  5       nU R                  U5      nUR                  SUR                  / 5      5        U R	                  U5      R                  5       nU R                  USU R                   S35        U R                  U5        g )Ndbgdeclare z !dbg !0)	rF   rP   set_metadataadd_metadatarY   r)   r>   r   rA   r   rF   rT   ra   s       r   test_function_metadata#TestFunction.test_function_metadata   s}    }}V$%!4!4R!89jj$$&#DJJ<x8	 	$$T*r   c                     U R                  5       nSUl        U R                  U5      R                  5       nU R	                  USU R
                   S35        U R                  U5        g )N	a_sectionr   z section "a_section")rP   sectionrY   r)   r>   r   rA   r   s      r   test_function_section"TestFunction.test_function_section   s\    }}"jj$$&#DJJ</CD	 	$$T*r   c                 6   U R                  5       nU R                  U5      nSUl        UR                  SUR	                  / 5      5        U R                  U5      R                  5       nU R                  USU R                   S35        U R                  U5        g )Nr   r   r   z section "a_section" !dbg !0)
rF   rP   r   r   r   rY   r)   r>   r   rA   r   s       r   test_function_section_meta'TestFunction.test_function_section_meta   s    }}V$"%!4!4R!89jj$$&#DJJ</KL	 	$$T*r   c                 ^   U R                  5       nU R                  U5      nUR                  R                  S5        UR	                  SUR                  / 5      5        U R                  U5      R                  5       nU R                  USU R                   S35        U R                  U5        g )Nr   r   r   z alwaysinline !dbg !0)rF   rP   r   r   r   r   rY   r)   r>   r   rA   r   s       r   test_function_attr_meta$TestFunction.test_function_attr_meta   s    }}V$N+%!4!4R!89jj$$&#DJJ</DE	 	$$T*r   c                    U R                  5       nUR                  R                  S5        SUl        U R	                  U5      R                  5       nU R                  USU R                   S35        U R                  U5        g )Nr   r   r   z optsize section "a_section")	rP   r   r   r   rY   r)   r>   r   rA   r   s      r   test_function_attr_section'TestFunction.test_function_attr_section   so    }}I&"jj$$&#DJJ</KL	N 	$$T*r   c                 l   U R                  5       nU R                  U5      nUR                  R                  S5        SUl        UR                  SUR                  / 5      5        U R                  U5      R                  5       nU R                  USU R                   S35        U R                  U5        g )Nr   r   r   r   z) alwaysinline section "a_section" !dbg !0)rF   rP   r   r   r   r   r   rY   r)   r>   r   rA   r   s       r   test_function_attr_section_meta,TestFunction.test_function_attr_section_meta   s    }}V$N+"%!4!4R!89jj$$&#DJJ</XY	 	$$T*r   c                 <   U R                  5       nUR                  R                  S5        UR                  S5      n[        R
                  " U5      nUR                  5         U R                  U5      nU R                  USR                  U R                  S95        g )Nr   my_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )r   )rP   r   r   rS   r   	IRBuilderret_voidrY   rk   formatr   )r   rT   rU   builderra   s        r   test_defineTestFunction.test_define  s~    }}N+''
3,,u%jj  TZZ(	*r   c                 H   U R                  5       n[        R                  5       nUR                  S[        /5      nUR                  SU[
        /5      nUR                  SX"[
        /5      nUR                  S5      nU R                  U R                  U5      R                  5       S5        [        (       a_  U R                  U R                  U5      R                  5       S5        U R                  U R                  U5      R                  5       S5        O^U R                  U R                  U5      R                  5       S5        U R                  U R                  U5      R                  5       S	5        U R                  U R                  U5      R                  5       S
5        g )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"))
rF   r   
as_pointerdeclare_intrinsicrK   rJ   rk   rY   r)   r   )r   rF   pint8powimemsetmemcpyassumes          r   test_declare_intrinsics$TestFunction.test_declare_intrinsics  sh   !''cU;))-%H))-%9NO))-8D)//1 4H 	I #"TZZ/557 :b cTZZ/557 :h i TZZ/557 :b cTZZ/557 :h iF+113 65 	6r   c                     U R                  5       nUR                  S[        /5      nUR                  S[        /5      nU R                  X#5        g )Nr   )rF   r   rK   r<   )r   rF   r   powi2s       r   test_redeclare_intrinsic%TestFunction.test_redeclare_intrinsic-  sA    ''cU;((se<d"r   c                 F    U R                  5       nU R                  U5        g r&   )rP   rA   )r   fns     r   test_picklingTestFunction.test_pickling3  s    ]]_$$R(r   c                    U R                  5       nU R                  U5      nUR                  R                  S5        SnU R	                  [
        U5         UR                  R                  S5        S S S 5        g ! , (       d  f       g = f)Nr   $Can't have alwaysinline and noinlinenoinlinerF   rP   r   r   assertRaisesRegex
ValueErrorr   rF   rT   msgs       r   %test_alwaysinline_noinline_disallowed2TestFunction.test_alwaysinline_noinline_disallowed7  s`    }}V$N+4##J4OO
+ 544   A::
Bc                    U R                  5       nU R                  U5      nUR                  R                  S5        SnU R	                  [
        U5         UR                  R                  S5        S S S 5        g ! , (       d  f       g = f)Nr   r   r   r   r   s       r   %test_noinline_alwaysinline_disallowed2TestFunction.test_noinline_alwaysinline_disallowed@  s`    }}V$J'4##J4OO/ 544r   r   N)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   |   sa    
 # 	LL 

A+6+,
+	+++	++* 60#),0r   r   c                   n    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rSrg)TestIRiJ  c                     U R                  5       nUR                  [        S5      [        S5      /5        U R	                  SU5        U R                  U5        g )N{   *   z!0 = !{ i32 123, i8 42 })rF   r   rJ   r   r.   r4   r3   s     r   test_unnamed_metadataTestIR.test_unnamed_metadataL  sG    kkm%*d2h/06<S!r   c                    U R                  5       nUR                  [        S5      S/5      nUR                  [        S5      U/5      nUR                  [        S5      U/5      nU R	                  XC5        UR                  X#U/5        U R                  SU5        U R                  SU5        U R                  SU5        g )Nr   kernel  z!0 = !{ i32 123, !"kernel" }z!1 = !{ i64 456, !0 }z!2 = !{ !0, !1, !1 })rF   r   rJ   int64r<   r.   )r   r,   m0m1m2s        r   test_unnamed_metadata_2TestIR.test_unnamed_metadata_2S  s    kkmuSz845uSz2./uSz2./b""&:C@3S92C8r   c                    U R                  5       nUR                  [        S5      [        S5      /[        S5      /[        S5      //5        U R                  SU5        U R                  SU5        U R                  SU5        g )Nr   r  i  z!0 = !{ i32 456 }z!1 = !{ i32 789 }z!2 = !{ i32 123, !0, !1, !0 })rF   r   rJ   r.   r3   s     r   test_unnamed_metadata_3TestIR.test_unnamed_metadata_3c  sm    kkm%*uSzlU3ZL5:,OP/5/5;SAr   c                 l    U R                  5       nUR                  S/5        U R                  SU5        g )Nz"\$z!0 = !{ !"\22\5c$" })rF   r   r.   r3   s     r   test_metadata_stringTestIR.test_metadata_stringk  s.    kkm'#4c:r   c                    U R                  5       nUR                  [        S5      /5      nUR                  [        S5      /5      nUR	                  S5      nUR                  U5        UR                  U5        UR                  U5        U R                  SU5        U R                  U5        U R                  XAR                  S5      5        U R                  [        5         UR                  S5        S S S 5        g ! , (       d  f       g = f)Nr   r  fooz!foo = !{ !0, !1, !0 }bar)rF   r   rJ   r  add_named_metadatar   r.   r4   r<   get_named_metadataassertRaisesKeyError)r   r,   r  r  nmds        r   test_named_metadataTestIR.test_named_metadataq  s    kkmuSzl+uSzl+$$U+4c:S!c11%89x(""5) )((s   #C>>
Dc                    U R                  5       nUR                  [        S5      /5      nUR                  SU5        UR                  S[	        S5      /5        UR                  SS/5        UR                  S/ 5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  S	U5        U R                  S
U5        U R                  SU5        U R                  U5        g )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 = !{  })rF   r   rJ   r  r  r.   r4   )r   r,   r  s      r   test_named_metadata_2TestIR.test_named_metadata_2  s    kkmuSzl+ub)uuSzl3uxj1ub)4c:/5/5137,c2L#.S!r   c                    U R                  5       nUR                  [        R                  5       " S 5      /5        [        (       a  U R                  SU5        OU R                  SU5        U R                  U5        U R                  5       nUR                  S [        S5      /5        U R                  SU5        U R                  U5        g )Nz!0 = !{ ptr null }z!0 = !{ i32* null }r   z!0 = !{ null, i32 123 })rF   r   rJ   r   r   r.   r4   r3   s     r   test_metadata_nullTestIR.test_metadata_null  s    kkm%**,T234"" 4c: 5s;S!kkm$c
+,5s;S!r   c           
         U R                  5       nUR                  SSSS.5      nUR                  SSUR                  S /5      05      nUR                  S[        R                  " S5      US	S
SS.SS9nUR                  SSUSUSUS.SS9  [        U5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  U5        g )NDIFiler  r  filename	directoryDISubroutineTypetypesDICompileUnitDW_LANG_PythonARTIQr   T)languagefileproducerruntimeVersionisOptimizedis_distinctDISubprogramr      F)rN   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))rF   add_debug_infor   r   DITokenr'   r.   r4   )r   r,   di_filedi_func_typedi_compileunitstrmods         r   test_debug_infoTestIR.test_debug_info  sK    kkm$$X0
  ))*<S%%tf-?
  ++O

#34>
  ,  	> ",
  	 	 SM"	$,f5?H D #	$ 	 " #	$ 	S!r   c                    U R                  5       nUR                  SSSS.5      nUR                  SSSS.5      nUR                  SSSS.5      nUR                  SSSS.SS9nU R                  X#5        U R                  [	        X#XE15      S5        [        U5      nU R                  SU5        U R                  S	U5        U R                  S
U5        U R                  U5        g )Nr  r  r  r   Tr-  r   r4  z/!1 = !DIFile(directory: "foo", filename: "bar")z8!2 = distinct !DIFile(directory: "bar", filename: "foo"))rF   r5  r<   r>   lenr'   r.   r4   )r   r,   di1di2di3di4r:  s          r   test_debug_info_2TestIR.test_debug_info_2  s   kkm  .3/4"$%   .3/4"$%   .3/4"$%   .3/4"$15 ! 7 	cc12A6SM"	$M"	$ %&,	.S!r   c                    U R                  5       n[        R                  " U[        R                  " 5       S5      n[        R                  " [        R                  " 5       S5      Ul        UR                  SSS[        R                  " S5      S.5      nUR                  SUR                  S	0 5      UR                  S
UR                  USS.SS9S.5      nUR                  SU5        [        U5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        [        R                  " S5      " S5      S[        R                  " S5      " S5      /n[        R                  " S5      " S5      S[        R                  " S5      " S5      /nUR                  U5      nUR                  U5      nUR                  S5      nUR                  U5        UR                  U5        UR                  SSSS.5      n	UR                  S[        R                  " S 5      U	[        R                  " S!5      UR                  U/5      S".SS9n
UR                  S#U
5        g )$Ngvarr   DIBasicTypefloatr
   DW_ATE_float)rN   sizeencodingDIGlobalVariableExpressionDIExpressionDIGlobalVariableT)rN   r1  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 !3r   zDwarf Versionr   zDebug Info Versionr   zllvm.module.flagsr  r  r  r   r%  r&  	FullDebug)r(  r)  emissionKindglobalszllvm.dbg.cu)rF   r   GlobalVariable	FloatTypeConstantinitializerr5  r6  rN   r   r'   r.   IntTyper   r  r   )r   r,   rF  di_floatdi_gvarr:  dverdiverflagsr7  di_cus              r   test_debug_info_gvarTestIR.test_debug_info_gvar  s`    kkm  bllnf=;;r||~r:%%m

>26
 
 $$%A&&~r:%%&8		  $;  	 & !D
  	%) S 78>	@2F; <=C	E '(.	0 &'-	/ 

2q!?BJJrN14EFB"$8"**R.:KL%  '&&':;		$		%$$X0
  ""?

#34JJ{3''	2	5

  #  	}e4r   c                     U R                  5       nUR                  SSS05        [        U5      nSR                  [	        S SR                  5       5      5      nU R                  SU S3U5        g )	NDILocalVariablerN   u   a∆r   c                     SU S 3$ )Nr   02xr   )xs    r   <lambda>7TestIR.test_debug_info_unicode_string.<locals>.<lambda>7  s    r!C\r   u   ∆z!0 = !DILocalVariable(name: "az"))rF   r5  r'   r   r   encoder.   )r   r,   r:  rN   s       r   test_debug_info_unicode_string%TestIR.test_debug_info_unicode_string1  sb    kkm,vv.>?Swws15<<>BC<TF"EvNr   c                    U R                  5       n[        R                  " U[        R                  " [        R                  " 5       / 5      S5      n[        R
                  " UR                  S5      5      n[        R                  " [        [        /5      n[        R                  " USSSS9nUR                  U[        S5      /5        UR                  5         SnU R                  U[        U5      5        U R                  U5        g )	Nr  r   
mov $1, $2=r,rTside_effectr   8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))rF   r   rM   rI   VoidTyper   rS   rJ   	InlineAsmcallr   r#   r'   r4   )r   r,   r  r   asmtyra   pats          r   test_inline_assemblyTestIR.test_inline_assembly:  s    kkmkk#rr{{}bA5I,,s55b9:w/ll5,DIS5:,'H#s3x(S!r   c                    U R                  5       n[        R                  " U[        R                  " [        R                  " 5       / 5      S5      n[        R
                  " UR                  S5      5      n[        R                  " [        [        /5      nUR                  USS[        S5      /SS9  UR                  5         SnU R                  U[        U5      5        U R                  U5        g )	Nr  r   rm  rn  r   Tro  rq  )rF   r   rM   rI   rr  r   rS   rJ   ra   r   r#   r'   r4   )r   r,   r  r   ru  rv  s         r   test_builder_asmTestIR.test_builder_asmF  s    kkmkk#rr{{}bA5I,,s55b9:w/E<%*4PH#s3x(S!r   c                    U R                  5       n[        R                  " U[        R                  " [        R                  " 5       / 5      S5      n[        R
                  " UR                  S5      5      nUR                  [        R                  " S5      S5        UR                  5         SnU R                  U[        U5      5        U R                  U5        g )Nr  r   r   raxzcall i64 asm "", "={rax}")rF   r   rM   rI   rr  r   rS   load_regrY  r   r#   r'   r4   r   r,   r  r   rv  s        r   test_builder_load_regTestIR.test_builder_load_regQ  s    kkmkk#rr{{}bA5I,,s55b9:B/)#s3x(S!r   c                    U R                  5       n[        R                  " U[        R                  " [        R                  " 5       / 5      S5      n[        R
                  " UR                  S5      5      nUR                  [        S5      [        R                  " S5      S5        UR                  5         SnU R                  U[        U5      5        U R                  U5        g )Nr  r   r   r   r}  z0call void asm sideeffect "", "{rax}" ( i64 123 ))rF   r   rM   rI   rr  r   rS   	store_regr  rY  r   r#   r'   r4   r  s        r   test_builder_store_regTestIR.test_builder_store_reg[  s    kkmkk#rr{{}bA5I,,s55b9:%*bjjne<@#s3x(S!r   r   N)r   r   r   r   r   r  r	  r  r  r  r  r;  rC  r`  rj  rw  rz  r  r  r   r   r   r   r   r   J  sR    "9 B;* " " +"Z">B5HO
"	"""r   r   c                   ,    \ rS rSrS rS rS rS rSrg)TestGlobalValuesif  c                    U R                  5       n[        R                  " U[        R                  " [        R                  " 5       / 5      S5      n[        R                  " U[        R                  " [        R                  " 5       / 5      S5        [        R
                  " U[        R                  " 5       S5      nU R                  UR                  S5      U5        U R                  UR                  S5      U5        U R                  [        5         UR                  S5        S S S 5        [        (       a  U R                  [        U5      S5        g U R                  [        U5      S5        g ! , (       d  f       NQ= f)Nr  r  
globdoublekkkz.<ir.GlobalVariable 'globdouble' of type 'ptr'>z2<ir.GlobalVariable 'globdouble' of type 'double*'>)rF   r   rM   rI   rr  rU  
DoubleTyper>   
get_globalr  r  r   repr)r   r,   r  r  s       r   test_globals_access$TestGlobalValues.test_globals_accessh  s   kkmkk#rr{{}bA5I
C;UC&&sBMMO\J
.45zBx(NN5! ) #"T*-MO Z DF )(s   E00
E>c                    U R                  5       n[        R                  " [        R                  " 5       / 5      n[        R                  " XS5      n[        R                  " XS5      n[        R
                  " U[        R                  " 5       S5      nU R                  [        UR                  5      [        X445      5        U R                  [        UR                  5      [        X4U45      5        g)zZ
Accessing functions and global values through Module.functions
and Module.global_values.
r  r  r  N)rF   r   rI   rr  rM   rU  r  r>   set	functionsglobal_values)r   r,   ftyr  r  r  s         r   #test_functions_global_values_access4TestGlobalValues.test_functions_global_values_access{  s    
 kkmoobkkmR0kk#E*kk#E*&&sBMMO\J
S]]+S#_=S../c
5K1LMr   c                 H   U R                  5       n[        R                  " U[        S5      n[        R                  " U[        SSS9n[        R                  " U[        S5      n[	        S5      Ul        [        R                  " U[        S5      nSUl        [        R                  " U[        S	5      nS
Ul        [        R                  " U[        SSS9nSUl        [        R                  " U[        S5      nS
Ul        [	        S5      Ul        SUl	        [        R                  " U[        S5      n	S
U	l        [	        S5      U	l        SU	l
        [        R                  " U[        S5      n
S
U
l        [	        S5      U
l        SU
l	        SU
l
        U R                  US5        g)z'
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)rF   r   rU  r   rJ   rX  global_constantlinkageunnamed_addrr   r   rx   )r   r,   r  r  r   r  r  r  r  r  r  s              r   test_global_variables_ir)TestGlobalValues.test_global_variables_ir  sO    kkmc4-c4;c5#.c
c5#. c5#.	c5#=c5#.	c
c5#.	c
	c5#.	c
	s 
% 
	r   c                 F    U R                  5       nU R                  U5        g r&   )rF   rA   r3   s     r   test_pickleTestGlobalValues.test_pickle  s    kkm$$S)r   r   N)	r   r   r   r   r  r  r  r  r   r   r   r   r  r  f  s    F&N)V*r   r  c                   ,    \ rS rSrS rS rS rS rSrg)	TestBlocki  c                     U R                  5       n[        R                  " USS9nU R                  UR                  U5        U R                  UR                  5        g )NstartparentrN   )rP   r   Blockr<   r  assertFalseis_terminatedr   rT   rU   s      r   test_attributesTestBlock.test_attributes  sC    }}73ellD),,-r   c                     U R                  SS9nU R                  U R                  U5      S5        UR                  R	                  SS/5        U R                  U R                  U5      S5        g )Nr   rN   z
my_block:
r  r  zmy_block:
  a
  b
)rU   r>   rY   instructionsextend)r   rU   s     r   
test_descrTestBlock.test_descr  s]    



+E*M:!!3*-E*,CDr   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4S5      nUR                  X4S5      nUR                  XdS5        [        R                  " XR                  SXT4S5      nU R                  US	5        UR                  Xg5        U R                  US
5        g )Nr   r  r   r   r  r  sdivr  z            my_block:
                %"c" = add i32 %".1", %".2"
                %"d" = sub i32 %".1", %".2"
                %"e" = mul i32 %"d", %".2"
            z            my_block:
                %"c" = add i32 %".1", %".2"
                %"f" = sdiv i32 %"c", %".2"
                %"e" = mul i32 %"f", %".2"
            )rU   r   r   rP   r   r   r   mulInstructionr1  ro   r`   )r   rU   r   r  r  r   r  r  s           r   test_replaceTestBlock.test_replace  s    



+,,u%$$Ra(KKc"KKc"A#NN5&&&1&#> ! 	 	a ! 	r   c                     U R                  5       n[        R                  " USS9nU R                  [	        U5      S5        g)z$
Blocks should have a useful repr()
r  r  z"<ir.Block 'start' of type 'label'>N)rP   r   r  r>   r  r  s      r   	test_reprTestBlock.test_repr  s4     }}73e&JKr   r   N)	r   r   r   r   r  r  r  r  r   r   r   r   r  r    s    .E,Lr   r  c                   f   \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;S: r<S;r=g<)=TestBuildInstructionsi  zF
Test IR generation of LLVM instructions through the IRBuilder class.
i  c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4S5      nU R                  US5        U R                  [        U5      S5        g )Nr   r  r   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>)>)	rU   r   r   rP   r   r   ro   r>   r  )r   rU   r   r  r  insts         r   test_simple!TestBuildInstructions.test_simple  sz    



+,,u%$$Ra({{1' ! 	
 	d<	=r   c                 2   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4nUR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S	5        UR                  X4S
5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR!                  X4S5        UR#                  X4S5        UR%                  X4S5        UR'                  X4S5        UR)                  X4S5        UR+                  X4S5        UR-                  X4S5        U R/                  [0        5       nUR                  X55        S S S 5        U R3                  [5        WR6                  5      S5        U R9                  UR:                  5        U R=                  US5        g ! , (       d  f       Na= f)Nr   r  r   r   r  r  r  r  r  r  jklmnopqrstz1Operands must be the same type, got (i32, double)aD              my_block:
                %"c" = add i32 %".1", %".2"
                %"d" = fadd i32 %".1", %".2"
                %"e" = sub i32 %".1", %".2"
                %"f" = fsub i32 %".1", %".2"
                %"g" = mul i32 %".1", %".2"
                %"h" = fmul i32 %".1", %".2"
                %"i" = udiv i32 %".1", %".2"
                %"j" = sdiv i32 %".1", %".2"
                %"k" = fdiv i32 %".1", %".2"
                %"l" = urem i32 %".1", %".2"
                %"m" = srem i32 %".1", %".2"
                %"n" = frem i32 %".1", %".2"
                %"o" = or i32 %".1", %".2"
                %"p" = and i32 %".1", %".2"
                %"q" = xor i32 %".1", %".2"
                %"r" = shl i32 %".1", %".2"
                %"s" = ashr i32 %".1", %".2"
                %"t" = lshr i32 %".1", %".2"
            )rU   r   r   rP   r   r   faddr   fsubr  fmuludivr  fdivuremsremfremor_and_xorshlashrlshrr  r   r>   r'   	exceptionr  r  ro   )r   rU   r   r  r  ffcms          r   test_binops!TestBuildInstructions.test_binops  s   



+,,u%##((!,bA#Q3A#Q3A#Q3Q3Q3Q3Q3Q3Q3A#Q3A#A#Q3Q3z*bKK +R\\*L	N,,- ! 	 +*s   H
Hc                     U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4SSS9  UR                  X4SSS	/S9  U R                  US
5        g )Nr   r  r   r   )nuwr^  r  r  nswz            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )rU   r   r   rP   r   r   r   ro   r   rU   r   r  r  s        r   test_binop_flags&TestBuildInstructions.test_binop_flags,  sw    



+,,u%$$Ra(A#X.A#eU^4 ! 	r   c                     U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4SSS9  UR                  X4SSS	/S9  U R                  US
5        g )Nr   r  r   r   fastr  r  ninfnszz            my_block:
                %"c" = fadd fast i32 %".1", %".2"
                %"d" = fsub ninf nsz i32 %".1", %".2"
            )rU   r   r   rP   r   r  r  ro   r  s        r   test_binop_fastmath_flags/TestBuildInstructions.test_binop_fastmath_flags:  sw    



+,,u%$$Ra(Q3i0Q3vuo6 ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S5        UR                  X4S	5        U R                  US
5        g )Nr   r  r   r   r  r  r  r  r  a  my_block:
    %"c" = call {i32, i1} @"llvm.sadd.with.overflow.i32"(i32 %".1", i32 %".2")
    %"d" = call {i32, i1} @"llvm.smul.with.overflow.i32"(i32 %".1", i32 %".2")
    %"e" = call {i32, i1} @"llvm.ssub.with.overflow.i32"(i32 %".1", i32 %".2")
    %"f" = call {i32, i1} @"llvm.uadd.with.overflow.i32"(i32 %".1", i32 %".2")
    %"g" = call {i32, i1} @"llvm.umul.with.overflow.i32"(i32 %".1", i32 %".2")
    %"h" = call {i32, i1} @"llvm.usub.with.overflow.i32"(i32 %".1", i32 %".2")
            )rU   r   r   rP   r   sadd_with_overflowsmul_with_overflowssub_with_overflowuadd_with_overflowumul_with_overflowusub_with_overflowro   r  s        r   test_binops_with_overflow/TestBuildInstructions.test_binops_with_overflowH  s    



+,,u%$$Ra(""1-""1-""1-""1-""1-""1- ! 	r   c                 L   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4nUR                  US5        UR                  US5        UR                  US5        U R                  UR                  5        U R                  US5        g )Nr   r  r   r  r  r  z            my_block:
                %"d" = sub i32 0, %".1"
                %"e" = xor i32 %".2", -1
                %"f" = fneg double %".3"
            )rU   r   r   rP   r   negnot_fnegr  r  ro   r   rU   r   r  r  r   s         r   test_unary_ops$TestBuildInstructions.test_unary_ops\  s    



+,,u%""''+aAsQQ,,- ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4[        R
                  " [        R                  " S5      [        R                  5      n[        R
                  " [        R                  " S5      [        R                  5      nUR                  XVS5      nU R                  US5        UR                  XS5        UR                  Xd5        U R                  US5        g )Nr   r  r   r
   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )rU   r   r   rP   r   rW  rY  	Undefinedr   ro   replace_usage)r   rU   r   r  r  undef1undef2r   s           r   test_replace_operand*TestBuildInstructions.test_replace_operandk  s    



+,,u%$$Ra(RZZ^R\\:RZZ^R\\:KK, ! 	 	
"	" ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  SX4S5        UR                  SX4S5        UR                  SX4S	5        UR                  S
X4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  S
X4S5        UR                  SX4S5        UR                  SX4S5        U R                  [        5         UR                  SX4S5        S S S 5        U R                  [        5         UR                  SX4S5        S S S 5        U R                  UR                  5        U R                  US5        g ! , (       d  f       Nm= f! , (       d  f       NM= f)Nr   r  r   ==r   !=r  <r  <=r  >r  >=r  r  r  r  r  r  r  unozzr  aj              my_block:
                %"c" = icmp eq i32 %".1", %".2"
                %"d" = icmp ne i32 %".1", %".2"
                %"e" = icmp ult i32 %".1", %".2"
                %"f" = icmp ule i32 %".1", %".2"
                %"g" = icmp ugt i32 %".1", %".2"
                %"h" = icmp uge i32 %".1", %".2"
                %"i" = icmp eq i32 %".1", %".2"
                %"j" = icmp ne i32 %".1", %".2"
                %"k" = icmp slt i32 %".1", %".2"
                %"l" = icmp sle i32 %".1", %".2"
                %"m" = icmp sgt i32 %".1", %".2"
                %"n" = icmp sge i32 %".1", %".2"
            )rU   r   r   rP   r   icmp_unsignedicmp_signedr  r   r  r  ro   r  s        r   test_integer_comparisons.TestBuildInstructions.test_integer_comparisons}  s   



+,,u%$$Ra(dA#.dA#.c1-dA#.c1-dA#.D!,D!,Cs+D!,Cs+D!,z*qT2 +z*qT2 +,,- ! 	 +***s   :F5+G5
G
Gc                 f   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  SX4S5        UR                  SX4S5        UR                  SX4S	5        UR                  S
X4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  S
X4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S5        UR                  SX4S/ SQS9  U R                  UR                  5        U R                  US 5        g )!Nr   r  r   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ordur  vwrf  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"
            )
rU   r   r   rP   r   fcmp_orderedfcmp_unorderedr  r  ro   r  s        r   test_float_comparisons,TestBuildInstructions.test_float_comparisons  s   



+,,u%$$Ra(T1-T1-S!,T1-S!,T1-tQ3/tQ3/sA#.tQ3/sA#.tQ3/UA#.UA#.uaC0uaC0uaC%L 	 	N,,- ! 	r   c                    U R                  SS9n[        R                  " [        S5      n[        R                  " U5      nUR
                  R                  S S u  pEUR                  X$USSS9  U R                  UR                  5        UR                  5         U R                  UR                  5        U R                  US5        g )	Nr   r  Tr   r   )r(  r'  r  z            my_block:
                %"c" = select arcp nnan i1 true, i32 %".1", i32 %".2"
                unreachable
            )rU   r   rW  int1r   rP   r   selectr  r  unreachable
assertTruero   )r   rU   r  r   r  r  s         r   test_misc_ops#TestBuildInstructions.test_misc_ops  s    



+KKd#,,u%$$Ra(qQ+;<,,-++, ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  R                  S5      nUR                  R                  S5      nUR                  [        SSS9nUR                  X55        UR                  XF5        U R                  UR                  5        U R                  US	5        g )
Nr   r  r   b2b3my_phir  r  zj            my_block:
                %"my_phi" = phi fast i32 [%".1", %"b2"], [%".2", %"b3"]
            )rU   r   r   rP   r   rS   phirJ   add_incomingr  r  ro   )r   rU   r   r  r  bb2bb3r8  s           r   test_phiTestBuildInstructions.test_phi  s    



+,,u%$$Ra(11$711$7kk%k;  ,,- ! 	r   c                 4   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4nUR                  [        SS9nUR                  [        SSS9nUR                  [        USS9nS	Ul        U R                  UR                  [        R                  " [        5      5        UR                  XX5      n	U R                  U	R                  [        R                  " 5       5        UR                  XF5      n
U R                  U
R                  [        R                  " 5       5        UR                  US
5      nU R                  UR                  [        5        UR                  XFSS9nU R                  UR                  [        R                  " 5       5        UR                  USSS9nU R                  UR                  [        5        UR                  XFSSS9nU R                  UR                  [        R                  " 5       5        UR!                  USSSS9nU R                  UR                  [        5        ["        (       a+  [        R$                  " [        R                  " 5       S 5      nO/[        R$                  " [        R                  " [        5      S 5      nUR                  [        R$                  " [        S5      U5        U R'                  [(        5         UR                  XC5        S S S 5        U R'                  [(        5         UR                  U5        S S S 5        U R'                  [(        5       nUR                  XH5        S S S 5        ["        (       a8  U R                  [+        WR,                  5      S5        U R/                  US5        g U R                  [+        WR,                  5      S5        U R/                  US5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)Nr   r  r   r   r   r  )rJ  rN   r  r   r  r   )r   r  seq_cstr   )orderingr   r  )r@  r   rN   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
                )rU   r   r   rP   r   allocarJ   rK   r   r>   r1  rL   storerr  loadstore_atomicload_atomicr   rW  r  	TypeErrorr'   r  ro   )r   rU   r   r  r  zr   r  r  eer  r  r  r  r  r  ptrr  s                     r   test_mem_ops"TestBuildInstructions.test_mem_ops  s   



+,,u%""''+aNN5sN+NN5rN4NN3QSN1!45]]1 "++-0MM!/LLC 'MM!aM(/LLCqL)'  	 C/IQSI'""++bnn.5C++bnnU3T:Cbkk%+S1y)MM! *y)LLO * y)RMM! * #"S.IKU %  S.MOU % ; *))) *)s$   4O'#O8P	'
O58
P	
Pc                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  [        R                  " [        5      SS9nUR                  U[        R                  " [        S5      U/SS9nU R                  UR                  [        R                  " [        5      5        [        (       a  U R                  US5        g U R                  US5        g )	Nr   r  r   r   r   r  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"
                )rU   r   r   rP   r   rA  rL   rJ   geprW  r>   r1  r   ro   r   rU   r   r  r  r   r  s          r   test_gepTestBuildInstructions.test_gep8  s    



+,,u%$$Ra(NN2>>%0sN;KKBKKq115CK@!67""U %  U % r   c           
      l   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4[
        R                  5       n[        R                  " [        XUU[        /5      nUR                  X6R                  5       SS9nUR                  US Vs/ s H  n[        R                  " [        U5      PM      snSS9n	U R                  U	R                  [        R                  " U5      5        [         (       a  U R#                  US5        g U R#                  US5        g s  snf )	Nr   r  r   r  r   r   r  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
                )rU   r   r   rP   r   r   r   LiteralStructTyper  bitcastrM  rW  rJ   r>   r1  rL   r   ro   )
r   rU   r   r  r  int8ptrlsr  rf  r  s
             r   test_gep_castinstr(TestBuildInstructions.test_gep_castinstrN  s     



+,,u%$$Ra(//#!!5'GU"KLOOA}}SO9KK6B6aBKKq16BKM!89""U %  U %  Cs   %%D1
c           
         U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4Sn[
        R                  5       n[        R                  " [        XfU[        /5      nUR                  X7R                  US9SS9nUR                  US V	s/ s H  n	[        R                  " [        U	5      PM      sn	SS9n
U R                  U
R                  R                  U5        U R                  U
R                  [        R                   " XeS95        ["        (       a  U R%                  US	5        g U R%                  US
5        g s  sn	f )Nr   r  r   r   r  r  rR  r  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
                )rU   r   r   rP   r   r   r   rS  r  rT  rM  rW  rJ   r>   r1  r  rL   r   ro   )r   rU   r   r  r  r  rU  rV  r  rf  r  s              r   test_gep_castinstr_addrspace2TestBuildInstructions.test_gep_castinstr_addrspaceg  s     



+,,u%$$Ra(	//#!!5'GU"KLOOA}}y}AOLKK6B6aBKKq16BKM))95!MN""U %  U %  Cs   &%E
c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4SnUR                  [        R                  " [        US9SS9n[        (       a&  U R                  [        UR                  5      S5        O%U R                  [        UR                  5      S5        U R                  UR                  R                  R                  U5        UR                  U[        R                  " [        S	5      U/S
S9nU R                  UR                  R                  U5        UR                  U[        R                  " [        S5      /SS9nU R                  UR                  R                  U5        [        (       a  U R!                  US5        g U R!                  US5        g )Nr   r  r   r   r  r   rI  zi32 addrspace(4)**r   r  r   r  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
                )rU   r   r   rP   r   rA  rL   rJ   r   r>   r'   r1  pointeer  rM  rW  ro   )	r   rU   r   r  r  r  r   r  r  s	            r   test_gep_addrspace(TestBuildInstructions.test_gep_addrspace  s]   



+,,u%$$Ra(	NN2>>%9ECNP""S[%0S[*>?119=KKBKKq115CK@))95KKBKKr23#K>))95""U %  U % r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4[        R
                  " [        [        /5      n[        R
                  " [        U/5      n[        R                  " U[        R                  " [        S5      [        R                  " [        S5      45      nUR                  USSS9nUR                  XsSSS9n	UR                  U	[        R                  " [        S	5      S
SS9n
U R                  U	R                  U5        U R                  U
R                  U5        UR                  USS9nUR                  USS9nUR                  USSS9nUR                  US
SS9nUR                  USSS9nUR                  USSS9nUR                  XS
SS9nUR                  XSSS9nU R                  UR                  [        5        U R                  UR                  U5        U R                  UR                  [        5        U R                  UR                  [        5        U R                  UR                  U5        U R                  UR                  U5        U R!                  ["        5         UR                  US5        S S S 5        U R!                  ["        5         UR                  US5        S S S 5        U R!                  ["        5         UR                  US5        S S S 5        U R!                  ["        5         UR                  X4S5        S S S 5        U R!                  ["        5         UR                  XsS
5        S S S 5        [$        (       a  U R'                  US5        g U R'                  US5        g ! , (       d  f       GN = f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)Nr   r  r   r   Tr   r   r  Fr   r  rI  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
                )rU   r   r   rP   r   rS  rJ   r.  r   rW  extract_valueinsert_valuer>   r1  rA  rC  r  rF  r   ro   )r   rU   r   r  r  tp_innertp_outerc_innerr   r  r  p_outerr  r  r  r  r  r  r  s                      r   test_extract_insert_value/TestBuildInstructions.test_extract_insert_value  sP   



+,,u%$$Ra(''6''x(89++hUA)>)+T4)@)B C !!'13!7  QS 9  BKKe$<ac J**...6LLsL+!!!QS!1!!!QS!1!!!V#!6!!!V#!6  qs 3  vC 8&*'&**y)!!'1- * y)!!'62 * y)!!'1- * y)  q) * y)  Q/ *
 #"U %  U % C *) *) *) *) *)s<   N(N:<O,OO-(
N7:
O
O
O*-
O;c                 `   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4pVUR                  U[        SS9nUR                  U[        SS9nUR                  U[        SS9n	UR                  U[        S5      n
UR                  U
[        S5      nUR                  U[        S	5      nUR                  U[        S
5      nUR!                  U[        S5      nUR#                  U[        S5      nUR%                  U[        S5      nUR'                  U[        R(                  " [        5      S5      nUR+                  U[        S5      nU R-                  UR.                  5        [0        (       a  U R3                  US5        g U R3                  US5        g )Nr   r  r   r   r  r  fbfcr  r  fdfer  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
                )rU   r   r   rP   r   truncr   zextrJ   sextfptruncfltfpextrK   fptouifptosiuitofpsitofpptrtointinttoptrrL   rT  r  r  r   ro   )r   rU   r   r  r  farI  r   r  r  rj  rk  r  r  rl  rm  r  r  r  s                      r   test_cast_ops#TestBuildInstructions.test_cast_ops  sm   



+,,u%((--bq1bMM!TM,LLEL,LLEL,__Rd+]]2sD)NN2uc*NN2tS)^^AsD)^^AsD)S%-Qt 4c:OOAsC(,,-""U %   U % r   c                 t   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  [        SS9nUR                  SXSSS5      nU R                  UR                  [        5        [        (       a  U R                  US5        g U R                  US	5        g )
Nr   r  r   r   r   	monotonicr  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
                )rU   r   r   rP   r   rA  rJ   
atomic_rmwr>   r1  r   ro   rN  s          r   test_atomicrmw$TestBuildInstructions.test_atomicrmw#  s    



+,,u%$$Ra(NN5sN+uaK='""U %  U % r   c                     U R                  SS9n[        R                  " U5      nUR                  R	                  SS9nUR                  U5        U R                  UR                  5        U R                  US5        g )Nr   r  targetzE            my_block:
                br label %"target"
            )	rU   r   r   rP   rS   branchr1  r  ro   )r   rU   r   	bb_targets       r   test_branch!TestBuildInstructions.test_branch8  sl    



+,,u%$$77X7F	y!++, ! 	r   c                 b   U R                  SS9n[        R                  " U5      nUR                  R	                  SS9nUR                  R	                  SS9nUR                  [        R                  " [        S5      X45        U R                  UR                  5        U R                  US5        g )Nr   r  b_trueb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )rU   r   r   rP   rS   cbranchrW  r.  r1  r  ro   )r   rU   r   bb_truebb_falses        r   test_cbranch"TestBuildInstructions.test_cbranchC  s    



+,,u%""5585D##66I6FD%0'D++, ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R	                  SS9nUR                  R	                  SS9nUR                  [        R                  " [        S5      X45      nUR                  SS/5        U R                  UR                  5        U R                  US5        U R                  UR                  S	5        g )
Nr   r  r  r  Fr   r   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )rU   r   r   rP   rS   r  rW  r.  set_weightsr1  r  ro   r|   rF   )r   rU   r   r  r  brs         r   test_cbranch_weights*TestBuildInstructions.test_cbranch_weightsO  s    



+,,u%""5585D##66I6F__R[[u5wI
2w++, ! 	 	GNN - 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R	                  SS9nUR                  R	                  SS9nUR                  [        R                  " UR                  U5      5      nUR                  U5        UR                  U5        U R                  UR                  5        [        (       a  U R                  US5        g U R                  US5        g )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"]
                )rU   r   r   rP   rS   branch_indirectBlockAddressadd_destinationr1  r  r   ro   )r   rU   r   bb_1bb_2
indirectbrs         r   test_branch_indirect*TestBuildInstructions.test_branch_indirect_  s    



+,,u%222>222>,,OOG,,d35
""4(""4(++,""U % 
 U % r   c                   ^  U 4S jnT R                  SS9n[        R                  " U5      nUR                  5         U" US5        T R                  SS9n[        R                  " U5      nUR	                  [        S5      5        U" US5        T R                  SS9n[        R                  " U5      nUR                  5       nUR                  SUR                  R                  S	5      5        U" US
5        T R                  SS9n[        R                  " U5      nUR	                  [        S5      5      nUR                  SUR                  R                  S	5      5        U" US5        g )Nc                 ^   > TR                  U R                  5        TR                  X5        g r&   )r1  r  ro   )rU   expected_irr   s     r   check1TestBuildInstructions.test_returns.<locals>.checkv  s#    OOE//0U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
            )	rU   r   r   r   retrJ   r   rF   r   )r   r  rU   r   r  s   `    r   test_returns"TestBuildInstructions.test_returnsu  s>   	1 



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

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



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



+,,u%{{58$%!:!:2!>?e  	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  R                  SS9nUR                  R                  SS9nUR                  R                  SS9nUR                  R                  SS9nUR                  X85      n	U	R                  [        R                  " [        S5      U5        U	R                  [        R                  " [        S	5      U5        U	R                  SU5        U R                  UR                  5        U R                  US
5        g )Nr   r  r   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"]
            )rU   r   r   rP   r   rS   switchadd_caserW  rJ   r1  r  ro   )
r   rU   r   r  r  	bb_onzerobb_ononebb_ontwobb_elsesws
             r   test_switch!TestBuildInstructions.test_switch  s   



+,,u%$$Ra($$77X7F	##66G6D##66G6D""55;5G^^A'
BKKq)95
BKKq)84
Ax ++, ! 	r   c                 b   U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4[        R
                  " [        [        [        45      n[        R
                  " [        [        4SS9n[        R
                  " [        [        [        45      n[        R                  " UR                  R                  US5      n[        R                  " UR                  R                  US5      n	[        R                  " UR                  R                  US5      n
UR                  XU4S	5        UR                  XU4S
5        UR                  XU4S5        UR                  XU4SSS9  UR                  XU4S5      nUR                  R                  S5        UR                  XU4SSS9  UR                  XU4SSS9  UR                  XU4SSS9  UR                  XU4SSS9  UR                  XU4SSS9  UR                  XU4SSS9  U R                  US5        g ) Nr   r  r   Tr   r  r  r  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   r  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
        )rU   r   r   rP   r   rI   rr  rJ   rK   hlfrM   rF   rt  r   r   ro   )r   rU   r   r  r  tp_ftp_gtp_hr  r  r  r  s               r   	test_callTestBuildInstructions.test_call  s   



+,,u%$$Ra(sUEN3sUHd;sUEN3KK((//s;KK((//s;KK((//s;QA(QA(QA(QAH= aQ1AB!!%%j1QA
V<QA:JKQAjAQA 2.IQA 1 :F 	GQA 0E ! 	r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        R                  " 5       [        R
                  " 5       /S-  5      n[        R                  " UR                  US5      nUR                  [        SS9nUR                  R                  S5      nUR                  XEXf45        [        (       a  U R                  US5        g	U R                  US5        g	)
z)
Function calls with metadata arguments.
r   r  r   zllvm.dbg.declarer  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)rU   r   r   rI   rr  MetaDataTyperM   rF   rA  rJ   r   rt  r   ro   )r   rU   r   dbg_declare_tydbg_declarer  r  s          r   test_call_metadata(TestBuildInstructions.test_call_metadata  s     



+,,u%9J8Ka8OPkkNN  NN5sN+NN''+[a),""U %  U % r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        R                  " 5       [
        R                  5       [
        [
        R                  5       45      n[        R                  " UR                  R                  US5      nUR                  S   R                  S5        UR                  [
        SS9nUR                  [
        SS9nUR                  UU[        R                  " [
        S5      U4S	S
S.S9  [        (       a  U R!                  US5        g U R!                  US5        g )Nr   r  funr   sretretvalotherr   r  r   r   r   r   	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"\)
            )rU   r   r   rI   rr  rJ   r   rM   rP   rF   r   r   rA  rt  rW  r   rr   )r   rU   r   fun_tyr  r  r  s          r   test_call_attributes*TestBuildInstructions.test_call_attributes  s   



+,,u%KKME,,.u7G7G7IJLkk'**1165A!!&)H5u73R[[+U3& 	 	
 #"""5 +  ""5 + r   c                 0   U R                  SS9n[        R                  " U5      n[        R                  " [        R                  " 5       S5      n[        R
                  " UR                  R                  US5      nUR                  US5        UR                  USSS9  UR                  USSS9  UR                  USSS9  UR                  USS	S9  UR                  USS
S9  UR                  US/ S9  UR                  USSS9  U R                  US5        g )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"()
        )
rU   r   r   rI   rr  rM   rP   rF   rt  ro   r   rU   r   r  r  s        r   test_call_tail$TestBuildInstructions.test_call_tail  s    



+,,u%3kk'**1168DS"S"5)S"4(S"6*S"8,S":.S"2&S">2 
! 
	r   c                    U R                  5       n[        R                  " U5      n[        R                  " [        R                  " 5       S5      n[        R
                  " UR                  R                  US5      nU R                  [        5         UR                  USSS0S9  S S S 5        g ! , (       d  f       g = f)Nr   r  r   r  r  )rU   r   r   rI   rr  rM   rP   rF   r  r   rt  r  s        r   test_invalid_call_attributes2TestBuildInstructions.test_invalid_call_attributes.  s    

,,u%3kk'**1165Az*LLbQKL8 +**s   B//
B=c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4[        R
                  " [        [        [        45      n[        R                  " UR                  R                  US5      nUR                  R                  SS9nUR                  R                  SS9nUR                  XcU4XxS5        U R                  US5        g )	Nr   r  r   r  normalunwindr  z            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )rU   r   r   rP   r   rI   rr  rJ   rM   rF   rS   invokero   )	r   rU   r   r  r  r  r  	bb_normal	bb_unwinds	            r   test_invoke!TestBuildInstructions.test_invoke7  s    



+,,u%$$Ra(sUEN3KK((//s;$$77X7F	$$77X7F	qa&)@ ! 	r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        R                  " 5       [
        R                  5       [
        [
        R                  5       45      n[        R                  " UR                  R                  US5      nSUl
        UR                  S   R                  S5        UR                  [
        SS9nUR                  [
        SS9nUR                  R                  S	S9nUR                  R                  S
S9nUR                  UU[        R                   " [
        S5      U4UUSSSSSS.S9  ["        (       a  U R%                  US5        g U R%                  US5        g )Nr   r  r  r  r   r  r  r  r  r  r   r  r   r  r   r  )r  r  r  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"
            )rU   r   r   rI   rr  rJ   r   rM   rP   rF   calling_conventionr   r   rA  rS   r  rW  r   rr   )	r   rU   r   r  r  r  r  r  r  s	            r   test_invoke_attributes,TestBuildInstructions.test_invoke_attributesF  s\   



+,,u%KKME,,.u7G7G7IJLkk'**1165A!)!!&)H5u73$$77X7F	$$77X7F	R[[+U3& 	 	
 #"""5 +  ""5 + r   c           
         U R                  SS9n[        R                  " U5      nUR                  [        R                  " [
        [        R                  5       /5      S5      n[        R                  " UR                  R                  [        R                  5       S5      nSUl        UR                  [        R                  " U5      5        UR                  [        R                  " [        R                  " [        R                   " UR"                  S5      U/5      5      5        UR%                  U5        [&        (       a  U R)                  US5        g U R)                  US5        g )	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"
                )rU   r   r   
landingpadrS  rJ   r   r   rU  rP   rF   r  
add_clauseCatchClauseFilterClauserW  	ArrayTyper1  resumer   ro   )r   rU   r   r  int_typeinfos        r   test_landingpad%TestBuildInstructions.test_landingpadq  s   



+,,u% 4 4e6:oo6G6I !JKOQ(()9)9)@)@)-):GE'+$
bnn\23
boobkk",,q3"$0>'3 4 	5r""U %  U % r   c                     U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  SX4SS9nUR                  U5        U R                  US5        g )Nr   r  r   r  r   z            my_block:
                %"c" = icmp sgt i32 %".1", %".2"
                call void @"llvm.assume"(i1 %"c")
            )rU   r   r   rP   r   r  r   ro   r	  s         r   test_assume!TestBuildInstructions.test_assume  sr    



+,,u%$$Ra(Q4q ! 	r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4SUl        SUl        [        R                  " UR                  S5      n[        R                  " U[        R                  5      n[        R                  " S5      nUR                  XcU" S5      SS9nUR                  XdU" S	5      S
S9nU R                  US5        UR                  S5      nUR                  U5        UR                  U5        [        R                  " US	S/5      nUR!                  XfUSS9  U R                  US5        UR                  S5      nUR                  U5        UR                  U5        UR#                  XfSS9  U R                  US5        UR                  S5      nUR                  U5        UR                  U5        UR%                  Xg" S5      SS9n	UR%                  Xg" S	5      SS9n
U R                  US5        UR'                  UR#                  X5      5        U R)                  UR*                  5        g )Ninsert_blockr  r   r  r  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
            )rU   r   r   rP   r   rN   
VectorTyper1  rW  r  rY  insert_elementro   rS   r  position_at_endshuffle_vectorr   extract_elementr  r4   rF   )r   rU   r   r  r  vectyvecidxtymaskr   r  s              r   test_vector_ops%TestBuildInstructions.test_vector_ops  s#   


/,,u%$$Ra(affa(kk%.

2$$SU1XF$C$$SU1XF$C ! 	 **?;u&{{51a&)sF; ! 	
 **;7u&C5) ! 	
 **?;u&##Cq#>##Cq#> ! 	 	GKK%&W^^,r   c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  USS9nUR                  U5        U R                  US5        g )Nr   r  r   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )rU   r   r   rW  r  
bitreverser  ro   r   rU   r   r  r   s        r   test_bitreverse%TestBuildInstructions.test_bitreverse  se    



+,,u%KKq!qs+A ! 	r   c                 L   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nU R                  [        5       nUR                  USS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r   #expected an integer type, got float)rU   r   r   rW  rr  r  rF  r  r*   r'   r  r   rU   r   r  raisess        r   test_bitreverse_wrongtype/TestBuildInstructions.test_bitreverse_wrongtype  s~    



+,,u%KKQy)Vqs+ *1  !	# *)   B
B#c                    U R                  SS9n[        R                  " U5      nU R                  [        5       nUR                  SS 5        S S S 5        U R                  S[        WR                  5      5        U R                  [        5       nUR                  S S5        S S S 5        U R                  S[        UR                  5      5        UR                  SS 5        UR                  SS5        UR                  S	S5        UR                  S
5        UR                  5         U R                  US5        g ! , (       d  f       N= f! , (       d  f       N= f)Nr   r  r~  z#Invalid fence ordering "monotonic"!zInvalid fence ordering "None"!acquirereleasesinglethreadacq_relr?  z            my_block:
                fence acquire
                fence syncscope("singlethread") release
                fence syncscope("singlethread") acq_rel
                fence seq_cst
                ret void
            )rU   r   r   r  r   fencer*   r'   r  r   ro   )r   rU   r   r%  s       r   
test_fence TestBuildInstructions.test_fence  s   



+,,u%z*fMM+t, +3  !	# z*fMM$, +.  !	# 	i&i0i0i  ! 	 +*
 +*s   D:E:
E
Ec                 4   U R                  SS9n[        R                  " U5      nU R                  [        5         UR                  S5        S S S 5        UR                  S5        UR                  5         U R                  US5        g ! , (       d  f       NB= f)Nr   r  zso
many linesz
my commentzX            my_block:
                ; my comment
                ret void
            )rU   r   r   r  AssertionErrorcommentr   ro   r   rU   r   s      r   test_comment"TestBuildInstructions.test_comment  sv    



+,,u%~.OO,- /% ! 		 /.s   B		
Bc                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  USS9nUR                  U5        U R                  US5        g )Nr   r  r   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )rU   r   r   rW  rJ   bswapr  ro   r  s        r   
test_bswap TestBuildInstructions.test_bswap  b    



+,,u%KKq!MM!#M&A ! 	r   c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  USS9nUR                  U5        U R                  US5        g )Nr   r  r   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )rU   r   r   rW  int16ctpopr  ro   r  s        r   
test_ctpop TestBuildInstructions.test_ctpop   r;  r   c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [
        S5      nUR                  X4SS9nUR                  U5        U R                  US5        g )Nr   r  r   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	rU   r   r   rW  r=  r.  ctlzr  ro   r	  s         r   	test_ctlzTestBuildInstructions.test_ctlz,  r    



+,,u%KKq!KKa LLCL(A ! 	r   c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  USS9nUR                  U5        U R                  US5        g )Nr   r  g      @r  z            my_block:
                %"b" = call i16 @"llvm.convert.to.fp16.f32"(float 0x4014000000000000)
                ret i16 %"b"
            )rU   r   r   rW  rr  convert_to_fp16r  ro   r  s        r   test_convert_to_fp16_f32.TestBuildInstructions.test_convert_to_fp16_f329  se    



+,,u%KKS!##AC#0A ! 	r   c                 L   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nU R                  [        5       nUR                  USS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r  expected a float type, got i16)rU   r   r   rW  r=  r  rF  rG  r*   r'   r  r$  s        r   "test_convert_to_fp16_f32_wrongtype8TestBuildInstructions.test_convert_to_fp16_f32_wrongtypeE  s~    



+,,u%KKq!y)V##AC#0 *,  !	# *)r(  c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  US[        S9nUR                  U5        U R                  US5        g )Nr   r  r   r  rN   toz            my_block:
                %"b" = call float @"llvm.convert.from.fp16.f32"(i16 5)
                ret float %"b"
            )	rU   r   r   rW  r=  convert_from_fp16rr  r  ro   r  s        r   test_convert_from_fp16_f320TestBuildInstructions.test_convert_from_fp16_f32P  sg    



+,,u%KKq!%%acc%:A ! 	r   c                 L   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nU R                  [        5       nUR                  USS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r        @r  zexpected a float return typerU   r   r   rW  rr  r  rF  rQ  r*   r'   r  r$  s        r   !test_convert_from_fp16_f32_notype7TestBuildInstructions.test_convert_from_fp16_f32_notype\  s~    



+,,u%KKS!y)V%%ac%2 **  !	# *)r(  c                 V   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nU R                  [        5       nUR                  US[        S9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  rU  r  rO  zexpected an i16 type, got floatrV  r$  s        r   $test_convert_from_fp16_f32_wrongtype:TestBuildInstructions.test_convert_from_fp16_f32_wrongtypeg  s    



+,,u%KKS!y)V%%acc%: *-  !	# *)   B
B(c                 V   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nU R                  [        5       nUR                  US[        S9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  rU  r  rO  rK  )rU   r   r   rW  rr  r  rF  rQ  r=  r*   r'   r  r$  s        r   %test_convert_from_fp16_f32_wrongtype2;TestBuildInstructions.test_convert_from_fp16_f32_wrongtype2r  s    



+,,u%KKS!y)V%%ace%< *,  !	# *)r\  c                     U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [
        S5      nUR                  X4SS9nUR                  U5        U R                  US5        g )Nr   r  r   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	rU   r   r   rW  r  r.  cttzr  ro   r	  s         r   	test_cttzTestBuildInstructions.test_cttz}  rE  r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [
        S5      nU R                  [        5       nUR                  X4SS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r   r   zexpected an i1 type, got i32)rU   r   r   rW  r  rJ   r  rF  ra  r*   r'   r  r   rU   r   r  r  r%  s         r   test_cttz_wrongflag)TestBuildInstructions.test_cttz_wrongflag  s    



+,,u%KKq!KKq!y)VLLCL( **  !	# *)   1B00
B>c                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [
        S5      nU R                  [        5       nUR                  X4SS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r   r   r#  )rU   r   r   rW  rr  r.  r  rF  ra  r*   r'   r  re  s         r   test_cttz_wrongtype)TestBuildInstructions.test_cttz_wrongtype  s    



+,,u%KKQKKa y)VLLCL( *1  !	# *)rh  c                 X   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [        S5      n[        R                  " [        S5      nUR                  X4USS9nUR                  U5        U R                  US5        g )Nr   r  r   r   r   fmaz            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )rU   r   r   rW  rr  rm  r  ro   )r   rU   r   r  r  r   rm  s          r   test_fmaTestBuildInstructions.test_fma  s    



+,,u%KKQKKQKKQkk!k.C ! 	r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [        S5      n[        R                  " [        S5      nU R                  [        5       nUR                  X4USS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r   r   rm  z(expected an floating point type, got i32)rU   r   r   rW  rJ   r  rF  rm  r*   r'   r  r   rU   r   r  r  r   r%  s          r   test_fma_wrongtype(TestBuildInstructions.test_fma_wrongtype  s    



+,,u%KKq!KKq!KKq!y)VKKaeK, *6  !	# *)   C
Cc                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      n[        R                  " [
        S5      n[        R                  " [        S5      nU R                  [        5       nUR                  X4USS9  S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= f)Nr   r  r   r   r   rm  z7expected types to be the same, got float, double, float)rU   r   r   rW  rr  rK   r  rF  rm  r*   r'   r  rq  s          r   test_fma_mixedtypes)TestBuildInstructions.test_fma_mixedtypes  s    



+,,u%KKQKKQKKQy)VKKaeK, *E  !	# *)rt  c                 T    S nS H  n[         R                  " U" U5      5        M!     g )Nc                    [         R                  " [         R                  " S5      [         R                  " S5      R                  5       [         R                  " S5      /5      n[         R                  " 5       n[         R
                  " X!SS9nUR                  5       nUR                  5       nUR                  5       n[         R                  " 5       nUR                  U5        UR                  U5        UR                  U5        UR                  [         R                  " S5      5      nUR                  [         R                  " UR                  S5      U5        UR                  [         R                  " S5      5      n	U	R                  [         R                  " U	R                  S5      U5        UR                  S   R                  U 5        UR!                  UR                  S   U/5      n
UR#                  U
5      nUR%                  X5      nU	R                  X5        UR%                  U[         R                  " UR                  S5      5      nUR                  X5        UR'                  SXR                  S   5      nUR)                  XU5        UR                  U5        UR+                  U5        [-        U5      $ )Nr
   r  r  r   r   r  )r   rI   rY  r   rD   rM   rS   r   r  r  r8  r9  rW  r1  r   r   rM  rC  r   r  r  r  r'   )	attr_namerO   rF   rT   bb_entrybb_loopbb_exitr   indexaccumrI  valueaddedindexp1conds                  r   gen_code;TestBuildInstructions.test_arg_attributes.<locals>.gen_code  s   ??2::b>BJJrN4M4M4O46JJrN4D EDYY[F;;v%8D..0H--/G--/GllnG##H-NN7###G,KK

2/Er{{5::q98DKK

2/Er{{5::q98DIIaL&&y1++diilUG4CLL%EKK-Eu.kk%UZZ)CDGw0((gyy|DDOOD7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  rz  s      r   test_arg_attributes)TestBuildInstructions.test_arg_attributes  s)    &	P
I,  34-
r   r   N)>r   r   r   r   r   maxDiffr  r  r  r  r  r
  r  r  r+  r2  r<  rJ  rO  rW  rZ  r^  rg  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r&  r/  r5  r9  r?  rC  rH  rL  rR  rW  rZ  r^  rb  rf  rj  rn  rr  rv  r  r   r   r   r   r  r    s/    G=/b($#J+ZIV,26@L\1f*	
 ,&P&$L8B69)V<
8-t
	#6


	#
	#	#	#
#
###?5r   r  c                   Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)TestBuilderMisci  z5
Test various other features of the IRBuilder class.
c                    U R                  SS9n[        R                  " U5      nU R                  UR                  UR
                  5        U R                  UR                  [        R                  5        U R                  UR                  UR
                  R                  5        U R                  UR                  [        R                  5        g )Nr  r  )
rU   r   r   r<   rP   r  assertIsInstancerM   rF   rD   r4  s      r   r  TestBuilderMisc.test_attributes  s    


(,,u%g&&5g..<gnnell&9&9:gnnbii8r   c                    U R                  SS9n[        R                  " U5      nUR                  R                  S S u  p4UR                  X4S5        UR                  SS9nUR                  U5         UR                  X4S5        UR                  5          UR                  X4S5        S S S 5        UR                  X4S5        UR                  U5        S S S 5        UR                  X4S	5        UR                  U5         UR                  X4S
5        S S S 5        U R                  US5        U R                  US5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NU= f)Nr   r  r   r   r  r  r  r  r  r  z            my_block:
                %"c" = add i32 %".1", %".2"
                %"e" = sub i32 %".1", %".2"
                %"g" = mul i32 %".1", %".2"
            z            foo:
                %"d" = fadd i32 %".1", %".2"
                %"f" = fsub i32 %".1", %".2"
                %"h" = fmul i32 %".1", %".2"
                br label %"foo"
            )rU   r   r   rP   r   r   rS   
goto_blockr  goto_entry_blockr   r  r  r  r  ro   )r   rU   r   r  r  bb_news         r   test_goto_blockTestBuilderMisc.test_goto_block  s-   



+,,u%$$Ra(A#+++7'LLs#))+A#& ,LLs#NN6" ( 	A#'LLs# ( ! 	 	 " 	 ,+ (' ('s0   3#ED?)+E?E!?
E		E
E!
E/c                 R   U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  X3S5      nUR                  U5       nUR                  X3S5        S S S 5        U R                  UR                   W5        UR                  X3S5      nUR                  U5         UR                  X3S5        UR                  U5        S S S 5        U R                  UR                  S5        g ! , (       d  f       N= f! , (       d  f       N<= f)	Noner  r   r  r  r   r  a              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                %"c" = add i1 0, 0
                br i1 %"c", label %"one.endif.if", label %"one.endif.endif"
            one.endif.if:
                %"d" = add i1 0, 0
                br label %"one"
            one.endif.endif:
            )rU   r   r   rW  r.  r   if_thenr<   r  r   rP   )r   rU   r   rG  r  bbendr   s          r   test_if_thenTestBuilderMisc.test_if_then7  s    


&,,u%KKa KKc"__Q5KKc"   	gmmU+KKc"__QKKc"NN5!   	W-- 0 	  
  s   $D>$D
D
D&c                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  X3S5      nUR                  U5         UR                  X3S5      nUR                  U5         UR                  X3S5        S S S 5        S S S 5        UR                  5         U R                  UR                  S5        g ! , (       d  f       NC= f! , (       d  f       NL= f)Nr  r  r   r  r  r   a              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.endif"
            one.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"one.if.if", label %"one.if.endif"
            one.endif:
                ret void
            one.if.if:
                %"c" = add i1 0, 0
                br label %"one.if.endif"
            one.if.endif:
                br label %"one.endif"
            )
rU   r   r   rW  r.  r   r  r   r   rP   )r   rU   r   rG  r  r  s         r   test_if_then_nested#TestBuilderMisc.test_if_then_nestedU  s    


&,,u%KKa KKc"__QA#&A#A#& $   	W-- 0 	 $#  s$   $$C)CC)
C&	"C))
C7c           	         SnU R                  US9n[        R                  " U5      n[        R                  " [        S5      nUR                  XDS5      nUR                  U5         UR                  XDS5      nUR                  U5         UR                  XDS5        S S S 5        S S S 5        UR                  5         U R                  UR                  SR                  XS S S	-   S
95        g ! , (       d  f       NV= f! , (       d  f       N_= f)NPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongr  r   r  r  r   a              {full_label}:
                %"a" = add i1 0, 0
                br i1 %"a", label %"{label}.if", label %"{label}.endif"
            {label}.if:
                %"b" = add i1 0, 0
                br i1 %"b", label %"{label}.if.if", label %"{label}.if.endif"
            {label}.endif:
                ret void
            {label}.if.if:
                %"c" = add i1 0, 0
                br label %"{label}.if.endif"
            {label}.if.endif:
                br label %"{label}.endif"
               z..)
full_labellabel)rU   r   r   rW  r.  r   r  r   r   rP   r   )r   r  rU   r   rG  r  r  s          r   test_if_then_long_label'TestBuilderMisc.test_if_then_long_labelp  s     




+,,u%KKa KKc"__QA#&A#A#& $   	W-- 0 *sOd4JK	M $#  s$   &$C>
C-C>-
C;	7C>>
Dc                    ^  U 4S jnU" S5      nT R                  UR                  S5        U" S5      nT R                  UR                  S5        g )Nc                    > TR                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  X0S9    S S S 5        TR                  US5        U$ ! , (       d  f       N"= f)Nr  r  r   likelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )rU   r   r   rW  r.  r  ro   )r  rU   r   rG  r   s       r   r  2TestBuilderMisc.test_if_then_likely.<locals>.check  sl    JJEJ*Ell5)GD!$A2 3U %  N 32s   A//
A=TC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            r|   rF   r   r  r   s   `  r   test_if_then_likely#TestBuilderMisc.test_if_then_likely  sP    
	 +GNN - 	 ,GNN - 	r   c                    U R                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  X3S5      nUR                  U5       u  pVU   UR                  X3S5        S S S 5        U   UR                  X3S5        S S S 5        S S S 5        UR                  U5       u  pVU   UR                  U5        S S S 5        U   UR                  5         S S S 5        S S S 5        U R                  UR                  S5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nw= f! , (       d  f       N= f)Nr  r  r   r  r  r   a)              one:
                %"a" = add i1 0, 0
                br i1 %"a", label %"one.if", label %"one.else"
            one.if:
                %"b" = add i1 0, 0
                br label %"one.endif"
            one.else:
                %"c" = add i1 0, 0
                br label %"one.endif"
            one.endif:
                br i1 %"a", label %"one.endif.if", label %"one.endif.else"
            one.endif.if:
                br label %"one"
            one.endif.else:
                ret void
            one.endif.endif:
            )rU   r   r   rW  r.  r   if_elser  r   r   rP   )r   rU   r   rG  r  thenr  s          r   test_if_elseTestBuilderMisc.test_if_else  s   


&,,u%KKa KKc"__Q#4DA#& A#&    __Q#4Du%   "    	W-- 0 	      sx   $D;)D<
D;D*D;:E.?E
E.E,E.
D'	#D;*
D8	4D;;
E	
E	E.
E+	'E..
E<c                    ^  U 4S jnU" S5      nT R                  UR                  S5        U" S5      nT R                  UR                  S5        g )Nc                   > TR                  SS9n[        R                  " U5      n[        R                  " [        S5      nUR                  X0S9 u  pEU   UR                  U5        S S S 5        U   UR                  5         S S S 5        S S S 5        TR                  UR                  S5        U$ ! , (       d  f       NO= f! , (       d  f       NE= f! , (       d  f       NN= f)Nr  r  r   r  z                one:
                    br i1 0, label %"one.if", label %"one.else", !prof !0
                one.if:
                    br label %"one"
                one.else:
                    ret void
                one.endif:
                )
rU   r   r   rW  r.  r  r  r   r   rP   )r  rU   r   rG  r  r  r   s         r   r  2TestBuilderMisc.test_if_else_likely.<locals>.check  s    JJEJ*Ell5)GD!$A26GtNN5) $$&  3
   !1!1 4  N TY 32s<   CB1(
C2CC1
B?	;C
C	C
C!Tr  Fr  r  r  s   `  r   test_if_else_likely#TestBuilderMisc.test_if_else_likely  sP    	& +GNN - 	 ,GNN - 	r   c                 6   U R                  5       n[        R                  " 5       n[        R                  " [        S5      nUR                  SS9nUR                  SS9nUR                  SS9nUR                  U5        UR                  X3S5        UR                  U5        UR                  X3S5        UR                  X3S5        UR                  U5        UR                  X3S	5      nUR                  X3S
5        UR                  U5        UR                  X3S5      nUR                  U5        UR                  X3S5        UR                  U5        UR                  X3S5        U R                  US5        U R                  US5        U R                  US5        g)z9
Test IRBuilder.position_{before,after,at_start,at_end}.
r   r  r  twothreer  r  r  r  r  r  r  r   z            one:
                %"a" = add i32 0, 0
                %"c" = add i32 0, 0
                %"b" = add i32 0, 0
            z            two:
                %"o" = add i32 0, 0
                %"q" = add i32 0, 0
                %"p" = add i32 0, 0
                %"m" = add i32 0, 0
                %"n" = add i32 0, 0
            z            three:
            N)rP   r   r   rW  rJ   rS   position_at_startr   r  position_afterposition_beforero   )	r   rT   r   rG  bb_onebb_twobb_threer  r  s	            r   test_positioning TestBuilderMisc.test_positioning  sn    }},,.KKq!((e(4((e(4***8!!&)A#'A#A#!!&)KKc"A#'KKc"q!A#"A# " 	 	 " 	 	 $ 	r   c                 z   U R                  5       n[        R                  " 5       nUR                  SS9nUR	                  U5        [        R
                  " [        S5      nUR                  XDS5      nUR                  5       nU R                  UR                  5        UR                  U5        U R                  UR                  5        UR                  XUS5      nUR                  XwS5      nUR                  U5        UR                  5         U R                  UR                  5        U R                  US5        g )Nentryr  i  r  r  r   z            entry:
                %"a" = add i32 1234, 1234
                %"b" = mul i32 %"a", %"a"
                ret void
        )rP   r   r   rS   r  rW  rJ   r   r   r1  r  remover  r  ro   )	r   rT   r   blkr  r  retvoidr  r   s	            r   test_instruction_removal(TestBuilderMisc.test_instruction_removal	  s    }},,.%%7%3$KKt$KKc"""$))*w**+KKc"KKc"q))*  	r   c                 >   U R                  SS9n[        R                  " U5      nUR                  R	                  / 5      Ul        UR                  [        R                  " [        5      SS9  [        (       a  U R                  US5        g U R                  US5        g )Nr   r  r   zY                my_block:
                    %"c" = alloca ptr, !dbg !0
                zZ                my_block:
                    %"c" = alloca i32*, !dbg !0
                )rU   r   r   rF   r   debug_metadatarA  rL   rJ   r   ro   r4  s      r   test_metadataTestBuilderMisc.test_metadata(	  s    



+,,u%!(!<!<R!@r~~e,37""U % 
 U % r   r   N)r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  r    sA    9:<6M6*"H:.`.r   r  c                   b    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)	TestTypesi:	  c                     [        U[        R                  5      (       a-  UR                  n[        U[        R                  5      (       a  M-  [        U[        R                  5      (       + $ r&   )
isinstancer   rL   r]  	LabelType)r   tys     r   has_logical_equalityTestTypes.has_logical_equality<	  sC    R^^,,B R^^,,b",,///r   c                    [         R                  " 5       n[         R                  " 5       [         R                  " 5       [         R                  " [
        [        [        45      [         R                  " [
        [        45      [         R                  " [
        [        4SS9[         R                  " [        [        45      [
        [        [        [        [        [         R                  " [        S5      [         R                  " [        S5      [         R                  " [        S5      [         R                  " [
        [        45      [         R                  " [        [
        45      UR                  S5      UR                  S5      /nX" Vs/ s HJ  n[        U[         R                  [         R                  45      (       a  M4  [         R                  " U5      PML     sn-  nU$ s  snf )z#
A bunch of mutually unequal types
Tr   r   r   MyType1MyType2)r   Contextr  rr  rI   r.  r   rJ   rr  rK   r  rS  get_identified_typer  rL   )r   contextr$  tps       r   assorted_typesTestTypes.assorted_typesA	  s;   
 **,LLNBKKMOOD4,/w1OOOD4'48OOD4'*$sCLLa ",,sA"6S!8L  $.0D0DdFJFL 1M''	2''	2
 	u Fu#Bbll(CD %"..$u F 	F Fs   	3G! G!c                     U R                  5       nU H=  nU R                  U5      nU R                  U5      (       d  M,  U R                  X25        M?     g r&   )r  rA   r  r>   )r   r$  r  newtys       r   r   TestTypes.test_picklingX	  sI    ##%B004E((,,  + r   c                    U R                  5       n[        R                  " X5       H5  u  p#X#Ld  M  U R                  X#:H  X#45        U R	                  X#:g  X#45        M7     U H  n[
        R
                  " U5      nU R                  U5      (       a,  U R	                  XE:H  XE45        U R                  XE:g  XE45        M[  U R                  XE:H  XE45        U R	                  XE:g  XE45        M     g r&   )r  	itertoolsproductr  r1  copyr  )r   r$  r  r  r  r  s         r   test_comparisonsTestTypes.test_comparisons_	  s    ##%%%e3DAz  !0/ 4
 BIIbME((,,b[9  rk:  rk:b[9 r   c                 t   U R                  [        [        5      S5        U R                  [        [        R                  " S5      5      S5        U R                  [        [
        5      S5        U R                  [        [        5      S5        U R                  [        [        R                  " 5       5      S5        U R                  [        [        R                  " [        S5      5      S5        U R                  [        [        R                  " [        [
        45      5      S	5        U R                  [        [        R                  " [        [
        [        45      5      S
5        U R                  [        [        R                  " [        SSS95      S5        U R                  [        [        R                  " [        [
        4SS95      S5        U R                  [        [        R                  " [        [
        [        4SS95      S5        [        (       a{  U R                  [        [        R                  " [        5      5      S5        U R                  [        [        R                  " [        R                  " [        5      5      5      S5        OzU R                  [        [        R                  " [        5      5      S5        U R                  [        [        R                  " [        R                  " [        5      5      5      S5        U R                  [        [        R                  " [        S5      5      S5        [        (       a  U R                  [        [        R                  " [        R                  " [        5      S5      5      S5        U R                  [        [        R                  " [        R                  " [        S5      5      5      S5        OU R                  [        [        R                  " [        R                  " [        5      S5      5      S5        U R                  [        [        R                  " [        R                  " [        S5      5      5      S5        U R                  [        [        R                  " [        45      5      S5        U R                  [        [        R                  " [        [
        45      5      S5        [        (       ah  U R                  [        [        R                  " [        R                  " [        5      [        R                  " [        [        45      45      5      S5        OgU R                  [        [        R                  " [        R                  " [        5      [        R                  " [        [        45      45      5      S5        U R                  [        [        R                  " [        4SS95      S5        U R                  [        [        R                  " [        [
        4SS95      S5        [        R                  " 5       nUR!                  S5      nU R                  [        U5      S 5        UR!                  S!5      nU R                  [        U5      S"5        UR!                  S#5      nU R                  [        U5      S$5        g%)&z*
Test the string representation of types.
i1   i29rH  doublevoidr   zi1 ()z
i1 (float)zi1 (float, double)Tr   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)rI  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   rY  rr  rK   rr  rI   r   rL   rJ   r  rS  r   r  r  )r   r  mytypemytype1mytype2s        r   test_strTestTypes.test_stro	  sm    	TD)RZZ^,e4S7+S8,R[[]+V4R__T267AR__TC6:;\JR__TC:>?-	/R__T2tDE#	%R__TC64HI*	,R__TC:tLM2	4 #"S!67?Su0E!FGOS!67@Su0E!FG$&R\\$23Z@""SbnnT.BA!FG(*ST10E!FGOSbnnT.BA!FG(*ST10E!FG(*R114':;VDR114+>?O""S!5!5t$b&:&:E4=&I7K "L M"$ S!5!5t$b&:&:E4=&I7K "L M"$ 	R114'$GH!	#R114+dKL(	* **,,,X6Vm4--j9W'89--j9W'89r   c           	          [        U R                  U R                  5       5       H;  nU R                  [	        U5      [	        [
        R
                  " U5      5      5        M=     g r&   )filterr  r  r>   hashr  )r   typs     r   	test_hashTestTypes.test_hash	  sD    $33T5H5H5JKCT#YTYYs^(<= Lr   c                   ^  U 4S jnU 4S jn[         R                  " [        5      n[        S5       H  nU" X4[        5        M     U" U5        [         R                  " [
        S5      n[        S5       H  nU" X4[
        5        M     U" U5        [         R                  " [        [         R                  " [
        [        45      45      nU" US[        5        U" US[         R                  " [
        [        45      5        T R                  [        5         UR                  [         R                  " [        S5      5        S S S 5        U" U5        [         R                  " 5       n[         R                  " US5      nUR                  [        [         R                  " [
        [        45      5        U" US[        5        U" US[         R                  " [
        [        45      5        T R                  [        5         UR                  [         R                  " [        S5      5        S S S 5        U" U5        g ! , (       d  f       N= f! , (       d  f       N(= f)	Nc                 |   > U R                  [        R                  " [        U5      5      nTR	                  X25        g r&   )rM  r   rW  rJ   r>   )r  r  rf   rw   r   s       r   check_constant*TestTypes.test_gep.<locals>.check_constant	  s*    VVBKKq12FV.r   c                    > [         R                  " [        S5      nTR                  [        5         U R                  U5        S S S 5        g ! , (       d  f       g = f)Ng      ?)r   rW  rK   r  rF  rM  )r  r~  r   s     r   check_index_type,TestTypes.test_gep.<locals>.check_index_type	  s8    KKS)E""9-u .--s   A
Ar   r   r   r   r   r   )r   rL   rK   ranger  r.  rS  r   r  
IndexErrorrM  rW  rJ   r  IdentifiedStructTypeset_body)r   r  r  r  r  r  s   `     r   rO  TestTypes.test_gep	  s   	/	
 ^^C qA2#& \\$"qA2$' !!3(<(<dD\(J"KLr1c"r1b22D$<@Az*FF2;;ua() +**,$$Wh7
C--tTl;<r1c"r1b22D$<@Az*FF2;;ua() + +* +*s   +H8<+I	8
I	
Ic                 p  ^ ^ [         R                  " S5      mU U4S jnU" [        S5        U" [        S5        U" [        S5        U" [
        R                  " [        S5      S5        U" [
        R                  " [        S5      S5        U" [
        R                  " [        [        [        45      S5        g )	N%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                 H   > TR                  U R                  T5      U5        g r&   )r>   get_abi_sizer  rf   r   tds     r   r  &TestTypes.test_abi_size.<locals>.check	  s    R__R0(;r   r   r   r   r      r	   
r1   create_target_datar   rJ   r  r   r  rS  rK   rr  r   r  r  s   ` @r   test_abi_sizeTestTypes.test_abi_size	  sy    $$%LM	<dAeQeQbll4#Q'bll5!$b)b""Cc?3R8r   c                 p  ^ ^ [         R                  " S5      mU U4S jnU" [        S5        U" [        S5        U" [        S5        U" [
        R                  " [        S5      S5        U" [
        R                  " [        S5      S5        U" [
        R                  " [        [        [        45      S5        g )Nr  c                 H   > TR                  U R                  T5      U5        g r&   )r*   get_abi_alignmentr  s     r   r  +TestTypes.test_abi_alignment.<locals>.check	  s    MM"..r2H=r   )r   r   r   )r   )r   r   r   r"  s   ` @r   test_abi_alignmentTestTypes.test_abi_alignment	  s|    $$%LM	>dIeTeTbll4#Y/bll5!$d+b""Cc?3T:r   c                    [         R                  " 5       nUR                  S5      n[         R                  " US9nU R	                  UR
                  5        U R                  U5        [        U5      nUR                  [         R                  " S5      [         R                  " S5      [         R                  " 5       5        U R                  UR
                  5        U R                  U5        U R                  U[        U5      5        g )Nr   r  r
   r   )r   r  r  rD   r1  	is_opaquer4   r'   r  rY  rV  r  assertNotEqual)r   r  r  rF   oldstrs        r   test_identified_struct TestTypes.test_identified_struct	  s    **,,,X67+(()V$V

2

2G))*V$FCK0r   c                    [         R                  " S5      n[        R                  " 5       nUR	                  SS5      n[        R
                  " US9nU R                  UR                  5        U R                  U5        [        U5      nUR                  [        R                  " S5      [        R                  " S5      [        R                  " 5       5        U R                  UR                  USU5      S5        U R                  UR                  5        U R                  U5        U R!                  U[        U5      5        g )	Nr  r   Tr,  r	   r   r   r   )r1   r!  r   r  r  rD   r1  r-  r4   r'   r  rY  rV  r>   get_element_offsetr  r.  )r   r  r  r  rF   r/  s         r   test_identified_struct_packed'TestTypes.test_identified_struct_packed	  s    $$%LM**,,,Xt<7+(()V$V

2

2G222q'BAF))*V$FCK0r   c                     [         R                  " 5       nUR                  S5      n[         R                  " S5      /Ul        [
        R                  " S5      nU R                  UR                  X1S9S5        g )Nr   r
   r  r,  r   )	r   r  r  rY  elementsr1   r!  r>   r  )r   r  r  r  s       r   $test_target_data_non_default_context.TestTypes.test_target_data_non_default_context
  s^    **,,,X6::b>*$$%LM,,R,A1Er   c                     [         R                  " [         R                  " S5      S5      nU R                  [	        U5      S5        g )Nr
   r   z	<8 x i32>)r   r  rY  r>   r'   )r   r  s     r   test_vectorTestTypes.test_vector
  s.    bjjna0U[1r   r   N)r   r   r   r   r  r  r   r  r  r
  rO  r#  r)  r0  r4  r8  r;  r   r   r   r   r  r  :	  sF    0
.,: =:~>"H
9
;
11F2r   r  c                 8    [         R                  " [        U 5      $ r&   )r   rW  rJ   )r  s    r   c32r>  
  s    ;;ua  r   c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"g!)"TestConstanti
  c                    [         R                  " [        S5      nU R                  [	        U5      S5        [         R                  " [
        S5      nU R                  [	        U5      S5        [         R                  " [
        S5      nU R                  [	        U5      S5        [         R                  " [
        S5      nU R                  [	        U5      S5        [         R                  " [
        S	5      nU R                  [	        U5      S
5        [         R                  " [
        [         R                  5      nU R                  [	        U5      S5        [         R                  " [
        S 5      nU R                  [	        U5      S5        g )Nr   zi32 42r   zi1 1r   zi1 0Ti1 trueFzi1 falsezi1 undef)r   rW  rJ   r>   r'   r.  r  r   r   s     r   test_integersTestConstant.test_integers
  s   KKr"Q*KKa Q(KKa Q(KKd#Q+KKe$Q,KKbll+Q,KKd#Q(r   c                    [         R                  " [        S5      nU R                  [	        U5      S5        [         R                  " [        S5      nU R                  [	        U5      S5        [         R                  " [
        S5      nU R                  [	        U5      S5        [         R                  " [
        S5      nU R                  [	        U5      S5        [         R                  " [
        [         R                  5      nU R                  [	        U5      S5        [         R                  " [
        S 5      nU R                  [	        U5      S5        g )	N      ?zfloat 0x3ff8000000000000g      zfloat 0xbff8000000000000zdouble 0x3ff8000000000000zdouble 0xbff8000000000000zdouble undefz
double 0.0)r   rW  rr  r>   r'   rK   r  rC  s     r   
test_realsTestConstant.test_reals*
  s    KKS!Q!;<KKT"Q!;<KKS!Q!<=KKT"Q!<=KKR\\*Q0KKT"Q.r   c                    [         R                  " [         R                  " [        S5      [	        S5      [	        S5      [	        S5      45      nU R                  [        U5      S5        [         R                  " [         R                  " [        S5      [	        S5      [	        [         R                  5      45      nU R                  [        U5      S5        [         R                  R                  [	        S5      [	        S5      [	        [         R                  5      45      nU R                  [        U5      S5        U R                  [        5       n[         R                  R                  [	        S5      [         R                  " [        S	5      45        S S S 5        U R                  [        WR                  5      S
5        [         R                  " [         R                  " [        S5      [         R                  5      nU R                  [        U5      S5        [         R                  " [         R                  " [        S5      S 5      nU R                  [        U5      S5        [         R                  " [         R                  " [        S5      [        S5      5      nU R                  [        U5      S5        [         R                  " [         R                  " [        S5      [        S5      5      nU R                  [        U5      S5        [         R                  " [         R                  " [        S5      S[         R                  S45      nU R                  [        U5      S5        U R                  [        5         [         R                  " [         R                  " [        S5      S5        S S S 5        g ! , (       d  f       GN+= f! , (       d  f       g = f)Nr   r   r  r   z[3 x i32] [i32 5, i32 6, i32 4]r   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]rG  z$all elements must have the same typez[2 x i32] undefz[2 x i32] zeroinitializerr0  s   foobar_123z[11 x i8] c"foobar_123\80"s    z[4 x i8] c"\00\01\04\ff"z#[3 x i32] [i32 5, i32 undef, i32 6])r   r  )r   rW  r  rJ   r>  r>   r'   r  literal_arrayr  rF  rr  r  r   	bytearrayr   )r   r   r%  s      r   test_arraysTestConstant.test_arrays9
  sp   KKUA.QQQ0HIQ!BCKKUA.QR\\9J0KLQ!?@KK%%s1vs1vs2<<7H&IJQ!FGy)VKK%%s1vr{{3/D&EF *V--.?	A KKUA.=Q!23KKUA.5Q!<=KKT2.	:K0LMQ!>?KKT1-y9L/MNQ!<=KKUA.BLL!0DEQ!FGz*KKUA.7 +*% *)$ +*s   AN: 1O:
O	
Oc                 ,   [         R                  " [         R                  " S5      S5      n/ SQn[         R                  " X5      nSR	                  SR                  [        SR                  U5      5      5      nU R                  [        U5      U5        g )Nr
   r   )r   r   r   r   r   r  	      z<8 x i32> <{}>z, zi32 {})	r   r  rY  rW  r   r   r   r>   r'   )r   r  valsr  vec_reprs        r   r;  TestConstant.test_vectorV
  sh    bjjna0'kk%&#**IIc(//4013S8,r   c                     [         R                  " [         R                  " S5      S 5      R                  nU R	                  US5        g )Nr
   r   )r   rW  rY  constantr>   )r   rV  s     r   test_non_nullable_int"TestConstant.test_non_nullable_int^
  s0    ;;rzz"~t4==1%r   c                    [         R                  " [        [        45      n[         R                  " [        U45      n[         R
                  " U[         R
                  " [         R                  " 5       S5      [         R
                  " [        S5      45      nU R                  [        U5      S5        [         R
                  R                  [         R
                  " [         R                  " 5       S5      [         R
                  " [        S5      45      nU R                  UR                  U5        U R                  [        U5      S5        [         R
                  R                  [         R
                  " [         R                  " 5       S5      [         R
                  " [        [         R                  5      45      nU R                  UR                  U5        U R                  [        U5      S5        [         R
                  " U[         R                  5      nU R                  [        U5      S5        [         R
                  " US 5      nU R                  [        U5      S5        [         R
                  " US5      nU R                  [        U5      S5        [         R
                  " USU45      nU R                  [        U5      S	5        [         R
                  " US
5      nU R                  [        U5      [        U5      5        U R                  [        5         [         R
                  " US5        S S S 5        g ! , (       d  f       g = f)NrG  T/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializerrG  Tr   L{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}}r   r[  r   r   r  )r   rS  rr  r.  rJ   rW  rV  r>   r'   literal_structr1  r  r  r   )r   st1st2r   c1c2c3s          r   test_structsTestConstant.test_structsb
  sB   ""C;/""E3<0KKbkk",,.#> kk$57 8QJ	LKK&&BLLNC(H(*D$(?(A B%QJ	LKK&&BLLNC(H(*D",,(G(I J%QK	MKKR\\*Q!45KKT"Q!>?[[k*RJ	L[[r2h'R $J 	L[[/0R#b'*z*KKY' +**s   L;;
M	c                     [         R                  " S5      n[         R                  " [         R                  " X/5      [         R                  5      nU R                  U5        g )Nr   )r   rY  rW  rS  r  rA   )r   i8sts      r   &test_undefined_literal_struct_pickling3TestConstant.test_undefined_literal_struct_pickling
  s>    ZZ][[--rh7F$$R(r   c                    [        S5      nU R                  U[        R                  5        U R	                  [        U5      S5        [        S5      nU R                  U[        R                  5        U R	                  [        U5      S5        [        R                  " [        S5      nU" [        S5      [        S5      [        S5      /5      nU R	                  [        U5      S	5        U" / S
Q5      nU R	                  [        U5      S	5        U" S5      nU R	                  [        U5      S5        U R                  [        5         U" / SQ5        SSS5        [        R                  " [        [        45      n[        R                  " [        U45      nU" S5      nU R	                  [        U5      S5        U" S5      nU R	                  [        U5      S5        g! , (       d  f       N= f)z0
Instantiating a type should create a constant.
r   zi8 42TrB  r   r   r   r  z[3 x i32] [i32 4, i32 5, i32 6]r^  Nz[3 x i32] zeroinitializer)r   r   r  rQ  r[  rZ  r]  r\  )r   r  r   rW  r>   r'   r.  r  rJ   r>  r  r   rS  rr  )r   r   atr`  ra  s        r   test_type_instantiaton#TestConstant.test_type_instantiaton
  s{    Ha-Q)Ja-Q+\\%#AAA'(Q!BCyMQ!BCtHQ!<=z*| + ""C;/""E3<0Q #* 	,!"Q #I 	K +*s   G
G*c                 P    [        S5      nU R                  [        U5      S5        g)z(
Constants should have a useful repr().
r   z!<ir.Constant type='i32' value=42>N)rJ   r>   r  rC  s     r   r  TestConstant.test_repr
  s"     "Ia"EFr   c                    [         R                  " [         R                  " [         R                  " S5      S5      [	        [        S5      5      5      nU R                  5       n[         R                  " X!R                  S5      nSUl	        Xl
        [        R                  " [        U5      5      n[        R                  " [        U5      5      nU R                  [        U5      [        U5      5        g )Nr      
myconstantT)r   rW  r  rY  rL  r  rF   rU  r1  r  rX  r1   r2   r'   r>   )r   r   r  gvparsedreparseds         r   test_encoding_problem"TestConstant.test_encoding_problem
  s    KKRZZ]C8!%*-/KKMq&&,7! $$SV,&&s6{3Vc(m4r   c           	      l   U R                  5       n[        R                  " [        [        45      n[        R
                  " XS5      nUR                  S Vs/ s H  n[        R                  " [        U5      PM      sn5      n[        (       a  U R                  [        U5      S5        OU R                  [        U5      S5        U R                  UR                  [        R                  " [        5      5        [        R                  " US 5      nU R                  [        5         UR                  [        R                  " [        S5      /5        S S S 5        [        R                  " UR!                  5       S 5      nUR                  [        R                  " [        S5      /5      n[        (       a  U R                  [        U5      S5        OU R                  [        U5      S5        U R                  UR                  [        R                  " [        5      5        g s  snf ! , (       d  f       N= f)Nrt  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))rF   r   rS  rr  r.  rU  rM  rW  rJ   r   r>   r'   r1  rL   r  rF  r   )	r   r  r  ru  rf  r   const	const_ptrrc  s	            r   rO  TestConstant.test_gep
  s   KKM!!3+.ql3FF6:6aBKKq)6:;""SV[] SVdf!56B%y)IIr{{5!,-. * KK6	]]BKKq123""SWKM SWTV!56/ ; *)s   %H %,H%%
H3c           	         U R                  5       n[        R                  " [        [        45      nSn[        R
                  " XSUS9nU R                  UR                  U5        UR                  S Vs/ s H  n[        R                  " [        U5      PM      sn5      nU R                  UR                  R                  U5        [        (       a  U R                  [        U5      S5        OU R                  [        U5      S5        U R                  UR                  [        R                  " [        US95        g s  snf )Nr   rt  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))rF   r   rS  rr  r.  rU  r>   r  rM  rW  rJ   r1  r   r'   rL   )r   r  r  r  ru  rf  r   s          r   test_gep_addrspace_globalvar)TestConstant.test_gep_addrspace_globalvar
  s    KKM!!3+.	qliHy1FF6:6aBKKq)6:;))95""SVJL SVKM 		!JK ;s   4%D<c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   ztrunc (i64 1 to i32))r   rW  r  rn  rJ   r>   r'   rC  s     r   
test_truncTestConstant.test_trunc
  s2    KKq!''.Q!78r   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   zzext (i32 1 to i64))r   rW  rJ   ro  r  r>   r'   rC  s     r   	test_zextTestConstant.test_zext
  s2    KKq!&&u-Q!67r   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr7   zsext (i32 -1 to i64))r   rW  rJ   rp  r  r>   r'   rC  s     r   	test_sextTestConstant.test_sext
  s2    KKr"''.Q!78r   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   z*fptrunc (float 0x3ff0000000000000 to half))r   rW  rr  rq  r  r>   r'   rC  s     r   test_fptruncTestConstant.test_fptrunc
  s2    KKQ'',Q!MNr   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   z*fpext (float 0x3ff0000000000000 to double))r   rW  rr  rs  rK   r>   r'   rC  s     r   
test_fpextTestConstant.test_fpext
  s2    KKQ%%c*Q!MNr   c                 &   U R                  5       n[        R                  " U[        S5      nUR	                  [
        R                  5       5      n[        (       a  U R                  [        U5      S5        g U R                  [        U5      S5        g )Nrt  z"bitcast (ptr @"myconstant" to ptr)z$bitcast (i32* @"myconstant" to i64*))
rF   r   rU  rJ   rT  r  r   r   r>   r'   )r   r  ru  r   s       r   test_bitcastTestConstant.test_bitcast  sh    KKMq%6JJu'')*""SV%IJSV%KLr   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   z(fptoui (float 0x3ff0000000000000 to i32))r   rW  rr  rt  rJ   r>   r'   rC  s     r   test_fptouiTestConstant.test_fptoui  2    KKQ&&u-Q!KLr   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   zuitofp (i32 1 to float))r   rW  rJ   rv  rr  r>   r'   rC  s     r   test_uitofpTestConstant.test_uitofp  2    KKq!((-Q!:;r   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   z(fptosi (float 0x3ff0000000000000 to i32))r   rW  rr  ru  rJ   r>   r'   rC  s     r   test_fptosiTestConstant.test_fptosi  r  r   c                     [         R                  " [        S5      R                  [        5      nU R                  [        U5      S5        g )Nr   zsitofp (i32 1 to float))r   rW  rJ   rw  rr  r>   r'   rC  s     r   test_sitofpTestConstant.test_sitofp  r  r   c                    [         R                  " [        R                  5       S 5      n[         R                  " [        S5      nUR                  [        5      nU R                  [        UR
                  [        5        U R                  [        UR
                  [        5        [        (       a  U R                  [        U5      S5        g U R                  [        U5      S5        g )Nr   zptrtoint (ptr null to i32)zptrtoint (i64* null to i32))r   rW  r  r   rJ   rx  r  rF  rr  r   r>   r'   )r   rI  r  r   s       r   test_ptrtoint_1TestConstant.test_ptrtoint_1  s    kk%**,d3kk%#LL)S\\59)S\\37""SV%ABSV%BCr   c                 \   U R                  5       n[        R                  " U[        S5      nUR	                  [
        5      n[        (       aP  U R                  [        U5      S5        U R                  [        SUR                  [
        R                  5       5        OOU R                  [        U5      S5        U R                  [        SUR                  [
        R                  5       5        [        R                  " [        S5      nU R                  [        SUR                  [
        5        g )Nrt  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')rF   r   rU  rJ   rx  r  r   r>   r'   r   rF  r   rW  )r   r  ru  r   rc  s        r   test_ptrtoint_2TestConstant.test_ptrtoint_2)  s    KKMq%6KK""SV%JK""C  "	$ SV%KL""E  "	$ [["DKK		r   c                    [         R                  " [        S5      n[         R                  " [        S5      nUR	                  [
        R                  5       5      nU R                  [        UR                  [
        5        U R                  [        UR                  [
        R                  5       5        [        (       a  U R                  [        U5      S5        g U R                  [        U5      S5        g )Nr   gQ	@zinttoptr (i32 1 to ptr)zinttoptr (i32 1 to i64*))r   rW  rJ   rr  ry  r  r   r  rF  r   r>   r'   )r   r  pir   s       r   test_inttoptrTestConstant.test_inttoptrF  s    kk%#[[d#LL))+,)S\\59)R[[%2B2B2DE""SV%>?SV%?@r   c                     [         R                  " [        S5      nU R                  [	        UR                  5       5      S5        g )Nr   zsub (i32 0, i32 1))r   rW  rJ   r>   r'   r  r   r  s     r   test_negTestConstant.test_negS  s-    kk%#SWWY)=>r   c                     [         R                  " [        S5      nU R                  [	        UR                  5       5      S5        g )Nr   zxor (i32 1, i32 -1))r   rW  rJ   r>   r'   r  r  s     r   test_notTestConstant.test_notW  s-    kk%#SXXZ*?@r   c                     [         R                  " [        S5      nU R                  [	        UR                  5       5      S5        g )Nr   zfneg (float 0x3ff0000000000000))r   rW  rr  r>   r'   r  r  s     r   	test_fnegTestConstant.test_fneg[  s-    kk#q!SXXZ*KLr   c                 z   [         R                  " [        S5      n[         R                  " [        S5      nUR                  SUR                  SUR
                  SUR                  SUR                  SUR                  SUR                  S	UR                  S
UR                  SUR                  SUR                  SUR                  SUR                  S0nUR!                  5        H)  u  pEU R#                  [%        U" U5      5      US-   5        M+     SSSSSSS.nUR!                  5        H8  u  pg[%        UR'                  Xb5      5      nSU-   S-   n	U R#                  X5        M:     SSSSSSS.nUR!                  5        H8  u  pg[%        UR)                  Xb5      5      nSU-   S-   n	U R#                  X5        M:     g )Nr   r   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   rW  rJ   r  r  r  r   r   r  r  r  r  r  r  r  r  itemsr>   r'   r  r  )
r   r  r  oracler   iropcopr  rw   rf   s
             r   test_int_binopsTestConstant.test_int_binops_  s}   kk%#kk%#''ECHHfchh''ECGGecgg((FCHHfchh((FCGGdchh''E	#
 HBSC\42C+CD ' Du5?IC**345F~(99HV. ( DEUDIC23F~(99HV. (r   c           
         [         R                  " [        S5      n[         R                  " [        S5      nUR                  SUR                  SUR
                  SUR                  SUR                  S0nUR                  5        H,  u  pE[        U" U5      5      nUS-   nU R                  Xg5        M.     S	S
SSSSS.nUR                  5        H8  u  p[        UR                  X5      5      nSU	-   S-   nU R                  Xg5        M:     SSSSSSS.nUR                  5        H8  u  p[        UR                  X5      5      nSU	-   S-   nU R                  Xg5        M:     g )Nr   r   r  r  r  r  r  z5 (float 0x3ff0000000000000, float 0x4000000000000000)oeqr  ogtoger%  oler  zfcmp uequner  r  r  r  )r   rW  rr  r  r  r  r  r  r  r'   r>   r)  r*  )
r   r  r  r  r   r  rw   rf   r  r  s
             r   test_flt_binopsTestConstant.test_flt_binops{  sQ   kk#q!kk#q!((FCHHfchh((FCHHf6HBC\F  < =HV.	 ' UeE+IC))#34F~ *F GHV.	 ( UeE+IC++C56F~ *F GHV.	 (r   r   N)#r   r   r   r   rD  rH  rM  r;  rW  re  rj  rn  r  rx  rO  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:-& (D)
K<G57:L(989OOMM<M<D:A?AM/8/r   r@  c                       \ rS rSrS rSrg)TestTransformsi  c                    [         R                  " 5       n[         R                  " U[         R                  " [         R                  " 5       S5      S5      n[         R                  " U[         R                  " [         R                  " 5       S5      S5      n[         R
                  " 5       nUR                  UR                  5       5        UR                  US5      nU R                  UR                  U5        [         R                  " XU5      nU R                  XV5        U R                  UR                  U5        U R                  UR                  U5        g )Nr   r  r  )r   rD   rM   rI   rr  r   r  rS   rt  r>   calleereplace_all_callsr*   r.  )r   r,   r  r  r   rt  modifieds          r   test_call_transform"TestTransforms.test_call_transform  s    iikkk#rr{{}bA5Ikk#rr{{}bA5I,,. 6 6 89||C$c*''#6d%DKK-c*r   r   N)r   r   r   r   r  r   r   r   r   r  r    s    +r   r  c                       \ rS rSrS rSrg)TestSingletoni  c                    U R                  [        R                  [        R                  R	                  5       5        U R                  [        R                  [
        R
                  " [        R                  5      5        U R                  [        R                  [
        R                  " [        R                  5      5        U R                  [        R                  5        g r&   )r<   r   r  values
_Undefinedr  deepcopyrA   rE   s    r   test_undefinedTestSingleton.test_undefined  sq    bllBII$8$8$:;bllDIIbll$;<bllDMM",,$?@$$R\\2r   r   N)r   r   r   r   r  r   r   r   r   r  r    s    3r   r  __main__)(r   r  r  r9   r   r^   unittestr   r   llvmliter   r   r1   r   rY  r.  r   r=  rJ   r  HalfTyper  rV  rr  r  rK   r   r   r   r  r  r  r  r  r>  r@  r  r  r   mainr   r   r   <module>r     sL      	     $ - 
zz!}	zz!}


2


2


2kkmllnmmo[;x [;|K08 K0\Y"X Y"xO*x O*d*L *LZd5H d5P)jh jZ	W2 W2t!/8 /D+X +3H 3 zMMO r   