about summary refs log tree commit diff
path: root/src/tools/miri
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-06-09 09:37:15 +0200
committerRalf Jung <post@ralfj.de>2024-06-09 11:54:23 +0200
commitd5fb8257e7533edd1f2699f9b92f80848477c800 (patch)
tree06eaccf075f3986e0d4e1755f0765e8b5fec000e /src/tools/miri
parent565cadb514d35e7b851540edbc172af0f606014f (diff)
downloadrust-d5fb8257e7533edd1f2699f9b92f80848477c800.tar.gz
rust-d5fb8257e7533edd1f2699f9b92f80848477c800.zip
interpret: do not ICE on padded non-pow2 SIMD vectors
Diffstat (limited to 'src/tools/miri')
-rw-r--r--src/tools/miri/tests/pass/intrinsics/portable-simd.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/tools/miri/tests/pass/intrinsics/portable-simd.rs b/src/tools/miri/tests/pass/intrinsics/portable-simd.rs
index 248a57d6850..5250a1138b7 100644
--- a/src/tools/miri/tests/pass/intrinsics/portable-simd.rs
+++ b/src/tools/miri/tests/pass/intrinsics/portable-simd.rs
@@ -1,5 +1,5 @@
 //@compile-flags: -Zmiri-strict-provenance
-#![feature(portable_simd, adt_const_params, core_intrinsics)]
+#![feature(portable_simd, adt_const_params, core_intrinsics, repr_simd)]
 #![allow(incomplete_features, internal_features)]
 use std::intrinsics::simd as intrinsics;
 use std::ptr;
@@ -581,11 +581,32 @@ fn simd_masked_loadstore() {
     assert_eq!(buf, [2, 3, 4]);
 }
 
+fn simd_ops_non_pow2() {
+    // Just a little smoke test for operations on non-power-of-two vectors.
+    #[repr(simd, packed)]
+    #[derive(Copy, Clone)]
+    pub struct SimdPacked<T, const N: usize>([T; N]);
+    #[repr(simd)]
+    #[derive(Copy, Clone)]
+    pub struct SimdPadded<T, const N: usize>([T; N]);
+
+    let x = SimdPacked([1u32; 3]);
+    let y = SimdPacked([2u32; 3]);
+    let z = unsafe { intrinsics::simd_add(x, y) };
+    assert_eq!({ z.0 }, [3u32; 3]);
+
+    let x = SimdPadded([1u32; 3]);
+    let y = SimdPadded([2u32; 3]);
+    let z = unsafe { intrinsics::simd_add(x, y) };
+    assert_eq!(z.0, [3u32; 3]);
+}
+
 fn main() {
     simd_mask();
     simd_ops_f32();
     simd_ops_f64();
     simd_ops_i32();
+    simd_ops_non_pow2();
     simd_cast();
     simd_swizzle();
     simd_gather_scatter();