@@ -122,19 +122,21 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
122
122
} ) => {
123
123
let dst_val = self . codegen_operand ( & mut bx, dst) ;
124
124
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 ( ) ) ;
138
140
bx
139
141
}
140
142
mir:: StatementKind :: FakeRead ( ..)
0 commit comments