Skip to content

Rust doesn't use niche in reference (or pointer) to slice #132235

Open

Description

@VorfeedCanal

From reddit thread: why can't rust optimize the size of Option<Option<&str>>?

Indeed, in spite of the fact that &str doesn't all use more than half of possible bit sequences (top bit of 2nd word is always zero, plus first word can not be zero) only Option<&str> is optimized

Would it make sense to teach compiler about that niche or is it prevented by some deeper issue?

Activity

  1. added
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Oct 27, 2024
  2. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    Duplicate of #119507

  3. the8472 commented on Oct 27, 2024

    @the8472
    Member

    I don't think that's correct. #119507 is about using niches across fields. This one is about having niches in slice lengths.

    And I've attempted to improve that in #116542 but so far perf hasn't been looking good. Maybe because the IR gets more complicated.

  4. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    @the8472 Isn't it a duplicate of #125363 then?

  5. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    In any case, I don't really think having a zillion tiny issues regarding the layout code, which is a big ball of mud, is very helpful. It would be better to collect the various possible optimizations and reason about them in a central manner, rather than trying to make tiny adjustments to spot-fix the code.

  6. the8472 commented on Oct 27, 2024

    @the8472
    Member

    #125363 is similar to #119507 actually.

    And having a "more niche optimizations" super issue would help. But some of the sub-issues are still useful because some specific cases can likely be fixed without difficult perf tradeoffs while others are less certain.

  7. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    Honestly, I'm not sure why your PR #116542 is seemingly both trying to add metadata and alter the layout of slices.

  8. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    The fundamental issue is that all of the issues we're discussing are trying to do the same thing: "There are two niches, one in each of two separate parts of this. Optimize the layout based on that."

    In that regard, a struct and a slice should not be treated significantly differently.

  9. the8472 commented on Oct 27, 2024

    @the8472
    Member

    This issue isn't about jointly using two pre-existing niches. It's about adding a new set of niches to the length field in slice-refs, by exploiting the isize::MAX bytes upper limit, something we're currently not doing.

    Honestly, I'm not sure why your PR #116542 is seemingly both trying to add metadata and alter the layout of slices.

    They're based on the same thing, derived from the validity ranges of the fields.

  10. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    They may be based on the same thing, but that doesn't mean the changes are functionally dependent in the implementation.

  11. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    ...Unless they are, in which case that segment of the layout code is possibly in even more dire need of being scrapped and rewritten than I thought.

  12. the8472 commented on Oct 27, 2024

    @the8472
    Member

    I mean if we define the slice length field validity range - which currently isn't explicitly set and so defaults to the same validity as usize - then both metadata and niches fall out of that automatically. Treating them differently for the purpose of llvmir metadata and niche calculation would take extra effort.

  13. workingjubilee commented on Oct 27, 2024

    @workingjubilee
    Member

    I suppose I'll reopen this then, but now I'm wondering if we can convince the layout code that &[T] is secretly a funny-looking struct.

  14. the8472 commented on Oct 27, 2024

    @the8472
    Member

    I think layout code should already be seeing an univariant ADT with two fields and scalarpair abi. My PR does result in layout changes.

  15. vrtgs commented on Oct 28, 2024

    @vrtgs
    Contributor

    I suppose I'll reopen this then, but now I'm wondering if we can convince the layout code that &[T] is secretly a funny-looking struct.

    The issue with this is that when T is a zst, it is now okay for a &[T] to have more than isize::MAX elements

    Also isize::MAX is an even bigger range than the null optimization, so I think it should be favored instead of the null optimization if only one niche optimization can be applied

  16. added
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    A-layoutArea: Memory layout of types
    on Oct 28, 2024
  17. added
    C-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing such
    E-needs-designThis issue needs exploration and design to see how and if we can fix/implement it
    and removed
    C-bugCategory: This is a bug.
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    E-needs-designThis issue needs exploration and design to see how and if we can fix/implement it
    on Oct 30, 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-layoutArea: Memory layout of typesC-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing suchE-needs-designThis issue needs exploration and design to see how and if we can fix/implement itT-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