]> granicus.if.org Git - llvm/commitdiff
InferAddressSpaces: Fix broken casting of constants
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 31 Jan 2017 23:48:40 +0000 (23:48 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 31 Jan 2017 23:48:40 +0000 (23:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293718 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InferAddressSpaces.cpp
test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll

index 279bec7cf8fedf0c6f94d65013c3c6cb31b4c0e8..8a8f82af82c52538d3dc65c39d6cf071cdd6f56c 100644 (file)
@@ -675,10 +675,15 @@ static bool handleMemIntrinsicPtrUse(MemIntrinsic *MI,
 // \p returns true if it is OK to change the address space of constant \p C with
 // a ConstantExpr addrspacecast.
 bool InferAddressSpaces::isSafeToCastConstAddrSpace(Constant *C, unsigned NewAS) const {
-  if (C->getType()->getPointerAddressSpace() == NewAS)
+  unsigned SrcAS = C->getType()->getPointerAddressSpace();
+  if (SrcAS == NewAS || isa<UndefValue>(C))
     return true;
 
-  if (isa<UndefValue>(C) || isa<ConstantPointerNull>(C))
+  // Prevent illegal casts between different non-flat address spaces.
+  if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace)
+    return false;
+
+  if (isa<ConstantPointerNull>(C))
     return true;
 
   if (auto *Op = dyn_cast<Operator>(C)) {
index 5a06f1fba218a37549af61e8ff413ca1fe8eaf93..b185ede26579734f53cf08a0f3da779fd8e60f71 100644 (file)
@@ -78,13 +78,22 @@ define i1 @icmp_group_flat_cmp_constant_inttoptr(i32 addrspace(3)* %group.ptr.0)
 }
 
 ; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_null(
-; CHECK: %cmp = icmp eq i32 addrspace(3)* %group.ptr.0, addrspacecast (i32* null to i32 addrspace(3)*)
+; CHECK: %1 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
+; CHECK: %cmp = icmp eq i32 addrspace(4)* %1, addrspacecast (i32* null to i32 addrspace(4)*)
 define i1 @icmp_mismatch_flat_group_private_cmp_null(i32 addrspace(3)* %group.ptr.0) #0 {
   %cast0 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
   %cmp = icmp eq i32 addrspace(4)* %cast0, addrspacecast (i32* null to i32 addrspace(4)*)
   ret i1 %cmp
 }
 
+; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_undef(
+; CHECK: %cmp = icmp eq i32 addrspace(3)* %group.ptr.0, undef
+define i1 @icmp_mismatch_flat_group_private_cmp_undef(i32 addrspace(3)* %group.ptr.0) #0 {
+  %cast0 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
+  %cmp = icmp eq i32 addrspace(4)* %cast0, addrspacecast (i32* undef to i32 addrspace(4)*)
+  ret i1 %cmp
+}
+
 @lds0 = internal addrspace(3) global i32 0, align 4
 @global0 = internal addrspace(1) global i32 0, align 4
 
@@ -114,7 +123,8 @@ define i1 @icmp_group_flat_cmp_undef(i32 addrspace(3)* %group.ptr.0) #0 {
 
 ; Test non-canonical orders
 ; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_null_swap(
-; CHECK: %cmp = icmp eq i32 addrspace(3)* addrspacecast (i32* null to i32 addrspace(3)*), %group.ptr.0
+; CHECK: %1 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
+; CHECK: %cmp = icmp eq i32 addrspace(4)* addrspacecast (i32* null to i32 addrspace(4)*), %1
 define i1 @icmp_mismatch_flat_group_private_cmp_null_swap(i32 addrspace(3)* %group.ptr.0) #0 {
   %cast0 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
   %cmp = icmp eq i32 addrspace(4)* addrspacecast (i32* null to i32 addrspace(4)*), %cast0
@@ -129,6 +139,14 @@ define i1 @icmp_group_flat_cmp_undef_swap(i32 addrspace(3)* %group.ptr.0) #0 {
   ret i1 %cmp
 }
 
+; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_undef_swap(
+; CHECK: %cmp = icmp eq i32 addrspace(3)* undef, %group.ptr.0
+define i1 @icmp_mismatch_flat_group_private_cmp_undef_swap(i32 addrspace(3)* %group.ptr.0) #0 {
+  %cast0 = addrspacecast i32 addrspace(3)* %group.ptr.0 to i32 addrspace(4)*
+  %cmp = icmp eq i32 addrspace(4)* addrspacecast (i32* undef to i32 addrspace(4)*), %cast0
+  ret i1 %cmp
+}
+
 ; TODO: Should be handled
 ; CHECK-LABEL: @icmp_flat_flat_from_group_vector(
 ; CHECK: %cmp = icmp eq <2 x i32 addrspace(4)*> %cast0, %cast1