@@ -1325,6 +1325,8 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
13251325 } ;
13261326 }
13271327
1328+ let llvm_version = crate :: llvm_util:: get_version ( ) ;
1329+
13281330 /// Converts a vector mask, where each element has a bit width equal to the data elements it is used with,
13291331 /// down to an i1 based mask that can be used by llvm intrinsics.
13301332 ///
@@ -1808,7 +1810,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
18081810 ) ;
18091811
18101812 // Alignment of T, must be a constant integer value:
1811- let alignment = bx. const_i32 ( bx . align_of ( in_elem) . bytes ( ) as i32 ) ;
1813+ let alignment = bx. align_of ( in_elem) . bytes ( ) ;
18121814
18131815 // Truncate the mask vector to a vector of i1s:
18141816 let mask = vector_mask_to_bitmask ( bx, args[ 2 ] . immediate ( ) , mask_elem_bitwidth, in_len) ;
@@ -1819,11 +1821,23 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
18191821 // Type of the vector of elements:
18201822 let llvm_elem_vec_ty = llvm_vector_ty ( bx, element_ty0, in_len) ;
18211823
1822- return Ok ( bx. call_intrinsic (
1823- "llvm.masked.gather" ,
1824- & [ llvm_elem_vec_ty, llvm_pointer_vec_ty] ,
1825- & [ args[ 1 ] . immediate ( ) , alignment, mask, args[ 0 ] . immediate ( ) ] ,
1826- ) ) ;
1824+ let args: & [ & ' ll Value ] = if llvm_version < ( 22 , 0 , 0 ) {
1825+ let alignment = bx. const_i32 ( alignment as i32 ) ;
1826+ & [ args[ 1 ] . immediate ( ) , alignment, mask, args[ 0 ] . immediate ( ) ]
1827+ } else {
1828+ & [ args[ 1 ] . immediate ( ) , mask, args[ 0 ] . immediate ( ) ]
1829+ } ;
1830+
1831+ let call =
1832+ bx. call_intrinsic ( "llvm.masked.gather" , & [ llvm_elem_vec_ty, llvm_pointer_vec_ty] , args) ;
1833+ if llvm_version >= ( 22 , 0 , 0 ) {
1834+ crate :: attributes:: apply_to_callsite (
1835+ call,
1836+ crate :: llvm:: AttributePlace :: Argument ( 0 ) ,
1837+ & [ crate :: llvm:: CreateAlignmentAttr ( bx. llcx , alignment) ] ,
1838+ )
1839+ }
1840+ return Ok ( call) ;
18271841 }
18281842
18291843 if name == sym:: simd_masked_load {
@@ -1891,18 +1905,30 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
18911905 let mask = vector_mask_to_bitmask ( bx, args[ 0 ] . immediate ( ) , m_elem_bitwidth, mask_len) ;
18921906
18931907 // Alignment of T, must be a constant integer value:
1894- let alignment = bx. const_i32 ( bx . align_of ( values_elem) . bytes ( ) as i32 ) ;
1908+ let alignment = bx. align_of ( values_elem) . bytes ( ) ;
18951909
18961910 let llvm_pointer = bx. type_ptr ( ) ;
18971911
18981912 // Type of the vector of elements:
18991913 let llvm_elem_vec_ty = llvm_vector_ty ( bx, values_elem, values_len) ;
19001914
1901- return Ok ( bx. call_intrinsic (
1902- "llvm.masked.load" ,
1903- & [ llvm_elem_vec_ty, llvm_pointer] ,
1904- & [ args[ 1 ] . immediate ( ) , alignment, mask, args[ 2 ] . immediate ( ) ] ,
1905- ) ) ;
1915+ let args: & [ & ' ll Value ] = if llvm_version < ( 22 , 0 , 0 ) {
1916+ let alignment = bx. const_i32 ( alignment as i32 ) ;
1917+
1918+ & [ args[ 1 ] . immediate ( ) , alignment, mask, args[ 2 ] . immediate ( ) ]
1919+ } else {
1920+ & [ args[ 1 ] . immediate ( ) , mask, args[ 2 ] . immediate ( ) ]
1921+ } ;
1922+
1923+ let call = bx. call_intrinsic ( "llvm.masked.load" , & [ llvm_elem_vec_ty, llvm_pointer] , args) ;
1924+ if llvm_version >= ( 22 , 0 , 0 ) {
1925+ crate :: attributes:: apply_to_callsite (
1926+ call,
1927+ crate :: llvm:: AttributePlace :: Argument ( 0 ) ,
1928+ & [ crate :: llvm:: CreateAlignmentAttr ( bx. llcx , alignment) ] ,
1929+ )
1930+ }
1931+ return Ok ( call) ;
19061932 }
19071933
19081934 if name == sym:: simd_masked_store {
@@ -1964,18 +1990,29 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
19641990 let mask = vector_mask_to_bitmask ( bx, args[ 0 ] . immediate ( ) , m_elem_bitwidth, mask_len) ;
19651991
19661992 // Alignment of T, must be a constant integer value:
1967- let alignment = bx. const_i32 ( bx . align_of ( values_elem) . bytes ( ) as i32 ) ;
1993+ let alignment = bx. align_of ( values_elem) . bytes ( ) ;
19681994
19691995 let llvm_pointer = bx. type_ptr ( ) ;
19701996
19711997 // Type of the vector of elements:
19721998 let llvm_elem_vec_ty = llvm_vector_ty ( bx, values_elem, values_len) ;
19731999
1974- return Ok ( bx. call_intrinsic (
1975- "llvm.masked.store" ,
1976- & [ llvm_elem_vec_ty, llvm_pointer] ,
1977- & [ args[ 2 ] . immediate ( ) , args[ 1 ] . immediate ( ) , alignment, mask] ,
1978- ) ) ;
2000+ let args: & [ & ' ll Value ] = if llvm_version < ( 22 , 0 , 0 ) {
2001+ let alignment = bx. const_i32 ( alignment as i32 ) ;
2002+ & [ args[ 2 ] . immediate ( ) , args[ 1 ] . immediate ( ) , alignment, mask]
2003+ } else {
2004+ & [ args[ 2 ] . immediate ( ) , args[ 1 ] . immediate ( ) , mask]
2005+ } ;
2006+
2007+ let call = bx. call_intrinsic ( "llvm.masked.store" , & [ llvm_elem_vec_ty, llvm_pointer] , args) ;
2008+ if llvm_version >= ( 22 , 0 , 0 ) {
2009+ crate :: attributes:: apply_to_callsite (
2010+ call,
2011+ crate :: llvm:: AttributePlace :: Argument ( 1 ) ,
2012+ & [ crate :: llvm:: CreateAlignmentAttr ( bx. llcx , alignment) ] ,
2013+ )
2014+ }
2015+ return Ok ( call) ;
19792016 }
19802017
19812018 if name == sym:: simd_scatter {
@@ -2040,7 +2077,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20402077 ) ;
20412078
20422079 // Alignment of T, must be a constant integer value:
2043- let alignment = bx. const_i32 ( bx . align_of ( in_elem) . bytes ( ) as i32 ) ;
2080+ let alignment = bx. align_of ( in_elem) . bytes ( ) ;
20442081
20452082 // Truncate the mask vector to a vector of i1s:
20462083 let mask = vector_mask_to_bitmask ( bx, args[ 2 ] . immediate ( ) , mask_elem_bitwidth, in_len) ;
@@ -2050,12 +2087,25 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20502087
20512088 // Type of the vector of elements:
20522089 let llvm_elem_vec_ty = llvm_vector_ty ( bx, element_ty0, in_len) ;
2053-
2054- return Ok ( bx. call_intrinsic (
2090+ let args: & [ & ' ll Value ] = if llvm_version < ( 22 , 0 , 0 ) {
2091+ let alignment = bx. const_i32 ( alignment as i32 ) ;
2092+ & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , alignment, mask]
2093+ } else {
2094+ & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , mask]
2095+ } ;
2096+ let call = bx. call_intrinsic (
20552097 "llvm.masked.scatter" ,
20562098 & [ llvm_elem_vec_ty, llvm_pointer_vec_ty] ,
2057- & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , alignment, mask] ,
2058- ) ) ;
2099+ args,
2100+ ) ;
2101+ if llvm_version >= ( 22 , 0 , 0 ) {
2102+ crate :: attributes:: apply_to_callsite (
2103+ call,
2104+ crate :: llvm:: AttributePlace :: Argument ( 1 ) ,
2105+ & [ crate :: llvm:: CreateAlignmentAttr ( bx. llcx , alignment) ] ,
2106+ )
2107+ }
2108+ return Ok ( call) ;
20592109 }
20602110
20612111 macro_rules! arith_red {
0 commit comments