Auto merge of #80652 - calebzulawski:simd-lanes, r=nagisa
Improve SIMD type element count validation Resolves rust-lang/stdsimd#53. These changes are motivated by `stdsimd` moving in the direction of const generic vectors, e.g.: ```rust #[repr(simd)] struct SimdF32<const N: usize>([f32; N]); ``` This makes a few changes: * Establishes a maximum SIMD lane count of 2^16 (65536). This value is arbitrary, but attempts to validate lane count before hitting potential errors in the backend. It's not clear what LLVM's maximum lane count is, but cranelift's appears to be much less than `usize::MAX`, at least. * Expands some SIMD intrinsics to support arbitrary lane counts. This resolves the ICE in the linked issue. * Attempts to catch invalid-sized vectors during typeck when possible. Unresolved questions: * Generic-length vectors can't be validated in typeck and are only validated after monomorphization while computing layout. This "works", but the errors simply bail out with no context beyond the name of the type. Should these errors instead return `LayoutError` or otherwise provide context in some way? As it stands, users of `stdsimd` could trivially produce monomorphization errors by making zero-length vectors. cc `@bjorn3`
This commit is contained in:
commit
bb587b1a17
28 changed files with 325 additions and 399 deletions
|
@ -11,7 +11,7 @@ This will cause an error:
|
|||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Bad<T>(T, T, T);
|
||||
struct Bad<T>(T, T, T, T);
|
||||
```
|
||||
|
||||
This will not:
|
||||
|
@ -20,5 +20,5 @@ This will not:
|
|||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Good(u32, u32, u32);
|
||||
struct Good(u32, u32, u32, u32);
|
||||
```
|
||||
|
|
|
@ -7,7 +7,7 @@ Erroneous code example:
|
|||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Bad(u16, u32, u32); // error!
|
||||
struct Bad(u16, u32, u32 u32); // error!
|
||||
```
|
||||
|
||||
When using the `#[simd]` attribute to automatically use SIMD operations in tuple
|
||||
|
@ -20,5 +20,5 @@ Fixed example:
|
|||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Good(u32, u32, u32); // ok!
|
||||
struct Good(u32, u32, u32, u32); // ok!
|
||||
```
|
||||
|
|
|
@ -19,5 +19,5 @@ Fixed example:
|
|||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Good(u32, u32, u32); // ok!
|
||||
struct Good(u32, u32, u32, u32); // ok!
|
||||
```
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue