Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@zetanumbers@petrochenkov@rust-timer@rust-log-analyzer@Kobzol@rustbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} 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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@zetanumbers@petrochenkov@rust-timer@rust-log-analyzer@Kobzol@rustbot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } 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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

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

Experiment: No dynamic dispatch for query functions - #155244

Draft
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch
Draft

Experiment: No dynamic dispatch for query functions#155244
zetanumbers wants to merge 15 commits into
rust-lang:mainfrom
zetanumbers:no_dynamic_dispatch

Conversation

@zetanumbers

@zetanumberszetanumbers commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

View all comments

Currently a lot of functions in the query system go through dynamic dispatch. This PR eliminates dynamic dispatch as much as possible in rustc_middle and rustc_query_impl. Actually rustc_query_impl was merged into rustc_middle to reduce the number of small changes in this PR.

Please run rustc_perf as this PR might bring performance benefits.

r? @petrochenkov

@rustbotrustbot added A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. A-meta Area: Issues & PRs about the rust-lang/rust repository itself A-query-system Area: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-bootstrap Relevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap) T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 13, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 13, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

At this point the code is super messy as an experiment. However I've found some changes feel more natural than the current impl, so I might return and polish it as a refactor.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

❗ There is currently no auto build in progress on this PR.

Hint: There is a pending try build on this PR. Maybe you meant to cancel it? You can do that using @bors try cancel.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try cancel

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Try build cancelled. Cancelled workflows:

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Apr 13, 2026
Experiment: No dynamic dispatch for query functions
@rust-bors

This comment has been minimized.

@rust-bors

rust-borsBot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 311dde6 (311dde6ca8a853abe25548ec530e16bfdc4cfd2b, parent: 14196dbfa3eb7c30195251eac092b1b86c8a2d84)

@rust-timer

This comment has been minimized.

@Kobzol

Copy link
Copy Markdown
Member

I vaguely remember something similar tried in the past, but maybe I misremember 🤔 Let's try 🔮: small compile-time wins and a massive bootstrap time regression 😆

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (311dde6): comparison URL.

Overall result: ❌✅ regressions and improvements - please read:

Benchmarking means the PR may be perf-sensitive. It's automatically marked not fit for rolling up. Overriding is possible but disadvised: it risks changing compiler perf.

Next, please: If you can, justify the regressions found in this try perf run in writing along with @rustbot label: +perf-regression-triaged. If not, fix the regressions and do another perf run. Neutral or positive results will clear the label automatically.

@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.

meanrangecount
Regressions ❌
(primary)
0.7%[0.2%, 1.1%]8
Regressions ❌
(secondary)
0.5%[0.1%, 2.7%]64
Improvements ✅
(primary)
-0.3%[-0.6%, -0.2%]41
Improvements ✅
(secondary)
-0.4%[-0.8%, -0.0%]49
All ❌✅ (primary)-0.2%[-0.6%, 1.1%]49

Max RSS (memory usage)

Results (primary 2.1%, secondary 3.2%)

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

meanrangecount
Regressions ❌
(primary)
2.1%[0.4%, 7.9%]160
Regressions ❌
(secondary)
3.2%[0.7%, 7.0%]229
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
--0
All ❌✅ (primary)2.1%[0.4%, 7.9%]160

Cycles

Results (primary -2.6%, secondary 5.7%)

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

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
12.0%[2.4%, 23.1%]7
Improvements ✅
(primary)
-2.6%[-2.8%, -2.2%]3
Improvements ✅
(secondary)
-3.2%[-4.0%, -2.0%]5
All ❌✅ (primary)-2.6%[-2.8%, -2.2%]3

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: 491.114s -> 526.632s (7.23%)
Artifact size: 394.23 MiB -> 412.09 MiB (4.53%)

@rustbotrustbot added perf-regression Performance regression. and removed S-waiting-on-perf Status: Waiting on a perf run to be completed. labels Apr 13, 2026
@rust-bors

This comment has been minimized.

@zetanumbers

Copy link
Copy Markdown
ContributorAuthor

More.

@petrochenkov

Copy link
Copy Markdown
Contributor

@bors try @rust-timer queue

@rust-timer

Copy link
Copy Markdown
Collaborator

Awaiting bors try build completion.

@rustbot label: +S-waiting-on-perf

@rust-bors

rust-borsBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🔒 Merge conflict

A merge attempt failed due to a merge conflict. Please rebase on top of the latest base
branch, and let the reviewer approve again.

How do I rebase?

Assuming self is your fork and upstream is this repository,
you can resolve the conflict following these steps:

  1. git checkout no_dynamic_dispatch(switch to your branch)
  2. git fetch upstream HEAD(retrieve the latest base branch)
  3. git rebase upstream/HEAD -p(rebase on top of it)
  4. Follow the on-screen instruction to resolve conflicts (check git status if you got lost).
  5. git push self no_dynamic_dispatch --force-with-lease(update this PR)

You may also read
Git Rebasing to Resolve Conflicts by Drew Blessing
for a short tutorial.

Please avoid the "Resolve conflicts" button on GitHub.
It uses git merge instead of git rebase which makes the PR commit history more difficult to read.

Sometimes step 4 will complete without asking for resolution. This is usually due to difference between how Cargo.lock conflict is
handled during merge and rebase. This is normal, and you should still perform step 5 to update this PR.

@rustbotrustbot added the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 14, 2026
@petrochenkov

Copy link
Copy Markdown
Contributor

Ah, cannot try, this needs a rebase first.

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

Labels

A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-metaArea: Issues & PRs about the rust-lang/rust repository itselfA-query-systemArea: The rustc query system (https://rustc-dev-guide.rust-lang.org/query.html)perf-regressionPerformance regression.S-waiting-on-authorStatus: This is awaiting some action (such as code changes or more information) from the author.S-waiting-on-perfStatus: Waiting on a perf run to be completed.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@zetanumbers@petrochenkov@rust-timer@rust-log-analyzer@Kobzol@rustbot