================ @@ -342,14 +346,63 @@ class DataLayout { SmallVector<unsigned, 8> getNonIntegralAddressSpaces() const { SmallVector<unsigned, 8> AddrSpaces; for (const PointerSpec &PS : PointerSpecs) { - if (PS.IsNonIntegral) + if (PS.HasNonIntegralRepresentation || PS.HasUnstableRepresentation) AddrSpaces.push_back(PS.AddrSpace); } return AddrSpaces; } + /// Returns whether this address space is "non-integral" and "unstable". + /// This means that passes should not introduce inttoptr or ptrtoint + /// instructions operating on pointers of this address space. + /// TODO: remove this function after migrating to finer-grained properties. bool isNonIntegralAddressSpace(unsigned AddrSpace) const { - return getPointerSpec(AddrSpace).IsNonIntegral; + const PointerSpec &PS = getPointerSpec(AddrSpace); + return PS.HasNonIntegralRepresentation || PS.HasUnstableRepresentation; + } + + /// Returns whether this address space has an "unstable" pointer + /// representation. The bitwise pattern of such pointers is allowed to change + /// in a target-specific way. For example, this could be used for copying + /// garbage collection where the garbage collector could update the pointer + /// value as part of the collection sweep. + bool hasUnstableRepresentation(unsigned AddrSpace) const { + return getPointerSpec(AddrSpace).HasUnstableRepresentation; + } + + /// Returns whether this address space has a non-integral pointer + /// representation, i.e. the pointer is not just an integer address but some + /// other bitwise representation. Examples include AMDGPU buffer descriptors + /// with a 128-bit fat pointer and a 32-bit offset or CHERI capabilities that + /// contain bounds, permissions and an out-of-band validity bit. In general, + /// these pointers cannot be re-created from just an integer value. + bool hasNonIntegralRepresentation(unsigned AddrSpace) const { + return getPointerSpec(AddrSpace).HasNonIntegralRepresentation; + } + + /// Returns whether passes should avoid introducing `inttoptr` instructions + /// for this address space. + /// + /// This is currently the case "non-integral" pointer representations + /// (hasNonIntegralRepresentation()) since such pointers generally require + /// additional metadata beyond just an address. + /// New `inttoptr` instructions should also be avoided for "unstable" bitwise + /// representations (hasUnstableRepresentation()) unless the pass knows it is + /// within a critical section that retains the current representation. + bool shouldAvoidIntToPtr(unsigned AddrSpace) const { + const PointerSpec &PS = getPointerSpec(AddrSpace); + return PS.HasNonIntegralRepresentation || PS.HasUnstableRepresentation; ---------------- jrtc27 wrote:
Use the helpers? This is the only one that doesn't (other than the deprecated isNonIntegralAddressSpace). https://github.com/llvm/llvm-project/pull/105735 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits