
    wg                       d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddl	mZ  e
j                  d      Z e
j                  d      Z e
j                  d      Z e
j                  d	      Z e
j                  d
      Z e
j&                         Z e
j*                         Z e
j.                         Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z d Z! G d de      Z" G d de      Z# G d  d!e      Z$e%d"k(  r ejL                          yy)#z
IR Construction Tests
    N   )TestCase)ir)binding          @   c                   t    e Zd ZdZd Zd Zd Zd Zd ZddZ	dd	Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestBasez!
    Utilities for IR tests.
    c                     d }dj                  t        ||            }t        j                  dd|      }| j	                  ||       y)zr
        Assert *pattern* is in *text*, ignoring any whitespace differences
        (including newlines).
        c                 P    | j                         s| j                         sd| z   S | S )N\)isalnumisspace)cs    [/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/llvmlite/tests/test_ir.pyescapez%TestBase.assertInText.<locals>.escape&   s!    99;qyy{axH     z\s+z\\s*N)joinmapresubassertRegex)selfpatterntextr   regexs        r   assertInTextzTestBase.assertInText    s@    	
 ''#fg./vw0u%r   c                     t        |      j                         D cg c]  }|j                          }}| j                  |       y c c}w N)str
splitlinesstripassertIn)r   linemodliness       r   assert_ir_linezTestBase.assert_ir_line/   s<    *-c(*=*=*?@$@@dE" As   Ac                 @    t        j                  t        |             y r"   )llvmparse_assemblyr#   r   r(   s     r   assert_valid_irzTestBase.assert_valid_ir3   s    CH%r   c                     t        j                  t        j                  |d            }| j                  |j                  |j                         | j                  t        |      t        |             |S )zAssert that the IR object pickles and unpickles correctly.
        The IR string is equal and that their type is equal
        )protocol)pickleloadsdumpsassertIs	__class__assertEqualr#   )r   irobject	newobjects      r   assert_pickle_correctlyz TestBase.assert_pickle_correctly6   sU     LLh!DE	h(()*=*=>XI7r   c                 *    t        j                         S r"   )r   Moduler   s    r   modulezTestBase.module?   s    yy{r   Nc           	          |xs | j                         }t        j                  t        t        t        t        t        j
                  t              f      }t        j                  |||      S r"   )r?   r   FunctionTypeint32dblPointerTypeFunction)r   r?   namefntys       r   functionzTestBase.functionB   sL    (4;;=uueS')~~e'<'> ?{{64..r   c                 L    |xs | j                         }|j                  |      S r"   )rH   append_basic_block)r   funcrF   s      r   blockzTestBase.blockH   s#    &t}}&&t,,r   c                 J    g }|j                  |       dj                  |      S Nr   )descrr   )r   thingbufs      r   rO   zTestBase.descrL   s!    Cwws|r   c                 T    t        j                  |      }|j                  dd      }|S )Nz
    z
  )textwrapdedentreplace)r   asms     r   _normalize_asmzTestBase._normalize_asmQ   s%    ooc"kk(F+
r   c                 J    | j                  |      }| j                  ||       y r"   )rW   r   r   rO   rV   expecteds       r   check_descr_regexzTestBase.check_descr_regexW   "    &&s+)r   c                 J    | j                  |      }| j                  ||       y r"   )rW   r8   rY   s       r   check_descrzTestBase.check_descr[   r\   r   c                 F    | j                  | j                  |      |       y r"   )r^   rO   r   rL   rV   s      r   check_blockzTestBase.check_block_   s    E*C0r   c                 F    | j                  | j                  |      |       y r"   )r[   rO   r`   s      r   check_block_regexzTestBase.check_block_regexb   s    tzz%0#6r   c                     | j                  |      }|j                         }| j                  |j                         |j                                y r"   )rW   _stringify_bodyr8   r%   r   r?   rV   rZ   actuals        r   check_module_bodyzTestBase.check_module_bodye   s=    &&s+''))9:r   c                     | j                  |      }|j                         }| j                  |j                         |j                                y)z6
        Check module metadata against *asm*.
        N)rW   _stringify_metadatar8   r%   rf   s        r   check_metadatazTestBase.check_metadataj   s?     &&s+++-)9:r   c                     | j                  |      }| j                  |      }|j                  d      d   j                  d      d   }| j	                  |j                         |j                                y )N{   }r   )rW   rO   	partition
rpartitionr8   r%   )r   rK   rV   rZ   rg   s        r   check_func_bodyzTestBase.check_func_bodyr   sb    &&s+D!!!#&q)44S9!<)9:r   )Nmy_funcrN   )__name__
__module____qualname____doc__r    r*   r/   r;   r?   rH   rL   rO   rW   r[   r^   ra   rc   rh   rk   rr    r   r   r   r      sW    &#&/-
**17;
;;r   r   c                   j    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)TestFunctionz>i32 @"my_func"(i32 %".1", i32 %".2", double %".3", i32* %".4")c                     | j                         }| j                  |      j                         }| j                  |j                         d| j                  z         y )Nz
declare %s)rH   rO   r%   r8   protor   rK   rV   s      r   test_declarezTestFunction.test_declare}   sC    }}jj$$&lTZZ&?@r   c                 *   | j                         }|j                  j                  d       |j                  j                  d       |j                  j                  d       d|j                  _        t	        j
                  t        dd      }t	        j                  | j                         |d      }||j                  _	        | j                  |      j                         }| j                  |d	| j                  z         | j                  |       y )
Noptsizealwaysinline
convergentr   rx   Tvar_arg__gxx_personality_v0zgdeclare %s alwaysinline convergent optsize alignstack(16) personality i8 (...)* @"__gxx_personality_v0")rH   
attributesadd
alignstackr   rA   int8rE   r?   personalityrO   r%   r8   r|   r;   )r   rK   tp_perspersrV   s        r   test_declare_attributesz$TestFunction.test_declare_attributes   s    }}I&N+L)%'"//$D9{{4;;='3IJ&*#jj$$&L $	% 	$$T*r   c                 
   | j                         }|j                  d   j                  d       d|j                  d   j                  _        d|j                  d   j                  _        d|j                  d   j                  _        |j                  d   j                  d       |j                  j                  d	       | j                  |      j                         }| j                  |d
       | j                  |       y )Nr   zeroext   r   
         nonnullnoaliaszdeclare noalias i32 @"my_func"(i32 zeroext %".1", i32 dereferenceable(5) dereferenceable_or_null(10) %".2", double %".3", i32* nonnull align 4 %".4"))rH   argsadd_attributer   dereferenceabledereferenceable_or_nullalignreturn_valuerO   r%   r8   r;   r}   s      r   test_function_attributesz%TestFunction.test_function_attributes   s    }}		!""9-23		!/:<		!7()		!%		!""9-''	2jj$$& u	 	$$T*r   c                 (   | j                         }| j                  |      }|j                  d|j                  g              | j	                  |      j                         }| j                  |d| j                   d       | j                  |       y )Ndbgdeclare z !dbg !0)	r?   rH   set_metadataadd_metadatarO   r%   r8   r|   r;   r   r?   rK   rV   s       r   test_function_metadataz#TestFunction.test_function_metadata   s}    }}V$%!4!4R!89jj$$&#DJJ<x8	 	$$T*r   c                     | j                         }d|_        | j                  |      j                         }| j	                  |d| j
                   d       | j                  |       y )N	a_sectionr   z section "a_section")rH   sectionrO   r%   r8   r|   r;   r}   s      r   test_function_sectionz"TestFunction.test_function_section   s\    }}"jj$$&#DJJ</CD	 	$$T*r   c                 6   | j                         }| j                  |      }d|_        |j                  d|j	                  g              | j                  |      j                         }| j                  |d| j                   d       | j                  |       y )Nr   r   r   z section "a_section" !dbg !0)
r?   rH   r   r   r   rO   r%   r8   r|   r;   r   s       r   test_function_section_metaz'TestFunction.test_function_section_meta   s    }}V$"%!4!4R!89jj$$&#DJJ</KL	 	$$T*r   c                 ^   | j                         }| j                  |      }|j                  j                  d       |j	                  d|j                  g              | j                  |      j                         }| j                  |d| j                   d       | j                  |       y )Nr   r   r   z alwaysinline !dbg !0)r?   rH   r   r   r   r   rO   r%   r8   r|   r;   r   s       r   test_function_attr_metaz$TestFunction.test_function_attr_meta   s    }}V$N+%!4!4R!89jj$$&#DJJ</DE	 	$$T*r   c                    | j                         }|j                  j                  d       d|_        | j	                  |      j                         }| j                  |d| j                   d       | j                  |       y )Nr   r   r   z optsize section "a_section")	rH   r   r   r   rO   r%   r8   r|   r;   r}   s      r   test_function_attr_sectionz'TestFunction.test_function_attr_section   so    }}I&"jj$$&#DJJ</KL	N 	$$T*r   c                 l   | j                         }| j                  |      }|j                  j                  d       d|_        |j                  d|j                  g              | j                  |      j                         }| j                  |d| j                   d       | j                  |       y )Nr   r   r   r   z) alwaysinline section "a_section" !dbg !0)r?   rH   r   r   r   r   r   rO   r%   r8   r|   r;   r   s       r   test_function_attr_section_metaz,TestFunction.test_function_attr_section_meta   s    }}V$N+"%!4!4R!89jj$$&#DJJ</XY	 	$$T*r   c                 @   | j                         }|j                  j                  d       |j                  d      }t	        j
                  |      }|j                          | j                  |      }| j                  |dj                  | j                               y )Nr   my_blockz            define {proto} alwaysinline
            {{
            my_block:
                ret void
            }}
            )r|   )rH   r   r   rJ   r   	IRBuilderret_voidrO   r^   formatr|   )r   rK   rL   builderrV   s        r   test_definezTestFunction.test_define   s~    }}N+''
3,,u%jj  TZZ(	*r   c                 v   | j                         }t        j                         }|j                  dt        g      }|j                  d|t
        g      }|j                  d||t
        g      }|j                  d      }| j                  | j                  |      j                         d       | j                  | j                  |      j                         d       | j                  | j                  |      j                         d       | j                  | j                  |      j                         d       y )	N	llvm.powizllvm.memsetzllvm.memcpyzllvm.assumezD            declare double @"llvm.powi.f64"(double %".1", i32 %".2")zZ            declare void @"llvm.memset.p0i8.i32"(i8* %".1", i8 %".2", i32 %".3", i1 %".4")z`            declare void @"llvm.memcpy.p0i8.p0i8.i32"(i8* %".1", i8* %".2", i32 %".3", i1 %".4")z1            declare void @"llvm.assume"(i1 %".1"))	r?   r   
as_pointerdeclare_intrinsicrC   rB   r^   rO   r%   )r   r?   pint8powimemsetmemcpyassumes          r   test_declare_intrinsicsz$TestFunction.test_declare_intrinsics   s   !''cU;))-%H))-%9NO))-8D)//1 4H 	IF+113 6^ 	_F+113 6d 	eF+113 65 	6r   c                     | j                         }|j                  dt        g      }|j                  dt        g      }| j                  ||       y )Nr   )r?   r   rC   r6   )r   r?   r   powi2s       r   test_redeclare_intrinsicz%TestFunction.test_redeclare_intrinsic  sC    ''cU;((se<dE"r   c                 F    | j                         }| j                  |       y r"   )rH   r;   )r   fns     r   test_picklingzTestFunction.test_pickling  s    ]]_$$R(r   c                    | j                         }| j                  |      }|j                  j                  d       d}| j	                  t
        |      5  |j                  j                  d       d d d        y # 1 sw Y   y xY w)Nr   $Can't have alwaysinline and noinlinenoinliner?   rH   r   r   assertRaisesRegex
ValueErrorr   r?   rK   msgs       r   %test_alwaysinline_noinline_disallowedz2TestFunction.test_alwaysinline_noinline_disallowed  si    }}V$N+4##J4 	,OO
+	, 	, 	,   A::Bc                    | j                         }| j                  |      }|j                  j                  d       d}| j	                  t
        |      5  |j                  j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   r   r   r   s       r   %test_noinline_alwaysinline_disallowedz2TestFunction.test_noinline_alwaysinline_disallowed$  si    }}V$J'4##J4 	0OO/	0 	0 	0r   N)rt   ru   rv   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r   r   rz   rz   y   sS    PEA+&+ 
+	+++	++* 6"#),0r   rz   c                   f    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)TestIRc                     | j                         }|j                  t        d      t        d      g       | j	                  d|       | j                  |       y )N{   *   z!0 = !{ i32 123, i8 42 })r?   r   rB   r   r*   r/   r.   s     r   test_unnamed_metadatazTestIR.test_unnamed_metadata0  sG    kkm%*d2h/06<S!r   c                    | j                         }|j                  t        d      dg      }|j                  t        d      |g      }|j                  t        d      |g      }| j	                  ||       |j                  |||g       | j                  d|       | j                  d|       | j                  d|       y )Nr   kernel  z!0 = !{ i32 123, !"kernel" }z!1 = !{ i64 456, !0 }z!2 = !{ !0, !1, !1 })r?   r   rB   int64r6   r*   )r   r(   m0m1m2s        r   test_unnamed_metadata_2zTestIR.test_unnamed_metadata_27  s    kkmuSz845uSz2./uSz2./b""b"&:C@3S92C8r   c                    | j                         }|j                  t        d      t        d      gt        d      gt        d      gg       | j                  d|       | j                  d|       | j                  d|       y )Nr   r   i  z!0 = !{ i32 456 }z!1 = !{ i32 789 }z!2 = !{ i32 123, !0, !1, !0 })r?   r   rB   r*   r.   s     r   test_unnamed_metadata_3zTestIR.test_unnamed_metadata_3G  sm    kkm%*uSzlU3ZL5:,OP/5/5;SAr   c                 l    | j                         }|j                  dg       | j                  d|       y )Nz"\$z!0 = !{ !"\22\5c$" })r?   r   r*   r.   s     r   test_metadata_stringzTestIR.test_metadata_stringO  s.    kkm'#4c:r   c                    | j                         }|j                  t        d      g      }|j                  t        d      g      }|j	                  d      }|j                  |       |j                  |       |j                  |       | j                  d|       | j                  |       | j                  ||j                  d             | j                  t              5  |j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   fooz!foo = !{ !0, !1, !0 }bar)r?   r   rB   r   add_named_metadatar   r*   r/   r6   get_named_metadataassertRaisesKeyError)r   r(   r   r   nmds        r   test_named_metadatazTestIR.test_named_metadataU  s    kkmuSzl+uSzl+$$U+4c:S!c311%89x( 	*""5)	* 	* 	*s   $C??Dc                    | j                         }|j                  t        d      g      }|j                  d|       |j                  dt	        d      g       |j                  ddg       |j                  dg        | j                  d|       | j                  d|       | j                  d|       | j                  d	|       | j                  d
|       | j                  d|       | j                  |       y )Nr   r   r   r   r   z!foo = !{ !0, !1, !2 }z!0 = !{ i32 123 }z!1 = !{ i64 456 }z!2 = !{ !"kernel" }z!bar = !{ !3 }z
!3 = !{  })r?   r   rB   r   r   r*   r/   )r   r(   r   s      r   test_named_metadata_2zTestIR.test_named_metadata_2e  s    kkmuSzl+ub)uuSzl3uxj1ub)4c:/5/5137,c2L#.S!r   c                 Z   | j                         }|j                  t        j                         d       g       | j	                  d|       | j                  |       | j                         }|j                  d t        d      g       | j	                  d|       | j                  |       y )Nz!0 = !{ i32* null }r   z!0 = !{ null, i32 123 })r?   r   rB   r   r*   r/   r.   s     r   test_metadata_nullzTestIR.test_metadata_nullu  s    kkm%**,T234137S!kkm$c
+,5s;S!r   c           
         | j                         }|j                  dddd      }|j                  dd|j                  d g      i      }|j                  dt        j                  d      |d	d
ddd      }|j                  dd|d|d|dd       t        |      }| j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  |       y )NDIFiler   r   filename	directoryDISubroutineTypetypesDICompileUnitDW_LANG_PythonARTIQr   T)languagefileproducerruntimeVersionisOptimizedis_distinctDISubprogramrs      F)rF   r   r'   typeisLocalunit/!0 = !DIFile(directory: "bar", filename: "foo")z!1 = !{ null }z!!2 = !DISubroutineType(types: !1)zy!3 = distinct !DICompileUnit(file: !0, isOptimized: true, language: DW_LANG_Python, producer: "ARTIQ", runtimeVersion: 0)zd!4 = distinct !DISubprogram(file: !0, isLocal: false, line: 11, name: "my_func", type: !2, unit: !3))r?   add_debug_infor   r   DITokenr#   r*   r/   )r   r(   di_filedi_func_typedi_compileunitstrmods         r   test_debug_infozTestIR.test_debug_info  sK    kkm$$X0
  ))*<S%%tf-?
  ++O

#34>
  ,  	> ",
  	 	 SM"	$,f5?H D #	$ 	 " #	$ 	S!r   c                    | j                         }|j                  dddd      }|j                  dddd      }|j                  dddd      }|j                  ddddd      }| j                  ||       | j                  t	        ||||h      d       t        |      }| j                  d|       | j                  d	|       | j                  d
|       | j                  |       y )Nr   r   r   r   Tr  r   r  z/!1 = !DIFile(directory: "foo", filename: "bar")z8!2 = distinct !DIFile(directory: "bar", filename: "foo"))r?   r	  r6   r8   lenr#   r*   r/   )r   r(   di1di2di3di4r  s          r   test_debug_info_2zTestIR.test_debug_info_2  s   kkm  .3/4"$%   .3/4"$%   .3/4"$%   .3/4"$15 ! 7 	c3c3S12A6SM"	$M"	$ %&,	.S!r   c                    | j                         }t        j                  |t        j                         d      }t        j                  t        j                         d      |_        |j                  dddt        j                  d      d      }|j                  d|j                  d	i       |j                  d
|j                  |ddd      d      }|j                  d|       t        |      }| j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|        t        j                  d      d      d t        j                  d      d      g} t        j                  d      d      d t        j                  d      d      g}|j                  |      }|j                  |      }|j                  d      }|j                  |       |j                  |       |j                  dddd      }	|j                  dt        j                  d       |	t        j                  d!      |j                  |g      d"d      }
|j                  d#|
       y )$Ngvarr   DIBasicTypefloatr	   DW_ATE_float)rF   sizeencodingDIGlobalVariableExpressionDIExpressionDIGlobalVariableT)rF   r  isDefinitionr  )exprvarr   zB!0 = !DIBasicType(encoding: DW_ATE_float, name: "float", size: 32)z!1 = !DIExpression()zK!2 = distinct !DIGlobalVariable(isDefinition: true, name: "gvar", type: !0)z3!3 = !DIGlobalVariableExpression(expr: !1, var: !2)z2@"gvar" = global float 0x4045000000000000, !dbg !3rn   zDwarf Versionr   zDebug Info Versionr   zllvm.module.flagsr   r   r   r   r   r   	FullDebug)r   r   emissionKindglobalszllvm.dbg.cu)r?   r   GlobalVariable	FloatTypeConstantinitializerr	  r
  rF   r   r#   r*   IntTyper   r   r   )r   r(   r  di_floatdi_gvarr  dverdiverflagsr  di_cus              r   test_debug_info_gvarzTestIR.test_debug_info_gvar  sh    kkm  bllnf=;;r||~r:%%m

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

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

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

  #  	}e4r   c                     | j                         }|j                  dddi       t        |      }dj                  t	        d dj                                     }| j                  d| d|       y )	NDILocalVariablerF   u   a∆r   c                     d| dS )Nr   02xrx   )xs    r   <lambda>z7TestIR.test_debug_info_unicode_string.<locals>.<lambda>  s    r!C\ r   u   ∆z!0 = !DILocalVariable(name: "az"))r?   r	  r#   r   r   encoder*   )r   r(   r  rF   s       r   test_debug_info_unicode_stringz%TestIR.test_debug_info_unicode_string  sb    kkm,vv.>?Swws15<<>BC<TF"EvNr   c                 
   | j                         }t        j                  |t        j                  t        j                         g       d      }t        j
                  |j                  d            }t        j                  t        t        g      }t        j                  |ddd      }|j                  |t        d      g       |j                          d}| j                  |t        |             | j                  |       y )	Nr   r   
mov $1, $2=r,rTside_effectr   8call i32 asm sideeffect "mov $1, $2", "=r,r" ( i32 123 ))r?   r   rE   rA   VoidTyper   rJ   rB   	InlineAsmcallr   r    r#   r/   )r   r(   r   r   asmtyrV   pats          r   test_inline_assemblyz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                    | j                         }t        j                  |t        j                  t        j                         g       d      }t        j
                  |j                  d            }t        j                  t        t        g      }|j                  |ddt        d      gd       |j                          d}| j                  |t        |             | j                  |       y )	Nr   r   r<  r=  r   Tr>  r@  )r?   r   rE   rA   rA  r   rJ   rB   rV   r   r    r#   r/   )r   r(   r   r   rD  rE  s         r   test_builder_asmzTestIR.test_builder_asm&  s    kkmkk#rr{{}bA5I,,s55b9:w/E<%*4PH#s3x(S!r   c                    | j                         }t        j                  |t        j                  t        j                         g       d      }t        j
                  |j                  d            }|j                  t        j                  d      d       |j                          d}| j                  |t        |             | j                  |       y )Nr   r   r
   raxzcall i64 asm "", "={rax}")r?   r   rE   rA   rA  r   rJ   load_regr+  r   r    r#   r/   r   r(   r   r   rE  s        r   test_builder_load_regzTestIR.test_builder_load_reg1  s    kkmkk#rr{{}bA5I,,s55b9:B/)#s3x(S!r   c                    | j                         }t        j                  |t        j                  t        j                         g       d      }t        j
                  |j                  d            }|j                  t        d      t        j                  d      d       |j                          d}| j                  |t        |             | j                  |       y )Nr   r   r   r
   rJ  z0call void asm sideeffect "", "{rax}" ( i64 123 ))r?   r   rE   rA   rA  r   rJ   	store_regr   r+  r   r    r#   r/   rL  s        r   test_builder_store_regzTestIR.test_builder_store_reg;  s    kkmkk#rr{{}bA5I,,s55b9:%*bjjne<@#s3x(S!r   N)rt   ru   rv   r   r   r   r   r   r   r   r  r  r2  r:  rF  rH  rM  rP  rx   r   r   r   r   .  sR    "9 B;* " 
"+"Z">B5HO
"	"""r   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestGlobalValuesc                    | j                         }t        j                  |t        j                  t        j                         g       d      }t        j                  |t        j                  t        j                         g       d       t        j
                  |t        j                         d      }| j                  |j                  d      |       | j                  |j                  d      |       | j                  t              5  |j                  d       d d d        | j                  t        |      d       y # 1 sw Y   %xY w)Nr   r   
globdoublekkkz2<ir.GlobalVariable 'globdouble' of type 'double*'>)r?   r   rE   rA   rA  r'  
DoubleTyper8   
get_globalr   r   repr)r   r(   r   rT  s       r   test_globals_accessz$TestGlobalValues.test_globals_accessH  s    kkmkk#rr{{}bA5I
C;UC&&sBMMO\J
.45zBx( 	"NN5!	" 	j)M	O	" 	"s   EE
c                    | j                         }t        j                  t        j                         g       }t        j                  ||d      }t        j                  ||d      }t        j
                  |t        j                         d      }| j                  t        |j                        t        ||f             | j                  t        |j                        t        |||f             y)zr
        Accessing functions and global values through Module.functions
        and Module.global_values.
        r   r   rT  N)r?   r   rA   rA  rE   r'  rV  r8   set	functionsglobal_values)r   r(   ftyr   r   rT  s         r   #test_functions_global_values_accessz4TestGlobalValues.test_functions_global_values_accessU  s    
 kkmoobkkmR0kk#sE*kk#sE*&&sBMMO\J
S]]+S#s_=S../c3
5K1LMr   c                 B   | j                         }t        j                  |t        d      }t        j                  |t        dd      }t        j                  |t        d      }t	        d      |_        t        j                  |t        d      }d|_        t        j                  |t        d	      }d
|_        t        j                  |t        dd      }d|_        t        j                  |t        d      }d
|_        t	        d      |_        d|_	        t        j                  |t        d      }	d
|	_        t	        d      |	_        d|	_
        t        j                  |t        d      }
d
|
_        t	        d      |
_        d|
_	        d|
_
        | j                  |d       y)z7
        IR serialization of global variables.
        abr   	addrspacer   r   dTeinternalfr   gr   h	h_sectionir   	i_sectiona              @"a" = external global i8
            @"b" = external addrspace(42) global i8
            @"c" = global i32 123
            @"d" = external constant i32
            @"e" = internal global i32 undef
            @"f" = external unnamed_addr addrspace(456) global i32
            @"g" = internal global i32 123, align 16
            @"h" = internal global i32 123, section "h_section"
            @"i" = internal global i32 456, section "i_section", align 8
            N)r?   r   r'  r   rB   r*  global_constantlinkageunnamed_addrr   r   rh   )r   r(   ra  rb  r   re  rf  rh  ri  rj  rl  s              r   test_global_variables_irz)TestGlobalValues.test_global_variables_irb  sO    kkmc4-c4;c5#.c
c5#. c5#.	c5#=c5#.	c
c5#.	c
	c5#.	c
	s 
% 
	r   c                 F    | j                         }| j                  |       y r"   )r?   r;   r.   s     r   test_picklezTestGlobalValues.test_pickle  s    kkm$$S)r   N)rt   ru   rv   rY  r_  rq  rs  rx   r   r   rR  rR  F  s    ON)V*r   rR  c                   $    e Zd Zd Zd Zd Zd Zy)	TestBlockc                     | j                         }t        j                  |d      }| j                  |j                  |       | j                  |j                         y )NstartparentrF   )rH   r   Blockr6   ry  assertFalseis_terminatedr   rK   rL   s      r   test_attributeszTestBlock.test_attributes  sC    }}73ellD),,-r   c                     | j                  d      }| j                  | j                  |      d       |j                  j	                  ddg       | j                  | j                  |      d       y )Nr   rF   z
my_block:
ra  rb  zmy_block:
  a
  b
)rL   r8   rO   instructionsextend)r   rL   s     r   
test_descrzTestBlock.test_descr  s]    



+E*M:!!3*-E*,CDr   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  ||d      }|j                  ||d      }|j                  ||d       t        j                  ||j                  d||fd      }| j                  |d	       |j                  ||       | j                  |d
       y )Nr   r  rn   r   re  rf  sdivrh  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"
            )rL   r   r   rH   r   r   r   mulInstructionr  ra   rU   )r   rL   r   ra  rb  r   re  rh  s           r   test_replacezTestBlock.test_replace  s    



+,,u%$$Ra(1KK1c"KK1c"Aq#NN5!&&&1a&#> ! 	 	a ! 	r   c                     | j                         }t        j                  |d      }| j                  t	        |      d       y)z4
        Blocks should have a useful repr()
        rw  rx  z"<ir.Block 'start' of type 'label'>N)rH   r   rz  r8   rX  r}  s      r   	test_reprzTestBlock.test_repr  s4     }}73e&JKr   N)rt   ru   rv   r~  r  r  r  rx   r   r   ru  ru    s    .E,Lr   ru  c                   ^   e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;y:);TestBuildInstructionszN
    Test IR generation of LLVM instructions through the IRBuilder class.
    i  c                 
   | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  ||d      }| j                  |d       | j                  t        |      d       y )Nr   r  rn   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>)>)	rL   r   r   rH   r   r   ra   r8   rX  )r   rL   r   ra  rb  insts         r   test_simplez!TestBuildInstructions.test_simple  s~    



+,,u%$$Ra(1{{1a' ! 	
 	d<	=r   c                 T   | j                  d      }t        j                  |      }|j                  j                  d d \  }}}|j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d	       |j                  ||d
       |j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d       |j!                  ||d       |j#                  ||d       |j%                  ||d       |j'                  ||d       |j)                  ||d       |j+                  ||d       |j-                  ||d       | j/                  t0              5 }|j                  ||       d d d        | j3                  t5        j6                        d       | j9                  |j:                         | j=                  |d       y # 1 sw Y   \xY w)Nr   r  r   r   re  rf  rh  ri  rj  rl  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"
            )rL   r   r   rH   r   r   faddr   fsubr  fmuludivr  fdivuremsremfremor_and_xorshlashrlshrr   r   r8   r#   	exceptionr{  r|  ra   )r   rL   r   ra  rb  ffcms          r   test_binopsz!TestBuildInstructions.test_binops  s   



+,,u%##((!,1bAq#Q3Aq#Q3Aq#Q3Q3Q3Q3Q3Q3Q3Aq#Q3Aq#Aq#Q3Q3z* 	bKK2	R\\*L	N,,- ! 		 	s   0HH'c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  ||dd       |j                  ||ddd	g       | j                  |d
       y )Nr   r  rn   r   )nuwr0  re  r  nswz            my_block:
                %"c" = add nuw i32 %".1", %".2"
                %"d" = sub nuw nsw i32 %".1", %".2"
            )rL   r   r   rH   r   r   r   ra   r   rL   r   ra  rb  s        r   test_binop_flagsz&TestBuildInstructions.test_binop_flags  s}    



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



+,,u%$$Ra(1Q3i0Q3vuo6 ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d       |j                  ||d	       | j                  |d
       y )Nr   r  rn   r   re  rf  rh  ri  rj  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")
            )rL   r   r   rH   r   sadd_with_overflowsmul_with_overflowssub_with_overflowuadd_with_overflowumul_with_overflowusub_with_overflowra   r  s        r   test_binops_with_overflowz/TestBuildInstructions.test_binops_with_overflow"  s    



+,,u%$$Ra(1""1a-""1a-""1a-""1a-""1a-""1a- ! 	r   c                 R   | j                  d      }t        j                  |      }|j                  j                  d d \  }}}|j                  |d       |j                  |d       |j                  |d       | j                  |j                         | j                  |d       y )Nr   r  r   re  rf  rh  z            my_block:
                %"d" = sub i32 0, %".1"
                %"e" = xor i32 %".2", -1
                %"f" = fneg double %".3"
            )rL   r   r   rH   r   negnot_fnegr{  r|  ra   r   rL   r   ra  rb  r   s         r   test_unary_opsz$TestBuildInstructions.test_unary_ops6  s    



+,,u%""''+1aAsQQ,,- ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}t        j
                  t        j                  d      t        j                        }t        j
                  t        j                  d      t        j                        }|j                  ||d      }| j                  |d       |j                  ||       |j                  ||       | j                  |d       y )Nr   r  rn   r	   r   zN            my_block:
                %"c" = add i32 undef, undef
            zN            my_block:
                %"c" = add i32 %".1", %".2"
            )rL   r   r   rH   r   r)  r+  	Undefinedr   ra   replace_usage)r   rL   r   ra  rb  undef1undef2r   s           r   test_replace_operandz*TestBuildInstructions.test_replace_operandE  s    



+,,u%$$Ra(1RZZ^R\\:RZZ^R\\:KK, ! 	 	
"	" ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  d||d       |j                  d||d       |j                  d||d	       |j                  d
||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d
||d       |j                  d||d       |j                  d||d       | j                  t              5  |j                  d||d       d d d        | j                  t              5  |j                  d||d       d d d        | j                  |j                         | j                  |d       y # 1 sw Y   ixY w# 1 sw Y   CxY w)Nr   r  rn   ==r   !=re  <rf  <=rh  >ri  >=rj  rl  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"
            )rL   r   r   rH   r   icmp_unsignedicmp_signedr   r   r{  r|  ra   r  s        r   test_integer_comparisonsz.TestBuildInstructions.test_integer_comparisonsW  s   



+,,u%$$Ra(1dAq#.dAq#.c1a-dAq#.c1a-dAq#.D!Q,D!Q,CAs+D!Q,CAs+D!Q,z* 	3q!T2	3z* 	3q!T2	3,,- ! 		3 	3	3 	3s   	G;GGGc                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  d||d       |j                  d||d       |j                  d||d	       |j                  d
||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d
||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||d       |j                  d||dg d       | j                  |j                         | j                  |d        y )!Nr   r  rn   r  r   r  re  r  rf  r  rh  r  ri  r  rj  rl  r  r  r  r  r  ordur  vwr7  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"
            )
rL   r   r   rH   r   fcmp_orderedfcmp_unorderedr{  r|  ra   r  s        r   test_float_comparisonsz,TestBuildInstructions.test_float_comparisons|  s   



+,,u%$$Ra(1T1a-T1a-S!Q,T1a-S!Q,T1a-tQ3/tQ3/sAq#.tQ3/sAq#.tQ3/UAq#.UAq#.uaC0uaC0uaC%L 	 	N,,- ! 	r   c                    | j                  d      }t        j                  t        d      }t        j                  |      }|j
                  j                  d d \  }}|j                  |||dd       | j                  |j                         |j                          | j                  |j                         | j                  |d       y )	Nr   r  Trn   r   )r  r  r  z            my_block:
                %"c" = select arcp nnan i1 true, i32 %".1", i32 %".2"
                unreachable
            )rL   r   r)  int1r   rH   r   selectr{  r|  unreachable
assertTruera   )r   rL   r  r   ra  rb  s         r   test_misc_opsz#TestBuildInstructions.test_misc_ops  s    



+KKd#,,u%$$Ra(1q!Q+;<,,-++, ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  j                  d      }|j                  j                  d      }|j                  t        dd      }|j                  ||       |j                  ||       | j                  |j                         | j                  |d	       y )
Nr   r  rn   b2b3my_phir  r  zj            my_block:
                %"my_phi" = phi fast i32 [%".1", %"b2"], [%".2", %"b3"]
            )rL   r   r   rH   r   rJ   phirB   add_incomingr{  r|  ra   )r   rL   r   ra  rb  bb2bb3r  s           r   test_phizTestBuildInstructions.test_phi  s    



+,,u%$$Ra(111$711$7kk%k;C C ,,- ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}}|j                  t        d      }|j                  t        dd      }|j                  t        |d      }d	|_        | j                  |j                  t        j                  t                     |j                  ||      }	| j                  |	j                  t        j                                |j                  ||      }
| j                  |
j                  t        j                                |j                  |d
      }| j                  |j                  t               |j                  ||d      }| j                  |j                  t        j                                |j                  |dd      }| j                  |j                  t               |j                  ||dd      }| j                  |j                  t        j                                |j!                  |ddd      }| j                  |j                  t               | j#                  t$              5  |j                  ||       d d d        | j#                  t$              5  |j                  |       d d d        | j#                  t$              5 }|j                  ||       d d d        | j                  t'        j(                        d       | j+                  |d       y # 1 sw Y   xY w# 1 sw Y   }xY w# 1 sw Y   YxY w)Nr   r  r   r   r   re  )r  rF   rf  r   ri  r   )r   rl  seq_cstr   )orderingr   r  )r  r   rF   z.cannot store i32 to double*: mismatching typesa              my_block:
                %"c" = alloca i32
                %"d" = alloca i32, i32 42
                %"e" = alloca double, i32 %".1", align 8
                store double %".3", double* %"e"
                store i32 %".2", i32* %"c"
                %"g" = load i32, i32* %"c"
                store i32 %".2", i32* %"c", align 1
                %"i" = load i32, i32* %"c", align 1
                store atomic i32 %".2", i32* %"c" seq_cst, align 4
                %"k" = load atomic i32, i32* %"c" seq_cst, align 4
            )rL   r   r   rH   r   allocarB   rC   r   r8   r  rD   storerA  loadstore_atomicload_atomicr   	TypeErrorr#   r  ra   )r   rL   r   ra  rb  zr   re  rf  eerh  ri  rj  rl  r  r  r  s                    r   test_mem_opsz"TestBuildInstructions.test_mem_ops  s   



+,,u%""''+1aNN5sN+NN5rN4NN3QSN1!45]]1a "++-0MM!Q/LLC 'MM!QaM(/LLCqL)'  A	 C/IQSI'y) 	 MM!Q	 y) 	LLO	 y) 	 RMM!Q	 R\\*I	K ! 		  	 	 		  	 s$   ;L-+L9M-L69MMc                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  t        j                  t              d      }|j                  |t        j                  t        d      |gd      }| j                  |j                  t        j                  t                     | j                  |d       y )Nr   r  rn   r   r   re  z            my_block:
                %"c" = alloca i32*
                %"d" = getelementptr i32*, i32** %"c", i32 5, i32 %".1"
            )rL   r   r   rH   r   r  rD   rB   gepr)  r8   r  ra   r   rL   r   ra  rb  r   re  s          r   test_gepzTestBuildInstructions.test_gep  s    



+,,u%$$Ra(1NN2>>%0sN;KKBKKq115CK@!67 ! 	r   c           
      :   | j                  d      }t        j                  |      }|j                  j                  d d \  }}t
        j                         }t        j                  t        |||t        g      }|j                  ||j                         d      }|j                  |dD cg c]  }t        j                  t        |       c}d      }	| j                  |	j                  t        j                  |             | j!                  |d       y c c}w )Nr   r  rn   re  r   r   rf  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
            )rL   r   r   rH   r   r   r   LiteralStructTyper   bitcastr  r)  rB   r8   r  rD   ra   )
r   rL   r   ra  rb  int8ptrlsre  r7  rf  s
             r   test_gep_castinstrz(TestBuildInstructions.test_gep_castinstr  s     



+,,u%$$Ra(1//#!!5'7GU"KLOOAr}}SO9KK6BaBKKq1BKM!89 ! 	 Cs   ,!D
c           
         | j                  d      }t        j                  |      }|j                  j                  d d \  }}d}t
        j                         }t        j                  t        |||t        g      }|j                  ||j                  |      d      }|j                  |dD 	cg c]  }	t        j                  t        |	       c}	d      }
| j                  |
j                  j                  |       | j                  |
j                  t        j                   ||             | j#                  |d	       y c c}	w )
Nr   r  rn   r   rc  re  r  rf  z            my_block:
                %"d" = bitcast i32 %".1" to {i64, i8*, i8*, i8*, i64} addrspace(4)*
                %"e" = getelementptr {i64, i8*, i8*, i8*, i64}, {i64, i8*, i8*, i8*, i64} addrspace(4)* %"d", i32 0, i32 3
            )rL   r   r   rH   r   r   r   r  r   r	  r  r)  rB   r8   r  rd  rD   ra   )r   rL   r   ra  rb  rd  r
  r  re  r7  rf  s              r   test_gep_castinstr_addrspacez2TestBuildInstructions.test_gep_castinstr_addrspace  s    



+,,u%$$Ra(1	//#!!5'7GU"KLOOAr}}y}AOLKK6BaBKKq1BKM))959!MN ! 	 Cs   0!E
c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}d}|j                  t        j                  t        |      d      }| j                  t        |j                        d       | j                  |j                  j                  j                  |       |j                  |t        j                  t        d      |gd	      }| j                  |j                  j                  |       |j                  |t        j                  t        d
      gd      }| j                  |j                  j                  |       | j                  |d       y )Nr   r  rn   r   rc  r   zi32 addrspace(4)**r   re  r   rf  z            my_block:
                %"c" = alloca i32 addrspace(4)*
                %"d" = getelementptr i32 addrspace(4)*, i32 addrspace(4)** %"c", i32 5, i32 %".1"
                %"e" = getelementptr i32, i32 addrspace(4)* %"d", i32 10
            )rL   r   r   rH   r   r  rD   rB   r8   r#   r  pointeerd  r  r)  ra   )	r   rL   r   ra  rb  rd  r   re  rf  s	            r   test_gep_addrspacez(TestBuildInstructions.test_gep_addrspace*  s$   



+,,u%$$Ra(1	NN2>>%9ECNPQVV&:;119=KKBKKq115CK@))95KKBKKr23#K>))95 ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}t        j
                  t        t        g      }t        j
                  t        |g      }t        j                  |t        j                  t        d      t        j                  t        d      f      }|j                  |dd      }|j                  ||dd      }	|j                  |	t        j                  t        d	      d
d      }
| j                  |	j                  |       | j                  |
j                  |       |j                  |d      }|j                  |d      }|j                  |dd      }|j                  |d
d      }|j                  |dd      }|j                  |dd      }|j                  ||d
d      }|j                  ||dd      }| j                  |j                  t               | j                  |j                  |       | j                  |j                  t               | j                  |j                  t               | j                  |j                  |       | j                  |j                  |       | j!                  t"              5  |j                  |d       d d d        | j!                  t"              5  |j                  |d       d d d        | j!                  t"              5  |j                  |d       d d d        | j!                  t"              5  |j                  ||d       d d d        | j!                  t"              5  |j                  ||d
       d d d        | j%                  |d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   qxY w# 1 sw Y   LxY w)Nr   r  rn   r   Tr   r   re  Fr   rf  ptrr  r  r  )r   r   r  )r   r   r  r  r  )r   r   r   a              my_block:
                %"c" = extractvalue {i32, i1} {i32 4, i1 true}, 0
                %"d" = insertvalue {i32, i1} {i32 4, i1 true}, i32 %".1", 0
                %"e" = insertvalue {i32, i1} %"d", i1 false, 1
                %"ptr" = alloca {i8, {i32, i1}}
                %"j" = load {i8, {i32, i1}}, {i8, {i32, i1}}* %"ptr"
                %"k" = extractvalue {i8, {i32, i1}} %"j", 0
                %"l" = extractvalue {i8, {i32, i1}} %"j", 1
                %"m" = extractvalue {i8, {i32, i1}} %"j", 1, 0
                %"n" = extractvalue {i8, {i32, i1}} %"j", 1, 1
                %"o" = insertvalue {i8, {i32, i1}} %"j", {i32, i1} %"l", 1
                %"p" = insertvalue {i8, {i32, i1}} %"j", i32 %".1", 1, 0
            )rL   r   r   rH   r   r  rB   r  r   r)  extract_valueinsert_valuer8   r  r  r  r   r  ra   )r   rL   r   ra  rb  tp_innertp_outerc_innerr   re  rf  p_outerr  r  r  r  r  r  r  s                      r   test_extract_insert_valuez/TestBuildInstructions.test_extract_insert_value=  sa   



+,,u%$$Ra(1''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  Aqs 3  AvC 8&*'&**y) 	.!!'1-	. y) 	3!!'62	3 y) 	.!!'1-	. y) 	*  Aq)	* y) 	0  !Q/	0 	 ! 	!	. 	.	3 	3	. 	.	* 	*	0 	0s<   =N--N9OO>O-N69OOOO&c                 <   | j                  d      }t        j                  |      }|j                  j                  d d \  }}}}|j                  |t        d      }|j                  |t        d      }|j                  |t        d      }	|j                  |t        d      }
|j                  |
t        d      }|j                  |t        d	      }|j                  |t        d
      }|j!                  |t        d      }|j#                  |t        d      }|j%                  |t        d      }|j'                  |t        j(                  t              d      }|j+                  |t        d      }| j-                  |j.                         | j1                  |d       y )Nr   r  r   r   re  rf  fbfcri  rj  fdferl  r  r  ah              my_block:
                %"c" = trunc i32 %".1" to i8
                %"d" = zext i8 %"c" to i32
                %"e" = sext i8 %"c" to i32
                %"fb" = fptrunc double %".3" to float
                %"fc" = fpext float %"fb" to double
                %"g" = fptoui double %".3" to i32
                %"h" = fptosi double %".3" to i8
                %"fd" = uitofp i32 %"g" to float
                %"fe" = sitofp i8 %"h" to double
                %"i" = ptrtoint i32* %".4" to i32
                %"j" = inttoptr i32 %"i" to i8*
                %"k" = bitcast i32 %".1" to float
            )rL   r   r   rH   r   truncr   zextrB   sextfptruncfltfpextrC   fptouifptosiuitofpsitofpptrtointinttoptrrD   r	  r{  r|  ra   )r   rL   r   ra  rb  far  r   re  rf  r  r  ri  rj  r  r  rl  r  r  s                      r   test_cast_opsz#TestBuildInstructions.test_cast_opsz  sT   



+,,u%((--bq11b#MM!TM,LLEL,LLEL,__Rd+]]2sD)NN2uc*NN2tS)^^AsD)^^AsD)S%-Qt 4c:OOAsC(,,- ! 	r   c                 F   | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  t        d      }|j                  d||dd      }| j                  |j                  t               | j                  |d       y )	Nr   r  rn   r   r   	monotonicre  z            my_block:
                %"c" = alloca i32
                %"d" = atomicrmw add i32* %"c", i32 %".1" monotonic
            )rL   r   r   rH   r   r  rB   
atomic_rmwr8   r  ra   r  s          r   test_atomicrmwz$TestBuildInstructions.test_atomicrmw  s    



+,,u%$$Ra(1NN5sN+uaK=' ! 	r   c                    | j                  d      }t        j                  |      }|j                  j	                  d      }|j                  |       | j                  |j                         | j                  |d       y )Nr   r  targetzE            my_block:
                br label %"target"
            )	rL   r   r   rH   rJ   branchr  r|  ra   )r   rL   r   	bb_targets       r   test_branchz!TestBuildInstructions.test_branch  sl    



+,,u%$$77X7F	y!++, ! 	r   c                 r   | j                  d      }t        j                  |      }|j                  j	                  d      }|j                  j	                  d      }|j                  t        j                  t        d      ||       | j                  |j                         | j                  |d       y )Nr   r  b_trueb_falseFza            my_block:
                br i1 false, label %"b_true", label %"b_false"
            )rL   r   r   rH   rJ   cbranchr)  r  r  r|  ra   )r   rL   r   bb_truebb_falses        r   test_cbranchz"TestBuildInstructions.test_cbranch  s    



+,,u%""5585D##66I6FD%0'8D++, ! 	r   c                    | j                  d      }t        j                  |      }|j                  j	                  d      }|j                  j	                  d      }|j                  t        j                  t        d      ||      }|j                  ddg       | j                  |j                         | j                  |d       | j                  |j                  d	       y )
Nr   r  r8  r9  Fr   r   zk            my_block:
                br i1 false, label %"b_true", label %"b_false", !prof !0
            zC            !0 = !{ !"branch_weights", i32 5, i32 42 }
            )rL   r   r   rH   rJ   r:  r)  r  set_weightsr  r|  ra   rk   r?   )r   rL   r   r;  r<  brs         r   test_cbranch_weightsz*TestBuildInstructions.test_cbranch_weights  s    



+,,u%""5585D##66I6F__R[[u5wI
2w++, ! 	 	GNN - 	r   c                    | j                  d      }t        j                  |      }|j                  j	                  d      }|j                  j	                  d      }|j                  t        j                  |j                  |            }|j                  |       |j                  |       | j                  |j                         | j                  |d       y )Nr   r  b_1b_2z            my_block:
                indirectbr i8* blockaddress(@"my_func", %"b_1"), [label %"b_1", label %"b_2"]
            )rL   r   r   rH   rJ   branch_indirectBlockAddressadd_destinationr  r|  ra   )r   rL   r   bb_1bb_2
indirectbrs         r   test_branch_indirectz*TestBuildInstructions.test_branch_indirect  s    



+,,u%222>222>,,OOG,,d35
""4(""4(++, ! 	r   c                      fd} j                  d      }t        j                  |      }|j                           ||d        j                  d      }t        j                  |      }|j	                  t        d              ||d        j                  d      }t        j                  |      }|j                         }|j                  d|j                  j                  d	              ||d
        j                  d      }t        j                  |      }|j	                  t        d            }|j                  d|j                  j                  d	              ||d       y )Nc                 `    j                  | j                         j                  | |       y r"   )r  r|  ra   )rL   expected_irr   s     r   checkz1TestBuildInstructions.test_returns.<locals>.check  s%    OOE//0UK0r   r   r  z;            my_block:
                ret void
            other_blockr   z?            other_block:
                ret i32 5
            r   rx   zD            my_block:
                ret void, !dbg !0
               zE            my_block:
                ret i32 6, !dbg !0
            )	rL   r   r   r   retrB   r   r?   r   )r   rO  rL   r   r  s   `    r   test_returnsz"TestBuildInstructions.test_returns  s>   	1 



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

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



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



+,,u%{{58$%!:!:2!>?e  	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  j                  d      }|j                  j                  d      }|j                  j                  d      }|j                  j                  d      }|j                  ||      }	|	j                  t        j                  t        d      |       |	j                  t        j                  t        d	      |       |	j                  d|       | j                  |j                         | j                  |d
       y )Nr   r  rn   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"]
            )rL   r   r   rH   r   rJ   switchadd_caser)  rB   r  r|  ra   )
r   rL   r   ra  rb  	bb_onzerobb_ononebb_ontwobb_elsesws
             r   test_switchz!TestBuildInstructions.test_switch  s   



+,,u%$$Ra(1$$77X7F	##66G6D##66G6D""55;5G^^Aw'
BKKq)95
BKKq)84
Ax ++, ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}t        j
                  t        t        t        f      }t        j
                  t        t        fd      }t        j
                  t        t        t        f      }t        j                  |j                  j                  |d      }t        j                  |j                  j                  |d      }	t        j                  |j                  j                  |d      }
|j                  |||fd	       |j                  |	||fd
       |j                  |
||fd       |j                  |||fdd       |j                  |||fd      }|j                  j                  d       |j                  |||fdd       |j                  |||fdd       |j                  |||fdd       |j                  |||fdd       |j                  |||fdd       |j                  |||fdd       | j                  |d       y ) Nr   r  rn   Tr   rh  ri  rj  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   ri  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
        )rL   r   r   rH   r   rA   r$  rB   rC   hlfrE   r?   rC  r   r   ra   )r   rL   r   ra  rb  tp_ftp_gtp_hrh  ri  rj  rh  s               r   	test_callzTestBuildInstructions.test_call  s   



+,,u%$$Ra(1sUEN3sUHd;sUEN3KK((//s;KK((//s;KK((//s;QA(QA(QA(QAH= a!Q1AB!!%%j1QA
V<QA:JKQAjAQA 2.IQA 1 :F 	GQA 0E ! 	r   c                    | j                  d      }t        j                  |      }t        j                  t        j                         t        j
                         gdz        }t        j                  |j                  |d      }|j                  t        d      }|j                  j                  d      }|j                  ||||f       | j                  |d       y)	z9
        Function calls with metadata arguments.
        r   r  r   zllvm.dbg.declarera  rx   z            my_block:
                %"a" = alloca i32
                call void @"llvm.dbg.declare"(metadata i32* %"a", metadata !0, metadata !0)
            N)rL   r   r   rA   rA  MetaDataTyperE   r?   r  rB   r   rC  ra   )r   rL   r   dbg_declare_tydbg_declarera  rb  s          r   test_call_metadataz(TestBuildInstructions.test_call_metadata?  s     



+,,u%9J8Ka8OPkkNN  NN5sN+NN''+[1a), ! 	r   c                 n   | j                  d      }t        j                  |      }t        j                  t        j                         t
        j                         t
        t
        j                         f      }t        j                  |j                  j                  |d      }|j                  d   j                  d       |j                  t
        d      }|j                  t
        d      }|j                  ||t        j                  t
        d      |fd	d
d       | j                  |d       y )Nr   r  funr   sretretvalotherr   r~  r   r   r   rn   	arg_attrsz        my_block:
            %"retval" = alloca i32
            %"other" = alloca i32
            call void @"fun"\(i32\* noalias sret(\(i32\))? %"retval", i32 42, i32\* noalias %"other"\)
        )rL   r   r   rA   rA  rB   r   rE   rH   r?   r   r   r  rC  r)  rc   )r   rL   r   fun_tyr}  r  r  s          r   test_call_attributesz*TestBuildInstructions.test_call_attributesS  s    



+,,u%KKME,,.u7G7G7IJLkk'**1165A!!&)H5u73R[[+U3& 	 	
 	u ' 	r   c                 X   | j                  d      }t        j                  |      }t        j                  t        j                         d      }t        j
                  |j                  j                  |d      }|j                  |d       |j                  |dd       |j                  |dd       |j                  |dd       |j                  |dd	       |j                  |dd
       |j                  |dg        |j                  |dd       | j                  |d       y )Nr   r  rx   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"()
        )
rL   r   r   rA   rA  rE   rH   r?   rC  ra   r   rL   r   r  r}  s        r   test_call_tailz$TestBuildInstructions.test_call_tailk  s    



+,,u%3kk'**1168DS"S"5)S"4(S"6*S"8,S":.S"2&S">2 
! 
	r   c                 t   | j                         }t        j                  |      }t        j                  t        j                         d      }t        j
                  |j                  j                  |d      }| j                  t              5  |j                  |dddi       d d d        y # 1 sw Y   y xY w)Nrx   r}  r   r~  r  )rL   r   r   rA   rA  rE   rH   r?   r   r   rC  r  s        r   test_invalid_call_attributesz2TestBuildInstructions.test_invalid_call_attributes  s    

,,u%3kk'**1165Az* 	9LLbQKL8	9 	9 	9s   B..B7c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}t        j
                  t        t        t        f      }t        j                  |j                  j                  |d      }|j                  j                  d      }|j                  j                  d      }|j                  |||f||d       | j                  |d       y )	Nr   r  rn   rh  normalunwindrb  z            my_block:
                %"res_f" = invoke float @"f"(i32 %".1", i32 %".2")
                    to label %"normal" unwind label %"unwind"
            )rL   r   r   rH   r   rA   r$  rB   rE   r?   rJ   invokera   )	r   rL   r   ra  rb  rs  rh  	bb_normal	bb_unwinds	            r   test_invokez!TestBuildInstructions.test_invoke  s    



+,,u%$$Ra(1sUEN3KK((//s;$$77X7F	$$77X7F	q1a&)Y@ ! 	r   c                    | j                  d      }t        j                  |      }t        j                  t        j                         t
        j                         t
        t
        j                         f      }t        j                  |j                  j                  |d      }d|_
        |j                  d   j                  d       |j                  t
        d      }|j                  t
        d      }|j                  j                  d	      }|j                  j                  d
      }|j                  ||t        j                   t
        d      |f||dddddd       | j#                  |d       y )Nr   r  r}  rf  r   r~  r  r  r  r  r   r  r   r  r   r  )rg  rk  rn  r  a          my_block:
            %"retval" = alloca i32
            %"other" = alloca i32
            invoke fast fastcc void @"fun"\(i32\* noalias sret(\(i32\))? %"retval", i32 42, i32\* noalias %"other"\) noinline
                to label %"normal" unwind label %"unwind"
        )rL   r   r   rA   rA  rB   r   rE   rH   r?   calling_conventionr   r   r  rJ   r  r)  rc   )	r   rL   r   r  r}  r  r  r  r  s	            r   test_invoke_attributesz,TestBuildInstructions.test_invoke_attributes  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& 	 	
 	u ' 	r   c           
         | j                  d      }t        j                  |      }|j                  t        j                  t
        t        j                         g      d      }t        j                  |j                  j                  t        j                         d      }d|_        |j                  t        j                  |             |j                  t        j                  t        j                  t        j                   |j"                  d      |g                   |j%                  |       | j'                  |d       y )Nr   r  lp_ZTIiTr   z            my_block:
                %"lp" = landingpad {i32, i8*}
                    catch i8** @"_ZTIi"
                    filter [1 x i8**] [i8** @"_ZTIi"]
                resume {i32, i8*} %"lp"
            )rL   r   r   
landingpadr  rB   r   r   r'  rH   r?   rn  
add_clauseCatchClauseFilterClauser)  	ArrayTyper  resumera   )r   rL   r   r  int_typeinfos        r   test_landingpadz%TestBuildInstructions.test_landingpad  s    



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



+,,u%$$Ra(1Q4q ! 	r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}d|_        d|_        t        j                  |j                  d      }t        j                  |t        j                        }t        j                  d      }|j                  || |d      d      }|j                  || |d	      d
      }| j                  |d       |j                  d      }|j                  |       |j                  |       t        j                  |d	dg      }|j!                  |||d       | j                  |d       |j                  d      }|j                  |       |j                  |       |j#                  ||d       | j                  |d       |j                  d      }|j                  |       |j                  |       |j%                  | |d      d      }	|j%                  | |d	      d      }
| j                  |d       |j'                  |j#                  |	|
             | j)                  |j*                         y )Ninsert_blockr  rn   ra  rb  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
            )rL   r   r   rH   r   rF   
VectorTyper  r)  r  r+  insert_elementra   rJ   r4  position_at_endshuffle_vectorr   extract_elementrR  r/   r?   )r   rL   r   ra  rb  vectyvecidxtymaskr   re  s              r   test_vector_opsz%TestBuildInstructions.test_vector_ops  s/   

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

2$$S!U1XF$C$$S!U1XF$C ! 	 **?;u&{{51a&)sCF; ! 	
 **;7u&C5) ! 	
 **?;u&##Cq#>##Cq#> ! 	 	GKK1%&W^^,r   c                     | j                  d      }t        j                  |      }t        j                  t        d      }|j                  |d      }|j                  |       | j                  |d       y )Nr   r  r   r   z}            my_block:
                %"c" = call i64 @"llvm.bitreverse.i64"(i64 5)
                ret i64 %"c"
            )rL   r   r   r)  r   
bitreverserR  ra   r   rL   r   ra  r   s        r   test_bitreversez%TestBuildInstructions.test_bitreverse  se    



+,,u%KKq!qs+A ! 	r   c                 J   | j                  d      }t        j                  |      }t        j                  t        d      }| j                  t              5 }|j                  |d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   r   #expected an integer type, got float)rL   r   r   r)  r$  r   r  r  r&   r#   r  r   rL   r   ra  raisess        r   test_bitreverse_wrongtypez/TestBuildInstructions.test_bitreverse_wrongtype%  s    



+,,u%KKQy) 	,Vqs+	,1  !	#	, 	,   BB"c                    | j                  d      }t        j                  |      }| j                  t              5 }|j                  dd        d d d        | j                  dt        j                               | j                  t              5 }|j                  d d       d d d        | j                  dt        |j                               |j                  dd        |j                  dd       |j                  d	d       |j                  d
       |j                          | j                  |d       y # 1 sw Y   xY w# 1 sw Y   xY w)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
            )rL   r   r   r   r   fencer&   r#   r  r   ra   )r   rL   r   r  s       r   
test_fencez TestBuildInstructions.test_fence0  s   



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



+,,u%~. 	.OO,-	.% ! 			. 	.s   BBc                     | j                  d      }t        j                  |      }t        j                  t        d      }|j                  |d      }|j                  |       | j                  |d       y )Nr   r  r   r   zx            my_block:
                %"c" = call i32 @"llvm.bswap.i32"(i32 5)
                ret i32 %"c"
            )rL   r   r   r)  rB   bswaprR  ra   r  s        r   
test_bswapz TestBuildInstructions.test_bswapX  b    



+,,u%KKq!MM!#M&A ! 	r   c                     | j                  d      }t        j                  |      }t        j                  t        d      }|j                  |d      }|j                  |       | j                  |d       y )Nr   r  r   r   zx            my_block:
                %"c" = call i16 @"llvm.ctpop.i16"(i16 5)
                ret i16 %"c"
            )rL   r   r   r)  int16ctpoprR  ra   r  s        r   
test_ctpopz TestBuildInstructions.test_ctpopd  r  r   c                 (   | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t
        d      }|j                  ||d      }|j                  |       | j                  |d       y )Nr   r  r   r   r   z}            my_block:
                %"c" = call i16 @"llvm.ctlz.i16"(i16 5, i1 1)
                ret i16 %"c"
            )	rL   r   r   r)  r  r  ctlzrR  ra   r  s         r   	test_ctlzzTestBuildInstructions.test_ctlzp  t    



+,,u%KKq!KKa LLACL(A ! 	r   c                     | j                  d      }t        j                  |      }t        j                  t        d      }|j                  |d      }|j                  |       | j                  |d       y )Nr   r  g      @rb  z            my_block:
                %"b" = call i16 @"llvm.convert.to.fp16.f32"(float 0x4014000000000000)
                ret i16 %"b"
            )rL   r   r   r)  r$  convert_to_fp16rR  ra   r  s        r   test_convert_to_fp16_f32z.TestBuildInstructions.test_convert_to_fp16_f32}  se    



+,,u%KKS!##AC#0A ! 	r   c                 J   | j                  d      }t        j                  |      }t        j                  t        d      }| j                  t              5 }|j                  |d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   rb  expected a float type, got i16)rL   r   r   r)  r  r   r  r  r&   r#   r  r  s        r   "test_convert_to_fp16_f32_wrongtypez8TestBuildInstructions.test_convert_to_fp16_f32_wrongtype  s    



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



+,,u%KKq!%%acc%:A ! 	r   c                 J   | j                  d      }t        j                  |      }t        j                  t        d      }| j                  t              5 }|j                  |d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r        @rb  zexpected a float return typerL   r   r   r)  r$  r   r  r  r&   r#   r  r  s        r   !test_convert_from_fp16_f32_notypez7TestBuildInstructions.test_convert_from_fp16_f32_notype  s    



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



+,,u%KKS!y) 	;V%%acc%:	;-  !	#	; 	;   BB'c                 T   | j                  d      }t        j                  |      }t        j                  t        d      }| j                  t              5 }|j                  |dt               d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r  rb  r  r  )rL   r   r   r)  r$  r   r  r  r  r&   r#   r  r  s        r   %test_convert_from_fp16_f32_wrongtype2z;TestBuildInstructions.test_convert_from_fp16_f32_wrongtype2  s    



+,,u%KKS!y) 	=V%%ace%<	=,  !	#	= 	=r  c                 (   | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t
        d      }|j                  ||d      }|j                  |       | j                  |d       y )Nr   r  r   r   r   z}            my_block:
                %"c" = call i64 @"llvm.cttz.i64"(i64 5, i1 1)
                ret i64 %"c"
            )	rL   r   r   r)  r   r  cttzrR  ra   r  s         r   	test_cttzzTestBuildInstructions.test_cttz  r  r   c                    | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t
        d      }| j                  t              5 }|j                  ||d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   r   r   zexpected an i1 type, got i32)rL   r   r   r)  r   rB   r   r  r  r&   r#   r  r   rL   r   ra  rb  r  s         r   test_cttz_wrongflagz)TestBuildInstructions.test_cttz_wrongflag  s    



+,,u%KKq!KKq!y) 	)VLLACL(	)*  !	#	) 	)   1B44B=c                    | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t
        d      }| j                  t              5 }|j                  ||d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   r   r   r  )rL   r   r   r)  r$  r  r   r  r  r&   r#   r  r  s         r   test_cttz_wrongtypez)TestBuildInstructions.test_cttz_wrongtype  s    



+,,u%KKQKKa y) 	)VLLACL(	)1  !	#	) 	)r  c                 ^   | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t        d      }t        j                  t        d      }|j                  |||d      }|j                  |       | j                  |d       y )Nr   r  r   r   rn   fmaz            my_block:
                %"fma" = call float @"llvm.fma.f32"(float 0x4014000000000000, float 0x3ff0000000000000, float 0x4000000000000000)
                ret float %"fma"
            )rL   r   r   r)  r$  r  rR  ra   )r   rL   r   ra  rb  r   r  s          r   test_fmazTestBuildInstructions.test_fma  s    



+,,u%KKQKKQKKQkk!Qk.C ! 	r   c                    | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t        d      }t        j                  t        d      }| j                  t              5 }|j                  |||d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   r   rn   r  z(expected an floating point type, got i32)rL   r   r   r)  rB   r   r  r  r&   r#   r  r   rL   r   ra  rb  r   r  s          r   test_fma_wrongtypez(TestBuildInstructions.test_fma_wrongtype  s    



+,,u%KKq!KKq!KKq!y) 	-VKK1aeK,	-6  !	#	- 	-   CCc                    | j                  d      }t        j                  |      }t        j                  t        d      }t        j                  t
        d      }t        j                  t        d      }| j                  t              5 }|j                  |||d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nr   r  r   r   rn   r  z7expected types to be the same, got float, double, float)rL   r   r   r)  r$  rC   r   r  r  r&   r#   r  r  s          r   test_fma_mixedtypesz)TestBuildInstructions.test_fma_mixedtypes  s    



+,,u%KKQKKQKKQy) 	-VKK1aeK,	-E  !	#	- 	-r  c                 N    d }dD ]  }t        j                   ||              y )Nc                    t        j                  t        j                  d      t        j                  d      j                         t        j                  d      g      }t        j                         }t        j
                  ||d      }|j                         }|j                         }|j                         }t        j                         }|j                  |       |j                  |       |j                  |       |j                  t        j                  d            }|j                  t        j                  |j                  d      |       |j                  t        j                  d            }	|	j                  t        j                  |	j                  d      |       |j                  d   j                  |        |j!                  |j                  d   |g      }
|j#                  |
      }|j%                  |	|      }|	j                  ||       |j%                  |t        j                  |j                  d            }|j                  ||       |j'                  d||j                  d         }|j)                  |||       |j                  |       |j+                  |       t-        |      S )Nr	   r  r  r   r   r  )r   rA   r+  r   r=   rE   rJ   r   r  r4  r  r  r)  r  r   r   r  r  r   r  r:  rR  r#   )	attr_namerG   r?   rK   bb_entrybb_loopbb_exitr   indexaccumr  valueaddedindexp1conds                  r   gen_codez;TestBuildInstructions.test_arg_attributes.<locals>.gen_code  s    ??2::b>BJJrN4M4M4O46JJrN4D EDYY[F;;vt%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u-Eug.kk%UZZ)CDGw0((gtyy|DDOOD'73##G,KKv;r   )byrefbyvalelementtypeimmarginallocainregnestr   	nocapturenofreer   noundefpreallocatedreturnedsignext
swiftasync
swifterror	swiftselfr   )r,   r-   )r   r  r  s      r   test_arg_attributesz)TestBuildInstructions.test_arg_attributes  s.    &	P
 	5I,  34-	5r   N)<rt   ru   rv   rw   maxDiffr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-  r1  r6  r=  rA  rK  rS  r`  rv  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r!  rx   r   r   r  r    s+    G=/b($#J+Z/b"&&;zB	
 &P&$L(069B(
8-t
	#6


	#
	#	#	#
#
###?5r   r  c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestBuilderMiscz=
    Test various other features of the IRBuilder class.
    c                    | j                  d      }t        j                  |      }| j                  |j                  |j
                         | j                  |j                  t        j                         | j                  |j                  |j
                  j                         | j                  |j                  t        j                         y )Nrw  r  )
rL   r   r   r6   rH   ry  assertIsInstancerE   r?   r=   r  s      r   r~  zTestBuilderMisc.test_attributesV  s    


(,,u%g&&5g..<gnnell&9&9:gnnbii8r   c                    | j                  d      }t        j                  |      }|j                  j                  d d \  }}|j                  ||d       |j                  d      }|j                  |      5  |j                  ||d       |j                         5  |j                  ||d       d d d        |j                  ||d       |j                  |       d d d        |j                  ||d	       |j                  |      5  |j                  ||d
       d d d        | j                  |d       | j                  |d       y # 1 sw Y   xY w# 1 sw Y   zxY w# 1 sw Y   FxY w)Nr   r  rn   r   r   re  rf  rh  ri  rj  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"
            )rL   r   r   rH   r   r   rJ   
goto_blockr  goto_entry_blockr   r  r4  r  r  ra   )r   rL   r   ra  rb  bb_news         r   test_goto_blockzTestBuilderMisc.test_goto_block^  sP   



+,,u%$$Ra(1Aq#+++7' 	#LLAs#))+ 'Aq#&'LLAs#NN6"	# 	Aq#' 	$LLAs#	$ ! 	 	 " 	' '	# 	#	$ 	$s0   :$EE2,E
E#E	EE #E,c                 H   | j                  d      }t        j                  |      }t        j                  t        d      }|j                  ||d      }|j                  |      5 }|j                  ||d       d d d        | j                  |j                          |j                  ||d      }|j                  |      5  |j                  ||d       |j                  |       d d d        | j                  |j                  d       y # 1 sw Y   xY w# 1 sw Y   2xY w)	Noner  r   ra  rb  r   re  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:
            )rL   r   r   r)  r  r   if_thenr6   r4  rr   rH   )r   rL   r   r  ra  bbendr   s          r   test_if_thenzTestBuilderMisc.test_if_then{  s    


&,,u%KKa KK1c"__Q 	#5KK1c"	# 	gmmU+KK1c"__Q 	"KK1c"NN5!	" 	W-- 0 		# 	#
	" 	"s   &D%DDD!c                    | j                  d      }t        j                  |      }t        j                  t        d      }|j                  ||d      }|j                  |      5  |j                  ||d      }|j                  |      5  |j                  ||d       d d d        d d d        |j                          | j                  |j                  d       y # 1 sw Y   >xY w# 1 sw Y   BxY w)Nr-  r  r   ra  rb  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"
            )
rL   r   r   r)  r  r   r.  r   rr   rH   )r   rL   r   r  ra  rb  s         r   test_if_then_nestedz#TestBuilderMisc.test_if_then_nested  s    


&,,u%KKa KK1c"__Q 	'Aq#&A# 'Aq#&'	' 	W-- 0 	' '	' 	's$   &%C(CC(C%	!C((C1c           	         d}| j                  |      }t        j                  |      }t        j                  t        d      }|j                  ||d      }|j                  |      5  |j                  ||d      }|j                  |      5  |j                  ||d       d d d        d d d        |j                          | j                  |j                  dj                  ||d d d	z   
             y # 1 sw Y   UxY w# 1 sw Y   YxY w)NPLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongr  r   ra  rb  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)rL   r   r   r)  r  r   r.  r   rr   rH   r   )r   r6  rL   r   r  ra  rb  s          r   test_if_then_long_labelz'TestBuilderMisc.test_if_then_long_label  s     




+,,u%KKa KK1c"__Q 	'Aq#&A# 'Aq#&'	' 	W-- 0 *JsOd4JK	M' '	' 	's$   (%DC5!D5C>	:DD
c                       fd} |d      } j                  |j                  d        |d      } j                  |j                  d       y )Nc                     j                  d      }t        j                  |      }t        j                  t        d      }|j                  ||       5  	 d d d        j                  |d       |S # 1 sw Y   xY w)Nr-  r  r   likelyzp                one:
                    br i1 0, label %"one.if", label %"one.endif", !prof !0
                )rL   r   r   r)  r  r.  ra   )r<  rL   r   r  r   s       r   rO  z2TestBuilderMisc.test_if_then_likely.<locals>.check  su    JJEJ*Ell5)GD!$A62 U %  N s   A44A=TC            !0 = !{ !"branch_weights", i32 99, i32 1 }
            FC            !0 = !{ !"branch_weights", i32 1, i32 99 }
            rk   r?   r   rO  r   s   `  r   test_if_then_likelyz#TestBuilderMisc.test_if_then_likely  sP    
	 +GNN - 	 ,GNN - 	r   c                    | j                  d      }t        j                  |      }t        j                  t        d      }|j                  ||d      }|j                  |      5 \  }}|5  |j                  ||d       d d d        |5  |j                  ||d       d d d        d d d        |j                  |      5 \  }}|5  |j                  |       d d d        |5  |j                          d d d        d d d        | j                  |j                  d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   mxY w# 1 sw Y   ^xY w# 1 sw Y   bxY w)Nr-  r  r   ra  rb  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:
            )rL   r   r   r)  r  r   if_elser4  r   rr   rH   )r   rL   r   r  ra  thenrX  s          r   test_if_elsezTestBuilderMisc.test_if_else  sI   


&,,u%KKa KK1c"__Q 	'#4D) 'Aq#&' 'Aq#&'	' __Q 	##4D) &u%& #  "#	# 	W-- 0 	' '' '	' 	'& &# #	# 	#sx   &D7,D 
D7
D+D7?EE
E!E2ED(	$D7+D4	0D77E E	EE	EE$c                       fd} |d      } j                  |j                  d        |d      } j                  |j                  d       y )Nc                    j                  d      }t        j                  |      }t        j                  t        d      }|j                  ||       5 \  }}|5  |j                  |       d d d        |5  |j                          d d d        d d d        j                  |j                  d       |S # 1 sw Y   JxY w# 1 sw Y   ;xY w# 1 sw Y   ?xY w)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:
                )
rL   r   r   r)  r  rC  r4  r   rr   rH   )r<  rL   r   r  rD  rX  r   s         r   rO  z2TestBuilderMisc.test_if_else_likely.<locals>.check	  s    JJEJ*Ell5)GD!$A62 '6GtY *NN5)* '$$&''
   !1!1 4  N* *' '' 's<   CB7.
C8C	C7C 	<CC	CCTr=  Fr>  r?  r@  s   `  r   test_if_else_likelyz#TestBuilderMisc.test_if_else_likely  sP    	& +GNN - 	 ,GNN - 	r   c                 T   | j                         }t        j                         }t        j                  t        d      }|j                  d      }|j                  d      }|j                  d      }|j                  |       |j                  ||d       |j                  |       |j                  ||d       |j                  ||d       |j                  |       |j                  ||d	      }|j                  ||d
       |j                  |       |j                  ||d      }|j                  |       |j                  ||d       |j                  |       |j                  ||d       | j                  |d       | j                  |d       | j                  |d       y)zI
        Test IRBuilder.position_{before,after,at_start,at_end}.
        r   r-  r  twothreera  r  r  r  r  rb  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)rH   r   r   r)  rB   rJ   position_at_startr   r  position_afterposition_beforera   )	r   rK   r   r  bb_onebb_twobb_threer  rb  s	            r   test_positioningz TestBuilderMisc.test_positioning%  s~    }},,.KKq!((e(4((e(4***8!!&)Aq#'Aq#Aq#!!&)KK1c"Aq#'KK1c"q!Aq#"Aq# " 	 	 " 	 	 $ 	r   c                    | j                         }t        j                         }|j                  d      }|j	                  |       t        j
                  t        d      }|j                  ||d      }|j                         }| j                  |j                         |j                  |       | j                  |j                         |j                  ||d      }|j                  ||d      }|j                  |       |j                          | j                  |j                         | j                  |d       y )Nentryr  i  ra  rb  r   z            entry:
                %"a" = add i32 1234, 1234
                %"b" = mul i32 %"a", %"a"
                ret void
        )rH   r   r   rJ   r  r)  rB   r   r   r  r|  remover{  r  ra   )	r   rK   r   blkr  ra  retvoidrb  r   s	            r   test_instruction_removalz(TestBuilderMisc.test_instruction_removalU  s    }},,.%%7%3$KKt$KK1c"""$))*w**+KK1c"KK1c"q))*  	r   c                 
   | j                  d      }t        j                  |      }|j                  j	                  g       |_        |j                  t        j                  t              d       | j                  |d       y )Nr   r  r   zN            my_block:
                %"c" = alloca i32*, !dbg !0
            )
rL   r   r   r?   r   debug_metadatar  rD   rB   ra   r  s      r   test_metadatazTestBuilderMisc.test_metadatal  se    



+,,u%!(!<!<R!@r~~e,37 ! 	r   N)rt   ru   rv   rw   r~  r+  r0  r2  r8  rA  rE  rH  rR  rX  r[  rx   r   r   r$  r$  Q  sA    9:<6M6*"H:.`.r   r$  c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)	TestTypesc                     t        |t        j                        r'|j                  }t        |t        j                        r't        |t        j                         S r"   )
isinstancer   rD   r  	LabelType)r   tys     r   has_logical_equalityzTestTypes.has_logical_equalityy  s=    R^^,B R^^,b",,///r   c                    t        j                         }t        j                         t        j                         t        j                  t
        t        t        f      t        j                  t
        t        f      t        j                  t
        t        fd      t        j                  t        t        f      t
        t        t        t        t        t        j                  t        d      t        j                  t        d      t        j                  t        d      t        j                  t
        t        f      t        j                  t        t
        f      |j                  d      |j                  d      g}||D cg c]A  }t        |t         j                  t         j                  f      st        j                  |      C c}z  }|S c c}w )z3
        A bunch of mutually unequal types
        Tr   r   r   MyType1MyType2)r   Contextr`  rA  rA   r  r   rB   r$  rC   r  r  get_identified_typer_  rD   )r   contextr   tps       r   assorted_typeszTestTypes.assorted_types~  s5   
 **,LLNBKKMOOD4,/w1OOOD4'48OOD4'*$sCLLa ",,sA"6S!8L  $.0D0DdFJFL 1M''	2''	2
 	u F#Bbll(CD ..$ F 	F Fs   AGc                     | j                         }|D ]7  }| j                  |      }| j                  |      s&| j                  ||       9 y r"   )rj  r;   rb  r8   )r   r   ra  newtys       r   r   zTestTypes.test_pickling  sM    ##% 	,B004E((,  +	,r   c                    | j                         }t        j                  ||      D ]8  \  }}||us| j                  ||k(  ||f       | j	                  ||k7  ||f       : |D ]  }t        j
                  |      }| j                  |      r/| j	                  ||k(  ||f       | j                  ||k7  ||f       X| j                  ||k(  ||f       | j	                  ||k7  ||f        y r"   )rj  	itertoolsproductr{  r  copyrb  )r   r   ra  rb  ri  r  s         r   test_comparisonszTestTypes.test_comparisons  s    ##%%%eU3 	0DAqz  a!Q0QA/	0
  	:BIIbME((,eb%[9  ur5k:  ur5k:eb%[9	:r   c                 8
   | j                  t        t              d       | j                  t        t        j                  d            d       | j                  t        t
              d       | j                  t        t              d       | j                  t        t        j                               d       | j                  t        t        j                  t        d            d       | j                  t        t        j                  t        t
        f            d	       | j                  t        t        j                  t        t
        t        f            d
       | j                  t        t        j                  t        dd            d       | j                  t        t        j                  t        t
        fd            d       | j                  t        t        j                  t        t
        t        fd            d       | j                  t        t        j                  t                    d       | j                  t        t        j                  t        j                  t                          d       | j                  t        t        j                  t        d            d       | j                  t        t        j                  t        j                  t              d            d       | j                  t        t        j                  t        j                  t        d                  d       | j                  t        t        j                  t        f            d       | j                  t        t        j                  t        t
        f            d       | j                  t        t        j                  t        j                  t              t        j                  t        t        f      f            d       | j                  t        t        j                  t        fd            d       | j                  t        t        j                  t        t
        fd            d       t        j                         }|j                  d      }| j                  t        |      d       |j                  d      }| j                  t        |      d       |j                  d       }| j                  t        |      d!       y")#z:
        Test the string representation of types.
        i1   i29r  doublevoidrx   zi1 ()z
i1 (float)zi1 (float, double)Tr   zi1 (...)zi1 (float, ...)zi1 (float, double, ...)zi32*zi32**r   z[5 x i1]z	[5 x i1*]z	[5 x i1]*z{i1}z{i1, float}z{i1*, {i32, i8}})packedz<{i1}>z<{i1, float}>MyTypez	%"MyType"zMyType\z%"MyType\5c"zMyType"z%"MyType\22"N)r8   r#   r  r   r+  r$  rC   rA  rA   rD   rB   r  r  r   rf  rg  )r   rh  mytypemytype1mytype2s        r   test_strzTestTypes.test_str  sp    	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R^^E23V<R^^BNN5,ABCWMR\\$23Z@R\\"..*>BC$	&R^^BLLq,ABC$	&R114':;VDR114+>?OR11NN4 ""6"6t}"E3G H I	  	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           	          t        | j                  | j                               D ]9  }| j                  t	        |      t	        t        j
                  |                   ; y r"   )filterrb  rj  r8   hashrp  )r   typs     r   	test_hashzTestTypes.test_hash  sH    $33T5H5H5JK 	>CT#YTYYs^(<=	>r   c                      fd} fd}t        j                  t              }t        d      D ]  } |||t                 ||       t        j                  t
        d      }t        d      D ]  } |||t
                 ||       t        j                  t        t        j                  t
        t        f      f      } ||dt                ||dt        j                  t
        t        f              j                  t              5  |j                  t        j                  t        d             d d d         ||       t        j                         }t        j                  |d      }|j                  t        t        j                  t
        t        f              ||dt                ||dt        j                  t
        t        f              j                  t              5  |j                  t        j                  t        d             d d d         ||       y # 1 sw Y   xY w# 1 sw Y   xY w)	Nc                 |    | j                  t        j                  t        |            }j	                  ||       y r"   )r  r   r)  rB   r8   )ri  rl  rZ   rg   r   s       r   check_constantz*TestTypes.test_gep.<locals>.check_constant  s,    VVBKKq12FVX.r   c                     t        j                  t        d      }j                  t              5  | j                  |       d d d        y # 1 sw Y   y xY w)Ng      ?)r   r)  rC   r   r  r  )ri  r
  r   s     r   check_index_typez,TestTypes.test_gep.<locals>.check_index_type  sA    KKS)E""9- u  s   AAr   r   r   r   rn   ry  )r   rD   rC   ranger  r  r  r   r   
IndexErrorr  r)  rB   rf  IdentifiedStructTypeset_body)r   r  r  ri  rl  rh  s   `     r   r  zTestTypes.test_gep  s   	/	
 ^^C q 	'A2q#&	'\\$"q 	(A2q$'	(!!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   *H).*H5)H25H>c                 f    t        j                  d       fd} |t        d        |t        d        |t        d        |t        j                  t        d      d        |t        j                  t        d      d        |t        j                  t        t        t        f      d       y )	N%e-m:e-i64:64-f80:128-n8:16:32:64-S128c                 H    j                  | j                        |       y r"   )r8   get_abi_sizeri  rZ   r   tds     r   rO  z&TestTypes.test_abi_size.<locals>.check	  s    R__R0(;r   r   r   r   r      r   
r,   create_target_datar   rB   r   r   r  r  rC   r$  r   rO  r  s   ` @r   test_abi_sizezTestTypes.test_abi_size	  sy    $$%LM	<dAeQeQbll4#Q'bll5!$b)b""Cc?3R8r   c                 f    t        j                  d       fd} |t        d        |t        d        |t        d        |t        j                  t        d      d        |t        j                  t        d      d        |t        j                  t        t        t        f      d       y )Nr  c                 H    j                  | j                        |       y r"   )r&   get_abi_alignmentr  s     r   rO  z+TestTypes.test_abi_alignment.<locals>.check	  s    MM"..r2H=r   )r   rn   r   )r   )r   r   r  r  s   ` @r   test_abi_alignmentzTestTypes.test_abi_alignment	  s|    $$%LM	>dIeTeTbll4#Y/bll5!$d+b""Cc?3T:r   c                    t        j                         }|j                  d      }t        j                  |      }| j	                  |j
                         | j                  |       t        |      }|j                  t        j                  d      t        j                  d      t        j                                | j                  |j
                         | j                  |       | j                  |t        |             y )Nry  rh  r	   r
   )r   rf  rg  r=   r  	is_opaquer/   r#   r  r+  r(  r{  assertNotEqual)r   rh  rz  r?   oldstrs        r   test_identified_structz TestTypes.test_identified_struct	  s    **,,,X67+(()V$V

2

2G))*V$FCK0r   c                     t        j                         }|j                  d      }t        j                  d      g|_        t        j                  d      }| j                  |j                  ||      d       y )Nry  r	   r  r  r   )	r   rf  rg  r+  elementsr,   r  r8   r  )r   rh  rz  r  s       r   $test_target_data_non_default_contextz.TestTypes.test_target_data_non_default_context%	  s`    **,,,X6::b>*$$%LM,,R,A1Er   c                     t        j                  t        j                  d      d      }| j                  t	        |      d       y )Nr	   r   z	<8 x i32>)r   r  r+  r8   r#   )r   r  s     r   test_vectorzTestTypes.test_vector,	  s.    bjjna0U[1r   N)rt   ru   rv   rb  rj  r   rq  r}  r  r  r  r  r  r  r  rx   r   r   r]  r]  w  sA    0
.,: +:Z>"H
9
;
1F2r   r]  c                 6    t        j                  t        |       S r"   )r   r)  rB   )rl  s    r   c32r  1	  s    ;;ua  r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z y) TestConstantc                    t        j                  t        d      }| j                  t	        |      d       t        j                  t
        d      }| j                  t	        |      d       t        j                  t
        d      }| j                  t	        |      d       t        j                  t
        d      }| j                  t	        |      d       t        j                  t
        d	      }| j                  t	        |      d
       t        j                  t
        t         j                        }| j                  t	        |      d       t        j                  t
        d       }| j                  t	        |      d       y )Nr   zi32 42r   zi1 1r   zi1 0Ti1 trueFzi1 falsezi1 undef)r   r)  rB   r8   r#   r  r  r   r   s     r   test_integerszTestConstant.test_integers7	  s   KKr"Q*KKa Q(KKa Q(KKd#Q+KKe$Q,KKbll+Q,KKd#Q(r   c                    t        j                  t        d      }| j                  t	        |      d       t        j                  t        d      }| j                  t	        |      d       t        j                  t
        d      }| j                  t	        |      d       t        j                  t
        d      }| j                  t	        |      d       t        j                  t
        t         j                        }| j                  t	        |      d       t        j                  t
        d       }| j                  t	        |      d       y )	N      ?zfloat 0x3ff8000000000000g      zfloat 0xbff8000000000000zdouble 0x3ff8000000000000zdouble 0xbff8000000000000zdouble undefz
double 0.0)r   r)  r$  r8   r#   rC   r  r  s     r   
test_realszTestConstant.test_realsG	  s    KKS!Q!;<KKT"Q!;<KKS!Q!<=KKT"Q!<=KKR\\*Q0KKT"Q.r   c                    t        j                  t        j                  t        d      t	        d      t	        d      t	        d      f      }| j                  t        |      d       t        j                  t        j                  t        d      t	        d      t	        t         j                        f      }| j                  t        |      d       t         j                  j                  t	        d      t	        d      t	        t         j                        f      }| j                  t        |      d       | j                  t              5 }t         j                  j                  t	        d      t        j                  t        d	      f       d d d        | j                  t        j                        d
       t        j                  t        j                  t        d      t         j                        }| j                  t        |      d       t        j                  t        j                  t        d      d       }| j                  t        |      d       t        j                  t        j                  t        d      t        d            }| j                  t        |      d       t        j                  t        j                  t        d      t        d            }| j                  t        |      d       t        j                  t        j                  t        d      dt         j                  df      }| j                  t        |      d       | j                  t              5  t        j                  t        j                  t        d      d       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   rQ  r   z[3 x i32] [i32 5, i32 6, i32 4]rn   z[2 x i32] [i32 5, i32 undef]z#[3 x i32] [i32 5, i32 6, i32 undef]r  z$all elements must have the same typez[2 x i32] undefz[2 x i32] zeroinitializerr  s   foobar_123z[11 x i8] c"foobar_123\80"s    z[4 x i8] c"\00\01\04\ff"z#[3 x i32] [i32 5, i32 undef, i32 6])r   rQ  )r   r)  r  rB   r  r8   r#   r  literal_arrayr   r  r$  r  r   	bytearrayr   )r   r   r  s      r   test_arrayszTestConstant.test_arraysV	  s   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) 	GVKK%%s1vr{{3/D&EF	G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* 	8KKUA.7	8 	8%	G 	G$	8 	8s   AN)1/N6)N36N?c                 (   t        j                  t        j                  d      d      }g d}t        j                  ||      }dj	                  dj                  t        dj                  |                  }| j                  t        |      |       y )Nr	   r   )r   rn   r   r   r   rQ  	      z<8 x i32> <{}>z, zi32 {})	r   r  r+  r)  r   r   r   r8   r#   )r   r  valsr  vec_reprs        r   r  zTestConstant.test_vectors	  sj    bjjna0'kk%&#**IIc(//4013S8,r   c                     t        j                  t        j                  d      d       j                  }| j	                  |d       y )Nr	   r   )r   r)  r+  constantr8   )r   r  s     r   test_non_nullable_intz"TestConstant.test_non_nullable_int{	  s0    ;;rzz"~t4==1%r   c                 j   t        j                  t        t        f      }t        j                  t        |f      }t        j
                  |t        j
                  t        j                         d      t        j
                  t        d      f      }| j                  t        |      d       t         j
                  j                  t        j
                  t        j                         d      t        j
                  t        d      f      }| j                  |j                  |       | j                  t        |      d       t         j
                  j                  t        j
                  t        j                         d      t        j
                  t        t         j                        f      }| j                  |j                  |       | j                  t        |      d       t        j
                  |t         j                        }| j                  t        |      d       t        j
                  |d       }| j                  t        |      d       t        j
                  |d      }| j                  t        |      d       t        j
                  |d|f      }| j                  t        |      d	       t        j
                  |d
      }| j                  t        |      t        |             | j                  t              5  t        j
                  |d       d d d        y # 1 sw Y   y xY w)Nr  T/{float, i1} {float 0x3ff8000000000000, i1 true}z0{float, i1} {float 0x3ff8000000000000, i1 undef}z{float, i1} undefz{float, i1} zeroinitializerr  Tr   L{i32, {float, i1}} {i32 42, {float, i1} {float 0x3ff8000000000000, i1 true}}r   r  r   r   rQ  )r   r  r$  r  rB   r)  r(  r8   r#   literal_structr  r  r   r   )r   st1st2r   c1c2c3s          r   test_structszTestConstant.test_structs	  sK   ""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))L2c                     t        j                  d      }t        j                  t        j                  ||g      t         j                        }| j                  |       y )Nr   )r   r+  r)  r  r  r;   )r   i8sts      r   &test_undefined_literal_struct_picklingz3TestConstant.test_undefined_literal_struct_pickling	  s@    ZZ][[--r2h7F$$R(r   c                    t        d      }| j                  |t        j                         | j	                  t        |      d       t        d      }| j                  |t        j                         | j	                  t        |      d       t        j                  t        d      } |t        d      t        d      t        d      g      }| j	                  t        |      d	        |g d
      }| j	                  t        |      d	        |d      }| j	                  t        |      d       | j                  t              5   |g d       ddd       t        j                  t        t        f      }t        j                  t        |f      } |d      }| j	                  t        |      d        |d      }| j	                  t        |      d       y# 1 sw Y   xY w)z@
        Instantiating a type should create a constant.
        r   zi8 42Tr  r   r   r   rQ  z[3 x i32] [i32 4, i32 5, i32 6]r  Nz[3 x i32] zeroinitializer)r   r   rQ  r  r  r  r  r  )r   r&  r   r)  r8   r#   r  r  rB   r  r   r   r  r$  )r   r   atr  r  s        r   test_type_instantiatonz#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    t        d      }| j                  t        |      d       y)z8
        Constants should have a useful repr().
        r   z!<ir.Constant type='i32' value=42>N)rB   r8   rX  r  s     r   r  zTestConstant.test_repr	  s"     "Ia"EFr   c                    t        j                  t        j                  t        j                  d      d      t	        t        d                  }| j                         }t        j                  ||j                  d      }d|_	        ||_
        t        j                  t        |            }t        j                  t        |            }| j                  t        |      t        |             y )Nr      
myconstantT)r   r)  r  r+  r  r  r?   r'  r  rn  r*  r,   r-   r#   r8   )r   r   r  gvparsedreparseds         r   test_encoding_problemz"TestConstant.test_encoding_problem	  s    KKRZZ]C8!%*-/KKMq!&&,7! $$SV,&&s6{3Vc(m4r   c           	         | j                         }t        j                  t        t        f      }t        j
                  ||d      }|j                  dD cg c]  }t        j                  t        |       c}      }| j                  t        |      d       | j                  |j                  t        j                  t                     t        j                  |d       }| j                  t              5  |j                  t        j                  t        d      g       d d d        t        j                  |j                         d       }|j                  t        j                  t        d      g      }| j                  t        |      d       | j                  |j                  t        j                  t                     y c c}w # 1 sw Y   xY w)Nr  r   r   zEgetelementptr ({float, i1}, {float, i1}* @"myconstant", i32 0, i32 1)r   z5getelementptr ({float, i1}, {float, i1}* null, i32 0))r?   r   r  r$  r  r'  r  r)  rB   r8   r#   r  rD   r   r  r   )	r   r  ri  r  r7  r   const	const_ptrr  s	            r   r  zTestConstant.test_gep	  sI   KKM!!3+.q"l3FF6:aBKKq):;Q`	b!56B%y) 	/IIr{{5!,-.	/ KK6	]]BKKq123RP	R!56 ;	/ 	/s   !G7+GGc           	      4   | j                         }t        j                  t        t        f      }d}t        j
                  ||d|      }| j                  |j                  |       |j                  dD cg c]  }t        j                  t        |       c}      }| j                  |j                  j                  |       | j                  t        |      d       | j                  |j                  t        j                  t        |             y c c}w )Nr   r  rc  r  zRgetelementptr ({float, i1}, {float, i1} addrspace(4)* @"myconstant", i32 0, i32 1))r?   r   r  r$  r  r'  r8   rd  r  r)  rB   r  r#   rD   )r   r  ri  rd  r  r7  r   s          r   test_gep_addrspace_globalvarz)TestConstant.test_gep_addrspace_globalvar	  s    KKM!!3+.	q"liHy1FF6:aBKKq):;))95QG	I 		!JK ;s   6!Dc                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   ztrunc (i64 1 to i32))r   r)  r   r   rB   r8   r#   r  s     r   
test_trunczTestConstant.test_trunc	  s2    KKq!''.Q!78r   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   zzext (i32 1 to i64))r   r)  rB   r!  r   r8   r#   r  s     r   	test_zextzTestConstant.test_zext	  s2    KKq!&&u-Q!67r   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr1   zsext (i32 -1 to i64))r   r)  rB   r"  r   r8   r#   r  s     r   	test_sextzTestConstant.test_sext
  s2    KKr"''.Q!78r   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   z*fptrunc (float 0x3ff0000000000000 to half))r   r)  r$  r#  rr  r8   r#   r  s     r   test_fptrunczTestConstant.test_fptrunc
  s2    KKQ'',Q!MNr   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   z*fpext (float 0x3ff0000000000000 to double))r   r)  r$  r%  rC   r8   r#   r  s     r   
test_fpextzTestConstant.test_fpext
  s2    KKQ%%c*Q!MNr   c                     | j                         }t        j                  |t        d      }|j	                  t
        j                               }| j                  t        |      d       y )Nr  z$bitcast (i32* @"myconstant" to i64*))	r?   r   r'  rB   r	  r   r   r8   r#   )r   r  r  r   s       r   test_bitcastzTestConstant.test_bitcast
  sM    KKMq%6JJu'')*Q!GHr   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   z(fptoui (float 0x3ff0000000000000 to i32))r   r)  r$  r&  rB   r8   r#   r  s     r   test_fptouizTestConstant.test_fptoui
  2    KKQ&&u-Q!KLr   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   zuitofp (i32 1 to float))r   r)  rB   r(  r$  r8   r#   r  s     r   test_uitofpzTestConstant.test_uitofp
  2    KKq!((-Q!:;r   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   z(fptosi (float 0x3ff0000000000000 to i32))r   r)  r$  r'  rB   r8   r#   r  s     r   test_fptosizTestConstant.test_fptosi
  r  r   c                     t        j                  t        d      j                  t              }| j                  t        |      d       y )Nr   zsitofp (i32 1 to float))r   r)  rB   r)  r$  r8   r#   r  s     r   test_sitofpzTestConstant.test_sitofp!
  r  r   c                 |   t        j                  t        j                         d       }t        j                  t        d      }|j                  t              }| j                  t        |j
                  t               | j                  t        |j
                  t               | j                  t        |      d       y )Nr   zptrtoint (i64* null to i32))r   r)  r   r   rB   r*  r   r  r$  r8   r#   )r   r  r-  r   s       r   test_ptrtoint_1zTestConstant.test_ptrtoint_1%
  sz    kk%**,d3kk%#LL)S\\59)S\\37Q!>?r   c                    | j                         }t        j                  |t        d      }|j	                  t
              }| j                  t        |      d       | j                  t        d|j                  t
        j                                t        j                  t        d      }| j                  t        d|j                  t
               y )Nr  z$ptrtoint (i32* @"myconstant" to i64)z2can only ptrtoint\(\) to integer type, not 'i64\*'r   z5can only call ptrtoint\(\) on pointer type, not 'i32')r?   r   r'  rB   r*  r   r8   r#   r   r  r   r)  )r   r  r  r   r  s        r   test_ptrtoint_2zTestConstant.test_ptrtoint_2.
  s    KKMq%6KKQ!GHAKK		  [["DKK		r   c                    t        j                  t        d      }t        j                  t        d      }|j	                  t
        j                               }| j                  t        |j                  t
               | j                  t        |j                  t
        j                                | j                  t        |      d       y )Nr   gQ	@zinttoptr (i32 1 to i64*))r   r)  rB   r$  r+  r   r   r   r  r8   r#   )r   r-  pir   s       r   test_inttoptrzTestConstant.test_inttoptrA
  s    kk%#[[d#LL))+,)S\\59)R[[%2B2B2DEQ!;<r   c                     t        j                  t        d      }| j                  t	        |j                               d       y )Nr   zsub (i32 0, i32 1))r   r)  rB   r8   r#   r  r   r-  s     r   test_negzTestConstant.test_negJ
  s-    kk%#SWWY)=>r   c                     t        j                  t        d      }| j                  t	        |j                               d       y )Nr   zxor (i32 1, i32 -1))r   r)  rB   r8   r#   r  r  s     r   test_notzTestConstant.test_notN
  s-    kk%#SXXZ*?@r   c                     t        j                  t        d      }| j                  t	        |j                               d       y )Nr   zfneg (float 0x3ff0000000000000))r   r)  r$  r8   r#   r  r  s     r   	test_fnegzTestConstant.test_fnegR
  s-    kk#q!SXXZ*KLr   c                 x   t        j                  t        d      }t        j                  t        d      }|j                  d|j                  d|j
                  d|j                  d|j                  d|j                  d|j                  d	|j                  d
|j                  d|j                  d|j                  d|j                  d|j                  di}|j!                         D ])  \  }}| j#                  t%         ||            |dz          + ddddddd}|j!                         D ]:  \  }}t%        |j'                  ||            }d|z   dz   }	| j#                  ||	       < ddddddd}|j!                         D ]:  \  }}t%        |j)                  ||            }d|z   dz   }	| j#                  ||	       < y )Nr   rn   r  r  r  r   r   r  r  r  r  r  orandr  z (i32 1, i32 2)eqneugtugeultuler  r  r  r  r  r  zicmp sgtsgesltsle)r   r)  rB   r  r  r  r   r   r  r  r  r  r  r  r  r  itemsr8   r#   r  r  )
r   r-  rJ  oracler   iropcopr  rg   rZ   s
             r   test_int_binopszTestConstant.test_int_binopsV
  s   kk%#kk%#''ECHHfchh''ECGGecgg((FCHHfchh((FCGGdchh''E	#
  	EHBSC\42C+CD	E Du5? 	/IC**345F~(99HVX.	/ DEUD 	/ICc23F~(99HVX.	/r   c           
         t        j                  t        d      }t        j                  t        d      }|j                  d|j                  d|j
                  d|j                  d|j                  di}|j                         D ]-  \  }}t         ||            }|dz   }| j                  ||       / d	d
ddddd}|j                         D ]:  \  }}	t        |j                  ||            }d|	z   dz   }| j                  ||       < ddddddd}|j                         D ]:  \  }}	t        |j                  ||            }d|	z   dz   }| j                  ||       < y )Nr   rn   r  r  r  r  r  z5 (float 0x3ff0000000000000, float 0x4000000000000000)oeqr-  ogtoger  oler  zfcmp uequner  r	  r
  r  )r   r)  r$  r  r  r  r  r  r  r#   r8   r  r  )
r   r-  rJ  r  r   r  rg   rZ   r  r  s
             r   test_flt_binopszTestConstant.test_flt_binopsr
  sp   kk#q!kk#q!((FCHHfchh((FCHHf6 	/HBC\F  < =HVX.		/ UeE+ 	/IC))#s34F~ *F GHVX.		/ UeE+ 	/IC++C56F~ *F GHVX.		/r   N)!rt   ru   rv   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  rx   r   r   r  r  5	  s    ) /8:-& (D)
K<G57&L989OOIM<M<@&=?AM/8/r   r  c                       e Zd Zd Zy)TestTransformsc                    t        j                         }t        j                  |t        j                  t        j                         d      d      }t        j                  |t        j                  t        j                         d      d      }t        j
                         }|j                  |j                                |j                  |d      }| j                  |j                  |       t        j                  |||      }| j                  ||       | j                  |j                  |       | j                  |j                  |       y )Nrx   r   r   )r   r=   rE   rA   rA  r   r  rJ   rC  r8   calleereplace_all_callsr&   r  )r   r(   r   r   r   rC  modifieds          r   test_call_transformz"TestTransforms.test_call_transform
  s    iikkk#rr{{}bA5Ikk#rr{{}bA5I,,. 6 6 89||C$c*''S#6dH%DKK-c*r   N)rt   ru   rv   r$  rx   r   r   r  r  
  s    +r   r  c                       e Zd Zd Zy)TestSingletonc                    | j                  t        j                  t        j                  j	                                | j                  t        j                  t        j
                  t        j                               | j                  t        j                  t        j                  t        j                               | j                  t        j                         y r"   )r6   r   r  values
_Undefinedrp  deepcopyr;   r>   s    r   test_undefinedzTestSingleton.test_undefined
  sq    bllBII$8$8$:;bllDIIbll$;<bllDMM",,$?@$$R\\2r   N)rt   ru   rv   r+  rx   r   r   r&  r&  
  s    3r   r&  __main__)'rw   rp  rn  r3   r   rS   unittestr   r   llvmliter   r   r,   r+  r  r   r  rB   r   HalfTyperr  r(  r$  rV  rC   r   rz   r   rR  ru  r  r$  r]  r  r  r  r&  rt   mainrx   r   r   <module>r1     sY      	     $ rzz!}rzz!}

2

2

2bkkmbllnbmmo[;x [;|r08 r0jU"X U"pI*x I*X*L *LZN5H N5d$ch cL	w2 w2t!Y/8 Y/x
+X +3H 3 zHMMO r   