From eb11e92994fba7f79774cf06813469f293b61160 Mon Sep 17 00:00:00 2001 From: Jack Liu Date: Tue, 3 May 2016 18:01:43 +0000 Subject: [PATCH] (no commit message) llvm-svn: 268409 --- lib/Transforms/Scalar/SROA.cpp | 6 ++++-- test/Transforms/SROA/address-spaces.ll | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 5980478010d..dbc49930f83 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/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(NewTy)->getPointerAddressSpace() == + cast(OldTy)->getPointerAddressSpace(); + } if (NewTy->isIntegerTy() || OldTy->isIntegerTy()) return true; return false; diff --git a/test/Transforms/SROA/address-spaces.ll b/test/Transforms/SROA/address-spaces.ll index 5f4df7faada..119f2252d95 100644 --- a/test/Transforms/SROA/address-spaces.ll +++ b/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 +}