@@ -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