Skip to content

Commit

Permalink
Don't sink ptrtoint/inttoptr sequences into non-noop addrspacecasts.
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D92210

(cherry picked from commit 822b19a)
(cherry picked from commit fcdf8f2)
  • Loading branch information
maleadt authored and vchuravy committed Feb 7, 2022
1 parent 9039ce8 commit 2208d33
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 5 deletions.
32 changes: 27 additions & 5 deletions llvm/lib/CodeGen/CodeGenPrepare.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5224,18 +5224,29 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
WeakTrackingVH SunkAddrVH = SunkAddrs[Addr];

Value * SunkAddr = SunkAddrVH.pointsToAliveValue() ? SunkAddrVH : nullptr;
Type *IntPtrTy = DL->getIntPtrType(Addr->getType());
if (SunkAddr) {
LLVM_DEBUG(dbgs() << "CGP: Reusing nonlocal addrmode: " << AddrMode
<< " for " << *MemoryInst << "\n");
if (SunkAddr->getType() != Addr->getType())
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
if (SunkAddr->getType() != Addr->getType()) {
// Even though we only considered no-op addrspacecasts,
// semantically-meaningful conversions may still be present due to
// ptrtoint/inttoptr sequences.
if (SunkAddr->getType()->getPointerAddressSpace() !=
Addr->getType()->getPointerAddressSpace() &&
!DL->isNonIntegralPointerType(Addr->getType())) {
SunkAddr = Builder.CreatePtrToInt(SunkAddr, IntPtrTy, "sunkaddr");
SunkAddr =
Builder.CreateIntToPtr(SunkAddr, Addr->getType(), "sunkaddr");
} else
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
}
} else if (AddrSinkUsingGEPs || (!AddrSinkUsingGEPs.getNumOccurrences() &&
SubtargetInfo->addrSinkUsingGEPs())) {
// By default, we use the GEP-based method when AA is used later. This
// prevents new inttoptr/ptrtoint pairs from degrading AA capabilities.
LLVM_DEBUG(dbgs() << "CGP: SINKING nonlocal addrmode: " << AddrMode
<< " for " << *MemoryInst << "\n");
Type *IntPtrTy = DL->getIntPtrType(Addr->getType());
Value *ResultPtr = nullptr, *ResultIndex = nullptr;

// First, find the pointer.
Expand Down Expand Up @@ -5364,8 +5375,19 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
: Builder.CreateGEP(I8Ty, ResultPtr, ResultIndex, "sunkaddr");
}

if (SunkAddr->getType() != Addr->getType())
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
if (SunkAddr->getType() != Addr->getType()) {
// Even though we only considered no-op addrspacecasts,
// semantically-meaningful conversions may still be present due to
// ptrtoint/inttoptr sequences.
if (SunkAddr->getType()->getPointerAddressSpace() !=
Addr->getType()->getPointerAddressSpace() &&
!DL->isNonIntegralPointerType(Addr->getType())) {
SunkAddr = Builder.CreatePtrToInt(SunkAddr, IntPtrTy, "sunkaddr");
SunkAddr =
Builder.CreateIntToPtr(SunkAddr, Addr->getType(), "sunkaddr");
} else
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
}
}
} else {
// We'd require a ptrtoint/inttoptr down the line, which we can't do for
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; RUN: opt -S -codegenprepare < %s | FileCheck %s

target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
target triple = "nvptx64-nvidia-cuda"


; ptrtoint/inttoptr combinations can introduce semantically-meaningful address space casts
; which we can't sink into an addrspacecast

; CHECK-LABEL: @test
define void @test(i8* %input_ptr) {
; CHECK-LABEL: l1:
; CHECK-NOT: addrspacecast
%intptr = ptrtoint i8* %input_ptr to i64
%ptr = inttoptr i64 %intptr to i32 addrspace(3)*

br label %l1
l1:

store atomic i32 1, i32 addrspace(3)* %ptr unordered, align 4
ret void
}


; we still should be able to look through multiple sequences of inttoptr/ptrtoint

; CHECK-LABEL: @test2
define void @test2(i8* %input_ptr) {
; CHECK-LABEL: l2:
; CHECK: bitcast
; CHECK-NEXT: store
%intptr = ptrtoint i8* %input_ptr to i64
%ptr = inttoptr i64 %intptr to i32 addrspace(3)*

%intptr2 = ptrtoint i32 addrspace(3)* %ptr to i64
%ptr2 = inttoptr i64 %intptr2 to i32*

br label %l2
l2:

store atomic i32 1, i32* %ptr2 unordered, align 4
ret void
}

0 comments on commit 2208d33

Please sign in to comment.