Skip to content

Commit

Permalink
[InferAddressSpaces] Check if AS are the same in isNoopPtrIntCastPair
Browse files Browse the repository at this point in the history
isNoopAddrSpaceCast is expecting SrcAS is different from DestAS.
If the two AS are the same, consider ptrtoint/inttoptr as noop cast.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D123573
  • Loading branch information
wenju-he authored and yubingex007-a11y committed Apr 28, 2022
1 parent 6365bde commit 96d3be8
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
6 changes: 3 additions & 3 deletions llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,15 +279,15 @@ static bool isNoopPtrIntCastPair(const Operator *I2P, const DataLayout &DL,
// arithmetic may also be undefined after invalid pointer reinterpret cast.
// However, as we confirm through the target hooks that it's a no-op
// addrspacecast, it doesn't matter since the bits should be the same.
unsigned P2IOp0AS = P2I->getOperand(0)->getType()->getPointerAddressSpace();
unsigned I2PAS = I2P->getType()->getPointerAddressSpace();
return CastInst::isNoopCast(Instruction::CastOps(I2P->getOpcode()),
I2P->getOperand(0)->getType(), I2P->getType(),
DL) &&
CastInst::isNoopCast(Instruction::CastOps(P2I->getOpcode()),
P2I->getOperand(0)->getType(), P2I->getType(),
DL) &&
TTI->isNoopAddrSpaceCast(
P2I->getOperand(0)->getType()->getPointerAddressSpace(),
I2P->getType()->getPointerAddressSpace());
(P2IOp0AS == I2PAS || TTI->isNoopAddrSpaceCast(P2IOp0AS, I2PAS));
}

// Returns true if V is an address expression.
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
; RUN: opt -mtriple=x86_64-unknown-unknown -S -o - -infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s

; Check that assert in X86TargetMachine::isNoopAddrSpaceCast is not triggered.

target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-ni:7"

; CHECK-LABEL: @noop_ptrint_pair(
; CHECK: addrspacecast i32 addrspace(1)* %x to i32 addrspace(4)*
; CHECK-NEXT: ptrtoint i32 addrspace(4)* %{{.*}} to i64
; CHECK-NEXT: inttoptr i64 %{{.*}} to i32 addrspace(4)*
define void @noop_ptrint_pair(i32 addrspace(1)* %x) {
%1 = addrspacecast i32 addrspace(1)* %x to i32 addrspace(4)*
%2 = ptrtoint i32 addrspace(4)* %1 to i64
%3 = inttoptr i64 %2 to i32 addrspace(4)*
ret void
}

0 comments on commit 96d3be8

Please sign in to comment.