[llvm] [TTI] Add getPointerInfos/getPointerInfo query for target address spaces (PR #213311)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 31 10:10:46 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-analysis

Author: Petr Kurapov (kurapov-peter)

<details>
<summary>Changes</summary>

Adds a PointerInfo struct describing an address space's number and target-given name, plus TTI query methods to enumerate all address spaces a target describes or look up a single one. Includes a unit test for the new queries.

---

There's currently no way of enumerating all the address spaces that a backend uses. Here's a naive way to do that in a simple form. I've encountered a need for it while trying to teach ir2vec what an address space is. Seems like a natural place for it, and it could have other use (e.g. early verification). There's probably a way to augment it with the rest of the addrspace apis in TTI with a smarter data structure, so that they are not a pile of unrelated entry points. No backend hooks yet, but the only thing needed is an override for `getPointerInfos`.

---
Full diff: https://github.com/llvm/llvm-project/pull/213311.diff


5 Files Affected:

- (modified) llvm/include/llvm/Analysis/TargetTransformInfo.h (+20) 
- (modified) llvm/include/llvm/Analysis/TargetTransformInfoImpl.h (+17) 
- (modified) llvm/lib/Analysis/TargetTransformInfo.cpp (+10) 
- (modified) llvm/unittests/Analysis/CMakeLists.txt (+1) 
- (added) llvm/unittests/Analysis/TargetTransformInfoTest.cpp (+72) 


``````````diff
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfo.h b/llvm/include/llvm/Analysis/TargetTransformInfo.h
index 107ae4dba5075..3ee61de7fff3d 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfo.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfo.h
@@ -547,6 +547,26 @@ class TargetTransformInfo {
   /// Return false if a \p AS0 address cannot possibly alias a \p AS1 address.
   LLVM_ABI bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const;
 
+  /// Describes a single address space exposed by the target.
+  struct PointerInfo {
+    /// The address space number, in the target's own numbering.
+    unsigned AddrSpace = 0;
+    /// The target's name for this address space, e.g. "global". Empty if the
+    /// target does not name it.
+    StringRef Name;
+  };
+
+  /// Returns every address space the target gives a meaning to, sorted by
+  /// address space number.
+  ///
+  /// \returns an empty list for targets that do not describe their address
+  /// spaces.
+  LLVM_ABI SmallVector<PointerInfo, 8> getPointerInfos() const;
+
+  /// Returns the description of address space \p AS, or std::nullopt if the
+  /// target does not describe it.
+  LLVM_ABI std::optional<PointerInfo> getPointerInfo(unsigned AS) const;
+
   /// Returns the address space ID for a target's 'flat' address space. Note
   /// this is not necessarily the same as addrspace(0), which LLVM sometimes
   /// refers to as the generic address space. The flat address space is a
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
index 25574a2d2c0e5..ef6d7a635294c 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -144,6 +144,23 @@ class LLVM_ABI TargetTransformInfoImplBase {
     return true;
   }
 
+  virtual SmallVector<TTI::PointerInfo, 8> getPointerInfos() const {
+    return {};
+  }
+
+  virtual std::optional<TTI::PointerInfo> getPointerInfo(unsigned AS) const {
+    // Targets only need to override getPointerInfos(); this searches the list
+    // they report, which is sorted by address space number.
+    SmallVector<TTI::PointerInfo, 8> Infos = getPointerInfos();
+    const auto *I = lower_bound(Infos, AS, [](const TTI::PointerInfo &PI,
+                                              unsigned AS) {
+      return PI.AddrSpace < AS;
+    });
+    if (I == Infos.end() || I->AddrSpace != AS)
+      return std::nullopt;
+    return *I;
+  }
+
   virtual unsigned getFlatAddressSpace() const { return -1; }
 
   virtual bool collectFlatAddressOperands(SmallVectorImpl<int> &OpIndexes,
diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp
index 595c2d10dd118..82a85334ce5a2 100644
--- a/llvm/lib/Analysis/TargetTransformInfo.cpp
+++ b/llvm/lib/Analysis/TargetTransformInfo.cpp
@@ -312,6 +312,16 @@ bool llvm::TargetTransformInfo::addrspacesMayAlias(unsigned FromAS,
   return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
 }
 
+SmallVector<TargetTransformInfo::PointerInfo, 8>
+TargetTransformInfo::getPointerInfos() const {
+  return TTIImpl->getPointerInfos();
+}
+
+std::optional<TargetTransformInfo::PointerInfo>
+TargetTransformInfo::getPointerInfo(unsigned AS) const {
+  return TTIImpl->getPointerInfo(AS);
+}
+
 unsigned TargetTransformInfo::getFlatAddressSpace() const {
   return TTIImpl->getFlatAddressSpace();
 }
diff --git a/llvm/unittests/Analysis/CMakeLists.txt b/llvm/unittests/Analysis/CMakeLists.txt
index 50bf4539e7984..66ecdb4a815bc 100644
--- a/llvm/unittests/Analysis/CMakeLists.txt
+++ b/llvm/unittests/Analysis/CMakeLists.txt
@@ -53,6 +53,7 @@ set(ANALYSIS_TEST_SOURCES
   ScalarEvolutionTest.cpp
   SparsePropagation.cpp
   TargetLibraryInfoTest.cpp
+  TargetTransformInfoTest.cpp
   TensorSpecTest.cpp
   TBAATest.cpp
   UnrollAnalyzerTest.cpp
diff --git a/llvm/unittests/Analysis/TargetTransformInfoTest.cpp b/llvm/unittests/Analysis/TargetTransformInfoTest.cpp
new file mode 100644
index 0000000000000..280f74599d04a
--- /dev/null
+++ b/llvm/unittests/Analysis/TargetTransformInfoTest.cpp
@@ -0,0 +1,72 @@
+//===- TargetTransformInfoTest.cpp - TargetTransformInfo unit tests -------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/TargetTransformInfo.h"
+#include "llvm/Analysis/TargetTransformInfoImpl.h"
+#include "llvm/IR/DataLayout.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+// A target that describes some of its address spaces, but not all of them.
+class FakeTTIImpl : public TargetTransformInfoImplBase {
+public:
+  explicit FakeTTIImpl(const DataLayout &DL) : TargetTransformInfoImplBase(DL) {}
+
+  SmallVector<TTI::PointerInfo, 8> getPointerInfos() const override {
+    return {TTI::PointerInfo{1, "global"}, TTI::PointerInfo{3, "local"},
+            TTI::PointerInfo{7, "private"}};
+  }
+};
+
+TargetTransformInfo makeFakeTTI(const DataLayout &DL) {
+  return TargetTransformInfo(std::make_unique<const FakeTTIImpl>(DL));
+}
+
+TEST(TargetTransformInfoTest, PointerInfosDefaultsToEmpty) {
+  DataLayout DL("p1:32:32-p2:64:64");
+  TargetTransformInfo TTI(DL);
+
+  EXPECT_THAT(TTI.getPointerInfos(), ::testing::IsEmpty());
+}
+
+TEST(TargetTransformInfoTest, PointerInfoDefaultsToNullopt) {
+  DataLayout DL("p1:32:32");
+  TargetTransformInfo TTI(DL);
+
+  EXPECT_FALSE(TTI.getPointerInfo(0).has_value());
+}
+
+TEST(TargetTransformInfoTest, PointerInfoFindsDescribedAddrSpace) {
+  DataLayout DL("");
+  TargetTransformInfo TTI = makeFakeTTI(DL);
+
+  std::optional<TTI::PointerInfo> PI = TTI.getPointerInfo(3);
+  ASSERT_TRUE(PI.has_value());
+  EXPECT_EQ(PI->AddrSpace, 3u);
+  EXPECT_EQ(PI->Name, "local");
+}
+
+TEST(TargetTransformInfoTest, PointerInfoFindsEveryReportedAddrSpace) {
+  DataLayout DL("p1:32:32");
+  TargetTransformInfo TTI = makeFakeTTI(DL);
+
+  for (const TTI::PointerInfo &Reported : TTI.getPointerInfos()) {
+    std::optional<TTI::PointerInfo> PI = TTI.getPointerInfo(Reported.AddrSpace);
+    ASSERT_TRUE(PI.has_value()) << "address space " << Reported.AddrSpace;
+    EXPECT_EQ(PI->AddrSpace, Reported.AddrSpace);
+    EXPECT_EQ(PI->Name, Reported.Name);
+  }
+
+  EXPECT_FALSE(TTI.getPointerInfo(999).has_value());
+}
+
+} // end anonymous namespace

``````````

</details>


https://github.com/llvm/llvm-project/pull/213311


More information about the llvm-commits mailing list