Index: lib/CodeGen/CGExprScalar.cpp =================================================================== --- lib/CodeGen/CGExprScalar.cpp +++ lib/CodeGen/CGExprScalar.cpp @@ -1411,7 +1411,14 @@ } case CK_AddressSpaceConversion: { Value *Src = Visit(const_cast(E)); - return Builder.CreateAddrSpaceCast(Src, ConvertType(DestTy)); + llvm::Type *SrcTy = Src->getType(); + llvm::Type *DstTy = ConvertType(DestTy); + // Since target may map different address spaces in AST to the same address + // space, an address space conversion may end up as a bitcast. + if (SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace()) + return Builder.CreateAddrSpaceCast(Src, DstTy); + else + return Builder.CreateBitCast(Src, DstTy); } case CK_AtomicToNonAtomic: case CK_NonAtomicToAtomic: Index: test/CodeGenOpenCL/2016-04-01-addrcast.cl =================================================================== --- /dev/null +++ test/CodeGenOpenCL/2016-04-01-addrcast.cl @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s + +// When -ffake-address-space-map is not used, all address space mapped to 0 for x86/x86-64, a bitcast should be generated instead of addrspacecast. +void foo() { + global int *a; + generic void *b = a; + // CHECK: bitcast + // CHECK-NOT: addrspacecast +}