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 <[email protected]>
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

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to