Skip to content

Commit a2b3e03

Browse files
committed
Addressed comments
1 parent 5c692fd commit a2b3e03

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2632,13 +2632,16 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
26322632
return replaceInstUsesWith(I, Res);
26332633

26342634
if (match(Op0, m_ZExt(m_PtrToInt(m_Value(LHSOp)))) &&
2635-
match(Op1, m_PtrToInt(m_Value(RHSOp))) && isa<GlobalValue>(RHSOp)) {
2636-
Value *Offset;
2637-
if (match(LHSOp, m_GEP(m_Specific(RHSOp), m_Value(Offset)))) {
2638-
auto *GEP = cast<GEPOperator>(LHSOp);
2639-
if (GEP->isInBounds()) {
2640-
Value *Res = Builder.CreateZExt(EmitGEPOffset(GEP), I.getType());
2641-
return replaceInstUsesWith(I, Res);
2635+
match(Op1, m_ZExtOrSelf(m_PtrToInt(m_Value(RHSOp))))) {
2636+
if (auto *GEP = dyn_cast<GEPOperator>(LHSOp)) {
2637+
if (GEP->getPointerOperand() == RHSOp) {
2638+
if (GEP->hasNoUnsignedWrap() || GEP->hasNoUnsignedSignedWrap()) {
2639+
Value *Offset = EmitGEPOffset(GEP);
2640+
Value *Res = GEP->hasNoUnsignedWrap()
2641+
? Builder.CreateZExt(Offset, I.getType())
2642+
: Builder.CreateSExt(Offset, I.getType());
2643+
return replaceInstUsesWith(I, Res);
2644+
}
26422645
}
26432646
}
26442647
}

llvm/test/Transforms/InstCombine/sub-gep.ll

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,19 +316,57 @@ define i16 @test25_as1(ptr addrspace(1) %P, i64 %A) {
316316
}
317317

318318
@Arr_as2 = external addrspace(2) global [42 x i16]
319-
define i64 @zext_ptrtoint_sub_ptrtoint_as2(ptr addrspace(1) %p, i32 %offset) {
319+
define i64 @zext_ptrtoint_sub_ptrtoint_as2(i32 %offset) {
320320
; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2(
321321
; CHECK-NEXT: %A.idx = shl nsw i32 %offset, 1
322+
; CHECK-NEXT: %D = sext i32 %A.idx to i64
323+
; CHECK-NEXT: ret i64 %D
324+
%A = getelementptr nusw bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
325+
%B = ptrtoint ptr addrspace(2) %A to i32
326+
%C = zext i32 %B to i64
327+
%D = sub i64 %C, ptrtoint (ptr addrspace(2) @Arr_as2 to i64)
328+
ret i64 %D
329+
}
330+
331+
define i64 @zext_ptrtoint_sub_ptrtoint_as2_nuw(i32 %offset) {
332+
; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nuw(
333+
; CHECK-NEXT: %A.idx = shl nuw i32 %offset, 1
322334
; CHECK-NEXT: %D = zext i32 %A.idx to i64
323335
; CHECK-NEXT: ret i64 %D
324-
%A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
336+
%A = getelementptr nuw bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
325337
%B = ptrtoint ptr addrspace(2) %A to i32
326338
%C = zext i32 %B to i64
327339
%D = sub i64 %C, ptrtoint (ptr addrspace(2) @Arr_as2 to i64)
328340
ret i64 %D
329341
}
330342

331-
define i64 @ptrtoint_sub_zext_ptrtoint_as2(ptr addrspace(2) %p, i32 %offset) {
343+
define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2(i32 %offset) {
344+
; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2(
345+
; CHECK-NEXT: %A.idx = shl nsw i32 %offset, 1
346+
; CHECK-NEXT: %E = sext i32 %A.idx to i64
347+
; CHECK-NEXT: ret i64 %E
348+
%A = getelementptr nusw bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
349+
%B = ptrtoint ptr addrspace(2) %A to i32
350+
%C = zext i32 %B to i64
351+
%D = zext i32 ptrtoint (ptr addrspace(2) @Arr_as2 to i32) to i64
352+
%E = sub i64 %C, %D
353+
ret i64 %E
354+
}
355+
356+
define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw(i32 %offset) {
357+
; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw(
358+
; CHECK-NEXT: %A.idx = shl nuw i32 %offset, 1
359+
; CHECK-NEXT: %E = zext i32 %A.idx to i64
360+
; CHECK-NEXT: ret i64 %E
361+
%A = getelementptr nuw bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
362+
%B = ptrtoint ptr addrspace(2) %A to i32
363+
%C = zext i32 %B to i64
364+
%D = zext i32 ptrtoint (ptr addrspace(2) @Arr_as2 to i32) to i64
365+
%E = sub i64 %C, %D
366+
ret i64 %E
367+
}
368+
369+
define i64 @ptrtoint_sub_zext_ptrtoint_as2(i32 %offset) {
332370
; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint_as2(
333371
; CHECK-NEXT: %A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
334372
; CHECK-NEXT: %B = ptrtoint ptr addrspace(2) %A to i32

0 commit comments

Comments
 (0)