[llvm] 1ed1537 - [NVPTX] Disable relative lookup tables (#159748)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 22 03:18:29 PDT 2025
Author: Nikita Popov
Date: 2025-09-22T12:18:25+02:00
New Revision: 1ed15374638ecf6046169194b4b3ca34b7cf340f
URL: https://github.com/llvm/llvm-project/commit/1ed15374638ecf6046169194b4b3ca34b7cf340f
DIFF: https://github.com/llvm/llvm-project/commit/1ed15374638ecf6046169194b4b3ca34b7cf340f.diff
LOG: [NVPTX] Disable relative lookup tables (#159748)
Relative lookup tables result in "LLVM ERROR: Circular dependency found
in global variable set", so disable them for this target.
Added:
llvm/test/Transforms/RelLookupTableConverter/nvptx.ll
Modified:
llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h
index b32d931bd3074..78eb751cf3c2e 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h
@@ -190,6 +190,11 @@ class NVPTXTTIImpl final : public BasicTTIImplBase<NVPTXTTIImpl> {
void collectKernelLaunchBounds(
const Function &F,
SmallVectorImpl<std::pair<StringRef, int64_t>> &LB) const override;
+
+ bool shouldBuildRelLookupTables() const override {
+ // Self-referential globals are not supported.
+ return false;
+ }
};
} // end namespace llvm
diff --git a/llvm/test/Transforms/RelLookupTableConverter/nvptx.ll b/llvm/test/Transforms/RelLookupTableConverter/nvptx.ll
new file mode 100644
index 0000000000000..70ebf220c369c
--- /dev/null
+++ b/llvm/test/Transforms/RelLookupTableConverter/nvptx.ll
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5
+; RUN: opt < %s -passes=rel-lookup-table-converter -relocation-model=pic -S | FileCheck %s
+; REQUIRES: nvptx-registered-target
+target triple = "nvptx64-nvidia-cuda"
+
+; Do not produce relative lookup table for nvptx target.
+
+ at a1 = internal constant i32 0, align 4
+ at b1 = internal constant i32 0, align 4
+ at c1 = internal constant i32 0, align 4
+ at d1 = internal constant i32 0, align 4
+
+ at switch.table = private unnamed_addr constant [3 x ptr] [ptr @a1, ptr @b1, ptr @c1], align 8
+
+;.
+; CHECK: @a1 = internal constant i32 0, align 4
+; CHECK: @b1 = internal constant i32 0, align 4
+; CHECK: @c1 = internal constant i32 0, align 4
+; CHECK: @d1 = internal constant i32 0, align 4
+; CHECK: @switch.table = private unnamed_addr constant [3 x ptr] [ptr @a1, ptr @b1, ptr @c1], align 8
+;.
+define ptr @internal_linkage(i32 %cond) {
+; CHECK-LABEL: define ptr @internal_linkage(
+; CHECK-SAME: i32 [[COND:%.*]]) {
+; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x ptr], ptr @switch.table, i32 0, i32 [[COND]]
+; CHECK-NEXT: [[RELTABLE_INTRINSIC:%.*]] = load ptr, ptr [[SWITCH_GEP]], align 8
+; CHECK-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
+;
+ %switch.gep = getelementptr inbounds [3 x ptr], ptr @switch.table, i32 0, i32 %cond
+ %switch.load = load ptr, ptr %switch.gep, align 8
+ ret ptr %switch.load
+}
More information about the llvm-commits
mailing list