Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Make Rc<T>::deref zero-cost - #141348

Open
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref
Open

Make Rc<T>::deref zero-cost#141348
EFanZh wants to merge 18 commits into
rust-lang:mainfrom
EFanZh:zero-cost-rc-deref

Conversation

@EFanZh

@EFanZhEFanZh commented May 21, 2025

Copy link
Copy Markdown
Contributor

View all comments

This PR makes Rc::deref zero-cost by changing the internal pointer to point directly to the value instead of to the allocation.

This PR is split from #132553, which will also make Arc::deref zero-cost.

Review status:

  • 8d8878a Add RefCounts and RcLayout types
  • abe9c27 Add allocation functions
  • cfa6ea8 Add RefCounter trait
  • 77755f0 Add RawWeak type
  • 7fce1c4 Add RawWeak methods for sized values
  • adddf22 Add RawWeak methods for slice values
  • 99522fc Implement necessary traits for RawWeak
  • 393e377 Add RawRc type
  • 6cb537c Add RawRc methods for sized values
  • 6b47771 Add RawRc methods for MaybeUninit<T> values
  • 9184466 Add RawRc methods for slice values
  • 33881a5 Add RawRc methods for dyn Any type
  • 17e84c6 Implement necessary traits for RawRc
  • 20e0aba Add RawUniqueRc type
  • 82525d0 Add RawUniqueRc methods for sized values
  • 8bc9dea Implement necessary traits for RawUniqueRc
  • cee99e8 Implement alloc::rc::{Rc,Weak,UniqueRc} with alloc::raw_rc types
  • 2676c63 (HEAD -> zero-cost-rc-deref) Add LLVM codegen tests for new Rc implementation

@rustbotrustbot added 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 May 21, 2025
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from df34f84 to d3a7429CompareMay 24, 2025 05:01
@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch 2 times, most recently from bc84ec6 to 19fb34bCompareMay 24, 2025 09:00
@EFanZh
EFanZh marked this pull request as ready for review May 24, 2025 10:22
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label May 24, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 19fb34b to f5245baCompareMay 26, 2025 15:02
@oli-obk

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label May 26, 2025
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

⌛ Trying commit f5245ba with merge 8ef4a25...

bors added a commit that referenced this pull request May 26, 2025
Make `Rc<T>::deref` zero-cost
This PR makes `Rc::deref` zero-cost by changing the internal pointer so that it points to the value directly instead of the allocation.
This is split out from #132553, which will also make `Arc::deref` zero-cost.
@bors

bors commented May 26, 2025

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 8ef4a25 (8ef4a25b05973cfbd577205c507a891d07f0ae5f)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (8ef4a25): comparison URL.

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

Benchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf.

Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please fix the regressions and do another perf run. If the next run shows neutral or positive results, the label will be automatically removed.

@bors rollup=never
@rustbot label: -S-waiting-on-perf +perf-regression

Instruction count

This is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.

meanrangecount
Regressions ❌
(primary)
0.5%[0.2%, 0.7%]4
Regressions ❌
(secondary)
1.1%[0.2%, 2.5%]9
Improvements ✅
(primary)
-1.0%[-2.0%, -0.5%]7
Improvements ✅
(secondary)
-1.3%[-2.0%, -0.1%]4
All ❌✅ (primary)-0.5%[-2.0%, 0.7%]11

Max RSS (memory usage)

Results (primary -0.3%, secondary -0.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
8.4%[8.4%, 8.4%]1
Regressions ❌
(secondary)
3.1%[2.0%, 4.8%]6
Improvements ✅
(primary)
-4.6%[-7.1%, -2.1%]2
Improvements ✅
(secondary)
-4.7%[-6.4%, -2.9%]4
All ❌✅ (primary)-0.3%[-7.1%, 8.4%]3

Cycles

Results (primary -0.5%, secondary -1.9%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.9%[0.9%, 0.9%]1
Regressions ❌
(secondary)
2.1%[2.1%, 2.1%]2
Improvements ✅
(primary)
-1.9%[-1.9%, -1.9%]1
Improvements ✅
(secondary)
-3.9%[-9.3%, -1.5%]4
All ❌✅ (primary)-0.5%[-1.9%, 0.9%]2

Binary size

Results (primary 0.2%, secondary 1.6%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
0.3%[0.0%, 1.8%]29
Regressions ❌
(secondary)
1.8%[0.0%, 6.4%]9
Improvements ✅
(primary)
-0.3%[-0.6%, -0.1%]5
Improvements ✅
(secondary)
-0.4%[-0.4%, -0.4%]1
All ❌✅ (primary)0.2%[-0.6%, 1.8%]34

Bootstrap: 775.728s -> 776.531s (0.10%)
Artifact size: 366.25 MiB -> 366.33 MiB (0.02%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels May 26, 2025
@apiraino

Copy link
Copy Markdown
Contributor

Would anyone comment the perf. run? cc @EFanZh thanks!

@rustbot author

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 31, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment threadlibrary/alloc/src/raw_rc/mod.rs Outdated
@rustbot

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 120b6ad to fd93f9fCompareAugust 29, 2026 16:43
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from fd93f9f to 307f110CompareAugust 30, 2026 12:49
@rustbot

This comment has been minimized.

@rust-bors

This comment has been minimized.

@EFanZh
EFanZhforce-pushed the zero-cost-rc-deref branch from 307f110 to c3ba010CompareAugust 31, 2026 14:27
@rustbot

Copy link
Copy Markdown
Collaborator

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.

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

Labels

perf-regressionPerformance regression.S-waiting-on-reviewStatus: Awaiting review from the assignee but also interested parties.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@EFanZh@rust-log-analyzer@rustbot@oli-obk@rust-timer@bors@apiraino@tgross35@clarfonthey@the8472@camsteffen@teor2345@joboet@Dylan-DPC