@@ -93,22 +93,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
93
93
return ;
94
94
}
95
95
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
+ }
100
106
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
+ } ;
107
115
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) {
112
119
return ;
113
120
}
114
121
}
0 commit comments