From 5549a45fd114b9467b8bf64a150b94426fa513d4 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Tue, 9 Sep 2025 11:40:02 +0300 Subject: [PATCH 1/2] builder: allow unsigned integers in `neg` and `exactsdiv`. --- crates/rustc_codegen_spirv/src/builder/builder_methods.rs | 8 ++++---- examples/shaders/compute-shader/src/lib.rs | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs index d86db1cbd00..c1f653c7052 100644 --- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs +++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs @@ -1600,9 +1600,9 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> { // Same note and TODO as exactudiv simple_op! { exactsdiv, - sint: s_div, + int: s_div, fold_const { - sint(a, b) => a.checked_div(b)?; + int(a, b) => a.checked_div(b)?; } } simple_op! {fdiv, float: f_div} @@ -1648,9 +1648,9 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> { } simple_uni_op! { neg, - sint: s_negate, + int: s_negate, fold_const { - sint(a) => a.checked_neg()?; + int(a) => a.checked_neg()?; } } simple_uni_op! {fneg, float: f_negate} diff --git a/examples/shaders/compute-shader/src/lib.rs b/examples/shaders/compute-shader/src/lib.rs index 16f91439004..c9408c2668a 100644 --- a/examples/shaders/compute-shader/src/lib.rs +++ b/examples/shaders/compute-shader/src/lib.rs @@ -46,6 +46,12 @@ pub fn main_cs( #[spirv(global_invocation_id)] id: UVec3, #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] prime_indices: &mut [u32], ) { - let index = id.x as usize; + let index = id.x as usize + + core::mem::size_of_val( + const { + struct S(T); + &S([]) as &S<[()]> + }, + ); prime_indices[index] = collatz(prime_indices[index]).unwrap_or(u32::MAX); } From 7ff8561fdd071167309138c615a024596a398ce7 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Tue, 9 Sep 2025 11:40:02 +0300 Subject: [PATCH 2/2] constant: avoid div-by-0 due to ZST arrays/slices. --- crates/rustc_codegen_spirv/src/codegen_cx/constant.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/rustc_codegen_spirv/src/codegen_cx/constant.rs b/crates/rustc_codegen_spirv/src/codegen_cx/constant.rs index bf874130e83..5c850bff2b7 100644 --- a/crates/rustc_codegen_spirv/src/codegen_cx/constant.rs +++ b/crates/rustc_codegen_spirv/src/codegen_cx/constant.rs @@ -573,9 +573,10 @@ impl<'tcx> CodegenCx<'tcx> { SpirvType::Array { count, .. } => { u64::try_from(self.builder.lookup_const_scalar(count).unwrap()).unwrap() } - SpirvType::RuntimeArray { .. } => { - (alloc.inner().size() - offset).bytes() / stride.bytes() - } + SpirvType::RuntimeArray { .. } => (alloc.inner().size() - offset) + .bytes() + .checked_div(stride.bytes()) + .unwrap_or(0), _ => unreachable!(), };