[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