rust/tests/codegen/simd/project-to-simd-array-field.rs
Scott McMurray 6f9cfd694d Rework OperandRef::extract_field to stop calling to_immediate_scalar on things which are already immediates
That means it stops trying to truncate things that are already `i1`s.
2025-02-19 12:03:40 -08:00

32 lines
930 B
Rust

//@compile-flags: -Copt-level=3
#![crate_type = "lib"]
#![feature(repr_simd, core_intrinsics)]
#[allow(non_camel_case_types)]
#[derive(Clone, Copy)]
#[repr(simd)]
struct i32x4([i32; 4]);
#[inline(always)]
fn to_array4(a: i32x4) -> [i32; 4] {
a.0
}
// CHECK-LABEL: simd_add_self_then_return_array(
// CHECK-SAME: ptr{{.+}}sret{{.+}}%[[RET:.+]],
// CHECK-SAME: ptr{{.+}}%a)
#[no_mangle]
pub fn simd_add_self_then_return_array(a: &i32x4) -> [i32; 4] {
// It would be nice to just ban `.0` into simd types,
// but until we do this has to keep working.
// See also <https://github.com/rust-lang/rust/issues/105439>
// CHECK: %[[T1:.+]] = load <4 x i32>, ptr %a
// CHECK: %[[T2:.+]] = shl <4 x i32> %[[T1]], {{splat \(i32 1\)|<i32 1, i32 1, i32 1, i32 1>}}
// CHECK: store <4 x i32> %[[T2]], ptr %[[RET]]
let a = *a;
let b = unsafe { core::intrinsics::simd::simd_add(a, a) };
to_array4(b)
}