Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot
, '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

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass - #110477

Merged
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo
Apr 19, 2023
Merged

Don't allocate on SimplifyCfg/Locals/Const on every MIR pass#110477
bors merged 1 commit into
rust-lang:masterfrom
miguelraz:canoodling2-electric-boogaloo

Conversation

@miguelraz

@miguelrazmiguelraz commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Hey! 👋🏾 This is a first PR attempt to see if I could speed up some rustc internals.

Thought process:

pubstructSimplifyCfg{label:String,}

in compiler/src/rustc_mir_transform/simplify.rs fires multiple times per MIR analysis. This means that a likely string allocation is happening in each of these runs, which may add up, as they are not being lazily allocated or cached in between the different passes.

...yes, I know that adding a global static array is probably not the future-proof solution, but I wanted to lob this now as a proof of concept to see if it's worth shaving off a few cycles and then making more robust.

@rustbot

Copy link
Copy Markdown
Collaborator

r? @compiler-errors

(rustbot has picked a reviewer for you, use r? to override)

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 18, 2023
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

@miguelrazmiguelraz changed the title try interning SimplifyCfg stringsDon't allocate on SimplifyCfg/Locals/Const on every MIR passApr 18, 2023
@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Do you have any evidence to suggest that these are expensive operations? I don't think this code is really worth the extra complication and possibly introducing new panic edges to the compiler just to avoid some string formatting.

@jyn514

Copy link
Copy Markdown
Member

@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 Apr 18, 2023
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit ccc7a0c1af6f58b3081024583d3cfdbcfb4f3434 with merge b89ba5d787d15245a9be6ac6f1619c153b23ea97...

Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
Comment threadcompiler/rustc_mir_transform/src/simplify.rs Outdated
@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: b89ba5d787d15245a9be6ac6f1619c153b23ea97 (b89ba5d787d15245a9be6ac6f1619c153b23ea97)

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (b89ba5d787d15245a9be6ac6f1619c153b23ea97): comparison URL.

Overall result: ✅ improvements - no action needed

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.

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

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.7%[-2.8%, -0.2%]19
Improvements ✅
(secondary)
-2.4%[-7.5%, -0.2%]17
All ❌✅ (primary)-0.7%[-2.8%, -0.2%]19

Max RSS (memory usage)

Results

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)
1.7%[1.7%, 1.7%]1
Regressions ❌
(secondary)
2.3%[2.0%, 2.5%]2
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-4.1%[-4.1%, -4.1%]1
All ❌✅ (primary)1.7%[1.7%, 1.7%]1

Cycles

Results

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
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-3.5%[-4.7%, -2.7%]3
All ❌✅ (primary)--0

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Apr 18, 2023
@compiler-errors

Copy link
Copy Markdown
Contributor

Apparently keccak and codegen-cranelift have been particularly noisy recently, so I've been advised to ignore those.

As for the other positive perf results, I'll have to take a closer look at them to see if they're legit or just noise as well. (Or maybe I'll queue another perf run in the morning and see if these perf results stick?)

@workingjubilee

Copy link
Copy Markdown
Member

comment worth noting from a sidebar conversation about (current behavior, as it relates to this PR):

[11:57 PM] compilererrors: there are 273521 calls to format! [editor's note: when constructing mir passes] to bootstrap stdlib

@compiler-errors

compiler-errors commented Apr 18, 2023

Copy link
Copy Markdown
Contributor

Anyways, @miguelraz, I did some thinking. I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Something like:

enumSimplifyCfgPassName{Initial,PromoteConsts,
...
}implSimplifyCfg{fnnew(e:SimplifyCfgPassName) -> Self{SimplifyCfg{ e }}fnname(&self) -> &'staticstr{matchself.e{SimplifyCfgPassName::Initial => "SimplifyCfg-initial",}}

@JakobDegen

Copy link
Copy Markdown
Contributor

The improvement is probably legit. I've seen major regressions in the past resulting from over-calling name and creating string allocations for it

@workingjubilee

workingjubilee commented Apr 18, 2023

Copy link
Copy Markdown
Member

We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

This would also reduce the size from the size of the string ref (pointer and length) to the size of the enum, which will save about 7~15 bytes per instance of this struct that is in memory at any given moment. Not the most important win compared to allocation overhead, but y'know, everything counts in large amounts.

@Noratrieb

Copy link
Copy Markdown
Member

cachegrind results from libc Debug Full:

1,260,425 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_qpath
888,494 ???:<core::cell::once::OnceCell<bool>>::get_or_try_init::<<core::cell::once::OnceCell<bool>>::get_or_init<<rustc_middle::mir::basic_blocks::BasicBlocks>::is_cfg_cyclic::{closure#0}>::{closure#0}, !>
-790,524 library/core/src/fmt/mod.rs:core::fmt::write
-710,531 ???:<rustc_data_structures::graph::iterate::TriColorDepthFirstSearch<rustc_middle::mir::basic_blocks::BasicBlocks>>::run_from_start::<rustc_data_structures::graph::iterate::CycleDetector>
-659,804 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/arena.c:_rjem_je_arena_ralloc
-638,356 ???:<rustc_passes::dead::MarkSymbolVisitor>::check_def_id
-634,657 ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms
-564,660 library/core/src/fmt/mod.rs:<&mut W as core::fmt::Write>::write_str
-527,874 ???:<rustc_passes::dead::MarkSymbolVisitor as rustc_hir::intravisit::Visitor>::visit_ty
-513,184 obj/build/x86_64-unknown-linux-gnu/stage1-rustc/x86_64-unknown-linux-gnu/release/build/jemalloc-sys-5bd9bcfdf2a83955/out/build/src/jemalloc.c:do_rallocx
-508,194 library/core/src/fmt/mod.rs:core::fmt::Formatter::pad
-435,018 ???:rustc_ast::mut_visit::noop_visit_fn_decl::<rustc_expand::expand::InvocationCollector>
-417,494 ???:rustc_passes::reachable::has_custom_linkage
-399,892 ???:<rustc_middle::ty::context::TyCtxt>::def_kind::<rustc_span::def_id::LocalDefId>
-395,262 library/core/src/fmt/mod.rs:alloc::fmt::format::format_inner

lots of noise, but there are some memcpys and core::fmt, so this looks like a legit improvement. Awesome!

@Noratrieb

Copy link
Copy Markdown
Member

I quickly profiled a few other allocation sites inside simplify and found a few interesting results, it may be worth it to SmallVec a bunch of these: https://hackmd.io/3ViTm3u5QDST-c6mUIyjXg

@lqd

lqd commented Apr 18, 2023

Copy link
Copy Markdown
Member

keccak and cranelift-codegen are indeed noisy right now unfortunately.

image
image

Some of the other wins look related to formatting so probably legit.

There shouldn't be many instances of these structs in-flight at the same time, so maybe we wouldn't really see size reduction benefits (nor exhaustiveness for such debugging info), and can e.g. take the name as &'static str and do the Simplify*-$pass concatenations at the 10 or so call-sites instead.

@cjgillot

Copy link
Copy Markdown
Contributor

I think the right approach for this would be to make SimplifyCfg/etc's constructors instead take some enum that actually makes the matches you constructed above exhaustive. We can probably store those enums in the mir pass structs instead of a &'static str, then match on them in fn name to turn them into a &'static str.

Even simpler: we can make SimplifyCfg itself an enum, and have fn name match on self?

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

@cjgillot yes, I just realized that and push that very change, thanks for the tip!

@compiler-errorscompiler-errors left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@miguelraz can you squash this into one commit? Other than that, this PR looks good to go.

@miguelraz
miguelrazforce-pushed the canoodling2-electric-boogaloo branch from 36b3f70 to fc27ae1CompareApril 18, 2023 18:34
@jyn514

Copy link
Copy Markdown
Member

@bors r=compiler-errors

@bors

bors commented Apr 18, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit fc27ae1 has been approved by compiler-errors

It is now in the queue for this repository.

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

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit fc27ae1 with merge 9e7f72c...

pub fn new(label: &str) -> Self {
SimplifyConstCondition { label: format!("SimplifyConstCondition-{}", label) }
}
pub enum SimplifyConstConditionPassName {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(nit) no need to block the PR on this, but if you touch this code again in the future could you rename this to just SimplifyConstCondition? That would make it consistent with all the other ones

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, finally got around to this fix.
#110657

@miguelrazmiguelraz mentioned this pull request Apr 19, 2023
@bors

bors commented Apr 19, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 9e7f72c to master...

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (9e7f72c): comparison URL.

Overall result: ✅ improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-0.5%[-0.7%, -0.3%]10
Improvements ✅
(secondary)
-0.6%[-0.7%, -0.4%]9
All ❌✅ (primary)-0.5%[-0.7%, -0.3%]10

Max RSS (memory usage)

Results

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)
2.5%[1.9%, 3.1%]2
Regressions ❌
(secondary)
1.6%[1.6%, 1.6%]1
Improvements ✅
(primary)
-3.6%[-3.6%, -3.6%]1
Improvements ✅
(secondary)
-4.2%[-4.2%, -4.2%]1
All ❌✅ (primary)0.5%[-3.6%, 3.1%]3

Cycles

Results

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
Regressions ❌
(secondary)
3.3%[2.7%, 3.6%]4
Improvements ✅
(primary)
-2.9%[-4.6%, -1.5%]8
Improvements ✅
(secondary)
--0
All ❌✅ (primary)-2.9%[-4.6%, -1.5%]8

@miguelraz

Copy link
Copy Markdown
ContributorAuthor

For the record, this PR was a revived attempt of #108026.

@miguelraz
miguelraz deleted the canoodling2-electric-boogaloo branch April 21, 2023 21:27
JohnTitor added a commit to JohnTitor/rust that referenced this pull request Apr 22, 2023
…ctor, r=compiler-errors
nit: consistent naming for SimplifyConstCondition
Fixing a small naming inconsistency that `@JakobDegen` brought up in rust-lang#110477 (comment).
Please signal for rollup.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-borsThis PR was explicitly merged by bors.S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.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.

11 participants

@miguelraz@rustbot@compiler-errors@jyn514@rust-timer@bors@workingjubilee@JakobDegen@Noratrieb@lqd@cjgillot