Skip to content

Rollup of 9 pull requests - #165023

Merged
rust-bors[bot] merged 22 commits into
rust-lang:mainfrom
tgross35:rollup-DfJzgDs
Oct 27, 2026
Merged

rust-bors[bot] merged 22 commits into
rust-lang:mainfrom
tgross35:rollup-DfJzgDs

Conversation

@tgross35

@tgross35 tgross35 commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

View all comments

Successful merges:

r? @ghost

Create a similar rollup

jackh726 and others added 22 commits October 13, 2026 07:53
This avoids the unsoundness-hazard of using `&'ll mut` to represent an owning
pointer that typically does not live for as long as its enclosing context.
The SimpleCx type contains references tied to the lifetime of the LLVM context,
but the SimpleCx itself has a shorter lifetime.
This commit changes the type of LLVM context references from `&'ll Context` to
a dedicated newtype struct `Context<'ll>` with an invariant lifetime brand.

The current usage of `&'ll Context` is not sound, because covariance in `'ll`
allows different contexts to be mixed in ways that the underlying bindings are
not prepared to handle.

(Most of the time, mixing contexts is unlikely to happen by accident, but
switching to a more-sound API is good maintenance hygiene for these complex
bindings.)
Lex and parse emoji in lifetimes, and disallow them in the parser with a hard error. Allow emoji to start a lifetime name even if they are not XID_Start.

```
error: lifetimes cannot contain emoji
  --> $DIR/emoji-in-lifetime.rs:1:22
   |
LL | fn bad_lifetime_name<'🐛🐛🐛family👨👩👧👦>(
   |                      ^^^^^^^^^^^^^^^^^^^^^
```

Unify lifetime and identifier parsing. Use `bad_unicode_identifiers` for lifetimes.
During work on PR 164772 [1], I've noticed another tiny inconsistency
in doc code examples: `HashMap`'s `Entry::insert_entry()`'s
doc code example did not have an assertion where `BTreeMap`'s
`Entry::insert_entry()`'s docs did.

I've added an assertion where it was missing.

[1] rust-lang#164772
This function is documented as allowed to continue, which is useful
behavior during const eval. Split a new `resumable_breakpoint` intrinsic
from `breakpoint` which has the behavior of continuing in Miri and CTFE.
The original `nonzero_ops` feature
(rust-lang#84186) was stabilized before
the `strict_*` methods on the regular integer types, so the inclusion of
the `strict` methods on `NonZero` type was left as future work. Some
users (see e.g.
rust-lang#84186 (comment))
have recently requested these methods, and it's good to have them for
consistency.
To avoid further duplication in `nonzero.rs`, this new set of tests is
generated by macros similar to those used for the primitive integer
types in `coretests/tests/num/{u,}int_macros.rs`. Many of the tests in
`nonzero.rs` are good candidates to be moved to the new
`nonzero_{u,}int_module` macros, but that's left as future work.
…s-tests, r=lqd

Add tests for unsoundness involving alias liveness

This adds a number of tests demonstrating unsoundness with alias liveness (some on stable w/ NLL, some only with Polonius Alpha).

This reopens rust-lang#153215. See tests/ui/borrowck/alias-liveness/projection-hide-one-bound-153215.rs.

This adds tests for rust-lang#160979, rust-lang#161038, rust-lang#151861, and rust-lang#163886.

r? lqd
…tes, r=Mark-Simulacrum

core: Constify `resumable_breakpoint` and re-export it in `std`

This function is documented as allowed to continue, which is useful
behavior during const eval. Split a new `resumable_breakpoint` intrinsic
from `breakpoint` which has the behavior of continuing in Miri and CTFE.
cg_llvm: Use an invariant lifetime brand for LLVM contexts

This PR changes the type of LLVM context references from `&'ll Context` to `&'ll Context<'ll>`, introducing an invariant lifetime brand.

The current usage of `&'ll Context` is not sound, because covariance in `'ll` allows different contexts to be mixed in ways that the underlying bindings are not prepared to handle.

(Most of the time, mixing contexts is unlikely to happen by accident, but switching to a more-sound API is good maintenance hygiene for these complex bindings.)

In most code there is no practical difference between `&'ll Context<'ll>` and `&Context<'ll>`, but when storing the context in structures (e.g. SCx) it is helpful to be able to avoid an extra lifetime.

---

A big chunk of the migration was done via a regex replace of `Context` with `Context<'ll>`, and then manually chasing down any resultant/remaining errors. I have tried to manually check each of the changes multiple times, forwards and backwards, but this is a pretty tedious process so hopefully I did catch everything that shouldn't be there.

I intend to migrate various other related types as well, but just Context on its own is quite a lot to review already.

There should be no change to compiler output.
x86-64-linux-gnu seems to have working f128 now

There was some progress in llvm/llvm-project#44744 that seems to have helped.
At least, I can compile and run Miri's `tests/pass/float.rs` on my system successfully. Let's see what CI says.
…lmann,Veykril

Lex lifetimes as identifiers, recover from emoji and emit appropriate error

Lex and parse emoji in lifetimes by using the identifier logic, and disallow them in the parser with a hard error. Allow emoji to start a lifetime name even if they are not XID_Start.

```
error: identifiers cannot contain emoji: `'🐛🐛🐛family👨👩👧👦`
  --> $DIR/emoji-in-lifetime.rs:1:22
   |
LL | fn bad_lifetime_name<'🐛🐛🐛family👨👩👧👦>(
   |                      ^^^^^^^^^^^^^^^^^^^^^
```

Address rust-lang#141081 (but we could provide more information in the diagnostic, pointing at the specific chars, providing a link to the reference on identifiers and/or some other extra information).
Add `strict_` methods to `NonZero`

The original `nonzero_ops` feature
(rust-lang#84186) was stabilized before the `strict_*` methods on the regular integer types, so the inclusion of the `strict` methods on `NonZero` type was left as future work. Some users (see e.g.
rust-lang#84186 (comment)) have recently requested these methods, and it's good to have them for consistency.
…r=mejrs

Disable recovery when attribute parser shouldn't emit

Removes some duplicate diagnostics.

r? @mejrs
…8472

fd-views: enable test on Miri

rust-lang/miri#5453 is fixed so we can enable this test.

r? @the8472
…aapoalas

docs: Nitpick change in `HashMap`'s `.insert_entry()` doc example

During work on PR 164772 [1], I've noticed another tiny inconsistency in doc code examples: `HashMap`'s `Entry::insert_entry()`'s doc code example did not have an assertion where `BTreeMap`'s `Entry::insert_entry()`'s docs did.

I've added an assertion where it was missing.

[1] rust-lang#164772
@rust-bors rust-bors Bot added the rollup A PR which is a rollup label Oct 27, 2026
@rustbot rustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. F-autodiff `#![feature(autodiff)]` S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue. T-rust-analyzer Relevant to the rust-analyzer team, which will review and decide on the PR/issue. labels Oct 27, 2026
@tgross35

Copy link
Copy Markdown
Member Author

@bors force

@rust-bors

rust-bors Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Unknown command "force". Run @bors help or go to https://bors.rust-lang.org/help to see available commands.

@tgross35

Copy link
Copy Markdown
Member Author

Oi,
@bors r+ force rollup=never p=5

@rust-bors

rust-bors Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

📌 Commit afd1d7a has been approved by tgross35

It is now in the queue for this repository.

@JonathanBrouwer

JonathanBrouwer commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

I thought we also had a loose policy to not close others' rollups if you just don't like the size...

Ah I'm sorry, @jhpratt and I agreed we can do this to eachothers rollups to increase size. I do it to other people's rollups as well, such as @GuillaumeGomez's, and I haven't heard complaints before, so I wasn't aware of any policy. (I know that matthias doesn't like me touching his rollups, so I don't touch his). I won't do it to your rollups in the future, sorry again <3

this tested all the way through with the exception of the spurious error, why throw the likely success away.

Because there are now a lot more PRs in the queue that are waiting to be tested.
If the goal is to decrease average latency of PRs in queue to get merged, increasing rollup size is sometimes desirable.
An extreme example is that a rollup of size 2, even if you're 100% sure it will work, is still a waste of queue time as all other PRs need to wait an extra 3 hours. (or perhaps more than 3 hours if this fails spuriously again)
Sure there is a cutoff somewhere, but in my mind increasing from 9 to 24 is still "worth it". I can completely understand if you disagree about this though, we'd need to collect some statistics on failure rate to figure out an objective definition of "worth it".

I think it's especially defensible to increase rollup size because we need to optimize throughput more than latency right now, because of the test-aarch64-apple-macos-26-2 problems. And bigger rollups are always strictly better for throughput.

@rust-bors

This comment has been minimized.

@tgross35

Copy link
Copy Markdown
Member Author

No worries at all :)

I was curious about the math. From a quick back of the napkin and assuming the average PR has a 95% pass rate, a 9 PR rollup has 0.95^9=63% chance of passing, a 24 PR rollup has a 29% chance of passing. Expected values of 5.7 and 7.0 PRs merging, respectively, so larger rollups are favorable in general. But this rollup with a known overall ~98% chance of passing (accounting for some failure right at the end of the Apple job) has an expected value of 8.8 PRs, which is highest of the three options.

Of course that completely hinges on the 95% average pass rate which could be completely off base, better pass percentages favor large rollups and worse pass percentages favor smaller ones. And it doesn't account for things that get caught early or the spurious failures we've been enjoying...

@JonathanBrouwer

Copy link
Copy Markdown
Member

That's an interesting way of thinking about it, thanks for sharing!
I think the 95% number is realistic enough.

One thing that that calculation does not take into account, is that this only calculates the expected amount of PRs merged in the first "merge attempt", and the second "merge attempt" benefits from the information gained of the failed big rollup.

Forgive me for completely getting nerdsniped, let's assume there are 24 PRs waiting in queue, of which 9 are known-good.

Strategy 1: Merge the 9 (happy to assume 100% chance), then take a chance at merging the remaining 15.
Expected total PRs merged: 9 + 15 * 0.95^15 = 15.94

Strategy 2: Merge all 24, if that fails try again. This will only fail if at least 2 PRs are bad.

The chance of <2 bad PRs is 66.1% I used https://www.omnicalculator.com/statistics/coin-flip-probability and entered:
  • flips = 24
  • at least 23 heads
  • probability of heads = 95%
Expected total PRs merged: 24*.661 = 15.86

That is surprisingly close, but strategy 1 still wins!
Perhaps analyzing 3 merge attempts makes the difference, but I don't feel like doing that :p

@JonathanBrouwer

JonathanBrouwer commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

Oh wait I fucked up the analysis of strategy 2. It should take into account that 9 PRs are known-good.
Then the chance of <2 bad PRs is 82.9% (15 coin flips of chance 0.95, at least 14 heads), making the expected total PRs merged 24*.829 = 19.9 PRs.

@jhpratt

jhpratt commented Oct 27, 2026

Copy link
Copy Markdown
Member

Yeah, that was just the two of us agreeing privately because I was tired of leaving a comment every time lol. At the time it was largely the two of us who were doing rollups, so it covered most. I don't think it's ever been explicitly stated publicly.

@rust-bors rust-bors Bot added merged-by-bors This PR was explicitly merged by bors. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Oct 27, 2026
@rust-bors

rust-bors Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

☀️ Test successful - CI
Approved by: tgross35
Duration: 3h 19m 30s
Pushing 41089d0 to main...

@rust-bors
rust-bors Bot merged commit 41089d0 into rust-lang:main Oct 27, 2026
29 checks passed
@rustbot rustbot added this to the 1.101.0 milestone Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor
What is this? This is an experimental post-merge analysis report that shows differences in test outcomes between the merged PR and its parent PR.

Comparing 16d1ffa (parent) -> 41089d0 (this PR)

Test differences

Show 2067 test diffs

Stage 1

  • num::floats::ceil::test_f128: [missing] -> pass (J1)
  • num::floats::clamp_max_is_nan::test_f128: [missing] -> pass (J1)
  • num::floats::clamp_to_min_is_nan::test_f128: [missing] -> pass (J1)
  • num::floats::copysign::test_f128: [missing] -> pass (J1)
  • num::floats::exp::test_f128: [missing] -> pass (J1)
  • num::floats::fract::test_f128: [missing] -> pass (J1)
  • num::floats::log::test_f128: [missing] -> pass (J1)
  • num::floats::min::test_f128: [missing] -> pass (J1)
  • num::floats::round::test_f128: [missing] -> pass (J1)
  • num::floats::signum::test_f128: [missing] -> pass (J1)
  • nonzero::test_from_str_radix: pass -> [missing] (J2)
  • nonzero::test_match_option_arc: pass -> [missing] (J2)
  • nonzero::test_nonzero_from_int_on_success: pass -> [missing] (J2)
  • nonzero::test_nonzero_highest_one: pass -> [missing] (J2)
  • nonzero::test_nonzero_lowest_one: pass -> [missing] (J2)
  • nonzero::test_signed_nonzero_neg: pass -> [missing] (J2)
  • num::nonzero::int::i128::test_strict_mul_overflow_limit: [missing] -> pass (J2)
  • num::nonzero::int::i16::test_strict_mul_overflow_neg_large: [missing] -> pass (J2)
  • num::nonzero::int::i16::test_strict_pow: [missing] -> pass (J2)
  • num::nonzero::int::i32::test_strict_mul_overflow_large: [missing] -> pass (J2)
  • num::nonzero::int::i32::test_strict_pow_overflow_neg_base: [missing] -> pass (J2)
  • num::nonzero::int::i64::test_strict_mul_overflow_limit: [missing] -> pass (J2)
  • num::nonzero::int::i64::test_strict_neg: [missing] -> pass (J2)
  • num::nonzero::int::i64::test_strict_neg_overflow: [missing] -> pass (J2)
  • num::nonzero::int::i64::test_strict_pow_overflow_neg_base: [missing] -> pass (J2)
  • num::nonzero::int::i8::test_strict_mul: [missing] -> pass (J2)
  • num::nonzero::int::i8::test_strict_mul_overflow_large: [missing] -> pass (J2)
  • num::nonzero::int::i8::test_strict_mul_overflow_neg_min: [missing] -> pass (J2)
  • num::nonzero::int::i8::test_strict_neg_overflow: [missing] -> pass (J2)
  • num::nonzero::int::i8::test_strict_pow_overflow_big_exp: [missing] -> pass (J2)
  • num::nonzero::int::isize::test_strict_pow_overflow_big_exp: [missing] -> pass (J2)
  • num::nonzero::int::isize::test_strict_pow_overflow_neg_base: [missing] -> pass (J2)
  • num::nonzero::nonzero_trailing_zeros: [missing] -> pass (J2)
  • num::nonzero::test_from_nonzero: [missing] -> pass (J2)
  • num::nonzero::test_match_on_nonzero_option: [missing] -> pass (J2)
  • num::nonzero::test_nonzero_bit_width: [missing] -> pass (J2)
  • num::nonzero::test_nonzero_bitor_assign: [missing] -> pass (J2)
  • num::nonzero::test_nonzero_isolate_highest_one: [missing] -> pass (J2)
  • num::nonzero::test_nonzero_isolate_lowest_one: [missing] -> pass (J2)
  • num::nonzero::test_size_nonzero_in_option: [missing] -> pass (J2)
  • num::nonzero::uint::u128::test_strict_mul_overflow_large: [missing] -> pass (J2)
  • num::nonzero::uint::u128::test_strict_pow_overflow_big_base: [missing] -> pass (J2)
  • num::nonzero::uint::u16::test_strict_add_overflow_big_small: [missing] -> pass (J2)
  • num::nonzero::uint::u16::test_strict_mul_overflow_limit: [missing] -> pass (J2)
  • num::nonzero::uint::u16::test_strict_pow: [missing] -> pass (J2)
  • num::nonzero::uint::u32::test_strict_add_overflow_big_small: [missing] -> pass (J2)
  • num::nonzero::uint::u32::test_strict_add_overflow_small_big: [missing] -> pass (J2)
  • num::nonzero::uint::u32::test_strict_mul_overflow_limit: [missing] -> pass (J2)
  • num::nonzero::uint::u32::test_strict_pow_overflow_big_exp: [missing] -> pass (J2)
  • num::nonzero::uint::u8::test_strict_add_overflow_big_small: [missing] -> pass (J2)
  • num::nonzero::uint::usize::test_strict_add_overflow_small_big: [missing] -> pass (J2)
  • num::nonzero::uint::usize::test_strict_pow: [missing] -> pass (J2)
  • [ui] tests/ui/borrowck/alias-liveness/marker-trait-blanket-151861.rs#polonius: [missing] -> pass (J3)
  • [ui] tests/ui/borrowck/alias-liveness/rpit-shorten-through-impl-161038.rs#nll: [missing] -> pass (J3)
  • [ui (polonius)] tests/ui/borrowck/alias-liveness/alias-static-interface-lifetime-151861.rs: [missing] -> pass (J5)
  • [ui (polonius)] tests/ui/borrowck/alias-liveness/higher-ranked-use-bound.rs: [missing] -> pass (J5)
  • [ui (polonius)] tests/ui/borrowck/alias-liveness/rpit-shorten-through-impl-161038.rs#polonius: [missing] -> ignore (ignored when comparing with compare-mode-polonius ((explicit revisions))) (J5)

Stage 2

  • nonzero::nonzero_trailing_zeros: pass -> [missing] (J0)
  • nonzero::test_from_ascii_bytes: pass -> [missing] (J0)
  • nonzero::test_match_on_nonzero_option: pass -> [missing] (J0)
  • nonzero::test_match_option_string: pass -> [missing] (J0)
  • nonzero::test_match_option_vec: pass -> [missing] (J0)
  • nonzero::test_nonzero_from_int_on_success: pass -> [missing] (J0)
  • num::nonzero::int::i128::test_strict_mul_overflow_limit: [missing] -> pass (J0)
  • num::nonzero::int::i128::test_strict_neg_overflow: [missing] -> pass (J0)
  • num::nonzero::int::i128::test_strict_pow_overflow_big_base: [missing] -> pass (J0)
  • num::nonzero::int::i16::test_strict_mul_overflow_neg_large: [missing] -> pass (J0)
  • num::nonzero::int::i16::test_strict_pow: [missing] -> pass (J0)
  • num::nonzero::int::i16::test_strict_pow_overflow_neg_base: [missing] -> pass (J0)
  • num::nonzero::int::i32::test_strict_mul_overflow_neg_large: [missing] -> pass (J0)
  • num::nonzero::int::i32::test_strict_neg: [missing] -> pass (J0)
  • num::nonzero::int::i32::test_strict_pow_overflow_big_exp: [missing] -> pass (J0)
  • num::nonzero::int::i64::test_strict_neg_overflow: [missing] -> pass (J0)
  • num::nonzero::int::isize::test_strict_mul_overflow_limit: [missing] -> pass (J0)
  • num::nonzero::int::isize::test_strict_pow_overflow_big_exp: [missing] -> pass (J0)
  • num::nonzero::int::isize::test_strict_pow_overflow_neg_base: [missing] -> pass (J0)
  • num::nonzero::test_from_ascii_bytes: [missing] -> pass (J0)
  • num::nonzero::test_from_nonzero: [missing] -> pass (J0)
  • num::nonzero::test_match_nonzero_const_pattern: [missing] -> pass (J0)
  • num::nonzero::test_match_option_empty_vec: [missing] -> pass (J0)
  • num::nonzero::test_nonzero_bitor_assign: [missing] -> pass (J0)
  • num::nonzero::test_signed_nonzero_neg: [missing] -> pass (J0)
  • num::nonzero::uint::u128::test_strict_mul_overflow_limit: [missing] -> pass (J0)
  • num::nonzero::uint::u16::test_strict_add_overflow_big_small: [missing] -> pass (J0)
  • num::nonzero::uint::u16::test_strict_mul_overflow_limit: [missing] -> pass (J0)
  • num::nonzero::uint::u16::test_strict_pow_overflow_big_exp: [missing] -> pass (J0)
  • num::nonzero::uint::u32::test_strict_add: [missing] -> pass (J0)
  • num::nonzero::uint::u32::test_strict_mul_overflow_large: [missing] -> pass (J0)
  • num::nonzero::uint::u64::test_strict_add: [missing] -> pass (J0)
  • num::nonzero::uint::u64::test_strict_add_overflow_small_big: [missing] -> pass (J0)
  • num::nonzero::uint::u8::test_strict_add_overflow_small_big: [missing] -> pass (J0)
  • process::const_breakpoint: [missing] -> pass (J0)
  • num::floats::copysign::test_f128: [missing] -> pass (J4)
  • num::floats::exp2::test_f128: [missing] -> pass (J4)
  • num::floats::powf::test_f128: [missing] -> pass (J4)
  • num::floats::rem_euclid::test_f128: [missing] -> pass (J4)
  • num::floats::round_ties_even::test_f128: [missing] -> pass (J4)
  • num::floats::sqrt_domain::test_f128: [missing] -> pass (J4)
  • [ui] tests/ui/borrowck/alias-liveness/marker-trait-blanket-151861.rs#polonius: [missing] -> pass (J6)
  • [ui] tests/ui/borrowck/alias-liveness/rpit-shorten-through-impl-161038.rs#nll: [missing] -> pass (J6)

(and 417 additional test diffs)

Additionally, 1550 doctest diffs were found. These are ignored, as they are noisy.

Job group index

Test dashboard

Run

cargo run --manifest-path src/ci/citool/Cargo.toml -- \
    test-dashboard 41089d07a0a2afc16adfe28a760d94d73d7298a4 --output-dir test-dashboard

And then open test-dashboard/index.html in your browser to see an overview of all executed tests.

Job duration changes

  1. test-x86_64-gnu-nopt: 1h 34m -> 2h 38m (+68.4%)
  2. test-various: 1h 25m -> 2h 18m (+60.8%)
  3. test-tidy: 4m 26s -> 6m 48s (+53.4%)
  4. dist-aarch64-linux: 1h 14m -> 1h 51m (+49.4%)
  5. dist-various-2: 37m 10s -> 55m 27s (+49.2%)
  6. dist-x86_64-msvc: 2h 13m -> 3h 17m (+48.5%)
  7. dist-x86_64-solaris: 1h 14m -> 1h 46m (+43.0%)
  8. test-x86_64-gnu-miri: 1h 22m -> 51m 30s (-37.8%)
  9. test-arm-android: 1h 50m -> 1h 10m (-36.3%)
  10. test-x86_64-gnu-stdlib-semver-check: 18m 24s -> 11m 44s (-36.2%)
How to interpret the job duration changes?

Job durations can vary a lot, based on the actual runner instance
that executed the job, system noise, invalidated caches, etc. The table above is provided
mostly for t-infra members, for simpler debugging of potential CI slow-downs.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (41089d0): comparison URL.

Overall result: ❌ regressions - no action needed

@rustbot label: -perf-regression

Instruction count

Our most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
0.1% [0.1%, 0.1%] 1
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) - - 0

Max RSS (memory usage)

Results (primary 0.7%, secondary -0.3%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
1.5% [0.6%, 3.4%] 5
Regressions ❌
(secondary)
1.7% [0.5%, 2.9%] 2
Improvements ✅
(primary)
-0.7% [-1.2%, -0.4%] 3
Improvements ✅
(secondary)
-4.4% [-4.4%, -4.4%] 1
All ❌✅ (primary) 0.7% [-1.2%, 3.4%] 8

Cycles

Results (primary -0.0%, secondary 1.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
0.8% [0.4%, 1.2%] 10
Regressions ❌
(secondary)
4.4% [4.4%, 4.4%] 1
Improvements ✅
(primary)
-1.0% [-1.7%, -0.4%] 8
Improvements ✅
(secondary)
-2.2% [-2.2%, -2.2%] 1
All ❌✅ (primary) -0.0% [-1.7%, 1.2%] 18

Binary size

Results (primary -0.1%, secondary -0.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
-0.1% [-0.1%, -0.1%] 1
Improvements ✅
(secondary)
-0.1% [-0.1%, -0.1%] 4
All ❌✅ (primary) -0.1% [-0.1%, -0.1%] 1

Bootstrap: 488.102s -> 490.666s (0.53%)
Artifact size: 405.92 MiB -> 405.86 MiB (-0.01%)

@rust-bors

rust-bors Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

📌 Perf builds for each rolled up PR:

PR# Message Perf Build Sha
#164168 Add tests for unsoundness involving alias liveness 170942be97d8a88734c88b5ce3a6cd0d83214420
(link)
#164608 core: Constify resumable_breakpoint and re-export it in `… 81b2bfd0ed2321bd1c3046df2c0c4a40957a1769
(link)
#164787 cg_llvm: Use an invariant lifetime brand for LLVM contexts 36568d3708b40573e9768e467823ec4750651cbc
(link)
#164966 x86-64-linux-gnu seems to have working f128 now fc149629038a450c20afff428e255f105b0d4c7b
(link)
#153893 Lex lifetimes as identifiers, recover from emoji and emit a… dc9d02aafae80c7b498252231afcdd23660b9cad
(link)
#164848 Add strict_ methods to NonZero 0b1030745333f557e8e0402e124ee9f49cdcec8a
(link)
#164895 Disable recovery when attribute parser shouldn't emit ce9b092adf5043fe9e298f96b9652aca148b350a
(link)
#164963 fd-views: enable test on Miri 98d83bbbbad72b1f2d28445fdb11057472689e76
(link)
#165004 docs: Nitpick change in HashMap's .insert_entry() doc e… 65d857f84ee2b741cbe562586bbef0e811a5ebe4
(link)

parent commit: 16d1ffac17

In the case of a perf regression, run the following command with the SHAs of each PR you suspect might be the cause: @rust-timer triage $SHA $SHA $SHA..., or run @rust-timer triage all to benchmark all rollup members.

@tgross35
tgross35 deleted the rollup-DfJzgDs branch October 27, 2026 19:50
@tgross35

Copy link
Copy Markdown
Member Author

Continuing the nerdsnipe, with the naive approach (not accounting for high-probability PRs), the maximum expected value is at $n = \frac{-1}{ln(\alpha)}$, where $\alpha$ is the pass probability. So assuming 95% is right-ish, that puts the ideal rollup size at 19.5 PRs :) perhaps a few more than that based on what you computed with rerun probability.

It would be interesting to compute the stats on this. A sufficiently advanced bors could probably automatically create pretty good rollups.

@JonathanBrouwer

JonathanBrouwer commented Oct 28, 2026 •

Copy link
Copy Markdown
Member

FYI I proposed a plan towards auto-rollup here: #t-infra/bors > Auto-rollup: The next big improvement of bors? @ 💬

I will likely start implementing this in the near future

@GuillaumeGomez

Copy link
Copy Markdown
Member

Just saying: love the maths, I had a good read. :)

Also I love the idea to automate rollups!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. F-autodiff `#![feature(autodiff)]` merged-by-bors This PR was explicitly merged by bors. rollup A PR which is a rollup T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-libs Relevant to the library team, which will review and decide on the PR/issue. T-rust-analyzer Relevant to the rust-analyzer team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.