mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 12:02:58 +02:00
InferAddressSpaces: Fix broken casting of constants
llvm-svn: 293718
This commit is contained in:
parent
13a90f6e77
commit
1c088e86a3
@ -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
|
// \p returns true if it is OK to change the address space of constant \p C with
|
||||||
// a ConstantExpr addrspacecast.
|
// a ConstantExpr addrspacecast.
|
||||||
bool InferAddressSpaces::isSafeToCastConstAddrSpace(Constant *C, unsigned NewAS) const {
|
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;
|
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;
|
return true;
|
||||||
|
|
||||||
if (auto *Op = dyn_cast<Operator>(C)) {
|
if (auto *Op = dyn_cast<Operator>(C)) {
|
||||||
|
@ -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-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 {
|
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)*
|
%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)*)
|
%cmp = icmp eq i32 addrspace(4)* %cast0, addrspacecast (i32* null to i32 addrspace(4)*)
|
||||||
ret i1 %cmp
|
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
|
@lds0 = internal addrspace(3) global i32 0, align 4
|
||||||
@global0 = internal addrspace(1) 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
|
; Test non-canonical orders
|
||||||
; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_null_swap(
|
; 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 {
|
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)*
|
%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
|
%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
|
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
|
; TODO: Should be handled
|
||||||
; CHECK-LABEL: @icmp_flat_flat_from_group_vector(
|
; CHECK-LABEL: @icmp_flat_flat_from_group_vector(
|
||||||
; CHECK: %cmp = icmp eq <2 x i32 addrspace(4)*> %cast0, %cast1
|
; CHECK: %cmp = icmp eq <2 x i32 addrspace(4)*> %cast0, %cast1
|
||||||
|
Loading…
Reference in New Issue
Block a user