Skip to content

Commit ee50839

Browse files
committed
[InstSimplify] Support ptrtoaddr in simplifyCastInst()
Handle ptrtoaddr the same way as ptrtoint. The fold already only operates on the index/address bits.
1 parent 565e9fa commit ee50839

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5440,9 +5440,10 @@ static Value *simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
54405440

54415441
// ptrtoint (ptradd (Ptr, X - ptrtoint(Ptr))) -> X
54425442
Value *Ptr, *X;
5443-
if (CastOpc == Instruction::PtrToInt &&
5444-
match(Op, m_PtrAdd(m_Value(Ptr),
5445-
m_Sub(m_Value(X), m_PtrToInt(m_Deferred(Ptr))))) &&
5443+
if ((CastOpc == Instruction::PtrToInt || CastOpc == Instruction::PtrToAddr) &&
5444+
match(Op,
5445+
m_PtrAdd(m_Value(Ptr),
5446+
m_Sub(m_Value(X), m_PtrToIntOrAddr(m_Deferred(Ptr))))) &&
54465447
X->getType() == Ty && Ty == Q.DL.getIndexType(Ptr->getType()))
54475448
return X;
54485449

llvm/test/Transforms/InstCombine/ptrtoaddr.ll

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,27 @@ define i32 @ptrtoaddr_sub_known_offset_addrsize(ptr addrspace(1) %p) {
161161
%sub = sub i32 %p2.addr, %p.addr
162162
ret i32 %sub
163163
}
164+
165+
define i64 @ptrtoaddr_of_ptradd_of_sub(i64 %x, ptr %p) {
166+
; CHECK-LABEL: define i64 @ptrtoaddr_of_ptradd_of_sub(
167+
; CHECK-SAME: i64 [[X:%.*]], ptr [[P:%.*]]) {
168+
; CHECK-NEXT: ret i64 [[X]]
169+
;
170+
%p.addr = ptrtoaddr ptr %p to i64
171+
%sub = sub i64 %x, %p.addr
172+
%ptradd = getelementptr i8, ptr %p, i64 %sub
173+
%ptradd.addr = ptrtoaddr ptr %ptradd to i64
174+
ret i64 %ptradd.addr
175+
}
176+
177+
define i32 @ptrtoaddr_of_ptradd_of_sub_addrsize(i32 %x, ptr addrspace(1) %p) {
178+
; CHECK-LABEL: define i32 @ptrtoaddr_of_ptradd_of_sub_addrsize(
179+
; CHECK-SAME: i32 [[X:%.*]], ptr addrspace(1) [[P:%.*]]) {
180+
; CHECK-NEXT: ret i32 [[X]]
181+
;
182+
%p.addr = ptrtoaddr ptr addrspace(1) %p to i32
183+
%sub = sub i32 %x, %p.addr
184+
%ptradd = getelementptr i8, ptr addrspace(1) %p, i32 %sub
185+
%ptradd.addr = ptrtoaddr ptr addrspace(1) %ptradd to i32
186+
ret i32 %ptradd.addr
187+
}

0 commit comments

Comments
 (0)