Index: lib/Transforms/Scalar/SROA.cpp =================================================================== --- lib/Transforms/Scalar/SROA.cpp +++ lib/Transforms/Scalar/SROA.cpp @@ -1636,7 +1636,7 @@ NewTy = NewTy->getScalarType(); if (NewTy->isPointerTy() || OldTy->isPointerTy()) { if (NewTy->isPointerTy() && OldTy->isPointerTy()) - return true; + return cast(NewTy)->getPointerAddressSpace() == cast(OldTy)->getPointerAddressSpace(); if (NewTy->isIntegerTy() || OldTy->isIntegerTy()) return true; return false; Index: test/Transforms/SROA/address-spaces-1.ll =================================================================== --- test/Transforms/SROA/address-spaces-1.ll +++ test/Transforms/SROA/address-spaces-1.ll @@ -0,0 +1,50 @@ +; RUN: opt -O3 < %s -S + +; ModuleID = '' +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" + +%union.anon = type { i32 addrspace(1)* } + +@g = addrspace(1) global i32 1, align 4 +@l = common addrspace(3) global i32 0, align 4 + +; Function Attrs: nounwind uwtable +define void @testKernel(i32 addrspace(1)*) #0 { + %2 = alloca i32 addrspace(1)*, align 8 + %3 = alloca i32, align 4 + %4 = alloca i32, align 4 + %5 = alloca i32, align 4 + %6 = alloca %union.anon, align 8 + store i32 addrspace(1)* %0, i32 addrspace(1)** %2, align 8 + store i32 0, i32* %3, align 4 + store i32 0, i32* %4, align 4 + store i32 2, i32 addrspace(3)* @l, align 4 + store i32 3, i32* %5, align 4 + %7 = bitcast %union.anon* %6 to i32 addrspace(1)** + store i32 addrspace(1)* @g, i32 addrspace(1)** %7, align 8 + %8 = bitcast %union.anon* %6 to i32 addrspace(1)** + %9 = load i32 addrspace(1)*, i32 addrspace(1)** %8, align 8 + %10 = load i32, i32 addrspace(1)* %9, align 4 + %11 = icmp ne i32 %10, 1 + %12 = zext i1 %11 to i32 + %13 = load i32, i32* %4, align 4 + %14 = add nsw i32 %13, %12 + store i32 %14, i32* %4, align 4 + %15 = bitcast %union.anon* %6 to i32 addrspace(3)** + store i32 addrspace(3)* @l, i32 addrspace(3)** %15, align 8 + %16 = bitcast %union.anon* %6 to i32 addrspace(3)** + %17 = load i32 addrspace(3)*, i32 addrspace(3)** %16, align 8 + %18 = load i32, i32 addrspace(3)* %17, align 4 + %19 = icmp ne i32 %18, 2 + %20 = zext i1 %19 to i32 + %21 = load i32, i32* %4, align 4 + %22 = add nsw i32 %21, %20 + store i32 %22, i32* %4, align 4 + %23 = load i32, i32* %4, align 4 + %24 = load i32, i32* %3, align 4 + %25 = zext i32 %24 to i64 + %26 = load i32 addrspace(1)*, i32 addrspace(1)** %2, align 8 + %27 = getelementptr inbounds i32, i32 addrspace(1)* %26, i64 %25 + store i32 %23, i32 addrspace(1)* %27, align 4 + ret void +}