@@ -20,7 +20,7 @@ use rustc_middle::ty::{self, Ty};
2020use rustc_middle:: { bug, span_bug} ;
2121use rustc_span:: { sym, symbol:: kw, Span , Symbol } ;
2222use rustc_target:: abi:: { self , HasDataLayout , Primitive } ;
23- use rustc_target:: spec:: PanicStrategy ;
23+ use rustc_target:: spec:: { HasTargetSpec , PanicStrategy } ;
2424
2525use std:: cmp:: Ordering ;
2626use std:: iter;
@@ -1190,11 +1190,28 @@ fn generic_simd_intrinsic(
11901190 // FIXME: use:
11911191 // https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Function.h#L182
11921192 // https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Intrinsics.h#L81
1193- fn llvm_vector_str ( elem_ty : Ty < ' _ > , vec_len : u64 , no_pointers : usize ) -> String {
1193+ fn llvm_vector_str (
1194+ elem_ty : Ty < ' _ > ,
1195+ vec_len : u64 ,
1196+ no_pointers : usize ,
1197+ bx : & Builder < ' a , ' ll , ' tcx > ,
1198+ ) -> String {
11941199 let p0s: String = "p0" . repeat ( no_pointers) ;
11951200 match * elem_ty. kind ( ) {
1196- ty:: Int ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1197- ty:: Uint ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1201+ ty:: Int ( v) => format ! (
1202+ "v{}{}i{}" ,
1203+ vec_len,
1204+ p0s,
1205+ // Normalize to prevent crash if v: IntTy::Isize
1206+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1207+ ) ,
1208+ ty:: Uint ( v) => format ! (
1209+ "v{}{}i{}" ,
1210+ vec_len,
1211+ p0s,
1212+ // Normalize to prevent crash if v: UIntTy::Usize
1213+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1214+ ) ,
11981215 ty:: Float ( v) => format ! ( "v{}{}f{}" , vec_len, p0s, v. bit_width( ) ) ,
11991216 _ => unreachable ! ( ) ,
12001217 }
@@ -1330,11 +1347,11 @@ fn generic_simd_intrinsic(
13301347
13311348 // Type of the vector of pointers:
13321349 let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1333- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1350+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
13341351
13351352 // Type of the vector of elements:
13361353 let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1337- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1354+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
13381355
13391356 let llvm_intrinsic =
13401357 format ! ( "llvm.masked.gather.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
@@ -1458,11 +1475,11 @@ fn generic_simd_intrinsic(
14581475
14591476 // Type of the vector of pointers:
14601477 let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1461- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1478+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
14621479
14631480 // Type of the vector of elements:
14641481 let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1465- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1482+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
14661483
14671484 let llvm_intrinsic =
14681485 format ! ( "llvm.masked.scatter.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
0 commit comments