[all-commits] [llvm/llvm-project] b0025b: IROutliner: Fixme relies on constant use lists

Matt Arsenault via All-commits all-commits at lists.llvm.org
Mon Apr 7 17:28:11 PDT 2025


  Branch: refs/heads/users/arsenm/ir/remove-uselist-for-constantdata
  Home:   https://github.com/llvm/llvm-project
  Commit: b0025b6c4ea617402a17c624160ecb4ccd1e41f2
      https://github.com/llvm/llvm-project/commit/b0025b6c4ea617402a17c624160ecb4ccd1e41f2
  Author: Matt Arsenault <Matthew.Arsenault at amd.com>
  Date:   2025-04-08 (Tue, 08 Apr 2025)

  Changed paths:
    M llvm/lib/Transforms/IPO/IROutliner.cpp

  Log Message:
  -----------
  IROutliner: Fixme relies on constant use lists


  Commit: 01b64382f73ca1b692e2541ba61b041a43dcf76d
      https://github.com/llvm/llvm-project/commit/01b64382f73ca1b692e2541ba61b041a43dcf76d
  Author: Matt Arsenault <Matthew.Arsenault at amd.com>
  Date:   2025-04-08 (Tue, 08 Apr 2025)

  Changed paths:
    M llvm/include/llvm/IR/Use.h
    M llvm/include/llvm/IR/Value.h
    M llvm/lib/Analysis/TypeMetadataUtils.cpp
    M llvm/lib/AsmParser/LLParser.cpp
    M llvm/lib/Bitcode/Reader/BitcodeReader.cpp
    M llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
    M llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
    M llvm/lib/CodeGen/CodeGenPrepare.cpp
    M llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
    M llvm/lib/IR/AsmWriter.cpp
    M llvm/lib/IR/Instruction.cpp
    M llvm/lib/IR/Use.cpp
    M llvm/lib/IR/Value.cpp
    M llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
    M llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
    M llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
    M llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
    M llvm/lib/Transforms/Scalar/Reassociate.cpp
    M llvm/test/Analysis/MemorySSA/nondeterminism.ll
    A llvm/test/tools/llvm-diff/uselistorder-issue58629-gv.ll
    M llvm/test/tools/llvm-diff/uselistorder-issue58629.ll
    M llvm/test/tools/llvm-reduce/bitcode-uselistorder.ll
    M llvm/test/tools/llvm-reduce/uselistorder-invalid-ir-output.ll
    M llvm/tools/verify-uselistorder/verify-uselistorder.cpp

  Log Message:
  -----------
  IR: Remove uselist for constantdata

This is a resurrected version of the patch attached to this RFC:

https://discourse.llvm.org/t/rfc-constantdata-should-not-have-use-lists/42606

In this adaptation, there are a few differences. In the original patch, the Use's
use list was replaced with an unsigned* to the reference count in the value. This
version leaves them as null and leaves the ref counting only in Value.

The current blocker is IROutliner has its own diy cloning, which doesn't use
ValueMapper and it does make direct use of constant use lists.

Remove use-lists from instances of ConstantData (which are shared
across modules and have no operands).

To continue supporting most of the use-list API, store a ref-count in
place of the use-list; this is for API like Value::use_empty and
Value::hasNUses.  Operations that actually need the use-list -- like
Value::use_begin -- will assert.

This change has three benefits:

 1. The compiler output cannot in any way depend on the use-list order
    of instances of ConstantData.

 2. There's no use-list traffic when adding and removing simple
    constants from operand lists (although there is ref-count traffic;
    YMMV).

 3. It's cheaper to serialize use-lists (since we're no longer
    serializing the use-list order of things like i32 0).

The downside is that you can't look at all the users of ConstantData,
but traversals of users of i32 0 are already ill-advised.

Possible follow-ups:
  - Track if an instance of a ConstantVector/ConstantArray/etc. is known
    to have all ConstantData arguments, and drop the use-lists to
    ref-counts in those cases.  Callers need to check Value::hasUseList
    before iterating through the use-list.
  - Remove even the ref-counts.  I'm not sure they have any benefit
    besides minimizing the scope of this commit, and maintaining the
    counts is not free.

Fixes #58629


Compare: https://github.com/llvm/llvm-project/compare/f79a8b028520...01b64382f73c

To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list