Skip to content

Commit 65ea9f3

Browse files
committed
Pull element init into a reusable closure
1 parent 7ad45f1 commit 65ea9f3

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

compiler/rustc_codegen_ssa/src/mir/rvalue.rs

+21-14
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)