-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Avoid ICE when is_val_statically_known is not of a supported type #120484
Conversation
r? @TaKO8Ki (rustbot has picked a reviewer for you, use r? to override) |
@bors r+ |
@bors r- hold up, this needs a test |
You can put it into |
Ah, let me write a test for this. Actually |
Up to you |
@rustbot ready |
@bors r+ |
…piler-errors Avoid ICE when is_val_statically_known is not of a supported type 2 ICE with 1 stone! 1. Implement `llvm.is.constant.ptr` to avoid first ICE in linked issue. 2. return `false` when the argument is not one of `i*`/`f*`/`ptr` to avoid second ICE. fixes rust-lang#120480
…piler-errors Avoid ICE when is_val_statically_known is not of a supported type 2 ICE with 1 stone! 1. Implement `llvm.is.constant.ptr` to avoid first ICE in linked issue. 2. return `false` when the argument is not one of `i*`/`f*`/`ptr` to avoid second ICE. fixes rust-lang#120480
|
||
#[inline] | ||
pub fn _iref(a: &u8) -> i32 { | ||
if unsafe { is_val_statically_known(a) } { 5 } else { 4 } | ||
} | ||
|
||
// CHECK-LABEL: @_iref_borrow( | ||
#[no_mangle] | ||
pub fn _iref_borrow() -> i32 { | ||
// CHECK: ret i32 4 | ||
_iref(&0) | ||
} | ||
|
||
// CHECK-LABEL: @_iref_arg( | ||
#[no_mangle] | ||
pub fn _iref_arg(a: &u8) -> i32 { | ||
// CHECK: ret i32 4 | ||
_iref(a) | ||
} | ||
|
||
#[inline] | ||
pub fn _slice_ref(a: &[u8]) -> i32 { | ||
if unsafe { is_val_statically_known(a) } { 7 } else { 6 } | ||
} | ||
|
||
// CHECK-LABEL: @_slice_ref_borrow( | ||
#[no_mangle] | ||
pub fn _slice_ref_borrow() -> i32 { | ||
// CHECK: ret i32 6 | ||
_slice_ref(&[0;3]) | ||
} | ||
|
||
// CHECK-LABEL: @_slice_ref_arg( | ||
#[no_mangle] | ||
pub fn _slice_ref_arg(a: &[u8]) -> i32 { | ||
// CHECK: ret i32 6 | ||
_slice_ref(a) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it isn't too late, can you add some test cases where the function should return true? Currently, it only returns false for pointers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure 😀
I'm not sure if it would make it into the tree though
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please make a follow-up PR rather than pushing to this one
…iaskrgr Rollup of 9 pull requests Successful merges: - rust-lang#120484 (Avoid ICE when is_val_statically_known is not of a supported type) - rust-lang#120516 (pattern_analysis: cleanup manual impls) - rust-lang#120517 (never patterns: It is correct to lower `!` to `_`.) - rust-lang#120523 (Improve `io::Read::read_buf_exact` error case) - rust-lang#120528 (Store SHOULD_CAPTURE as AtomicU8) - rust-lang#120529 (Update data layouts in custom target tests for LLVM 18) - rust-lang#120530 (Be less confident when `dyn` suggestion is not checked for object safety) - rust-lang#120531 (Remove a bunch of `has_errors` checks that have no meaningful or the wrong effect) - rust-lang#120533 (Correct paths for hexagon-unknown-none-elf platform doc) r? `@ghost` `@rustbot` modify labels: rollup
…iaskrgr Rollup of 9 pull requests Successful merges: - rust-lang#120484 (Avoid ICE when is_val_statically_known is not of a supported type) - rust-lang#120516 (pattern_analysis: cleanup manual impls) - rust-lang#120517 (never patterns: It is correct to lower `!` to `_`.) - rust-lang#120523 (Improve `io::Read::read_buf_exact` error case) - rust-lang#120528 (Store SHOULD_CAPTURE as AtomicU8) - rust-lang#120529 (Update data layouts in custom target tests for LLVM 18) - rust-lang#120530 (Be less confident when `dyn` suggestion is not checked for object safety) - rust-lang#120531 (Remove a bunch of `has_errors` checks that have no meaningful or the wrong effect) - rust-lang#120533 (Correct paths for hexagon-unknown-none-elf platform doc) r? `@ghost` `@rustbot` modify labels: rollup
…iaskrgr Rollup of 9 pull requests Successful merges: - rust-lang#120484 (Avoid ICE when is_val_statically_known is not of a supported type) - rust-lang#120516 (pattern_analysis: cleanup manual impls) - rust-lang#120517 (never patterns: It is correct to lower `!` to `_`.) - rust-lang#120523 (Improve `io::Read::read_buf_exact` error case) - rust-lang#120528 (Store SHOULD_CAPTURE as AtomicU8) - rust-lang#120529 (Update data layouts in custom target tests for LLVM 18) - rust-lang#120530 (Be less confident when `dyn` suggestion is not checked for object safety) - rust-lang#120531 (Remove a bunch of `has_errors` checks that have no meaningful or the wrong effect) - rust-lang#120533 (Correct paths for hexagon-unknown-none-elf platform doc) r? `@ghost` `@rustbot` modify labels: rollup
…iaskrgr Rollup of 8 pull requests Successful merges: - rust-lang#120484 (Avoid ICE when is_val_statically_known is not of a supported type) - rust-lang#120516 (pattern_analysis: cleanup manual impls) - rust-lang#120517 (never patterns: It is correct to lower `!` to `_`.) - rust-lang#120523 (Improve `io::Read::read_buf_exact` error case) - rust-lang#120528 (Store SHOULD_CAPTURE as AtomicU8) - rust-lang#120529 (Update data layouts in custom target tests for LLVM 18) - rust-lang#120531 (Remove a bunch of `has_errors` checks that have no meaningful or the wrong effect) - rust-lang#120533 (Correct paths for hexagon-unknown-none-elf platform doc) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#120484 - Teapot4195:issue-120480-fix, r=compiler-errors Avoid ICE when is_val_statically_known is not of a supported type 2 ICE with 1 stone! 1. Implement `llvm.is.constant.ptr` to avoid first ICE in linked issue. 2. return `false` when the argument is not one of `i*`/`f*`/`ptr` to avoid second ICE. fixes rust-lang#120480
You may need to edit documentation as well. I tried playing around with it, and // CHECK-LABEL: @_iref_addr(
#[no_mangle]
pub fn _iref_addr() -> i32 {
let my_num_ptr = 16 as *mut u8;
// CHECK: ret i32 5
unsafe { _iref(my_num_ptr.as_ref().unwrap()) }
} So it seems |
2 ICE with 1 stone!
llvm.is.constant.ptr
to avoid first ICE in linked issue.false
when the argument is not one ofi*
/f*
/ptr
to avoid second ICE.fixes #120480