Skip to content

Commit 9d34b67

Browse files
authored
[InstSimplify] Fold ptrtoint(ptradd(P,X-ptrtoint(P))) to X (#98649)
This is a special case of the general ptrtoint(gep) to add(ptrtoint) transform that is particularly profitable, as everything folds away. Proof: https://alive2.llvm.org/ce/z/fwv8_L Fixes #86417.
1 parent 297fab1 commit 9d34b67

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5333,6 +5333,14 @@ static Value *simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
53335333
if (Op->getType() == Ty)
53345334
return Op;
53355335

5336+
// ptrtoint (ptradd (Ptr, X - ptrtoint(Ptr))) -> X
5337+
Value *Ptr, *X;
5338+
if (CastOpc == Instruction::PtrToInt &&
5339+
match(Op, m_PtrAdd(m_Value(Ptr),
5340+
m_Sub(m_Value(X), m_PtrToInt(m_Deferred(Ptr))))) &&
5341+
X->getType() == Ty && Ty == Q.DL.getIndexType(Ptr->getType()))
5342+
return X;
5343+
53365344
return nullptr;
53375345
}
53385346

llvm/test/Transforms/InstSimplify/ptrtoint.ll

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
define i64 @ptrtoint_gep_sub(ptr %ptr, i64 %end.addr) {
55
; CHECK-LABEL: define i64 @ptrtoint_gep_sub(
66
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
7-
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
8-
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[END_ADDR]], [[PTR_ADDR]]
9-
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
10-
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
11-
; CHECK-NEXT: ret i64 [[END_ADDR2]]
7+
; CHECK-NEXT: ret i64 [[END_ADDR]]
128
;
139
%ptr.addr = ptrtoint ptr %ptr to i64
1410
%size = sub i64 %end.addr, %ptr.addr
@@ -20,11 +16,7 @@ define i64 @ptrtoint_gep_sub(ptr %ptr, i64 %end.addr) {
2016
define <2 x i64> @ptrtoint_gep_sub_vector(<2 x ptr> %ptr, <2 x i64> %end.addr) {
2117
; CHECK-LABEL: define <2 x i64> @ptrtoint_gep_sub_vector(
2218
; CHECK-SAME: <2 x ptr> [[PTR:%.*]], <2 x i64> [[END_ADDR:%.*]]) {
23-
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint <2 x ptr> [[PTR]] to <2 x i64>
24-
; CHECK-NEXT: [[SIZE:%.*]] = sub <2 x i64> [[END_ADDR]], [[PTR_ADDR]]
25-
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, <2 x ptr> [[PTR]], <2 x i64> [[SIZE]]
26-
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint <2 x ptr> [[END]] to <2 x i64>
27-
; CHECK-NEXT: ret <2 x i64> [[END_ADDR2]]
19+
; CHECK-NEXT: ret <2 x i64> [[END_ADDR]]
2820
;
2921
%ptr.addr = ptrtoint <2 x ptr> %ptr to <2 x i64>
3022
%size = sub <2 x i64> %end.addr, %ptr.addr

0 commit comments

Comments
 (0)