Repository navigation
-C linker-plugin-lto prevents vectorization of mem::swap at -C opt-level=3 #124234
Description
Activity
- addedneeds-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triagingThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triagingA-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-LTOArea: Link-time optimization (LTO)Area: Link-time optimization (LTO)I-slowIssue: Problems and improvements with respect to performance of generated code.Issue: Problems and improvements with respect to performance of generated code.
on Apr 21, 2024 - changed the title
[-]`-C linker-plugin-lto` prevents vectorization of `ptr::swap_nonoverlapping` at `-C opt-level=3`[/-][+]`-C linker-plugin-lto` prevents vectorization of `mem::swap` at `-C opt-level=3`[/+]on Apr 21, 2024 searched toolchains nightly-2020-12-25 through nightly-2024-04-21 Regression in nightly-2022-02-26 get_commits_between returning commits, len: 11 commit[0] 2022-02-24: Auto merge of #94131 - Mark-Simulacrum:fmt-string, r=oli-obk commit[1] 2022-02-24: Auto merge of #94333 - Dylan-DPC:rollup-7yxtywp, r=Dylan-DPC commit[2] 2022-02-25: Auto merge of #93368 - eddyb:diagbld-guarantee, r=estebank commit[3] 2022-02-25: Auto merge of #93878 - Aaron1011:newtype-macro, r=cjgillot commit[4] 2022-02-25: Auto merge of #94130 - erikdesjardins:partially, r=nikic commit[5] 2022-02-25: Auto merge of #94350 - matthiaskrgr:rollup-eesfiyr, r=matthiaskrgr commit[6] 2022-02-25: Auto merge of #93644 - michaelwoerister:simpler-debuginfo-typemap, r=wesleywiser commit[7] 2022-02-25: Auto merge of #94357 - matthiaskrgr:rollup-xrjaof3, r=matthiaskrgr commit[8] 2022-02-25: Auto merge of #94279 - tmiasko:write-print, r=Mark-Simulacrum commit[9] 2022-02-25: Auto merge of #94290 - Mark-Simulacrum:bump-bootstrap, r=pietroalbini commit[10] 2022-02-25: Auto merge of #94369 - matthiaskrgr:rollup-qtripm2, r=matthiaskrgr ERROR: no CI builds available between 4b043faba34ccc053a4d0110634c323f6c03765e and d3ad51b48f83329fac0cd8a9f1253f3146613c1c within last 167 daysWe used to basically be forcing this, but stopped doing that in #123185
I know nothing about what
linker-plugin-ltodoes or why it would be relevant.But yeah, in assembly it swaps via
ymms in v3 https://rust.godbolt.org/z/Mqc64zYxW without the flag, but does individualqwords with it 🤷I'm not sure whether
-C linker-plugin-ltois compatible with--emit=llvm-ir(or--emit=asm). I'd guess it prints the pre-LTO IR in that case?My workflow is getting the
--releaseassembly withcargo-show-asm. LTO is enabled in the release profile overrides in the manifest.It's unfortunate that this does not return the fully optimized assembly, but it also makes sense since linking doesn't actually happen. I thought this issue initially was a regression because couldn't find any info on this.
I confirmed that it gets vectorized in the final assembly with
objdump+grepin a new crate, so I'll close this issue.Glad to hear it's working! (and that I didn't break everything *phew*)
TBH, this has been confusing me too as I work on stuff. Thus tests like https://github.com/rust-lang/rust/blob/master/tests/assembly/x86_64-typed-swap.rs as it seems that looking in LLVM IR keeps not telling the full story :(
Reacted by DaniPopes- removedA-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.I-slowIssue: Problems and improvements with respect to performance of generated code.Issue: Problems and improvements with respect to performance of generated code.C-bugCategory: This is a bug.Category: This is a bug.A-LTOArea: Link-time optimization (LTO)Area: Link-time optimization (LTO)needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triagingThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
on Apr 23, 2024 It's unfortunate that this does not return the fully optimized assembly, but it also makes sense since linking doesn't actually happen. I thought this issue initially was a regression because couldn't find any info on this.
FWIW I just released
cargo-show-asm0.2.33 and now it can actually disassemble your binary (pass--disasmin addition to usual flags and make sure symbols are not stripped bycargo) so output should be similar to what you can get fromobjdump, but with less manual interactions. For now it's locked behind "disasm" feature (cargo install cargo-show-asm --features disasm), if something doesn't work - please make a ticket :)Reacted by DaniPopes, onbjerg and Rahul Butani
I tried this code (godbolt):
I expected to see this happen: code optimizes to a few
<_ x i64>(target-cpu-dependent) loads and stores on-C opt-level=3.Instead, this happened: the code is not vectorized when
-C linker-plugin-ltois also passed to the compiler (this is passed together with-Clto=...but that has no effect here)Note that this only happens with
mem::swap/ptr::swap_nonoverlapping, notptr::swap.Meta
rustc --version --verbose:This happens since at least 1.61, but I could not find a way to bisect this, so I opted not to mark this a regression.
@rustbot modify labels: +A-LLVM +A-LTO +I-slow