From 1494706cadd45a5e5e890efed99a39e80dd64020 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 11 May 2024 15:26:49 -0700 Subject: [PATCH] Make `index_by_increasing_offset` return one item for primitives --- compiler/rustc_abi/src/lib.rs | 7 ++++++- compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 13 ++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index ea805c5ad5db7..9f2788c87c323 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -1271,7 +1271,12 @@ impl FieldsShape { } } - (0..self.count()).map(move |i| match *self { + // Primitives don't really have fields in the way that structs do, + // but having this return an empty iterator for them is unhelpful + // since that makes them look kinda like ZSTs, which they're not. + let pseudofield_count = if let FieldsShape::Primitive = self { 1 } else { self.count() }; + + (0..pseudofield_count).map(move |i| match *self { FieldsShape::Primitive | FieldsShape::Union(_) | FieldsShape::Array { .. } => i, FieldsShape::Arbitrary { .. } => { if use_small { diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index d146128f86bc9..45b18f65670c2 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -18,7 +18,6 @@ use rustc_span::{Span, DUMMY_SP}; use rustc_target::abi::{self, FieldIdx, FIRST_VARIANT}; use arrayvec::ArrayVec; -use either::Either; impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { #[instrument(level = "trace", skip(self, bx))] @@ -724,24 +723,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { } mir::Rvalue::Use(ref operand) => self.codegen_operand(bx, operand), mir::Rvalue::Repeat(..) => bug!("{rvalue:?} in codegen_rvalue_operand"), - mir::Rvalue::Aggregate(ref kind, ref fields) => { + mir::Rvalue::Aggregate(_, ref fields) => { let ty = rvalue.ty(self.mir, self.cx.tcx()); let ty = self.monomorphize(ty); let layout = self.cx.layout_of(ty); - let field_indices = if let mir::AggregateKind::RawPtr(..) = **kind { - // `index_by_increasing_offset` gives an empty iterator for primitives - Either::Left([0_usize, 1_usize].iter().copied()) - } else { - Either::Right(layout.fields.index_by_increasing_offset()) - }; - debug_assert_eq!(field_indices.len(), fields.len()); - // `rvalue_creates_operand` has arranged that we only get here if // we can build the aggregate immediate from the field immediates. let mut inputs = ArrayVec::::new(); let mut input_scalars = ArrayVec::::new(); - for field_idx in field_indices { + for field_idx in layout.fields.index_by_increasing_offset() { let field_idx = FieldIdx::from_usize(field_idx); let op = self.codegen_operand(bx, &fields[field_idx]); let values = op.val.immediates_or_place().left_or_else(|p| {