[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