Don't ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung
, '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 ICE in might_permit_raw_init if reference is polymorphic - #108012

Merged
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999
Feb 16, 2023
Merged

Don't ICE in might_permit_raw_init if reference is polymorphic#108012
bors merged 2 commits into
rust-lang:masterfrom
compiler-errors:issue-107999

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Feb 13, 2023

Copy link
Copy Markdown
Contributor

Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.

cc @saethlin
fixes#107999

@rustbot

Copy link
Copy Markdown
Collaborator

r? @oli-obk

(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 Feb 13, 2023
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 6c854dc to 132ee4dCompareFebruary 13, 2023 22:31
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
Comment threadtests/ui/lint/invalid_value-polymorphic.rs Outdated
@rust-log-analyzer

This comment has been minimized.

@compiler-errors
compiler-errorsforce-pushed the issue-107999 branch 2 times, most recently from 13c9802 to c7b3261CompareFebruary 13, 2023 23:23
@rust-log-analyzer

This comment has been minimized.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

oh, lol, this is totally wrong. this is might_permit_raw_init_lax, not known_to_permit_raw_init_lax (or something worded like that) :/ this probably should return true in that case...

@saethlin, are you sure that it's valid to instcombine away an uninit validity assertion in this case? really we should be returning something ternary -- yes, no, or "too generic" (or at least, "unknown layout"), and in the case of the last option, we don't do anything in the optimization.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Not sure what you're asking, but I'll guess.

If you are asking me what the correct thing to do instead of ICEing here is, no idea. The upstream effect here should be not applying the optimization- we don't know if T has alignment > 1, in which case the 0x1-filling is invalid.

If you're asking about the code I added to InstCombine, I intended to nab that directly from what codegen does when it decides to emit a panic or not for that intrinsic. Now it's a fair question as to whether what codegen does just behaves nonsensically when given a generic, if code is supposed to be monomorphized at that stage.

@compiler-errorscompiler-errorsFeb 14, 2023

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.

What I'm saying is that it's probably not correct to return either false (like I did) or true (like I wanted to change when I first pointed out this comment) if we can't get the layout of the pointee here.

CI failure(edited link) shows that false is bad because we're optimizing away perfectly fine polymorphic functions in the stdlib, and true is also probably not great, since we're dropping this assertion which may be false later once things are monomorphized. Added a mir-opt test to show the latter behavior in the first commit in this PR.

^^^ edit: I'm not actually sure that CI failure is due to this? It's confusing why that's happening, though. We should always be going from ICE -> dropping assertions

Second PR in this stack makes the queries you added fallible, so we can handle the LayoutErrors gracefully and not perform the optimization in that case. It duplicates a bit of work, since we may have to call the layout query twice on some code paths, but oh well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

and true is also probably not great, since we're dropping this assertion

If this function is not allowed to have false positives maybe it shouldn't be called might_

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The function is intended to definitely answer whether we will emit a panic or not. Optimizations shouldn't change that behavior.

We don't always emit panics fully aggressively (that depends on compiler flags), so in a sense there are false negatives allowed.

@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

Some changes occurred to the CTFE / Miri engine

cc @rust-lang/miri

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

Comment threadcompiler/rustc_middle/src/query/mod.rs Outdated
Comment threadcompiler/rustc_codegen_cranelift/src/intrinsics/mod.rs Outdated
@saethlin

saethlin commented Feb 14, 2023

Copy link
Copy Markdown
Member

Just been musing about this... I'm pretty sure that all of the MIR optimization value derived here is from deleting the inhabited assertion. Initially I was concerned that the ICE here pointed at a deeper issue in the compiler.

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries, we should probably just delete the InstCombine for those intrinsics, and only keep the one that checks for inhabited types.

@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

But if the solution that preserves the optimizations of the zero init and mem_uninit init paths costs complexity elsewhere in the compiler, or especially if it makes compilation slower due to the additional queries

I don't think that this implementation is significantly more complex, and I guess we can see if compilation is slower with

@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 Feb 14, 2023
@bors

bors commented Feb 14, 2023

Copy link
Copy Markdown
Collaborator

⌛ Trying commit b096f0e with merge ff2eaadf96941a226289d1d89cb63f9e7d7ef475...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

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

@rust-timer

This comment has been minimized.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (ff2eaadf96941a226289d1d89cb63f9e7d7ef475): comparison URL.

Overall result: no relevant changes - 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 benchmark run did not return any relevant results for this metric.

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)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
-3.5%[-3.5%, -3.5%]1
Improvements ✅
(secondary)
-2.1%[-2.9%, -0.9%]15
All ❌✅ (primary)-3.5%[-3.5%, -3.5%]1

Cycles

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

@rustbotrustbot removed the S-waiting-on-perf Status: Waiting on a perf run to be completed. label Feb 15, 2023
@oli-obk

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit b096f0e has been approved by oli-obk

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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge f6cc158db71213b9eb346875598970a4205d964c...

@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

💔 Test failed - checks-actions

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

Copy link
Copy Markdown
ContributorAuthor

Spurious it seems

@bors retry

@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 Feb 15, 2023
@bors

bors commented Feb 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit b096f0e with merge c528357...

@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

1 similar comment
@bors

bors commented Feb 16, 2023

Copy link
Copy Markdown
Collaborator

☀️ Test successful - checks-actions
Approved by: oli-obk
Pushing c528357 to master...

@borsbors added the merged-by-bors This PR was explicitly merged by bors. label Feb 16, 2023
@bors
bors merged commit c528357 into rust-lang:masterFeb 16, 2023
@rustbotrustbot added this to the 1.69.0 milestone Feb 16, 2023
@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job mingw-check failed! Check out the build log: (web)(plain)

Click to see the possible cause of the failure (guessed by this bot)
curl: (22) The requested URL returned error: 404
error: failed to download llvm from ci
help: old builds get deleted after a certain time
help: if trying to compile an old commit of rustc, disable `download-ci-llvm` in config.toml:
[llvm]
download-ci-llvm = false
Build completed unsuccessfully in 0:00:00

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (c528357): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

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

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)
--0
Regressions ❌
(secondary)
4.8%[3.9%, 5.6%]2
Improvements ✅
(primary)
-3.3%[-3.4%, -3.2%]2
Improvements ✅
(secondary)
-2.4%[-4.8%, -0.6%]50
All ❌✅ (primary)-3.3%[-3.4%, -3.2%]2

Cycles

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

bjorn3 pushed a commit to bjorn3/rust that referenced this pull request Mar 15, 2023
Don't ICE in `might_permit_raw_init` if reference is polymorphic
Emitting optimized MIR for a polymorphic function may require computing layout of a type that isn't (yet) known. This happens in the instcombine pass, for example. Let's fail gracefully in that condition.
cc `@saethlin`
fixesrust-lang#107999
tautschnig added a commit to tautschnig/kani that referenced this pull request Apr 16, 2023
Upstream PRs that require local changes:
- Don't ICE in might_permit_raw_init if reference is polymorphic rust-lang/rust#108012
- Use target instead of machine for mir interpreter integer handling rust-lang/rust#108047
- Optimize mk_region rust-lang/rust#108020
Co-authored-by: Qinheping Hu <qinhh@amazon.com>
@compiler-errors
compiler-errors deleted the issue-107999 branch August 11, 2023 20:04
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.

ICE: need to be able to compute layouts: Unknown(T) running miri with -Zunpretty-mir

8 participants

@compiler-errors@rustbot@rust-log-analyzer@saethlin@rust-timer@bors@oli-obk@RalfJung