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
