Rollup of 7 pull requests#152632
Open
JonathanBrouwer wants to merge 93 commits intorust-lang:mainfrom
Open
Conversation
This moves all LLVM intrinsic handling out of the regular call path for cg_gcc and makes it easier to hook into this code for future cg_llvm changes.
…acro_transparency`
It's described as a "backwards compatibility hack to keep the diff small". Removing it requires only a modest amount of churn, and the resulting code is clearer without the invisible derefs.
…ics-generation Simplify intrinsics generation
Regenerate intrinsics
Move LTO to OngoingCodegen::join This will make it easier to in the future move all this code to link_binary. Follow up to rust-lang#147810 Part of rust-lang/compiler-team#908
This is the conceptual opposite of the rust-cold calling convention and
is particularly useful in combination with the new `explicit_tail_calls`
feature.
For relatively tight loops implemented with tail calling (`become`) each
of the function with the regular calling convention is still responsible
for restoring the initial value of the preserved registers. So it is not
unusual to end up with a situation where each step in the tail call loop
is spilling and reloading registers, along the lines of:
foo:
push r12
; do things
pop r12
jmp next_step
This adds up quickly, especially when most of the clobberable registers
are already used to pass arguments or other uses.
I was thinking of making the name of this ABI a little less LLVM-derived
and more like a conceptual inverse of `rust-cold`, but could not come
with a great name (`rust-cold` is itself not a great name: cold in what
context? from which perspective? is it supposed to mean that the
function is rarely called?)
Fix segfault related to __builtin_unreachable with inline asm
…bilee
add `simd_splat` intrinsic
Add `simd_splat` which lowers to the LLVM canonical splat sequence.
```llvm
insertelement <N x elem> poison, elem %x, i32 0
shufflevector <N x elem> v0, <N x elem> poison, <N x i32> zeroinitializer
```
Right now we try to fake it using one of
```rust
fn splat(x: u32) -> u32x8 {
u32x8::from_array([x; 8])
}
```
or (in `stdarch`)
```rust
fn splat(value: $elem_type) -> $name {
#[derive(Copy, Clone)]
#[repr(simd)]
struct JustOne([$elem_type; 1]);
let one = JustOne([value]);
// SAFETY: 0 is always in-bounds because we're shuffling
// a simd type with exactly one element.
unsafe { simd_shuffle!(one, one, [0; $len]) }
}
```
Both of these can confuse the LLVM optimizer, producing sub-par code. Some examples:
- rust-lang#60637
- rust-lang#137407
- rust-lang#122623
- rust-lang#97804
---
As far as I can tell there is no way to provide a fallback implementation for this intrinsic, because there is no `const` way of evaluating the number of elements (there might be issues beyond that, too). So, I added implementations for all 4 backends.
Both GCC and const-eval appear to have some issues with simd vectors containing pointers. I have a workaround for GCC, but haven't yet been able to make const-eval work. See the comments below.
Currently this just adds the intrinsic, it does not actually use it anywhere yet.
…ochenkov
abi: add a rust-preserve-none calling convention
This is the conceptual opposite of the rust-cold calling convention and is particularly useful in combination with the new `explicit_tail_calls` feature.
For relatively tight loops implemented with tail calling (`become`) each of the function with the regular calling convention is still responsible for restoring the initial value of the preserved registers. So it is not unusual to end up with a situation where each step in the tail call loop is spilling and reloading registers, along the lines of:
foo:
push r12
; do things
pop r12
jmp next_step
This adds up quickly, especially when most of the clobberable registers are already used to pass arguments or other uses.
I was thinking of making the name of this ABI a little less LLVM-derived and more like a conceptual inverse of `rust-cold`, but could not come with a great name (`rust-cold` is itself not a great name: cold in what context? from which perspective? is it supposed to mean that the function is rarely called?)
…, r=Mark-Simulacrum
Optimize indexing slices and strs with inclusive ranges
Instead of separately checking for `end == usize::MAX` and `end + 1 > slice.len()`, we can check for `end >= slice.len()`. Also consolidate all the str indexing related panic functions into a single function which reports the correct error depending on the arguments, as the slice indexing code already does.
The downside of all this is that the panic message is slightly less specific when trying to index with `[..=usize::MAX]`: instead of saying "attempted to index str up to maximum usize" it just says "end byte index {end} out of bounds". But this is a rare enough case that I think it is acceptable
…yUwU UnsafePinned: implement opsem effects of UnsafeUnpin This implements the next step for rust-lang#125735: actually making `UnsafePinned` have special opsem effects by suppressing the `noalias` *even if* the type is wrapped in an `Unpin` wrapper. For backwards compatibility we also still keep the `Unpin` hack, i.e. a type must be both `Unpin` and `UnsafeUnpin` to get `noalias`.
…ark-Simulacrum Do not require `'static` for obtaining reflection information. tracking issue rust-lang#142577 This does not affect the stable `TypeId::of`, as that has its own `'static` bound. But it will allow obtaining `TypeId`s for non-static types via the reflection API. To obtain such a `TypeId` for any type, just use `Type::of::<(T,)>().kind` to extract the first field of a tuple. This effectively reintroduces rust-lang#41875, which @rust-lang/lang decided against allowing back in 2018 due to lack of sound use cases. We will thus need to have a T-lang meeting specifically about `TypeId` for non-static types before *stabilizing* any part of reflection (in addition to T-lang meetings about reflection in general). I'm adding an explicit point about this to the tracking issue. cc @scottmcm @joshtriplett @9SonSteroids @SpriteOvO @izagawd @BD103
…ark-Simulacrum Remove named lifetimes in some `PartialOrd` & `PartialEq` `impl`s Makes [the docs](https://doc.rust-lang.org/1.88.0/std/cmp/trait.PartialOrd.html#impl-PartialOrd%3CPathBuf%3E-for-Cow%3C'a,+Path%3E) way easier to look at, gets rid of a few `#[allow(unused_lifetimes)]`, and AFAICT is completely equivalent.
…-constant, r=Mark-Simulacrum tests: adapt align-offset.rs for InstCombine improvements in LLVM 23 Upstream [has improved InstCombine](llvm/llvm-project@8d20783) so that it can shrink added constants using known zeroes, which caused a little bit of change in this test. As far as I can tell either output is fine, so we just accept both. @rustbot label: +llvm-main
rustc_query_impl: Use `ControlFlow` in `visit_waiters` instead of nested options Noticed when reviewing rust-lang#152229.
Contributor
Author
|
@bors r+ rollup=never p=5 |
Contributor
This comment has been minimized.
This comment has been minimized.
rust-bors bot
pushed a commit
that referenced
this pull request
Feb 14, 2026
…uwer Rollup of 7 pull requests Successful merges: - #152622 (Update GCC subtree) - #145024 (Optimize indexing slices and strs with inclusive ranges) - #151365 (UnsafePinned: implement opsem effects of UnsafeUnpin) - #152381 (Do not require `'static` for obtaining reflection information.) - #143575 (Remove named lifetimes in some `PartialOrd` & `PartialEq` `impl`s) - #152404 (tests: adapt align-offset.rs for InstCombine improvements in LLVM 23) - #152582 (rustc_query_impl: Use `ControlFlow` in `visit_waiters` instead of nested options)
Collaborator
|
The job Click to see the possible cause of the failure (guessed by this bot) |
Contributor
|
💔 Test for 60f234f failed: CI. Failed job:
|
Contributor
Author
|
@bors retry |
Contributor
|
⌛ Testing commit 7c36d15 with merge 7bee525... Workflow: https://github.com/rust-lang/rust/actions/runs/22026120890 |
rust-bors bot
pushed a commit
that referenced
this pull request
Feb 14, 2026
…uwer Rollup of 7 pull requests Successful merges: - #152622 (Update GCC subtree) - #145024 (Optimize indexing slices and strs with inclusive ranges) - #151365 (UnsafePinned: implement opsem effects of UnsafeUnpin) - #152381 (Do not require `'static` for obtaining reflection information.) - #143575 (Remove named lifetimes in some `PartialOrd` & `PartialEq` `impl`s) - #152404 (tests: adapt align-offset.rs for InstCombine improvements in LLVM 23) - #152582 (rustc_query_impl: Use `ControlFlow` in `visit_waiters` instead of nested options)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Successful merges:
'staticfor obtaining reflection information. #152381 (Do not require'staticfor obtaining reflection information.)PartialOrd&PartialEqimpls #143575 (Remove named lifetimes in somePartialOrd&PartialEqimpls)ControlFlowinvisit_waitersinstead of nested options #152582 (rustc_query_impl: UseControlFlowinvisit_waitersinstead of nested options)r? @ghost
Create a similar rollup