Description
It appears that with simd_insert and simd_extract that I can produce garbage data in a way that is probably due to unsound OOB memory access. These are unsafe functions but the related simd_shuffle functions fail to monomorphize. Miri provokes an ICE. I thiiiink simd_extract and simd_insert might not require const arguments on purpose, but I believe something may need to be patched re: Miri. cc @RalfJung
I was in the middle of constructing tests for rustc's simd intrinsics. I tried this code: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=dfc24d97ffa77e6fbd4a65c16b713cf9
#![allow(non_camel_case_types)]
#![feature(repr_simd, platform_intrinsics)]
#[repr(simd)]
#[derive(Copy, Clone, Debug)]
struct f32x4(f32, f32, f32, f32);
extern "platform-intrinsic" {
pub fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
pub fn simd_extract<T, E>(x: T, idx: u32) -> E;
}
fn main() {
let x = f32x4(-1.0, 0.0, f32::INFINITY, f32::NAN);
unsafe {
let ins: f32x4 = simd_insert(x, 5, f32::NEG_INFINITY);
let ext: f32 = simd_extract(x, 9);
println!("{:?}", x); // f32x4(-1.0, 0.0, inf, NaN)
println!("{:?}", ins); // f32x4(0.000000000000000000000000000000000000000000001, 0.0,
// 12499248000000000.0, 0.000000000000000000000000000000000000000045915)
println!("{}", ext); // 0.000000000000000000000000000000000000000030658
}
}
I (perhaps overly naively) expected to see this happen: "failure to monomorphize because blah blah blah"
Instead, this happened: I got some totally wild garbage data!
rustc --version
:
rustc 1.48.0-nightly (ef663a8a4 2020-09-30) running on x86_64-unknown-linux-gnu
The Miri ICE:
thread 'rustc' panicked at 'Index `5` must be in bounds of vector type `f32`: `[0, 4)`', /rustc/ef663a8a48ea6b98b43cbfaefd99316b36b16825/compiler/rustc_mir/src/interpret/intrinsics.rs:393:17