You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
-C linker-plugin-lto prevents vectorization of mem::swap at -C opt-level=3 #124234
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-lto is 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, not ptr::swap.
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 days
My workflow is getting the --release assembly with cargo-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 + grep in a new crate, so I'll close this issue.
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-asm 0.2.33 and now it can actually disassemble your binary (pass --disasm in addition to usual flags and make sure symbols are not stripped by cargo) so output should be similar to what you can get from objdump, 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 :)
Activity
[-]`-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`[/+]DaniPopes commentedon Apr 21, 2024
4b043fa...d3ad51b
Probably #94212 cc @scottmcm
scottmcm commentedon Apr 23, 2024
We 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 🤷nikic commentedon Apr 23, 2024
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?DaniPopes commentedon Apr 23, 2024
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.scottmcm commentedon Apr 23, 2024
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 :(
pacak commentedon Apr 24, 2024
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 :)