Rollup merge of #144665 - scottmcm:restore-sroa-simd-check, r=compiler-errors

Re-block SRoA on SIMD types

Fixes rust-lang/rust#144621
This commit is contained in:
Stuart Cook 2025-07-31 18:52:10 +10:00 committed by GitHub
commit 8cca6bce4e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 55 additions and 1 deletions

View file

@ -72,8 +72,12 @@ fn escaping_locals<'tcx>(
return true;
}
if let ty::Adt(def, _args) = ty.kind()
&& tcx.is_lang_item(def.did(), LangItem::DynMetadata)
&& (def.repr().simd() || tcx.is_lang_item(def.did(), LangItem::DynMetadata))
{
// Exclude #[repr(simd)] types so that they are not de-optimized into an array
// (MCP#838 banned projections into SIMD types, but if the value is unused
// this pass sees "all the uses are of the fields" and expands it.)
// codegen wants to see the `DynMetadata<T>`,
// not the inner reference-to-opaque-type.
return true;

View file

@ -0,0 +1,32 @@
- // MIR for `foo` before ScalarReplacementOfAggregates
+ // MIR for `foo` after ScalarReplacementOfAggregates
fn foo(_1: &[Simd<u8, 16>], _2: Simd<u8, 16>) -> () {
debug simds => _1;
debug _unused => _2;
let mut _0: ();
let _3: std::simd::Simd<u8, 16>;
let _4: usize;
let mut _5: usize;
let mut _6: bool;
scope 1 {
debug a => _3;
}
bb0: {
StorageLive(_3);
StorageLive(_4);
_4 = const 0_usize;
_5 = PtrMetadata(copy _1);
_6 = Lt(copy _4, copy _5);
assert(move _6, "index out of bounds: the length is {} but the index is {}", move _5, copy _4) -> [success: bb1, unwind continue];
}
bb1: {
_3 = copy (*_1)[_4];
StorageDead(_4);
StorageDead(_3);
return;
}
}

View file

@ -0,0 +1,18 @@
//@ needs-unwind
#![feature(portable_simd)]
// SRoA expands things even if they're unused
// <https://github.com/rust-lang/rust/issues/144621>
use std::simd::Simd;
// EMIT_MIR simd_sroa.foo.ScalarReplacementOfAggregates.diff
pub(crate) fn foo(simds: &[Simd<u8, 16>], _unused: Simd<u8, 16>) {
// CHECK-LABEL: fn foo
// CHECK-NOT: [u8; 16]
// CHECK: let [[SIMD:_.+]]: std::simd::Simd<u8, 16>;
// CHECK-NOT: [u8; 16]
// CHECK: [[SIMD]] = copy (*_1)[0 of 1];
// CHECK-NOT: [u8; 16]
let a = simds[0];
}