Skip to content

Conversation

@cjgillot
Copy link
Contributor

@cjgillot cjgillot commented Oct 26, 2025

This PR changes the way we compute the value of the offset_of! macro in MIR. The current implementation uses a dedicated MIR rvalue.

This PR proposes to replace it by an inline constant which sums calls to a new intrinsic offset_of(variant index, field index). The desugaring is done at THIR building time, easier that doing it on MIR.

The new intrinsic is only meant to be used by const-eval. LLVM codegen will refuse to generate code for it.

We replace:

a = offset_of!(T, Variant1.Field1.Variant2.Field2);

By:

a = const {constant#n};

{constant#n}: usize = {
    _1 = offset_of::<T>(index of Variant1, index of Field1);
    _2 = offset_of::<U>(index of Variant2, index of Field2); // Where T::Variant1::Field1 has type U
    _0 = _1 + _2
}

The second commit modifies intrinsic const checking to take allow_internal_unstable into account. The new intrinsic should only be called from stable offset_of! macro. The intrinsic itself is unstable, const-unstable, but rustc_intrinsic_const_stable_indirect.

Fixes #123959
Fixes #125680
Fixes #129425
Fixes #136175

r? @ghost

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-clippy Relevant to the Clippy team. 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. labels Oct 26, 2025
@rust-log-analyzer

This comment has been minimized.

@cjgillot
Copy link
Contributor Author

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

rust-bors bot added a commit that referenced this pull request Oct 27, 2025
Replace OffsetOf by an actual sum of calls to intrinsic.
@rustbot rustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Oct 27, 2025
@rust-bors
Copy link

rust-bors bot commented Oct 27, 2025

☀️ Try build successful (CI)
Build commit: 7721497 (772149783c4c312fd88b7dfaa68a045b14db3280, parent: f37aa9955f03bb1bc6fe08670cb1ecae534b5815)

@rust-timer

This comment has been minimized.

@rust-timer
Copy link
Collaborator

Finished benchmarking commit (7721497): comparison URL.

Overall result: ❌✅ regressions and improvements - no action needed

Benchmarking this pull request means it may be perf-sensitive – we'll automatically label it not fit for rolling up. You can override this, but we strongly advise not to, due to possible changes in compiler perf.

@bors rollup=never
@rustbot label: -S-waiting-on-perf -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.0%, 0.1%] 3
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-0.1% [-0.1%, -0.1%] 3
All ❌✅ (primary) - - 0

Max RSS (memory usage)

Results (secondary -1.9%)

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)
2.6% [2.1%, 3.2%] 2
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-3.7% [-4.9%, -1.5%] 5
All ❌✅ (primary) - - 0

Cycles

Results (secondary -0.8%)

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)
2.7% [1.6%, 5.0%] 3
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-6.1% [-7.9%, -4.2%] 2
All ❌✅ (primary) - - 0

Binary size

This benchmark run did not return any relevant results for this metric.

Bootstrap: 473.876s -> 473.729s (-0.03%)
Artifact size: 390.50 MiB -> 390.46 MiB (-0.01%)

@rustbot rustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Oct 27, 2025
@bors
Copy link
Collaborator

bors commented Oct 31, 2025

☔ The latest upstream changes (presumably #148324) made this pull request unmergeable. Please resolve the merge conflicts.

@cjgillot cjgillot marked this pull request as ready for review November 1, 2025 23:47
@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Nov 1, 2025
@rustbot
Copy link
Collaborator

rustbot commented Nov 1, 2025

Some changes occurred in match checking

cc @Nadrieril

Some changes occurred to the CTFE machinery

cc @RalfJung, @oli-obk, @lcnr

⚠️ #[rustc_intrinsic_const_stable_indirect] controls whether intrinsics can be exposed to stable const
code; adding it needs t-lang approval.

cc @rust-lang/wg-const-eval

Some changes occurred to constck

cc @fee1-dead

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

This PR changes rustc_public

cc @oli-obk, @celinval, @ouz-a

Some changes occurred in rustc_ty_utils::consts.rs

cc @BoxyUwU

Some changes occurred to the intrinsics. Make sure the CTFE / Miri interpreter
gets adapted for the changes, if necessary.

cc @rust-lang/miri, @RalfJung, @oli-obk, @lcnr

This PR changes MIR

cc @oli-obk, @RalfJung, @JakobDegen, @vakaras

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri interpreter

cc @rust-lang/miri

Some changes occurred in compiler/rustc_codegen_ssa

cc @WaffleLapkin

This PR changes a file inside tests/crashes. If a crash was fixed, please move into the corresponding ui subdir and add 'Fixes #' to the PR description to autoclose the issue upon merge.

@rustbot rustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Nov 1, 2025
@cjgillot cjgillot added the I-lang-nominated Nominated for discussion during a lang team meeting. label Nov 2, 2025
@oli-obk oli-obk self-assigned this Nov 2, 2025
@BoxyUwU
Copy link
Member

BoxyUwU commented Nov 2, 2025

What's the justification/benefit for doing this, and what user facing impact does it have (i.e. why does it need a lang nomination)?

@cjgillot
Copy link
Contributor Author

cjgillot commented Nov 2, 2025

My justification is simplifying MIR. This feature was implemented as a specific MIR statement, but does not need to, an intrinsic is sufficient.

There should be no user-facing change because of the offset_of manipulation. Maybe some diagnostics, but not more.

However, there are 2 user-facing changes in this PR that t-lang may want to know:

  • const-stability of intrinsics now takes allow_internal_unstable into account;
  • we get an additional intrinsic with rustc_intrinsic_const_stable_indirect.

@WaffleLapkin

This comment was marked as resolved.

@cjgillot

This comment was marked as resolved.

@traviscross traviscross added the T-lang Relevant to the language team label Nov 5, 2025
@rustbot

This comment has been minimized.

@rustbot
Copy link
Collaborator

rustbot commented Nov 18, 2025

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@oli-obk
Copy link
Contributor

oli-obk commented Nov 18, 2025

@bors r=scottmcm

@bors
Copy link
Collaborator

bors commented Nov 18, 2025

📌 Commit e799160 has been approved by scottmcm

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 18, 2025
@bors
Copy link
Collaborator

bors commented Nov 18, 2025

⌛ Testing commit e799160 with merge f9e7961...

@bors
Copy link
Collaborator

bors commented Nov 18, 2025

☀️ Test successful - checks-actions
Approved by: scottmcm
Pushing f9e7961 to main...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Nov 18, 2025
@bors bors merged commit f9e7961 into rust-lang:main Nov 18, 2025
12 checks passed
@rustbot rustbot added this to the 1.93.0 milestone Nov 18, 2025
@github-actions
Copy link
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 c199562 (parent) -> f9e7961 (this PR)

Test differences

Show 82 test diffs

Stage 1

  • [crashes] tests/crashes/123959.rs: pass -> [missing] (J3)
  • [crashes] tests/crashes/125680.rs: pass -> [missing] (J3)
  • [crashes] tests/crashes/129425.rs: pass -> [missing] (J3)
  • [crashes] tests/crashes/136175-2.rs: pass -> [missing] (J3)
  • [mir-opt] tests/mir-opt/building/offset_of.rs: [missing] -> pass (J3)
  • [mir-opt] tests/mir-opt/dataflow-const-prop/offset_of.rs: pass -> [missing] (J3)
  • [ui] tests/ui/offset-of/inside-array-length.rs: [missing] -> pass (J3)
  • [ui] tests/ui/thir-print/offset_of.rs: [missing] -> pass (J3)

Stage 2

  • [crashes] tests/crashes/123959.rs: pass -> [missing] (J0)
  • [crashes] tests/crashes/125680.rs: pass -> [missing] (J0)
  • [crashes] tests/crashes/129425.rs: pass -> [missing] (J0)
  • [crashes] tests/crashes/136175-2.rs: pass -> [missing] (J0)
  • [ui] tests/ui/offset-of/inside-array-length.rs: [missing] -> pass (J1)
  • [ui] tests/ui/thir-print/offset_of.rs: [missing] -> pass (J1)
  • [mir-opt] tests/mir-opt/building/offset_of.rs: [missing] -> pass (J2)
  • [mir-opt] tests/mir-opt/dataflow-const-prop/offset_of.rs: pass -> [missing] (J2)

Additionally, 66 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 f9e7961506a97b318ad4815b8ce94bb045562f89 --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. x86_64-gnu-gcc: 2788.1s -> 3512.0s (+26.0%)
  2. aarch64-apple: 7671.6s -> 9098.6s (+18.6%)
  3. pr-check-1: 1633.7s -> 1918.4s (+17.4%)
  4. aarch64-gnu-llvm-20-1: 3230.0s -> 3765.5s (+16.6%)
  5. x86_64-rust-for-linux: 2666.8s -> 3098.8s (+16.2%)
  6. x86_64-gnu-llvm-20: 2257.8s -> 2593.6s (+14.9%)
  7. dist-x86_64-solaris: 5282.4s -> 5894.9s (+11.6%)
  8. dist-aarch64-msvc: 6224.0s -> 5534.3s (-11.1%)
  9. aarch64-gnu-debug: 3940.7s -> 4360.6s (+10.7%)
  10. x86_64-gnu-llvm-20-1: 3166.7s -> 3489.0s (+10.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.

@bors bors mentioned this pull request Nov 18, 2025
@rust-timer
Copy link
Collaborator

Finished benchmarking commit (f9e7961): comparison URL.

Overall result: ❌✅ regressions and improvements - please read the text below

Our benchmarks found a performance regression caused by this PR.
This might be an actual regression, but it can also be just noise.

Next Steps:

  • If the regression was expected or you think it can be justified,
    please write a comment with sufficient written justification, and add
    @rustbot label: +perf-regression-triaged to it, to mark the regression as triaged.
  • If you think that you know of a way to resolve the regression, try to create
    a new PR with a fix for the regression.
  • If you do not understand the regression or you think that it is just noise,
    you can ask the @rust-lang/wg-compiler-performance working group for help (members of this group
    were already notified of this PR).

@rustbot label: +perf-regression
cc @rust-lang/wg-compiler-performance

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)
3.1% [3.1%, 3.1%] 1
Regressions ❌
(secondary)
0.3% [0.1%, 0.6%] 6
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-0.4% [-0.9%, -0.0%] 7
All ❌✅ (primary) 3.1% [3.1%, 3.1%] 1

Max RSS (memory usage)

Results (primary 2.1%, secondary -0.6%)

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

mean range count
Regressions ❌
(primary)
2.1% [2.0%, 2.2%] 2
Regressions ❌
(secondary)
3.4% [2.4%, 4.4%] 3
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-2.6% [-5.5%, -0.7%] 6
All ❌✅ (primary) 2.1% [2.0%, 2.2%] 2

Cycles

Results (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)
- - 0
Regressions ❌
(secondary)
4.0% [2.3%, 6.6%] 5
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-4.5% [-7.6%, -1.3%] 5
All ❌✅ (primary) - - 0

Binary size

Results (primary 1.1%)

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

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

Bootstrap: 474.876s -> 471.624s (-0.68%)
Artifact size: 388.76 MiB -> 388.73 MiB (-0.01%)

@rustbot rustbot added the perf-regression Performance regression. label Nov 18, 2025
@lqd
Copy link
Member

lqd commented Nov 18, 2025

clap_derive is noise, include-blob looks like noise.

@cjgillot cjgillot deleted the no-offset-of branch November 18, 2025 21:30
tautschnig added a commit to tautschnig/kani that referenced this pull request Nov 19, 2025
Relevant upstream PR:
- rust-lang/rust#148151 (Replace OffsetOf by an
  actual sum of calls to intrinsic.)

Resolves: model-checking#4481
@panstromek
Copy link
Contributor

perf triage:

As indicated by the comment above, clap_derive is noise, include-blob is also noise (at least the opt variants, other ones didn't return to previous state, but they are tiny in absolute numbers).

@rustbot label: +perf-regression-triaged

@rustbot rustbot added the perf-regression-triaged The performance regression has been triaged. label Nov 19, 2025
github-merge-queue bot pushed a commit to model-checking/kani that referenced this pull request Nov 19, 2025
Relevant upstream PR:
- rust-lang/rust#148151 (Replace OffsetOf by an
actual sum of calls to intrinsic.)

Resolves: #4481

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. I-lang-radar Items that are on lang's radar and will need eventual work or consideration. merged-by-bors This PR was explicitly merged by bors. perf-regression Performance regression. perf-regression-triaged The performance regression has been triaged. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-clippy Relevant to the Clippy team. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-lang Relevant to the language team T-libs Relevant to the library team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting

Projects

None yet