<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Oct 16, 2013 at 10:12 AM, Tom Stellard <span dir="ltr"><<a href="mailto:tom@stellard.net" target="_blank">tom@stellard.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
This patch fixes <a href="http://www.llvm.org/bugs/show_bug.cgi?id=15907" target="_blank">http://www.llvm.org/bugs/show_bug.cgi?id=15907</a>  What<br>
needs to be done to get it upstream?<br></blockquote><div><br></div><div>Just bump the thread for review from time to time (usual rate is weekly, if it's high priority/you've got enough community credit, you can spend that to push harder).<br>
<br>- David</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
-Tom<br>
<div><div class="h5"><br>
On Thu, Sep 26, 2013 at 12:46:53PM -0700, Matt Arsenault wrote:<br>
> Hi chandlerc,<br>
><br>
> <a href="http://llvm-reviews.chandlerc.com/D1764" target="_blank">http://llvm-reviews.chandlerc.com/D1764</a><br>
><br>
> Files:<br>
>   lib/Transforms/Scalar/SROA.cpp<br>
>   test/Transforms/SROA/address-spaces.ll<br>
><br>
> Index: lib/Transforms/Scalar/SROA.cpp<br>
> ===================================================================<br>
> --- lib/Transforms/Scalar/SROA.cpp<br>
> +++ lib/Transforms/Scalar/SROA.cpp<br>
> @@ -1416,7 +1416,8 @@<br>
><br>
>    if (!OffsetPtr) {<br>
>      if (!Int8Ptr) {<br>
> -      Int8Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy(),<br>
> +      unsigned AS = Ptr->getType()->getPointerAddressSpace();<br>
> +      Int8Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy(AS),<br>
>                                    "raw_cast");<br>
>        Int8PtrOffset = Offset;<br>
>      }<br>
> @@ -2526,16 +2527,17 @@<br>
>      IntegerType *SubIntTy<br>
>        = IntTy ? Type::getIntNTy(IntTy->getContext(), Size*8) : 0;<br>
><br>
> -    Type *OtherPtrTy = NewAI.getType();<br>
> +    unsigned OtherAS = OtherPtr->getType()->getPointerAddressSpace();<br>
> +    Type *OtherPtrTy = NewAllocaTy->getPointerTo(OtherAS);<br>
>      if (VecTy && !IsWholeAlloca) {<br>
>        if (NumElements == 1)<br>
>          OtherPtrTy = VecTy->getElementType();<br>
>        else<br>
>          OtherPtrTy = VectorType::get(VecTy->getElementType(), NumElements);<br>
><br>
> -      OtherPtrTy = OtherPtrTy->getPointerTo();<br>
> +      OtherPtrTy = OtherPtrTy->getPointerTo(OtherAS);<br>
>      } else if (IntTy && !IsWholeAlloca) {<br>
> -      OtherPtrTy = SubIntTy->getPointerTo();<br>
> +      OtherPtrTy = SubIntTy->getPointerTo(OtherAS);<br>
>      }<br>
><br>
>      Value *SrcPtr = getAdjustedPtr(IRB, DL, OtherPtr, RelOffset, OtherPtrTy);<br>
> Index: test/Transforms/SROA/address-spaces.ll<br>
> ===================================================================<br>
> --- /dev/null<br>
> +++ test/Transforms/SROA/address-spaces.ll<br>
> @@ -0,0 +1,51 @@<br>
> +; RUN: opt < %s -sroa -S | FileCheck %s<br>
> +target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"<br>
> +<br>
> +declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)*, i8*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p0i8.p1i8.i32(i8*, i8 addrspace(1)*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p1i8.p1i8.i32(i8 addrspace(1)*, i8 addrspace(1)*, i32, i32, i1)<br>
> +<br>
> +; Make sure an illegal bitcast isn't introduced<br>
> +define void @test_address_space_1_1(<2 x i64> addrspace(1)* %a, i16 addrspace(1)* %b) {<br>
> +; CHECK-LABEL: @test_address_space_1_1(<br>
> +; CHECK: load <2 x i64> addrspace(1)* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)*<br>
> +  call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
> +define void @test_address_space_1_0(<2 x i64> addrspace(1)* %a, i16* %b) {<br>
> +; CHECK-LABEL: @test_address_space_1_0(<br>
> +; CHECK: load <2 x i64> addrspace(1)* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64>* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16* %b to i8*<br>
> +  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
> +define void @test_address_space_0_1(<2 x i64>* %a, i16 addrspace(1)* %b) {<br>
> +; CHECK-LABEL: @test_address_space_0_1(<br>
> +; CHECK: load <2 x i64>* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64>* %a to i8*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %aaptr, i8* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)*<br>
> +  call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
<br>
> Index: lib/Transforms/Scalar/SROA.cpp<br>
> ===================================================================<br>
> --- lib/Transforms/Scalar/SROA.cpp<br>
> +++ lib/Transforms/Scalar/SROA.cpp<br>
> @@ -1416,7 +1416,8 @@<br>
><br>
>    if (!OffsetPtr) {<br>
>      if (!Int8Ptr) {<br>
> -      Int8Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy(),<br>
> +      unsigned AS = Ptr->getType()->getPointerAddressSpace();<br>
> +      Int8Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy(AS),<br>
>                                    "raw_cast");<br>
>        Int8PtrOffset = Offset;<br>
>      }<br>
> @@ -2526,16 +2527,17 @@<br>
>      IntegerType *SubIntTy<br>
>        = IntTy ? Type::getIntNTy(IntTy->getContext(), Size*8) : 0;<br>
><br>
> -    Type *OtherPtrTy = NewAI.getType();<br>
> +    unsigned OtherAS = OtherPtr->getType()->getPointerAddressSpace();<br>
> +    Type *OtherPtrTy = NewAllocaTy->getPointerTo(OtherAS);<br>
>      if (VecTy && !IsWholeAlloca) {<br>
>        if (NumElements == 1)<br>
>          OtherPtrTy = VecTy->getElementType();<br>
>        else<br>
>          OtherPtrTy = VectorType::get(VecTy->getElementType(), NumElements);<br>
><br>
> -      OtherPtrTy = OtherPtrTy->getPointerTo();<br>
> +      OtherPtrTy = OtherPtrTy->getPointerTo(OtherAS);<br>
>      } else if (IntTy && !IsWholeAlloca) {<br>
> -      OtherPtrTy = SubIntTy->getPointerTo();<br>
> +      OtherPtrTy = SubIntTy->getPointerTo(OtherAS);<br>
>      }<br>
><br>
>      Value *SrcPtr = getAdjustedPtr(IRB, DL, OtherPtr, RelOffset, OtherPtrTy);<br>
> Index: test/Transforms/SROA/address-spaces.ll<br>
> ===================================================================<br>
> --- /dev/null<br>
> +++ test/Transforms/SROA/address-spaces.ll<br>
> @@ -0,0 +1,51 @@<br>
> +; RUN: opt < %s -sroa -S | FileCheck %s<br>
> +target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"<br>
> +<br>
> +declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)*, i8*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p0i8.p1i8.i32(i8*, i8 addrspace(1)*, i32, i32, i1)<br>
> +declare void @llvm.memcpy.p1i8.p1i8.i32(i8 addrspace(1)*, i8 addrspace(1)*, i32, i32, i1)<br>
> +<br>
> +; Make sure an illegal bitcast isn't introduced<br>
> +define void @test_address_space_1_1(<2 x i64> addrspace(1)* %a, i16 addrspace(1)* %b) {<br>
> +; CHECK-LABEL: @test_address_space_1_1(<br>
> +; CHECK: load <2 x i64> addrspace(1)* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)*<br>
> +  call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
> +define void @test_address_space_1_0(<2 x i64> addrspace(1)* %a, i16* %b) {<br>
> +; CHECK-LABEL: @test_address_space_1_0(<br>
> +; CHECK: load <2 x i64> addrspace(1)* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64>* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64> addrspace(1)* %a to i8 addrspace(1)*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p1i8.i32(i8* %aaptr, i8 addrspace(1)* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16* %b to i8*<br>
> +  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
> +define void @test_address_space_0_1(<2 x i64>* %a, i16 addrspace(1)* %b) {<br>
> +; CHECK-LABEL: @test_address_space_0_1(<br>
> +; CHECK: load <2 x i64>* %a, align 2<br>
> +; CHECK: store <2 x i64> {{.*}}, <2 x i64> addrspace(1)* {{.*}}, align 2<br>
> +; CHECK: ret void<br>
> +  %aa = alloca <2 x i64>, align 16<br>
> +  %aptr = bitcast <2 x i64>* %a to i8*<br>
> +  %aaptr = bitcast <2 x i64>* %aa to i8*<br>
> +  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %aaptr, i8* %aptr, i32 16, i32 2, i1 false)<br>
> +  %bptr = bitcast i16 addrspace(1)* %b to i8 addrspace(1)*<br>
> +  call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)* %bptr, i8* %aaptr, i32 16, i32 2, i1 false)<br>
> +  ret void<br>
> +}<br>
> +<br>
<br>
</div></div>> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>