[llvm] e24526c - [NVPTXCtorDtorLowering] Removing unnecessary pointer arithmetic (#182269)

via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 19 07:02:28 PST 2026


Author: Nikita Popov
Date: 2026-02-19T16:02:23+01:00
New Revision: e24526cf437430a5a5a597cefc47bc2ca80c315e

URL: https://github.com/llvm/llvm-project/commit/e24526cf437430a5a5a597cefc47bc2ca80c315e
DIFF: https://github.com/llvm/llvm-project/commit/e24526cf437430a5a5a597cefc47bc2ca80c315e.diff

LOG: [NVPTXCtorDtorLowering] Removing unnecessary pointer arithmetic (#182269)

This code was computing `begin + ((end - begin) exact/ 8) * 8`, which is
a very complicated way to spell `end`.

Added: 
    

Modified: 
    llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp
    llvm/test/CodeGen/NVPTX/lower-ctor-dtor.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp
index ef0035fa9da4d..29ec718ea381c 100644
--- a/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp
@@ -138,20 +138,13 @@ static void createInitOrFiniCalls(Function &F, bool IsCtor) {
   Value *BeginVal = IRB.CreateLoad(Begin->getType(), Begin, "begin");
   Value *EndVal = IRB.CreateLoad(Begin->getType(), End, "stop");
   if (!IsCtor) {
-    auto *BeginInt = IRB.CreatePtrToInt(BeginVal, IntegerType::getInt64Ty(C));
-    auto *EndInt = IRB.CreatePtrToInt(EndVal, IntegerType::getInt64Ty(C));
-    auto *SubInst = IRB.CreateSub(EndInt, BeginInt);
-    auto *Offset = IRB.CreateAShr(
-        SubInst, ConstantInt::get(IntegerType::getInt64Ty(C), 3), "offset",
-        /*IsExact=*/true);
-    auto *ValuePtr = IRB.CreateGEP(PointerType::get(C, 0), BeginVal,
-                                   ArrayRef<Value *>({Offset}));
-    EndVal = BeginVal;
+    Value *OldBeginVal = BeginVal;
     BeginVal =
-        IRB.CreateInBoundsGEP(PointerType::get(C, 0), ValuePtr,
+        IRB.CreateInBoundsGEP(PointerType::get(C, 0), EndVal,
                               ArrayRef<Value *>(ConstantInt::getAllOnesValue(
                                   IntegerType::getInt64Ty(C))),
                               "start");
+    EndVal = OldBeginVal;
   }
   IRB.CreateCondBr(
       IRB.CreateCmp(IsCtor ? ICmpInst::ICMP_NE : ICmpInst::ICMP_UGE, BeginVal,

diff  --git a/llvm/test/CodeGen/NVPTX/lower-ctor-dtor.ll b/llvm/test/CodeGen/NVPTX/lower-ctor-dtor.ll
index b503da4a0bfde..9823304c9bd3f 100644
--- a/llvm/test/CodeGen/NVPTX/lower-ctor-dtor.ll
+++ b/llvm/test/CodeGen/NVPTX/lower-ctor-dtor.ll
@@ -66,12 +66,7 @@ define internal void @bar() {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[BEGIN:%.*]] = load ptr addrspace(1), ptr addrspace(1) @__fini_array_start, align 8
 ; CHECK-NEXT:    [[STOP:%.*]] = load ptr addrspace(1), ptr addrspace(1) @__fini_array_end, align 8
-; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr addrspace(1) [[BEGIN]] to i64
-; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[STOP]] to i64
-; CHECK-NEXT:    [[TMP2:%.*]] = sub i64 [[TMP1]], [[TMP0]]
-; CHECK-NEXT:    [[OFFSET:%.*]] = ashr exact i64 [[TMP2]], 3
-; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr ptr, ptr addrspace(1) [[BEGIN]], i64 [[OFFSET]]
-; CHECK-NEXT:    [[START:%.*]] = getelementptr inbounds ptr, ptr addrspace(1) [[TMP3]], i64 -1
+; CHECK-NEXT:    [[START:%.*]] = getelementptr inbounds ptr, ptr addrspace(1) [[STOP]], i64 -1
 ; CHECK-NEXT:    [[TMP4:%.*]] = icmp uge ptr addrspace(1) [[START]], [[BEGIN]]
 ; CHECK-NEXT:    br i1 [[TMP4]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]]
 ; CHECK:       while.entry:


        


More information about the llvm-commits mailing list