about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa/src
diff options
context:
space:
mode:
authorkadmin <julianknodt@gmail.com>2021-01-23 02:28:08 +0000
committerkadmin <julianknodt@gmail.com>2021-03-09 16:54:14 +0000
commit845e4b5962aa84fcfc0b8a6b1e4b9e32725547ef (patch)
tree4fcd901bdad7110b09dcf9ce63a26c8be7e508f2 /compiler/rustc_codegen_ssa/src
parent049045b100f2b7f5fbc36ecd36418dec1f6853cb (diff)
downloadrust-845e4b5962aa84fcfc0b8a6b1e4b9e32725547ef.tar.gz
rust-845e4b5962aa84fcfc0b8a6b1e4b9e32725547ef.zip
Change CopyNonOverlapping::codegen_ssa
Fixes copy_non_overlapping codegen_ssa to properly handle pointees,
and use bytes instead of elem count
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/statement.rs28
1 files changed, 15 insertions, 13 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/statement.rs b/compiler/rustc_codegen_ssa/src/mir/statement.rs
index 054273262f7..e11539c1476 100644
--- a/compiler/rustc_codegen_ssa/src/mir/statement.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/statement.rs
@@ -122,19 +122,21 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
             }) => {
                 let dst_val = self.codegen_operand(&mut bx, dst);
                 let src_val = self.codegen_operand(&mut bx, src);
-                let count_val = self.codegen_operand(&mut bx, count);
-                let count = count_val.immediate_or_packed_pair(&mut bx);
-                let dst = dst_val.immediate_or_packed_pair(&mut bx);
-                let src = src_val.immediate_or_packed_pair(&mut bx);
-                let flags = crate::MemFlags::empty();
-                bx.memcpy(
-                    dst,
-                    dst_val.layout.layout.align.pref,
-                    src,
-                    src_val.layout.layout.align.pref,
-                    count,
-                    flags,
-                );
+                let count = self.codegen_operand(&mut bx, count).immediate();
+                let get_val_align = |oper_ref: crate::mir::OperandRef<'_, _>| match oper_ref.val {
+                    OperandValue::Ref(val, _, align) => (val, align),
+                    _ => unreachable!(),
+                };
+                let pointee_layout = dst_val
+                    .layout
+                    .pointee_info_at(&mut bx, rustc_target::abi::Size::ZERO)
+                    .expect("Expected pointer");
+                let elem_size = bx.const_u64(pointee_layout.size.bytes());
+                let byte_count = bx.mul(count, elem_size);
+
+                let (dst, dst_align) = get_val_align(dst_val);
+                let (src, src_align) = get_val_align(src_val);
+                bx.memcpy(dst, dst_align, src, src_align, byte_count, crate::MemFlags::empty());
                 bx
             }
             mir::StatementKind::FakeRead(..)