|
| 1 | +; This test case ensures that several references to "null" in the same function |
| 2 | +; don't break validity of the output code from the perspective of type inference. |
| 3 | + |
| 4 | +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s |
| 5 | +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| 6 | + |
| 7 | +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s |
| 8 | +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| 9 | + |
| 10 | +; CHECK: OpInBoundsPtrAccessChain |
| 11 | +; CHECK: OpPtrCastToGeneric |
| 12 | +; CHECK: OpGenericCastToPtr |
| 13 | +; CHECK: OpPtrEqual |
| 14 | +; CHECK: OpInBoundsPtrAccessChain |
| 15 | +; CHECK: OpGenericCastToPtr |
| 16 | +; CHECK: OpPtrEqual |
| 17 | + |
| 18 | +define spir_kernel void @foo(ptr addrspace(3) align 4 %_arg_local, ptr addrspace(1) align 4 %_arg_global) { |
| 19 | +entry: |
| 20 | + %p1 = getelementptr inbounds i32, ptr addrspace(1) %_arg_global, i64 0 |
| 21 | + %p2 = getelementptr inbounds i32, ptr addrspace(3) %_arg_local, i64 0 |
| 22 | + store i32 0, ptr addrspace(3) %p2, align 4 |
| 23 | + %p3 = getelementptr inbounds i32, ptr addrspace(1) %p1, i64 0 |
| 24 | + %p4 = addrspacecast ptr addrspace(1) %p3 to ptr addrspace(4) |
| 25 | + %p5 = tail call spir_func ptr addrspace(3) @_Z40__spirv_GenericCastToPtrExplicit_ToLocalPvi(ptr addrspace(4) %p4, i32 4) |
| 26 | + %b1 = icmp eq ptr addrspace(3) %p5, null |
| 27 | + %p6 = getelementptr inbounds i32, ptr addrspace(3) %p5, i64 0 |
| 28 | + %p7 = tail call spir_func ptr addrspace(3) @_Z40__spirv_GenericCastToPtrExplicit_ToLocalPvi(ptr addrspace(4) %p4, i32 4) |
| 29 | + %b2 = icmp eq ptr addrspace(3) %p7, null |
| 30 | + ret void |
| 31 | +} |
| 32 | + |
| 33 | +declare dso_local spir_func ptr addrspace(3) @_Z40__spirv_GenericCastToPtrExplicit_ToLocalPvi(ptr addrspace(4), i32) |
0 commit comments