; This test checks that the address space casts for SPIR-V generic pointer casts ; are lowered correctly by the infer-address-spaces pass. ; RUN: opt < %s -passes=infer-address-spaces -S --mtriple=spirv64-unknown-unknown | FileCheck %s ; Casting a global pointer to a global pointer. ; The uses of c2 will be replaced with %global. ; CHECK: @kernel1(ptr addrspace(1) %global) define i1 @kernel1(ptr addrspace(1) %global) { %c1 = addrspacecast ptr addrspace(1) %global to ptr addrspace(4) %c2 = call ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(1) %global, null %b1 = icmp eq ptr addrspace(1) %c2, null ret i1 %b1 } ; Casting a global pointer to a local pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel2(ptr addrspace(1) %global) define i1 @kernel2(ptr addrspace(1) %global) { %c1 = addrspacecast ptr addrspace(1) %global to ptr addrspace(4) %c2 = call ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(3) null, null %b1 = icmp eq ptr addrspace(3) %c2, null ret i1 %b1 } ; Casting a global pointer to a private pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel3(ptr addrspace(1) %global) define i1 @kernel3(ptr addrspace(1) %global) { %c1 = addrspacecast ptr addrspace(1) %global to ptr addrspace(4) %c2 = call ptr @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr null, null %b1 = icmp eq ptr %c2, null ret i1 %b1 } ; Casting a local pointer to a local pointer. ; The uses of c2 will be replaced with %local. ; CHECK: @kernel4(ptr addrspace(3) %local) define i1 @kernel4(ptr addrspace(3) %local) { %c1 = addrspacecast ptr addrspace(3) %local to ptr addrspace(4) %c2 = call ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(3) %local, null %b1 = icmp eq ptr addrspace(3) %c2, null ret i1 %b1 } ; Casting a local pointer to a global pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel5(ptr addrspace(3) %local) define i1 @kernel5(ptr addrspace(3) %local) { %c1 = addrspacecast ptr addrspace(3) %local to ptr addrspace(4) %c2 = call ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(1) null, null %b1 = icmp eq ptr addrspace(1) %c2, null ret i1 %b1 } ; Casting a local pointer to a private pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel6(ptr addrspace(3) %local) define i1 @kernel6(ptr addrspace(3) %local) { %c1 = addrspacecast ptr addrspace(3) %local to ptr addrspace(4) %c2 = call ptr @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr null, null %b1 = icmp eq ptr %c2, null ret i1 %b1 } ; Casting a private pointer to a private pointer. ; The uses of c2 will be replaced with %private. ; CHECK: @kernel7(ptr %private) define i1 @kernel7(ptr %private) { %c1 = addrspacecast ptr %private to ptr addrspace(4) %c2 = call ptr @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr %private, null %b1 = icmp eq ptr %c2, null ret i1 %b1 } ; Casting a private pointer to a global pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel8(ptr %private) define i1 @kernel8(ptr %private) { %c1 = addrspacecast ptr %private to ptr addrspace(4) %c2 = call ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(1) null, null %b1 = icmp eq ptr addrspace(1) %c2, null ret i1 %b1 } ; Casting a private pointer to a local pointer. ; The uses of c2 will be replaced with null. ; CHECK: @kernel9(ptr %private) define i1 @kernel9(ptr %private) { %c1 = addrspacecast ptr %private to ptr addrspace(4) %c2 = call ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit(ptr addrspace(4) %c1) ; CHECK: %b1 = icmp eq ptr addrspace(3) null, null %b1 = icmp eq ptr addrspace(3) %c2, null ret i1 %b1 }