1
Fork 0

Inline is_machine into check_simd

This commit is contained in:
Jubilee Young 2021-06-02 15:20:15 -07:00
parent d03683caf6
commit 3d738b0594
2 changed files with 12 additions and 11 deletions

View file

@ -1888,14 +1888,6 @@ impl<'tcx> TyS<'tcx> {
matches!(self.kind(), Int(ty::IntTy::Isize) | Uint(ty::UintTy::Usize)) matches!(self.kind(), Int(ty::IntTy::Isize) | Uint(ty::UintTy::Usize))
} }
#[inline]
pub fn is_machine(&self) -> bool {
// Yes, RawPtr is a "machine" type for these purposes.
// LLVM uses a vector-of-pointers model for scatter/gather ops,
// which typically use a base pointer and vector of signed integers.
matches!(self.kind(), Int(..) | Uint(..) | Float(..) | RawPtr(..))
}
#[inline] #[inline]
pub fn has_concrete_skeleton(&self) -> bool { pub fn has_concrete_skeleton(&self) -> bool {
!matches!(self.kind(), Param(_) | Infer(_) | Error(_)) !matches!(self.kind(), Param(_) | Infer(_) | Error(_))

View file

@ -1214,10 +1214,19 @@ pub fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: LocalDefId) {
} }
} }
// Check that we use types valid for use in the lanes of a SIMD "vector register"
// These are scalar types which directly match a "machine" type
// Yes: Integers, floats, "thin" pointers
// No: char, "fat" pointers, compound types
match e.kind() { match e.kind() {
ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ } ty::Param(_) => (), // pass struct<T>(T, T, T, T) through, let monomorphization catch errors
_ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ } ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::RawPtr(_) => (), // struct(u8, u8, u8, u8) is ok
ty::Array(ty, _c) if ty.is_machine() => { /* struct([f32; 4]) */ } ty::Array(t, _clen)
if matches!(
t.kind(),
ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::RawPtr(_)
) =>
{ /* struct([f32; 4]) is ok */ }
_ => { _ => {
struct_span_err!( struct_span_err!(
tcx.sess, tcx.sess,