diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Transforms/SROA/address-spaces.ll | 19 |
2 files changed, 22 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 5980478010d..dbc49930f83 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -1635,8 +1635,10 @@ static bool canConvertValue(const DataLayout &DL, Type *OldTy, Type *NewTy) { OldTy = OldTy->getScalarType(); NewTy = NewTy->getScalarType(); if (NewTy->isPointerTy() || OldTy->isPointerTy()) { - if (NewTy->isPointerTy() && OldTy->isPointerTy()) - return true; + if (NewTy->isPointerTy() && OldTy->isPointerTy()) { + return cast<PointerType>(NewTy)->getPointerAddressSpace() == + cast<PointerType>(OldTy)->getPointerAddressSpace(); + } if (NewTy->isIntegerTy() || OldTy->isIntegerTy()) return true; return false; diff --git a/llvm/test/Transforms/SROA/address-spaces.ll b/llvm/test/Transforms/SROA/address-spaces.ll index 5f4df7faada..119f2252d95 100644 --- a/llvm/test/Transforms/SROA/address-spaces.ll +++ b/llvm/test/Transforms/SROA/address-spaces.ll @@ -52,7 +52,7 @@ define void @test_address_space_0_1(<2 x i64>* %a, i16 addrspace(1)* %b) { %struct.struct_test_27.0.13 = type { i32, float, i64, i8, [4 x i32] } -; Function Attrs: nounwind +; Function Attrs: nounwind define void @copy_struct([5 x i64] %in.coerce) { ; CHECK-LABEL: @copy_struct( ; CHECK-NOT: memcpy @@ -66,3 +66,20 @@ for.end: ret void } +%union.anon = type { i32* } + +@g = common global i32 0, align 4 +@l = common addrspace(3) global i32 0, align 4 + +; Make sure an illegal bitcast isn't introduced +define void @pr27557() { +; CHECK-LABEL: @pr27557( +; CHECK: %[[CAST:.*]] = bitcast i32** {{.*}} to i32 addrspace(3)** +; CHECK: store i32 addrspace(3)* @l, i32 addrspace(3)** %[[CAST]] + %1 = alloca %union.anon, align 8 + %2 = bitcast %union.anon* %1 to i32** + store i32* @g, i32** %2, align 8 + %3 = bitcast %union.anon* %1 to i32 addrspace(3)** + store i32 addrspace(3)* @l, i32 addrspace(3)** %3, align 8 + ret void +} |