-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Open
Labels
A-boxArea: Our favorite opsem complicationArea: Our favorite opsem complicationA-codegenArea: Code generationArea: Code generationC-bugCategory: This is a bug.Category: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Description
I tried this code:
struct Foo {
x: i32
}
#[inline(never)]
fn function2() { println!("foo"); }
#[inline(never)]
fn function1() -> Box<Foo> { Box::new(Foo { x: 4}) }
pub fn foo() {
let foo: Box<_> = function1();
let value1 = foo.x;
function2();
let value2 = foo.x;
assert_eq!(value1, value2);
}
I expect the assert_eq! to be compiled away. However, this only happens with -C panic=abort
.
I'm using rustc 1.61.0-nightly (c84f39e 2022-03-20)
Metadata
Metadata
Assignees
Labels
A-boxArea: Our favorite opsem complicationArea: Our favorite opsem complicationA-codegenArea: Code generationArea: Code generationC-bugCategory: This is a bug.Category: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
RalfJung commentedon Apr 10, 2022
Possibly related: #46515
ldm0 commentedon Jul 30, 2022
Cannot reproduce with nightly rust: https://godbolt.org/z/M5vvsbGnK
RalfJung commentedon Jul 30, 2022
Cc @Nilstrieb
nikic commentedon Jul 30, 2022
This always worked with
-C opt-level=3
but failed (and still fails) with-C opt-level=2
.Noratrieb commentedon Jul 30, 2022
I think LLVM inlined the function anyways and that's why it's not reproducible anymore (even with
-Zbox-noalias=no
). Interestingly, if the function is made truly opaque my passing a function pointer instead, the assert is not optimized away with-Zbox-noalias=no
, but it is optimized away with-Zbox-noalias=yes
. So this indeed seems like a case wherenoalias
on box improves codegen.Edit: It's obviously not inlined for codegen as the assembly shows the call, but there seems to be some smarter analysis going on.
nikic commentedon Jul 30, 2022
@Nilstrieb Yes, LLVM infers that the return value is noalias in this case (noinline does not affect IPO inference passes).