From 530f6207c23ac647932726e9f11592d3ed986cd3 Mon Sep 17 00:00:00 2001 From: khyperia <953151+khyperia@users.noreply.github.com> Date: Wed, 15 Dec 2021 09:56:47 +0100 Subject: [PATCH 1/2] Fix some ICEs with bools --- .../src/builder/builder_methods.rs | 16 ++++++---------- .../src/codegen_cx/declare.rs | 12 +----------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs index f6ce633d5c..60bd8007cc 100644 --- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs +++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs @@ -927,20 +927,16 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> { let b_offset = a.value.size(self).align_to(b.value.align(self).abi); let pair_ty = place.layout.spirv_type(self.span(), self); - let mut load = |i, scalar: &Scalar, align| { + let mut load = |i, _: &Scalar, align| { let llptr = self.struct_gep(pair_ty, place.llval, i as u64); - let load = self.load( + // WARN! This should go through to_immediate, but because we only have a Scalar, + // not a Ty, we can't call to_immediate here (even though we implement it as a + // no-op), so "inline" the no-op here and do nothing. + self.load( self.scalar_pair_element_backend_type(place.layout, i, false), llptr, align, - ); - // WARN! This does not go through to_immediate due to only having a Scalar, not a Ty, but it still does - // whatever to_immediate does! - if scalar.is_bool() { - self.trunc(load, SpirvType::Bool.def(self.span(), self)) - } else { - load - } + ) }; OperandValue::Pair( diff --git a/crates/rustc_codegen_spirv/src/codegen_cx/declare.rs b/crates/rustc_codegen_spirv/src/codegen_cx/declare.rs index b5f9c2a727..5a9f8904cf 100644 --- a/crates/rustc_codegen_spirv/src/codegen_cx/declare.rs +++ b/crates/rustc_codegen_spirv/src/codegen_cx/declare.rs @@ -263,7 +263,6 @@ impl<'tcx> StaticMethods for CodegenCx<'tcx> { fn codegen_static(&self, def_id: DefId, _is_mutable: bool) { let g = self.get_static(def_id); - let span = self.tcx.def_span(def_id); let alloc = match self.tcx.eval_static_initializer(def_id) { Ok(alloc) => alloc, @@ -277,16 +276,7 @@ impl<'tcx> StaticMethods for CodegenCx<'tcx> { other.debug(g.ty, self) )), }; - let mut v = self.create_const_alloc(alloc, value_ty); - - if self.lookup_type(v.ty) == SpirvType::Bool { - let val_int = match self.builder.lookup_const(v).unwrap() { - SpirvConst::Bool(val) => val as u8, - _ => bug!(), - }; - v = self.constant_u8(span, val_int); - } - + let v = self.create_const_alloc(alloc, value_ty); assert_ty_eq!(self, value_ty, v.ty); self.builder .set_global_initializer(g.def_cx(self), v.def_cx(self)); From 0ac44083ba00149d6b5ae68b1f273e7f5912b915 Mon Sep 17 00:00:00 2001 From: khyperia <953151+khyperia@users.noreply.github.com> Date: Wed, 15 Dec 2021 14:41:57 +0100 Subject: [PATCH 2/2] :sweat_smile: --- .../rustc_codegen_spirv/src/builder/builder_methods.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs index 60bd8007cc..5151da23e0 100644 --- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs +++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs @@ -927,16 +927,14 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> { let b_offset = a.value.size(self).align_to(b.value.align(self).abi); let pair_ty = place.layout.spirv_type(self.span(), self); - let mut load = |i, _: &Scalar, align| { + let mut load = |i, scalar: &Scalar, align| { let llptr = self.struct_gep(pair_ty, place.llval, i as u64); - // WARN! This should go through to_immediate, but because we only have a Scalar, - // not a Ty, we can't call to_immediate here (even though we implement it as a - // no-op), so "inline" the no-op here and do nothing. - self.load( + let load = self.load( self.scalar_pair_element_backend_type(place.layout, i, false), llptr, align, - ) + ); + self.to_immediate_scalar(load, *scalar) }; OperandValue::Pair(