Skip to content

Few LLVM lint "Unusual" #48229

Description

@leonardo-m

In Issue #48227 I've seen code compiled with "-C passes=lint", I've used it on some of my code and I've found few problems, reduced below:


fn foo(_: &u32, _: &u32) {}
fn main() {
    let a = 0;
    foo(&a, &a);
}


...>rustc -C passes=lint test1.rs
Unusual: noalias argument aliases another argument
  call void @_ZN4bug13foo17h2a852a9d6b40f8a0E(i32* noalias readonly dereferenceable(4) %1, i32* noalias readonly dereferenceable(4) %1)

fn main() {
    (1 .. 9).take_while(|i| i * i <= 10).any(|_| true);
}


...>rustc -C passes=lint test2.rs
Unusual: noalias argument aliases another argument
  %3 = call i32 @"_ZN86_$LT$$RF$$u27$b$u20$i32$u20$as$u20$core..ops..arith..Mul$LT$$RF$$u27$a$u20$i32$GT$$GT$3mul17hdb3638dfdb52b819E"(i32* noalias readonly dereferenceab
le(4) %1, i32* noalias readonly dereferenceable(4) %1)

fn main() {
    (1 .. 9).filter(|_| true).sum::<u32>();
}


...>rustc -C passes=lint test3.rs
Unusual: Return statement in function with noreturn attribute
  ret void


Activity

  1. leonardo-m commented on Feb 15, 2018

    @leonardo-m
    Author
    rustc 1.25.0-nightly (3ec5a99aa 2018-02-14)
    binary: rustc
    commit-hash: 3ec5a99aaa0084d97a9e845b34fdf03d1462c475
    commit-date: 2018-02-14
    host: x86_64-pc-windows-gnu
    release: 1.25.0-nightly
    LLVM version: 6.0
    
  2. added
    A-codegenArea: Code generation
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/Soundness
    C-bugCategory: This is a bug.
    on Feb 15, 2018
  3. nagisa commented on Feb 16, 2018

    @nagisa
    Member

    Duplicate of #7463

  4. nagisa commented on Feb 16, 2018

    @nagisa
    Member

    I guess I’ll reopen, since this contains minimal and actionable code samples.

  5. reopened this on Feb 16, 2018
  6. RalfJung commented on Mar 28, 2018

    @RalfJung
    Member

    This seems like the LLVM lint disagrees with the statement somewhere in the compiler sources saying that noalias on read-only data is fine even if thins alias -- because we can still reorder them?

  7. hanna-kruppe commented on Mar 28, 2018

    @hanna-kruppe
    Contributor

    Doesn't noalias also factor into optimizing pointer comparisons?

  8. RalfJung commented on Mar 28, 2018

    @RalfJung
    Member

    Well, whoever wrote that code strongly things that is not the case...

    Also, depending on what exactly clang does, that would be unsound:

    int foo(restrict int *x, restrict int *y) {
      (x == y) ? 1 : 0
    }

    This can not be optimized to return 0.

  9. hanna-kruppe commented on Mar 28, 2018

    @hanna-kruppe
    Contributor

    Hm, you're right, and indeed I couldn't find any such optimization in a quick skim of instcombine.

  10. added 7 commits that reference this issue on Apr 3, 2019
  11. cuviper commented on Apr 5, 2019

    @cuviper
    Member
    Unusual: Return statement in function with noreturn attribute
    

    This case is fixed by #59639 as of nightly-2019-04-05.

  12. jonas-schievink commented on Dec 10, 2019

    @jonas-schievink
    Contributor

    Removing I-unsound label. The remaining 2 cases ("noalias argument aliases another argument") seem to be caused by the LLVM lint being a bit overzealous. Maybe we should close this altogether?

  13. added
    A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.
    and removed
    I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/Soundness
    on Dec 10, 2019
  14. cuviper commented on Dec 10, 2019

    @cuviper
    Member

    Those noalias lints should be relaxed by D60239, which is in LLVM 9. I will try to do a new rustc build with lints enabled to see if anything remains.

  15. jonas-schievink commented on Dec 10, 2019

    @jonas-schievink
    Contributor

    Can confirm they're gone on rustc 1.41.0-nightly (797fd9262 2019-11-26) with -Cpasses=lint. In some other code, some of these have shown up:

    Unusual: unreachable immediately preceded by instruction without side effects
      unreachable, !dbg !112
    

    This shouldn't really be an issue and is just a bit sloppy codegen by rustc.

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-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-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

      Issue actions