Index: lib/Transforms/Scalar/SROA.cpp =================================================================== --- lib/Transforms/Scalar/SROA.cpp +++ lib/Transforms/Scalar/SROA.cpp @@ -1635,8 +1635,10 @@ 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; Index: test/Transforms/SROA/pr27557.ll =================================================================== --- test/Transforms/SROA/pr27557.ll +++ test/Transforms/SROA/pr27557.ll @@ -0,0 +1,19 @@ +; RUN: opt -O1 < %s -S + +; ModuleID = '' +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" + +%union.anon = type { i32 addrspace(1)* } + +@g = common addrspace(1) global i32 0, align 4 +@l = common addrspace(3) global i32 0, align 4 + +; Function Attrs: nounwind uwtable +define void @testKernel() #0 { + %1 = alloca %union.anon, align 8 + %2 = bitcast %union.anon* %1 to i32 addrspace(1)** + store i32 addrspace(1)* @g, i32 addrspace(1)** %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 +}