| ; RUN: llc -mtriple=spirv-unknown-vulkan1.3-vertex -o - %s | FileCheck %s |
| ; RUN: %if spirv-tools %{ llc -mtriple=spirv-unknown-vulkan1.3-vertex \ |
| ; RUN: -filetype=obj -o - %s | spirv-val --target-env vulkan1.3 %} |
| ; |
| ; Confirm that addrspace(7) globals appear in the SPIR-V output as distinct |
| ; OpVariables and in the OpEntryPoint interface. Three cases are tested: |
| ; |
| ; @used_input -- has a real load in @main. |
| ; @dead_input -- no IR uses; protected by llvm.compiler.used. |
| ; @bare_input -- no IR uses; NOT in llvm.compiler.used. |
| ; |
| ; @bare_input tests that the backend emits any addrspace(7) global that reaches |
| ; it without an initializer and without real function uses, regardless of |
| ; llvm.compiler.used. |
| ; |
| ; The OpEntryPoint check pins the interface to exactly four IDs. The SPIR-V |
| ; backend builds the interface by iterating every Input/Output OpVariable in |
| ; the module, so combined with the four OpVariable checks below this proves |
| ; all four preserved variables appear in OpEntryPoint regardless of the |
| ; backend's interface ordering. |
| |
| ; CHECK: OpCapability Shader |
| ; CHECK: OpEntryPoint Vertex %[[#]] "main" %[[#]] %[[#]] %[[#]] %[[#]] |
| |
| ; CHECK-DAG: OpDecorate %[[#USED:]] Location 0 |
| ; CHECK-DAG: OpDecorate %[[#DEAD:]] Location 1 |
| ; CHECK-DAG: OpDecorate %[[#BARE:]] Location 2 |
| ; CHECK-DAG: OpDecorate %[[#OUTPUT:]] Location 0 |
| ; CHECK-DAG: %[[#USED]] = OpVariable %[[#]] Input |
| ; CHECK-DAG: %[[#DEAD]] = OpVariable %[[#]] Input |
| ; CHECK-DAG: %[[#BARE]] = OpVariable %[[#]] Input |
| ; CHECK-DAG: %[[#OUTPUT]] = OpVariable %[[#]] Output |
| |
| @used_input = external hidden thread_local addrspace(7) global float, |
| !spirv.Decorations !0 |
| @dead_input = external hidden thread_local addrspace(7) global float, |
| !spirv.Decorations !2 |
| @bare_input = external hidden thread_local addrspace(7) global float, |
| !spirv.Decorations !4 |
| |
| @llvm.compiler.used = appending global [1 x ptr addrspace(7)] |
| [ptr addrspace(7) @dead_input], section "llvm.metadata" |
| |
| define void @main() #0 { |
| %v = load float, ptr addrspace(7) @used_input, align 4 |
| store float %v, ptr addrspace(8) @output, align 4 |
| ret void |
| } |
| |
| @output = external hidden thread_local addrspace(8) global float, |
| !spirv.Decorations !6 |
| |
| attributes #0 = { "hlsl.shader"="vertex" } |
| |
| ; Location = 0 on @used_input |
| !0 = !{!1} |
| !1 = !{i32 30, i32 0} |
| |
| ; Location = 1 on @dead_input |
| !2 = !{!3} |
| !3 = !{i32 30, i32 1} |
| |
| ; Location = 2 on @bare_input |
| !4 = !{!5} |
| !5 = !{i32 30, i32 2} |
| |
| ; Location = 0 on @output |
| !6 = !{!7} |
| !7 = !{i32 30, i32 0} |