@@ -93,22 +93,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
9393 return ;
9494 }
9595
96- match cg_elem. val {
97- OperandValue :: Immediate ( v) => {
98- let start = dest. val . llval ;
99- let size = bx. const_usize ( dest. layout . size . bytes ( ) ) ;
96+ let try_init_all_same = |bx : & mut Bx , v| {
97+ let start = dest. val . llval ;
98+ let size = bx. const_usize ( dest. layout . size . bytes ( ) ) ;
99+
100+ // Use llvm.memset.p0i8.* to initialize all zero arrays
101+ if bx. cx ( ) . const_to_opt_u128 ( v, false ) == Some ( 0 ) {
102+ let fill = bx. cx ( ) . const_u8 ( 0 ) ;
103+ bx. memset ( start, fill, size, dest. val . align , MemFlags :: empty ( ) ) ;
104+ return true ;
105+ }
100106
101- // Use llvm.memset.p0i8.* to initialize all zero arrays
102- if bx. cx ( ) . const_to_opt_u128 ( v, false ) == Some ( 0 ) {
103- let fill = bx. cx ( ) . const_u8 ( 0 ) ;
104- bx. memset ( start, fill, size, dest. val . align , MemFlags :: empty ( ) ) ;
105- return ;
106- }
107+ // Use llvm.memset.p0i8.* to initialize byte arrays
108+ let v = bx. from_immediate ( v) ;
109+ if bx. cx ( ) . val_ty ( v) == bx. cx ( ) . type_i8 ( ) {
110+ bx. memset ( start, v, size, dest. val . align , MemFlags :: empty ( ) ) ;
111+ return true ;
112+ }
113+ false
114+ } ;
107115
108- // Use llvm.memset.p0i8.* to initialize byte arrays
109- let v = bx. from_immediate ( v) ;
110- if bx. cx ( ) . val_ty ( v) == bx. cx ( ) . type_i8 ( ) {
111- bx. memset ( start, v, size, dest. val . align , MemFlags :: empty ( ) ) ;
116+ match cg_elem. val {
117+ OperandValue :: Immediate ( v) => {
118+ if try_init_all_same ( bx, v) {
112119 return ;
113120 }
114121 }
0 commit comments