[llvm] [InstSimplify] Support non-inbounds GEP in ptrdiff fold (PR #162676)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 9 08:23:57 PDT 2025
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/162676
We can fold ptrdiff(ptradd(p, x), p) to x regardless of whether the ptradd is inbounds.
Proof: https://alive2.llvm.org/ce/z/Xuvc7N
>From dde327d665f84e75e17fa0bfabb53362b497d7b2 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Thu, 9 Oct 2025 17:05:24 +0200
Subject: [PATCH] [InstSimplify] Support non-inbounds GEP in ptrdiff fold
We can fold ptrdiff(ptradd(p, x), p) to x regardless of whether
the ptradd is inbounds.
Proof: https://alive2.llvm.org/ce/z/Xuvc7N
---
llvm/lib/Analysis/InstructionSimplify.cpp | 6 +++---
llvm/test/Transforms/InstSimplify/ptr_diff.ll | 6 +-----
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index d1977f0b0daf9..333e3522613d4 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -671,12 +671,12 @@ Value *llvm::simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
/// This is very similar to stripAndAccumulateConstantOffsets(), except it
/// normalizes the offset bitwidth to the stripped pointer type, not the
/// original pointer type.
-static APInt stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V,
- bool AllowNonInbounds = false) {
+static APInt stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V) {
assert(V->getType()->isPtrOrPtrVectorTy());
APInt Offset = APInt::getZero(DL.getIndexTypeSizeInBits(V->getType()));
- V = V->stripAndAccumulateConstantOffsets(DL, Offset, AllowNonInbounds);
+ V = V->stripAndAccumulateConstantOffsets(DL, Offset,
+ /*AllowNonInbounds=*/true);
// As that strip may trace through `addrspacecast`, need to sext or trunc
// the offset calculated.
return Offset.sextOrTrunc(DL.getIndexTypeSizeInBits(V->getType()));
diff --git a/llvm/test/Transforms/InstSimplify/ptr_diff.ll b/llvm/test/Transforms/InstSimplify/ptr_diff.ll
index fdd9e8e149c1c..508dfbc710830 100644
--- a/llvm/test/Transforms/InstSimplify/ptr_diff.ll
+++ b/llvm/test/Transforms/InstSimplify/ptr_diff.ll
@@ -14,11 +14,7 @@ define i64 @ptrdiff(ptr %ptr) {
define i64 @ptrdiff_no_inbounds(ptr %ptr) {
; CHECK-LABEL: @ptrdiff_no_inbounds(
-; CHECK-NEXT: [[LAST:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i32 42
-; CHECK-NEXT: [[FIRST_INT:%.*]] = ptrtoint ptr [[PTR]] to i64
-; CHECK-NEXT: [[LAST_INT:%.*]] = ptrtoint ptr [[LAST]] to i64
-; CHECK-NEXT: [[DIFF:%.*]] = sub i64 [[LAST_INT]], [[FIRST_INT]]
-; CHECK-NEXT: ret i64 [[DIFF]]
+; CHECK-NEXT: ret i64 42
;
%last = getelementptr i8, ptr %ptr, i32 42
%first.int = ptrtoint ptr %ptr to i64
More information about the llvm-commits
mailing list