[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