Emit == null instead of <= null
When the niche maximum is zero, emit a "== zero" check instead of a "<= zero" check. In particular, this avoid the awkward case of "<= null". While LLVM does canonicalize this to "!= null", this appently doesn't happen for constant expressions, leading to the issue in #74425. While that can be addressed on the LLVM side, it still seems prudent to emit sensible IR here, because this will allow null checks to be optimized earlier in the pipeline. Fixes #74425.
This commit is contained in:
parent
48036804d2
commit
7e5c7cf8e3
2 changed files with 32 additions and 8 deletions
25
src/test/codegen/some-global-nonnull.rs
Normal file
25
src/test/codegen/some-global-nonnull.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// compile-flags: -O
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// CHECK-LABEL: @test
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: tail call void @ext_fn0()
|
||||
#[no_mangle]
|
||||
pub fn test() {
|
||||
test_inner(Some(inner0));
|
||||
}
|
||||
|
||||
fn test_inner(f_maybe: Option<fn()>) {
|
||||
if let Some(f) = f_maybe {
|
||||
f();
|
||||
}
|
||||
}
|
||||
|
||||
fn inner0() {
|
||||
unsafe { ext_fn0() };
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
fn ext_fn0();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue