about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa/src
diff options
context:
space:
mode:
authorOli Scherer <github333195615777966@oli-obk.de>2025-01-08 16:15:50 +0000
committerOli Scherer <github333195615777966@oli-obk.de>2025-01-10 08:27:41 +0000
commit65ea9f3eb40e113284d0142f28e061fd90191c46 (patch)
treedd876338b62f0050b4ebfa1dade409e0adb52223 /compiler/rustc_codegen_ssa/src
parent7ad45f1d2fc5b237a0f3ce128dc403eb6f618403 (diff)
downloadrust-65ea9f3eb40e113284d0142f28e061fd90191c46.tar.gz
rust-65ea9f3eb40e113284d0142f28e061fd90191c46.zip
Pull element init into a reusable closure
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/rvalue.rs35
1 files changed, 21 insertions, 14 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
index 8ef25d4e2ff..e36e0e18d9c 100644
--- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
@@ -93,22 +93,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
                     return;
                 }
 
-                match cg_elem.val {
-                    OperandValue::Immediate(v) => {
-                        let start = dest.val.llval;
-                        let size = bx.const_usize(dest.layout.size.bytes());
+                let try_init_all_same = |bx: &mut Bx, v| {
+                    let start = dest.val.llval;
+                    let size = bx.const_usize(dest.layout.size.bytes());
+
+                    // Use llvm.memset.p0i8.* to initialize all zero arrays
+                    if bx.cx().const_to_opt_u128(v, false) == Some(0) {
+                        let fill = bx.cx().const_u8(0);
+                        bx.memset(start, fill, size, dest.val.align, MemFlags::empty());
+                        return true;
+                    }
 
-                        // Use llvm.memset.p0i8.* to initialize all zero arrays
-                        if bx.cx().const_to_opt_u128(v, false) == Some(0) {
-                            let fill = bx.cx().const_u8(0);
-                            bx.memset(start, fill, size, dest.val.align, MemFlags::empty());
-                            return;
-                        }
+                    // Use llvm.memset.p0i8.* to initialize byte arrays
+                    let v = bx.from_immediate(v);
+                    if bx.cx().val_ty(v) == bx.cx().type_i8() {
+                        bx.memset(start, v, size, dest.val.align, MemFlags::empty());
+                        return true;
+                    }
+                    false
+                };
 
-                        // Use llvm.memset.p0i8.* to initialize byte arrays
-                        let v = bx.from_immediate(v);
-                        if bx.cx().val_ty(v) == bx.cx().type_i8() {
-                            bx.memset(start, v, size, dest.val.align, MemFlags::empty());
+                match cg_elem.val {
+                    OperandValue::Immediate(v) => {
+                        if try_init_all_same(bx, v) {
                             return;
                         }
                     }