From c18da3ccd4cca6295bba599324962a469aae9aa9 Mon Sep 17 00:00:00 2001 From: David Koloski Date: Wed, 6 Sep 2023 02:21:56 +0000 Subject: [PATCH 1/2] Add regression test for LLVM 17-rc3 miscompile See #115385 for more details. --- tests/codegen/issues/issue-115385.rs | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/codegen/issues/issue-115385.rs diff --git a/tests/codegen/issues/issue-115385.rs b/tests/codegen/issues/issue-115385.rs new file mode 100644 index 00000000000..773b3507f23 --- /dev/null +++ b/tests/codegen/issues/issue-115385.rs @@ -0,0 +1,50 @@ +// compile-flags: -O -Ccodegen-units=1 +// only-x86_64-unknown-linux-gnu + +#![crate_type = "lib"] + +#[repr(i64)] +pub enum Boolean { + False = 0, + True = 1, +} + +impl Clone for Boolean { + fn clone(&self) -> Self { + *self + } +} + +impl Copy for Boolean {} + +extern "C" { + fn set_value(foo: *mut i64); +} + +pub fn foo(x: bool) { + let mut foo = core::mem::MaybeUninit::::uninit(); + unsafe { + set_value(foo.as_mut_ptr()); + } + + if x { + let l1 = unsafe { *foo.as_mut_ptr().cast::() }; + if matches!(l1, Boolean::False) { + unsafe { + *foo.as_mut_ptr() = 0; + } + } + } + + let l2 = unsafe { *foo.as_mut_ptr() }; + if l2 == 2 { + // CHECK: call void @bar + bar(); + } +} + +#[no_mangle] +#[inline(never)] +pub fn bar() { + println!("Working correctly!"); +} From ddd8878d697ac0006b25000137d457093917ae12 Mon Sep 17 00:00:00 2001 From: David Koloski Date: Wed, 6 Sep 2023 22:13:56 +0000 Subject: [PATCH 2/2] Address feedback --- ...115385.rs => issue-115385-llvm-jump-threading.rs} | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) rename tests/codegen/issues/{issue-115385.rs => issue-115385-llvm-jump-threading.rs} (84%) diff --git a/tests/codegen/issues/issue-115385.rs b/tests/codegen/issues/issue-115385-llvm-jump-threading.rs similarity index 84% rename from tests/codegen/issues/issue-115385.rs rename to tests/codegen/issues/issue-115385-llvm-jump-threading.rs index 773b3507f23..142e3596d96 100644 --- a/tests/codegen/issues/issue-115385.rs +++ b/tests/codegen/issues/issue-115385-llvm-jump-threading.rs @@ -1,5 +1,4 @@ // compile-flags: -O -Ccodegen-units=1 -// only-x86_64-unknown-linux-gnu #![crate_type = "lib"] @@ -19,6 +18,7 @@ impl Copy for Boolean {} extern "C" { fn set_value(foo: *mut i64); + fn bar(); } pub fn foo(x: bool) { @@ -39,12 +39,8 @@ pub fn foo(x: bool) { let l2 = unsafe { *foo.as_mut_ptr() }; if l2 == 2 { // CHECK: call void @bar - bar(); + unsafe { + bar(); + } } } - -#[no_mangle] -#[inline(never)] -pub fn bar() { - println!("Working correctly!"); -}