diff options
| author | bors <bors@rust-lang.org> | 2025-03-28 10:18:32 +0000 | 
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-03-28 10:18:32 +0000 | 
| commit | 2a06022951893fe5b5384f8dbd75b4e6e3b5cee0 (patch) | |
| tree | c03e2eb1cf5ee8a760a01e53b150b74c033bc4b6 /compiler/rustc_codegen_llvm/src/consts.rs | |
| parent | e77a8f439cc87c5d67b007e9811578533de1de91 (diff) | |
| parent | 5c82a59bd30815a942b64fa09e22dbe442edf56d (diff) | |
| download | rust-2a06022951893fe5b5384f8dbd75b4e6e3b5cee0.tar.gz rust-2a06022951893fe5b5384f8dbd75b4e6e3b5cee0.zip | |
Auto merge of #138503 - bjorn3:string_merging, r=tmiasko
Avoid wrapping constant allocations in packed structs when not necessary This way LLVM will set the string merging flag if the alloc is a nul terminated string, reducing binary sizes. try-job: armhf-gnu
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/consts.rs')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/consts.rs | 7 | 
1 files changed, 6 insertions, 1 deletions
| diff --git a/compiler/rustc_codegen_llvm/src/consts.rs b/compiler/rustc_codegen_llvm/src/consts.rs index 62fa2884e0f..7675e75338a 100644 --- a/compiler/rustc_codegen_llvm/src/consts.rs +++ b/compiler/rustc_codegen_llvm/src/consts.rs @@ -129,7 +129,12 @@ pub(crate) fn const_alloc_to_llvm<'ll>( append_chunks_of_init_and_uninit_bytes(&mut llvals, cx, alloc, range); } - cx.const_struct(&llvals, true) + // Avoid wrapping in a struct if there is only a single value. This ensures + // that LLVM is able to perform the string merging optimization if the constant + // is a valid C string. LLVM only considers bare arrays for this optimization, + // not arrays wrapped in a struct. LLVM handles this at: + // https://github.com/rust-lang/llvm-project/blob/acaea3d2bb8f351b740db7ebce7d7a40b9e21488/llvm/lib/Target/TargetLoweringObjectFile.cpp#L249-L280 + if let &[data] = &*llvals { data } else { cx.const_struct(&llvals, true) } } fn codegen_static_initializer<'ll, 'tcx>( | 
