blob: 8b5a9310e8b6f8530f226994a24abb26dc021e56 [file] [edit]
; RUN: opt -passes=globaldce -S -o - %s | llc -mtriple=spirv-unknown-vulkan1.3-vertex \
; RUN: -o - | FileCheck %s
; RUN: %if spirv-tools %{ opt -passes=globaldce -S -o - %s \
; RUN: | llc -mtriple=spirv-unknown-vulkan1.3-vertex -filetype=obj -o - \
; RUN: | spirv-val --target-env vulkan1.3 %}
;
; Confirm that GlobalDCE removes an addrspace(7) global with no users before
; the SPIR-V backend emits OpEntryPoint. A passing run means the dead variable
; is absent from the interface list and -fspv-preserve-interface must guard it.
;
; @used_input has a live load. It must appear in OpEntryPoint.
; @dead_input has no users. GlobalDCE removes it before backend emission.
; OpEntryPoint appears before OpVariable in SPIR-V module order. Check it first.
; CHECK: OpCapability Shader
; CHECK: OpEntryPoint Vertex %[[#]] "main"
; Exactly one Input variable must appear: the one for @used_input.
; CHECK: %[[#]] = OpTypePointer Input
; CHECK: %[[#UsedVar:]] = OpVariable %[[#]] Input
; CHECK-NOT: = OpVariable %[[#]] Input
@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
define void @main() #0 {
; Load from @used_input. The result feeds the store to @output.
%v = load float, ptr addrspace(7) @used_input, align 4
store float %v, ptr addrspace(8) @output, align 4
; @dead_input is never referenced.
ret void
}
@output = external hidden thread_local addrspace(8) global float,
!spirv.Decorations !4
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 = 0 on @output
!4 = !{!5}
!5 = !{i32 30, i32 0}