[PATCH] D123573: [InferAddressSpaces] Check if AS are the same in isNoopPtrIntCastPair

Wenju He via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 12 00:19:00 PDT 2022


wenju created this revision.
wenju added a reviewer: arsenm.
Herald added subscribers: hiraditya, arichardson.
Herald added a project: All.
wenju requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.

isNoopAddrSpaceCast is expecting SrcAS is different from DestAS.
If the two AS are the same, consider ptrtoint/inttoptr as noop cast.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D123573

Files:
  llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
  llvm/test/Transforms/InferAddressSpaces/OpenCL/noop-ptrint-pair.ll


Index: llvm/test/Transforms/InferAddressSpaces/OpenCL/noop-ptrint-pair.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InferAddressSpaces/OpenCL/noop-ptrint-pair.ll
@@ -0,0 +1,16 @@
+; RUN: opt -mtriple=x86_64-unknown-unknown -S -o - -infer-address-spaces -override-flat-addr-space=4 %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
+}
Index: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -145,6 +145,11 @@
 static const unsigned UninitializedAddressSpace =
     std::numeric_limits<unsigned>::max();
 
+static cl::opt<unsigned> OverrideFlatAS(
+    "override-flat-addr-space", cl::init(UninitializedAddressSpace),
+    cl::ReallyHidden,
+    cl::desc("Override flat address space. This is mainly for test purpose."));
+
 namespace {
 
 using ValueToAddrSpaceMapTy = DenseMap<const Value *, unsigned>;
@@ -279,15 +284,15 @@
   // 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.
@@ -805,6 +810,9 @@
   if (AssumeDefaultIsFlatAddressSpace)
     FlatAddrSpace = 0;
 
+  if (OverrideFlatAS != UninitializedAddressSpace)
+    FlatAddrSpace = OverrideFlatAS;
+
   if (FlatAddrSpace == UninitializedAddressSpace) {
     FlatAddrSpace = TTI->getFlatAddressSpace();
     if (FlatAddrSpace == UninitializedAddressSpace)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D123573.422132.patch
Type: text/x-patch
Size: 3124 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220412/ffa932ec/attachment.bin>


More information about the llvm-commits mailing list