Index: lib/Transforms/InstCombine/InstCombineCasts.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCasts.cpp +++ lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -2243,6 +2243,12 @@ Type *DstElTy = DstPTy->getElementType(); Type *SrcElTy = SrcPTy->getElementType(); + // Casting pointers between the same type, but with different address spaces + // is an addrspace cast rather than a bitcast. + if ((DstElTy == SrcElTy) && + (DstPTy->getAddressSpace() != SrcPTy->getAddressSpace())) + return new AddrSpaceCastInst(Src, DestTy); + // If we are casting a alloca to a pointer to a type of the same // size, rewrite the allocation instruction to allocate the "right" type. // There is no need to modify malloc calls because it is their bitcast that Index: test/Transforms/InstCombine/gep-addrspace.ll =================================================================== --- test/Transforms/InstCombine/gep-addrspace.ll +++ test/Transforms/InstCombine/gep-addrspace.ll @@ -51,3 +51,21 @@ %.fca.1.insert = insertvalue { i8, i8 } zeroinitializer, i8 %3, 1 ret { i8, i8 } %.fca.1.insert } + +declare spir_func <16 x i32> @my_extern_func() + +; check that a bitcast is not generated when we need an addrspace cast +define void @bitcast_after_gep(<16 x i32>*) { +entry: +; CHECK-LABEL: @bitcast_after_gep + %1 = bitcast <16 x i32>* %0 to [16 x i32]* + %2 = addrspacecast [16 x i32]* %1 to [16 x i32] addrspace(3)* + %3 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* %2, i64 0, i64 0 +; CHECK: %1 = addrspacecast <16 x i32>* %0 to <16 x i32> addrspace(3)* + %4 = bitcast i32 addrspace(3)* %3 to <16 x i32> addrspace(3)* +; CHECK: %call = call spir_func <16 x i32> @my_extern_func() + %call = call spir_func <16 x i32> @my_extern_func() +; CHECK: store <16 x i32> %call, <16 x i32> addrspace(3)* %1 + store <16 x i32> %call, <16 x i32> addrspace(3)* %4 + ret void +}