Skip to content

noalias on a Box doesn't seem to have an impact when compiling without -C panic=abort #95323

@jrmuizel

Description

@jrmuizel
Contributor

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)

Activity

RalfJung

RalfJung commented on Apr 10, 2022

@RalfJung
Member

Possibly related: #46515

ldm0

ldm0 commented on Jul 30, 2022

@ldm0
Contributor

Cannot reproduce with nightly rust: https://godbolt.org/z/M5vvsbGnK

RalfJung

RalfJung commented on Jul 30, 2022

@RalfJung
Member
nikic

nikic commented on Jul 30, 2022

@nikic
Contributor

This always worked with -C opt-level=3 but failed (and still fails) with -C opt-level=2.

Noratrieb

Noratrieb commented on Jul 30, 2022

@Noratrieb
Member

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 where noalias 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

nikic commented on Jul 30, 2022

@nikic
Contributor

@Nilstrieb Yes, LLVM infers that the return value is noalias in this case (noinline does not affect IPO inference passes).

added
A-codegenArea: Code generation
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
and removed on Aug 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-boxArea: Our favorite opsem complicationA-codegenArea: Code generationC-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Enselic@nikic@RalfJung@jrmuizel@ChrisDenton

        Issue actions

          noalias on a Box doesn't seem to have an impact when compiling without `-C panic=abort` · Issue #95323 · rust-lang/rust