[clang] [llvm] [Offloading] Use getGetElementPtr() overload accepting DataLayout (PR #225766)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 23 06:34:43 PDT 2026


https://github.com/nikic created https://github.com/llvm/llvm-project/pull/225766

To produce constant GEP in canonical ptradd representation.

>From d05c89e8db466821cd2e038f40e6b6f1119cd04a Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 23 Sep 2026 15:22:28 +0200
Subject: [PATCH] [Offloading] Use getGetElementPtr() overload accepting
 DataLayout

To produce constant GEP in canonical ptradd representation.
---
 .../clang-linker-wrapper/linker-wrapper-image.c      | 12 ++++++------
 llvm/lib/Frontend/Offloading/Utility.cpp             |  5 +++--
 llvm/test/tools/llvm-offload-wrapper/coff-opt-ref.ll |  2 +-
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-image.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-image.c
index baa56f951ac294..a73c4ac42ffa07 100644
--- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-image.c
+++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-image.c
@@ -25,8 +25,8 @@
 // OPENMP-REL: @.omp_offloading.device_image = internal unnamed_addr constant [[[SIZE:[0-9]+]] x i8] c"\10\FF\10\AD{{.*}}", section ".llvm.offloading.relocatable", align 8
 
 //      OPENMP: @.omp_offloading.device_image = internal unnamed_addr constant [[[SIZE:[0-9]+]] x i8] c"\10\FF\10\AD{{.*}}", section ".llvm.offloading", align 8
-// OPENMP-NEXT: @.omp_offloading.device_images = internal unnamed_addr constant [1 x %__tgt_device_image] [%__tgt_device_image { ptr getelementptr (i8, ptr @.omp_offloading.device_image, i64 [[IMG_OFF:[0-9]+]]), ptr getelementptr (i8, ptr @.omp_offloading.device_image, i64 [[IMG_OFF]]), ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, ptr @__stop_llvm_offload_entries }]
-// OPENMP-NEXT: @.omp_offloading.descriptor = internal constant %__tgt_bin_desc { i32 1, ptr @.omp_offloading.device_images, ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, ptr @__stop_llvm_offload_entries }
+// OPENMP-NEXT: @.omp_offloading.device_images = internal unnamed_addr constant [1 x %__tgt_device_image] [%__tgt_device_image { ptr getelementptr (i8, ptr @.omp_offloading.device_image, i64 [[IMG_OFF:[0-9]+]]), ptr getelementptr (i8, ptr @.omp_offloading.device_image, i64 [[IMG_OFF]]), ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, ptr @__stop_llvm_offload_entries }]
+// OPENMP-NEXT: @.omp_offloading.descriptor = internal constant %__tgt_bin_desc { i32 1, ptr @.omp_offloading.device_images, ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, ptr @__stop_llvm_offload_entries }
 // OPENMP-NEXT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 101, ptr @.omp_offloading.descriptor_reg, ptr null }]
 
 //      OPENMP: define internal void @.omp_offloading.descriptor_reg() section ".text.startup" {
@@ -90,11 +90,11 @@
 //
 //      CUDA: define internal void @.cuda.globals_reg(ptr %0) section ".text.startup" {
 // CUDA-NEXT: entry:
-// CUDA-NEXT:   %1 = icmp ne ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, @__stop_llvm_offload_entries
+// CUDA-NEXT:   %1 = icmp ne ptr {{(@__start_llvm_offload_entries|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, @__stop_llvm_offload_entries
 // CUDA-NEXT:   br i1 %1, label %while.entry, label %while.end
 //
 //      CUDA: while.entry:
-// CUDA-NEXT:   %entry1 = phi ptr [ {{(@__start_llvm_offload_entries|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, %entry ], [ %16, %if.end ]
+// CUDA-NEXT:   %entry1 = phi ptr [ {{(@__start_llvm_offload_entries|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, %entry ], [ %16, %if.end ]
 // CUDA-NEXT:   %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i32 0, i32 4
 // CUDA-NEXT:   %addr = load ptr, ptr %2, align 8
 // CUDA-NEXT:   %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i32 0, i32 8
@@ -232,11 +232,11 @@
 //
 //      HIP: define internal void @.hip.globals_reg(ptr %0) section "{{\.text\.startup|__TEXT,__StaticInit}}" {
 // HIP-NEXT: entry:
-// HIP-NEXT:   %1 = icmp ne ptr {{(@.*offload_entries.*|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, @{{.*offload_entries.*}}
+// HIP-NEXT:   %1 = icmp ne ptr {{(@.*offload_entries.*|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, @{{.*offload_entries.*}}
 // HIP-NEXT:   br i1 %1, label %while.entry, label %while.end
 //
 //      HIP: while.entry:
-// HIP-NEXT:   %entry1 = phi ptr [ {{(@.*offload_entries.*|getelementptr inbounds \(\[1 x %struct.__tgt_offload_entry\], ptr @__start_llvm_offload_entries, i32 0, i32 1\))}}, %entry ], [ %16, %if.end ]
+// HIP-NEXT:   %entry1 = phi ptr [ {{(@.*offload_entries.*|getelementptr inbounds \(i8, ptr @__start_llvm_offload_entries, i64 [0-9]+\))}}, %entry ], [ %16, %if.end ]
 // HIP-NEXT:   %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i32 0, i32 4
 // HIP-NEXT:   %addr = load ptr, ptr %2, align 8
 // HIP-NEXT:   %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i32 0, i32 8
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index f8dc721664e9d6..e150cef8260716 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -190,8 +190,9 @@ std::pair<Constant *, Constant *> offloading::getOffloadEntryArray(Module &M) {
     Type *Int32Ty = Type::getInt32Ty(M.getContext());
     Constant *Indices[] = {ConstantInt::get(Int32Ty, 0),
                            ConstantInt::get(Int32Ty, COFFSentinelEntryCount)};
-    Constant *BeginAfterSentinel = ConstantExpr::getInBoundsGetElementPtr(
-        EntriesB->getValueType(), EntriesB, Indices);
+    Constant *BeginAfterSentinel = ConstantExpr::getGetElementPtr(
+        M.getDataLayout(), EntriesB->getValueType(), EntriesB, Indices,
+        GEPNoWrapFlags::inBounds());
     return std::make_pair(BeginAfterSentinel, EntriesE);
   }
 
diff --git a/llvm/test/tools/llvm-offload-wrapper/coff-opt-ref.ll b/llvm/test/tools/llvm-offload-wrapper/coff-opt-ref.ll
index 2295b47d39d750..dcb8ed7795eb88 100644
--- a/llvm/test/tools/llvm-offload-wrapper/coff-opt-ref.ll
+++ b/llvm/test/tools/llvm-offload-wrapper/coff-opt-ref.ll
@@ -14,7 +14,7 @@
 
 ; CHECK: @__start_llvm_offload_entries = weak_odr hidden constant [1 x %struct.__tgt_offload_entry] zeroinitializer, section "llvm_offload_entries$OA"
 ; CHECK-NEXT: @__stop_llvm_offload_entries = weak_odr hidden constant [1 x %struct.__tgt_offload_entry] zeroinitializer, section "llvm_offload_entries$OZ"
-; CHECK: icmp ne ptr getelementptr inbounds ([1 x %struct.__tgt_offload_entry], ptr @__start_llvm_offload_entries, i32 0, i32 1), @__stop_llvm_offload_entries
+; CHECK: icmp ne ptr getelementptr inbounds (i8, ptr @__start_llvm_offload_entries, i64 56), @__stop_llvm_offload_entries
 
 ; OBJ: Name: llvm_offload_entries{{[$]}}OA
 ; OBJ: RawDataSize: 0x38



More information about the llvm-commits mailing list