15651af89SMatt Arsenault; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s 2cee313d2SEric Christopher 3cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_cmp_self( 4a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, %group.ptr.0 5a982f095SMatt Arsenaultdefine i1 @icmp_flat_cmp_self(ptr addrspace(3) %group.ptr.0) #0 { 6a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 7a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, %cast0 8cee313d2SEric Christopher ret i1 %cmp 9cee313d2SEric Christopher} 10cee313d2SEric Christopher 11cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_flat_from_group( 12a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, %group.ptr.1 13a982f095SMatt Arsenaultdefine i1 @icmp_flat_flat_from_group(ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1) #0 { 14a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 15a982f095SMatt Arsenault %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr 16a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, %cast1 17cee313d2SEric Christopher ret i1 %cmp 18cee313d2SEric Christopher} 19cee313d2SEric Christopher 20cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_from_group_private( 21a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr addrspace(5) %private.ptr.0 to ptr 22a982f095SMatt Arsenault; CHECK: %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr 23a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr %cast0, %cast1 24a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_from_group_private(ptr addrspace(5) %private.ptr.0, ptr addrspace(3) %group.ptr.1) #0 { 25a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(5) %private.ptr.0 to ptr 26a982f095SMatt Arsenault %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr 27a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, %cast1 28cee313d2SEric Christopher ret i1 %cmp 29cee313d2SEric Christopher} 30cee313d2SEric Christopher 31cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_group_flat( 32a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 33a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr %cast0, %flat.ptr.1 34a982f095SMatt Arsenaultdefine i1 @icmp_flat_group_flat(ptr addrspace(3) %group.ptr.0, ptr %flat.ptr.1) #0 { 35a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 36a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, %flat.ptr.1 37cee313d2SEric Christopher ret i1 %cmp 38cee313d2SEric Christopher} 39cee313d2SEric Christopher 40cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_flat_group( 41a982f095SMatt Arsenault; CHECK: %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr 42a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr %flat.ptr.0, %cast1 43a982f095SMatt Arsenaultdefine i1 @icmp_flat_flat_group(ptr %flat.ptr.0, ptr addrspace(3) %group.ptr.1) #0 { 44a982f095SMatt Arsenault %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr 45a982f095SMatt Arsenault %cmp = icmp eq ptr %flat.ptr.0, %cast1 46cee313d2SEric Christopher ret i1 %cmp 47cee313d2SEric Christopher} 48cee313d2SEric Christopher 49cee313d2SEric Christopher; Keeping as cmp addrspace(3)* is better 50cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_to_group_cmp( 51a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr %flat.ptr.0 to ptr addrspace(3) 52a982f095SMatt Arsenault; CHECK: %cast1 = addrspacecast ptr %flat.ptr.1 to ptr addrspace(3) 53a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %cast0, %cast1 54a982f095SMatt Arsenaultdefine i1 @icmp_flat_to_group_cmp(ptr %flat.ptr.0, ptr %flat.ptr.1) #0 { 55a982f095SMatt Arsenault %cast0 = addrspacecast ptr %flat.ptr.0 to ptr addrspace(3) 56a982f095SMatt Arsenault %cast1 = addrspacecast ptr %flat.ptr.1 to ptr addrspace(3) 57a982f095SMatt Arsenault %cmp = icmp eq ptr addrspace(3) %cast0, %cast1 58cee313d2SEric Christopher ret i1 %cmp 59cee313d2SEric Christopher} 60cee313d2SEric Christopher 61cee313d2SEric Christopher; FIXME: Should be able to ask target about how to constant fold the 62cee313d2SEric Christopher; constant cast if this is OK to change if 0 is a valid pointer. 63cee313d2SEric Christopher 64cee313d2SEric Christopher; CHECK-LABEL: @icmp_group_flat_cmp_null( 65a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, addrspacecast (ptr null to ptr addrspace(3)) 66a982f095SMatt Arsenaultdefine i1 @icmp_group_flat_cmp_null(ptr addrspace(3) %group.ptr.0) #0 { 67a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 68a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, null 69cee313d2SEric Christopher ret i1 %cmp 70cee313d2SEric Christopher} 71cee313d2SEric Christopher 72cee313d2SEric Christopher; CHECK-LABEL: @icmp_group_flat_cmp_constant_inttoptr( 73a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, addrspacecast (ptr inttoptr (i64 400 to ptr) to ptr addrspace(3)) 74a982f095SMatt Arsenaultdefine i1 @icmp_group_flat_cmp_constant_inttoptr(ptr addrspace(3) %group.ptr.0) #0 { 75a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 76a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, inttoptr (i64 400 to ptr) 77cee313d2SEric Christopher ret i1 %cmp 78cee313d2SEric Christopher} 79cee313d2SEric Christopher 80cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_null( 81a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 82a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr %cast0, addrspacecast (ptr addrspace(5) null to ptr) 83a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_group_private_cmp_null(ptr addrspace(3) %group.ptr.0) #0 { 84a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 85a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, addrspacecast (ptr addrspace(5) null to ptr) 86cee313d2SEric Christopher ret i1 %cmp 87cee313d2SEric Christopher} 88cee313d2SEric Christopher 89cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_undef( 90a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, undef 91a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_group_private_cmp_undef(ptr addrspace(3) %group.ptr.0) #0 { 92a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 93a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, addrspacecast (ptr addrspace(5) undef to ptr) 94cee313d2SEric Christopher ret i1 %cmp 95cee313d2SEric Christopher} 96cee313d2SEric Christopher 97cee313d2SEric Christopher@lds0 = internal addrspace(3) global i32 0, align 4 98cee313d2SEric Christopher@global0 = internal addrspace(1) global i32 0, align 4 99cee313d2SEric Christopher 100cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_group_global_cmp_gv( 101a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 102a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr %cast0, addrspacecast (ptr addrspace(1) @global0 to ptr) 103a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_group_global_cmp_gv(ptr addrspace(3) %group.ptr.0) #0 { 104a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 105a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, addrspacecast (ptr addrspace(1) @global0 to ptr) 106cee313d2SEric Christopher ret i1 %cmp 107cee313d2SEric Christopher} 108cee313d2SEric Christopher 109cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_group_global_cmp_gv_gv( 110a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspacecast (ptr addrspace(3) @lds0 to ptr), addrspacecast (ptr addrspace(1) @global0 to ptr) 111a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_group_global_cmp_gv_gv(ptr addrspace(3) %group.ptr.0) #0 { 112a982f095SMatt Arsenault %cmp = icmp eq ptr addrspacecast (ptr addrspace(3) @lds0 to ptr), addrspacecast (ptr addrspace(1) @global0 to ptr) 113cee313d2SEric Christopher ret i1 %cmp 114cee313d2SEric Christopher} 115cee313d2SEric Christopher 116cee313d2SEric Christopher; CHECK-LABEL: @icmp_group_flat_cmp_undef( 117a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) %group.ptr.0, undef 118a982f095SMatt Arsenaultdefine i1 @icmp_group_flat_cmp_undef(ptr addrspace(3) %group.ptr.0) #0 { 119a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 120a982f095SMatt Arsenault %cmp = icmp eq ptr %cast0, undef 121cee313d2SEric Christopher ret i1 %cmp 122cee313d2SEric Christopher} 123cee313d2SEric Christopher 124cee313d2SEric Christopher; Test non-canonical orders 125cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_null_swap( 126a982f095SMatt Arsenault; CHECK: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 127a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspacecast (ptr addrspace(5) null to ptr), %cast0 128a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_group_private_cmp_null_swap(ptr addrspace(3) %group.ptr.0) #0 { 129a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 130a982f095SMatt Arsenault %cmp = icmp eq ptr addrspacecast (ptr addrspace(5) null to ptr), %cast0 131cee313d2SEric Christopher ret i1 %cmp 132cee313d2SEric Christopher} 133cee313d2SEric Christopher 134cee313d2SEric Christopher; CHECK-LABEL: @icmp_group_flat_cmp_undef_swap( 135a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) undef, %group.ptr.0 136a982f095SMatt Arsenaultdefine i1 @icmp_group_flat_cmp_undef_swap(ptr addrspace(3) %group.ptr.0) #0 { 137a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 138a982f095SMatt Arsenault %cmp = icmp eq ptr undef, %cast0 139cee313d2SEric Christopher ret i1 %cmp 140cee313d2SEric Christopher} 141cee313d2SEric Christopher 142cee313d2SEric Christopher; CHECK-LABEL: @icmp_mismatch_flat_group_private_cmp_undef_swap( 143a982f095SMatt Arsenault; CHECK: %cmp = icmp eq ptr addrspace(3) undef, %group.ptr.0 144a982f095SMatt Arsenaultdefine i1 @icmp_mismatch_flat_group_private_cmp_undef_swap(ptr addrspace(3) %group.ptr.0) #0 { 145a982f095SMatt Arsenault %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr 146a982f095SMatt Arsenault %cmp = icmp eq ptr addrspacecast (ptr addrspace(5) undef to ptr), %cast0 147cee313d2SEric Christopher ret i1 %cmp 148cee313d2SEric Christopher} 149cee313d2SEric Christopher 150cee313d2SEric Christopher; CHECK-LABEL: @icmp_flat_flat_from_group_vector( 151*44096e69SCaprYang; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 152a982f095SMatt Arsenaultdefine <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { 153a982f095SMatt Arsenault %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr> 154a982f095SMatt Arsenault %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr> 155a982f095SMatt Arsenault %cmp = icmp eq <2 x ptr> %cast0, %cast1 156cee313d2SEric Christopher ret <2 x i1> %cmp 157cee313d2SEric Christopher} 158cee313d2SEric Christopher 159cee313d2SEric Christopherattributes #0 = { nounwind } 160