Skip to content

Commit 845e4b5

Browse files
committed
Change CopyNonOverlapping::codegen_ssa
Fixes copy_non_overlapping codegen_ssa to properly handle pointees, and use bytes instead of elem count
1 parent 049045b commit 845e4b5

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

compiler/rustc_codegen_ssa/src/mir/statement.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,21 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
122122
}) => {
123123
let dst_val = self.codegen_operand(&mut bx, dst);
124124
let src_val = self.codegen_operand(&mut bx, src);
125-
let count_val = self.codegen_operand(&mut bx, count);
126-
let count = count_val.immediate_or_packed_pair(&mut bx);
127-
let dst = dst_val.immediate_or_packed_pair(&mut bx);
128-
let src = src_val.immediate_or_packed_pair(&mut bx);
129-
let flags = crate::MemFlags::empty();
130-
bx.memcpy(
131-
dst,
132-
dst_val.layout.layout.align.pref,
133-
src,
134-
src_val.layout.layout.align.pref,
135-
count,
136-
flags,
137-
);
125+
let count = self.codegen_operand(&mut bx, count).immediate();
126+
let get_val_align = |oper_ref: crate::mir::OperandRef<'_, _>| match oper_ref.val {
127+
OperandValue::Ref(val, _, align) => (val, align),
128+
_ => unreachable!(),
129+
};
130+
let pointee_layout = dst_val
131+
.layout
132+
.pointee_info_at(&mut bx, rustc_target::abi::Size::ZERO)
133+
.expect("Expected pointer");
134+
let elem_size = bx.const_u64(pointee_layout.size.bytes());
135+
let byte_count = bx.mul(count, elem_size);
136+
137+
let (dst, dst_align) = get_val_align(dst_val);
138+
let (src, src_align) = get_val_align(src_val);
139+
bx.memcpy(dst, dst_align, src, src_align, byte_count, crate::MemFlags::empty());
138140
bx
139141
}
140142
mir::StatementKind::FakeRead(..)

0 commit comments

Comments
 (0)