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::max(); +static cl::opt 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; @@ -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) 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 +}