From 34a0d5fe90a749017e10d6630ac9de25b6286f94 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 31 Jan 2017 23:48:40 +0000 Subject: [PATCH] InferAddressSpaces: Fix broken casting of constants git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293718 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InferAddressSpaces.cpp | 9 ++++++-- .../InferAddressSpaces/AMDGPU/icmp.ll | 22 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/InferAddressSpaces.cpp b/lib/Transforms/Scalar/InferAddressSpaces.cpp index 279bec7cf8f..8a8f82af82c 100644 --- a/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -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(C)) return true; - if (isa(C) || isa(C)) + // Prevent illegal casts between different non-flat address spaces. + if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace) + return false; + + if (isa(C)) return true; if (auto *Op = dyn_cast(C)) { diff --git a/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll b/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll index 5a06f1fba21..b185ede2657 100644 --- a/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll +++ b/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll @@ -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 -- 2.50.1