[llvm] d22a72c - [RelLookupTableConverter] Reject volatile loads (#224414)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 17 20:04:43 PDT 2026
Author: PiJoules
Date: 2026-09-18T03:04:37Z
New Revision: d22a72cebb2dce4be4b64bfd196ac85d36f85bd1
URL: https://github.com/llvm/llvm-project/commit/d22a72cebb2dce4be4b64bfd196ac85d36f85bd1
DIFF: https://github.com/llvm/llvm-project/commit/d22a72cebb2dce4be4b64bfd196ac85d36f85bd1.diff
LOG: [RelLookupTableConverter] Reject volatile loads (#224414)
The pass converts absolute pointer lookup tables to relative lookup
tables and replaces the table load with a call to `@llvm.load.relative`.
However, `@llvm.load.relative` is an intrinsic with `memory(argmem:
read)` and cannot represent volatile access semantics. Replacing a
volatile load with `@llvm.load.relative` drops volatile side effects.
Added:
Modified:
llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
llvm/test/Transforms/RelLookupTableConverter/X86/relative_lookup_table.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp b/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
index 4068211e2031d..bf721778a99cd 100644
--- a/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
+++ b/llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp
@@ -51,7 +51,7 @@ static bool shouldConvertToRelLookupTable(LookupTableInfo &Info, Module &M,
return false;
auto *Load = dyn_cast<LoadInst>(GEP->use_begin()->getUser());
- if (!Load)
+ if (!Load || Load->isVolatile())
return false;
// If values are not 64-bit pointers, do not generate a relative lookup table.
diff --git a/llvm/test/Transforms/RelLookupTableConverter/X86/relative_lookup_table.ll b/llvm/test/Transforms/RelLookupTableConverter/X86/relative_lookup_table.ll
index 4fbcb110cfd3a..b9c7cfa207536 100644
--- a/llvm/test/Transforms/RelLookupTableConverter/X86/relative_lookup_table.ll
+++ b/llvm/test/Transforms/RelLookupTableConverter/X86/relative_lookup_table.ll
@@ -103,6 +103,11 @@ target triple = "x86_64-unknown-linux-gnu"
ptr @.str.9
], align 16
+ at table.volatile = internal constant [2 x ptr] [
+ ptr @.str.8,
+ ptr @.str.9
+], align 16
+
;.
; CHECK: @.str = private unnamed_addr constant [5 x i8] c"zero\00", align 1
; CHECK: @.str.1 = private unnamed_addr constant [4 x i8] c"one\00", align 1
@@ -137,6 +142,7 @@ target triple = "x86_64-unknown-linux-gnu"
; CHECK: @skip.table.rel = internal unnamed_addr constant [2 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @.str.8 to i64), i64 ptrtoint (ptr @skip.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @.str.9 to i64), i64 ptrtoint (ptr @skip.table.rel to i64)) to i32)], align 4
; CHECK: @wrong.skip.table = internal constant [4 x ptr] [ptr null, ptr @.str.8, ptr null, ptr @.str.9], align 16
; CHECK: @table.multiple.load.uses.rel = internal unnamed_addr constant [2 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @.str.8 to i64), i64 ptrtoint (ptr @table.multiple.load.uses.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @.str.9 to i64), i64 ptrtoint (ptr @table.multiple.load.uses.rel to i64)) to i32)], align 4
+; CHECK: @table.volatile = internal constant [2 x ptr] [ptr @.str.8, ptr @.str.9], align 16
;.
define ptr @external_linkage(i32 %cond) {
; CHECK-LABEL: define ptr @external_linkage(
@@ -442,6 +448,18 @@ define ptr @load_multiple_uses(i64 %index) {
ret ptr %load
}
+define ptr @gep_volatile_load(i64 %index) {
+; CHECK-LABEL: define ptr @gep_volatile_load(
+; CHECK-SAME: i64 [[INDEX:%.*]]) {
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @table.volatile, i64 0, i64 [[INDEX]]
+; CHECK-NEXT: [[LOAD:%.*]] = load volatile ptr, ptr [[GEP]], align 8
+; CHECK-NEXT: ret ptr [[LOAD]]
+;
+ %gep = getelementptr inbounds [2 x ptr], ptr @table.volatile, i64 0, i64 %index
+ %load = load volatile ptr, ptr %gep, align 8
+ ret ptr %load
+}
+
!llvm.module.flags = !{!0, !1}
!0 = !{i32 7, !"PIC Level", i32 2}
!1 = !{i32 1, !"Code Model", i32 1}
More information about the llvm-commits
mailing list