[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