Skip to content

Commit

Permalink
[SROA] Function canConvertValue needs to check whether both NewTy and…
Browse files Browse the repository at this point in the history
… OldTy pointers are

pointing to the same addr space. This can prevent SROA from creating a bitcast
between pointers with different addr spaces.

Differential Revision: http://reviews.llvm.org/D19697

llvm-svn: 268424
  • Loading branch information
Jack Liu committed May 3, 2016
1 parent 34fd4fb commit f101c0f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
6 changes: 4 additions & 2 deletions llvm/lib/Transforms/Scalar/SROA.cpp
Expand Up @@ -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;
Expand Down
19 changes: 18 additions & 1 deletion llvm/test/Transforms/SROA/address-spaces.ll
Expand Up @@ -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
Expand All @@ -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
}

0 comments on commit f101c0f

Please sign in to comment.