Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Fischer <greg@lunarg.com>2022-09-13 17:41:07 +0300
committerGitHub <noreply@github.com>2022-09-13 17:41:07 +0300
commit272e4b3d07160254f2439f714d4c84f738e9dec6 (patch)
treeb4131f87889ef114825b9e65900c3b7e868bba83
parent49deada730614b9762e11195fd1b23715d2c2a96 (diff)
Fix missing and incorrect DebugValues (#4929)
Specificially, fixes DebugValues coming out of eliminate-local-single-store and eliminate-local-multi-store AKA SSA rewrite.
-rw-r--r--source/opt/debug_info_manager.cpp6
-rw-r--r--source/opt/debug_info_manager.h17
-rw-r--r--source/opt/local_single_store_elim_pass.cpp2
-rw-r--r--source/opt/ssa_rewrite_pass.cpp24
-rw-r--r--source/opt/ssa_rewrite_pass.h2
-rw-r--r--test/opt/ir_context_test.cpp34
-rw-r--r--test/opt/local_single_store_elim_test.cpp231
-rw-r--r--test/opt/local_ssa_elim_test.cpp1205
8 files changed, 1468 insertions, 53 deletions
diff --git a/source/opt/debug_info_manager.cpp b/source/opt/debug_info_manager.cpp
index f0a78a5ff..98d98d4ff 100644
--- a/source/opt/debug_info_manager.cpp
+++ b/source/opt/debug_info_manager.cpp
@@ -564,8 +564,8 @@ bool DebugInfoManager::IsDeclareVisibleToInstr(Instruction* dbg_declare,
bool DebugInfoManager::AddDebugValueIfVarDeclIsVisible(
Instruction* scope_and_line, uint32_t variable_id, uint32_t value_id,
- Instruction* insert_pos,
- std::unordered_set<Instruction*>* invisible_decls) {
+ Instruction* insert_pos, std::unordered_set<Instruction*>* invisible_decls,
+ bool force) {
assert(scope_and_line != nullptr);
auto dbg_decl_itr = var_id_to_dbg_decl_.find(variable_id);
@@ -573,7 +573,7 @@ bool DebugInfoManager::AddDebugValueIfVarDeclIsVisible(
bool modified = false;
for (auto* dbg_decl_or_val : dbg_decl_itr->second) {
- if (!IsDeclareVisibleToInstr(dbg_decl_or_val, scope_and_line)) {
+ if (!IsDeclareVisibleToInstr(dbg_decl_or_val, scope_and_line) && !force) {
if (invisible_decls) invisible_decls->insert(dbg_decl_or_val);
continue;
}
diff --git a/source/opt/debug_info_manager.h b/source/opt/debug_info_manager.h
index df34b30f4..7dfb7c7f9 100644
--- a/source/opt/debug_info_manager.h
+++ b/source/opt/debug_info_manager.h
@@ -15,6 +15,7 @@
#ifndef SOURCE_OPT_DEBUG_INFO_MANAGER_H_
#define SOURCE_OPT_DEBUG_INFO_MANAGER_H_
+#include <set>
#include <unordered_map>
#include <unordered_set>
@@ -145,11 +146,12 @@ class DebugInfoManager {
// variable that is in the scope of |scope_and_line| and whose memory is
// |variable_id| and inserts it after the instruction |insert_pos|.
// Returns whether a DebugValue is added or not. |invisible_decls| returns
- // DebugDeclares invisible to |scope_and_line|.
+ // DebugDeclares invisible to |scope_and_line|. Assume visible if |force|
+ // is true.
bool AddDebugValueIfVarDeclIsVisible(
Instruction* scope_and_line, uint32_t variable_id, uint32_t value_id,
Instruction* insert_pos,
- std::unordered_set<Instruction*>* invisible_decls);
+ std::unordered_set<Instruction*>* invisible_decls, bool force = false);
// Creates a DebugValue for DebugDeclare |dbg_decl| and inserts it before
// |insert_before|. The new DebugValue has the same line and scope as
@@ -244,9 +246,18 @@ class DebugInfoManager {
// operand is the function.
std::unordered_map<uint32_t, Instruction*> fn_id_to_dbg_fn_;
+ // Orders Instruction* for use in associative containers (i.e. less than
+ // ordering). Unique Id is used.
+ typedef Instruction* InstPtr;
+ struct InstPtrLess {
+ bool operator()(const InstPtr& lhs, const InstPtr& rhs) const {
+ return lhs->unique_id() < rhs->unique_id();
+ }
+ };
+
// Mapping from variable or value ids to DebugDeclare or DebugValue
// instructions whose operand is the variable or value.
- std::unordered_map<uint32_t, std::unordered_set<Instruction*>>
+ std::unordered_map<uint32_t, std::set<InstPtr, InstPtrLess>>
var_id_to_dbg_decl_;
// Mapping from DebugScope ids to users.
diff --git a/source/opt/local_single_store_elim_pass.cpp b/source/opt/local_single_store_elim_pass.cpp
index 8cdd0abdc..2efb1e2c8 100644
--- a/source/opt/local_single_store_elim_pass.cpp
+++ b/source/opt/local_single_store_elim_pass.cpp
@@ -179,7 +179,7 @@ bool LocalSingleStoreElimPass::RewriteDebugDeclares(Instruction* store_inst,
uint32_t value_id = store_inst->GetSingleWordInOperand(1);
bool modified =
context()->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(
- store_inst, var_id, value_id, store_inst, &invisible_decls);
+ store_inst, var_id, value_id, store_inst, &invisible_decls, true);
// For cases like the argument passing for an inlined function, the value
// assignment is out of DebugDeclare's scope, but we have to preserve the
diff --git a/source/opt/ssa_rewrite_pass.cpp b/source/opt/ssa_rewrite_pass.cpp
index 29ab6123f..23cd64135 100644
--- a/source/opt/ssa_rewrite_pass.cpp
+++ b/source/opt/ssa_rewrite_pass.cpp
@@ -316,7 +316,8 @@ void SSARewriter::ProcessStore(Instruction* inst, BasicBlock* bb) {
if (pass_->IsTargetVar(var_id)) {
WriteVariable(var_id, bb, val_id);
pass_->context()->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(
- inst, var_id, val_id, inst, &decls_invisible_to_value_assignment_);
+ inst, var_id, val_id, inst, &decls_invisible_to_value_assignment_,
+ true);
#if SSA_REWRITE_DEBUGGING_LEVEL > 1
std::cerr << "\tFound store '%" << var_id << " = %" << val_id << "': "
@@ -497,7 +498,7 @@ uint32_t SSARewriter::GetPhiArgument(const PhiCandidate* phi_candidate,
return 0;
}
-bool SSARewriter::ApplyReplacements() {
+bool SSARewriter::ApplyReplacements(Function* fp) {
bool modified = false;
#if SSA_REWRITE_DEBUGGING_LEVEL > 2
@@ -507,9 +508,20 @@ bool SSARewriter::ApplyReplacements() {
std::cerr << "\n\n";
#endif
+ // Sort phi candiates by reverse postorder. Operand of a Phi may be
+ // a phi itself so make sure all operand phis are generated first.
+ std::vector<const PhiCandidate*> ordered_phis_to_generate;
+ pass_->context()->cfg()->ForEachBlockInReversePostOrder(
+ &*fp->begin(), [&ordered_phis_to_generate, this](BasicBlock* bb) {
+ for (const PhiCandidate* phi_candidate : phis_to_generate_) {
+ if (phi_candidate->bb() == bb)
+ ordered_phis_to_generate.push_back(phi_candidate);
+ }
+ });
+
// Add Phi instructions from completed Phi candidates.
std::vector<Instruction*> generated_phis;
- for (const PhiCandidate* phi_candidate : phis_to_generate_) {
+ for (const PhiCandidate* phi_candidate : ordered_phis_to_generate) {
#if SSA_REWRITE_DEBUGGING_LEVEL > 2
std::cerr << "Phi candidate: " << phi_candidate->PrettyPrint(pass_->cfg())
<< "\n";
@@ -557,11 +569,11 @@ bool SSARewriter::ApplyReplacements() {
phi_candidate->var_id(), phi_candidate->result_id(),
{SpvDecorationRelaxedPrecision});
- // Add DebugValue for the new OpPhi instruction.
+ // Add DebugValue for the new OpPhi instruction. Assume OpPhi is visible.
insert_it->SetDebugScope(local_var->GetDebugScope());
pass_->context()->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(
&*insert_it, phi_candidate->var_id(), phi_candidate->result_id(),
- &*insert_it, &decls_invisible_to_value_assignment_);
+ &*insert_it, &decls_invisible_to_value_assignment_, true);
modified = true;
}
@@ -733,7 +745,7 @@ Pass::Status SSARewriter::RewriteFunctionIntoSSA(Function* fp) {
FinalizePhiCandidates();
// Finally, apply all the replacements in the IR.
- bool modified = ApplyReplacements();
+ bool modified = ApplyReplacements(fp);
auto status = AddDebugValuesForInvisibleDebugDecls(fp);
if (status == Pass::Status::SuccessWithChange ||
diff --git a/source/opt/ssa_rewrite_pass.h b/source/opt/ssa_rewrite_pass.h
index 1f4cd24ca..44cdd360a 100644
--- a/source/opt/ssa_rewrite_pass.h
+++ b/source/opt/ssa_rewrite_pass.h
@@ -181,7 +181,7 @@ class SSARewriter {
// Applies all the SSA replacement decisions. This replaces loads/stores to
// SSA target variables with their corresponding SSA IDs, and inserts Phi
// instructions for them.
- bool ApplyReplacements();
+ bool ApplyReplacements(Function* fp);
// Registers a definition for variable |var_id| in basic block |bb| with
// value |val_id|.
diff --git a/test/opt/ir_context_test.cpp b/test/opt/ir_context_test.cpp
index ece04796f..dcae7cf81 100644
--- a/test/opt/ir_context_test.cpp
+++ b/test/opt/ir_context_test.cpp
@@ -1147,40 +1147,6 @@ OpFunctionEnd)";
dbg_decl = ctx->get_def_use_mgr()->GetDef(25);
EXPECT_EQ(dbg_decl->GetSingleWordOperand(kDebugDeclareOperandVariableIndex),
20);
-
- // No DebugValue should be added because result id '26' is not used for
- // DebugDeclare.
- ctx->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(dbg_decl, 26, 22,
- dbg_decl, nullptr);
- EXPECT_EQ(dbg_decl->NextNode()->opcode(), SpvOpReturn);
-
- // DebugValue should be added because result id '20' is used for DebugDeclare.
- ctx->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(dbg_decl, 20, 22,
- dbg_decl, nullptr);
- EXPECT_EQ(dbg_decl->NextNode()->GetOpenCL100DebugOpcode(),
- OpenCLDebugInfo100DebugValue);
-
- // Replace all uses of result it '20' with '26'
- EXPECT_EQ(dbg_decl->GetSingleWordOperand(kDebugDeclareOperandVariableIndex),
- 20);
- EXPECT_TRUE(ctx->ReplaceAllUsesWith(20, 26));
- EXPECT_EQ(dbg_decl->GetSingleWordOperand(kDebugDeclareOperandVariableIndex),
- 26);
-
- // No DebugValue should be added because result id '20' is not used for
- // DebugDeclare.
- ctx->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(dbg_decl, 20, 7,
- dbg_decl, nullptr);
- Instruction* dbg_value = dbg_decl->NextNode();
- EXPECT_EQ(dbg_value->GetOpenCL100DebugOpcode(), OpenCLDebugInfo100DebugValue);
- EXPECT_EQ(dbg_value->GetSingleWordOperand(kDebugValueOperandValueIndex), 22);
-
- // DebugValue should be added because result id '26' is used for DebugDeclare.
- ctx->get_debug_info_mgr()->AddDebugValueIfVarDeclIsVisible(dbg_decl, 26, 7,
- dbg_decl, nullptr);
- dbg_value = dbg_decl->NextNode();
- EXPECT_EQ(dbg_value->GetOpenCL100DebugOpcode(), OpenCLDebugInfo100DebugValue);
- EXPECT_EQ(dbg_value->GetSingleWordOperand(kDebugValueOperandValueIndex), 7);
}
} // namespace
diff --git a/test/opt/local_single_store_elim_test.cpp b/test/opt/local_single_store_elim_test.cpp
index 5d910c4e7..8f43a11d4 100644
--- a/test/opt/local_single_store_elim_test.cpp
+++ b/test/opt/local_single_store_elim_test.cpp
@@ -1494,19 +1494,19 @@ TEST_F(LocalSingleStoreElimTest, AddDebugValueforStoreOutOfDebugDeclareScope) {
%56 = OpLoad %v4float %in_var_COLOR
;CHECK: DebugNoScope
;CHECK-NOT: OpLine
-;CHECK: [[pos:%\w+]] = OpLoad %v4float %in_var_POSITION
-;CHECK: [[color:%\w+]] = OpLoad %v4float %in_var_COLOR
-
OpLine %7 7 23
OpStore %param_var_color %56
OpNoLine
%93 = OpExtInst %void %1 DebugScope %48
%73 = OpExtInst %void %1 DebugDeclare %53 %param_var_pos %52
%74 = OpExtInst %void %1 DebugDeclare %51 %param_var_color %52
+;CHECK: [[pos:%\w+]] = OpLoad %v4float %in_var_POSITION
;CHECK: OpLine [[file:%\w+]] 6 23
-;CHECK-NEXT: {{%\w+}} = OpExtInst %void {{%\w+}} DebugValue [[dbg_pos]] [[pos]] [[empty_expr:%\w+]]
+;CHECK: {{%\w+}} = OpExtInst %void {{%\w+}} DebugValue [[dbg_pos]] [[pos]] [[empty_expr:%\w+]]
+;CHECK: [[color:%\w+]] = OpLoad %v4float %in_var_COLOR
;CHECK: OpLine [[file]] 7 23
-;CHECK-NEXT: {{%\w+}} = OpExtInst %void {{%\w+}} DebugValue [[dbg_color]] [[color]] [[empty_expr]]
+;CHECK: {{%\w+}} = OpExtInst %void {{%\w+}} DebugValue [[dbg_color]] [[color]] [[empty_expr]]
+;CHECK: OpLine [[file]] 9 3
%94 = OpExtInst %void %1 DebugScope %49
OpLine %7 9 3
@@ -1529,6 +1529,227 @@ TEST_F(LocalSingleStoreElimTest, AddDebugValueforStoreOutOfDebugDeclareScope) {
SinglePassRunAndMatch<LocalSingleStoreElimPass>(text, false);
}
+TEST_F(LocalSingleStoreElimTest, DebugValuesForAllLocalsAndParams) {
+ // Texture2D g_tColor;
+ //
+ // SamplerState g_sAniso;
+ //
+ // struct PS_INPUT
+ // {
+ // float2 vTextureCoords : TEXCOORD2 ;
+ // } ;
+ //
+ // struct PS_OUTPUT
+ // {
+ // float4 vColor : SV_Target0 ;
+ // } ;
+ //
+ // void do_sample ( in float2 tc, out float4 c ) {
+ // c = g_tColor . Sample ( g_sAniso , tc ) ;
+ // }
+ //
+ // PS_OUTPUT MainPs ( PS_INPUT i )
+ // {
+ // PS_OUTPUT ps_output ;
+ // float4 color;
+ //
+ // do_sample ( i . vTextureCoords . xy , color ) ;
+ // ps_output . vColor = color;
+ // return ps_output ;
+ // }
+ const std::string text = R"(
+ OpCapability Shader
+ %1 = OpExtInstImport "OpenCL.DebugInfo.100"
+;CHECK: [[set:%\w+]] = OpExtInstImport "OpenCL.DebugInfo.100"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %MainPs "MainPs" %in_var_TEXCOORD2 %out_var_SV_Target0 %g_tColor %g_sAniso
+ OpExecutionMode %MainPs OriginUpperLeft
+ %7 = OpString "foo2.frag"
+ %21 = OpString "float"
+ %27 = OpString "PS_INPUT"
+ %31 = OpString "vTextureCoords"
+ %34 = OpString "PS_OUTPUT"
+ %38 = OpString "vColor"
+ %40 = OpString "do_sample"
+ %41 = OpString ""
+ %45 = OpString "c"
+ %47 = OpString "tc"
+ %50 = OpString "MainPs"
+ %54 = OpString "color"
+ %56 = OpString "ps_output"
+ %59 = OpString "i"
+ %62 = OpString "@type.sampler"
+ %63 = OpString "type.sampler"
+ %65 = OpString "g_sAniso"
+ %67 = OpString "@type.2d.image"
+ %68 = OpString "type.2d.image"
+ %70 = OpString "TemplateParam"
+ %73 = OpString "g_tColor"
+;CHECK: [[str_c:%\w+]] = OpString "c"
+;CHECK: [[str_tc:%\w+]] = OpString "tc"
+;CHECK: [[str_color:%\w+]] = OpString "color"
+;CHECK: [[str_ps_output:%\w+]] = OpString "ps_output"
+;CHECK: [[str_i:%\w+]] = OpString "i"
+ OpName %type_2d_image "type.2d.image"
+ OpName %g_tColor "g_tColor"
+ OpName %type_sampler "type.sampler"
+ OpName %g_sAniso "g_sAniso"
+ OpName %in_var_TEXCOORD2 "in.var.TEXCOORD2"
+ OpName %out_var_SV_Target0 "out.var.SV_Target0"
+ OpName %MainPs "MainPs"
+ OpName %PS_INPUT "PS_INPUT"
+ OpMemberName %PS_INPUT 0 "vTextureCoords"
+ OpName %PS_OUTPUT "PS_OUTPUT"
+ OpMemberName %PS_OUTPUT 0 "vColor"
+ OpName %type_sampled_image "type.sampled.image"
+ OpDecorate %in_var_TEXCOORD2 Location 0
+ OpDecorate %out_var_SV_Target0 Location 0
+ OpDecorate %g_tColor DescriptorSet 0
+ OpDecorate %g_tColor Binding 0
+ OpDecorate %g_sAniso DescriptorSet 0
+ OpDecorate %g_sAniso Binding 1
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %uint_32 = OpConstant %uint 32
+ %float = OpTypeFloat 32
+%type_2d_image = OpTypeImage %float 2D 2 0 0 1 Unknown
+%_ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %type_2d_image
+%type_sampler = OpTypeSampler
+%_ptr_UniformConstant_type_sampler = OpTypePointer UniformConstant %type_sampler
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %void = OpTypeVoid
+ %uint_64 = OpConstant %uint 64
+ %uint_0 = OpConstant %uint 0
+ %uint_128 = OpConstant %uint 128
+ %75 = OpTypeFunction %void
+ %PS_INPUT = OpTypeStruct %v2float
+%_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT
+ %PS_OUTPUT = OpTypeStruct %v4float
+ %85 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT
+%_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %105 = OpTypeFunction %void %_ptr_Function_v2float %_ptr_Function_v4float
+%type_sampled_image = OpTypeSampledImage %type_2d_image
+ %g_tColor = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+ %g_sAniso = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+%in_var_TEXCOORD2 = OpVariable %_ptr_Input_v2float Input
+%out_var_SV_Target0 = OpVariable %_ptr_Output_v4float Output
+ %145 = OpExtInst %void %1 DebugOperation Deref
+ %61 = OpExtInst %void %1 DebugInfoNone
+ %58 = OpExtInst %void %1 DebugExpression
+ %23 = OpExtInst %void %1 DebugTypeBasic %21 %uint_32 Float
+ %24 = OpExtInst %void %1 DebugTypeVector %23 2
+ %25 = OpExtInst %void %1 DebugSource %7
+ %26 = OpExtInst %void %1 DebugCompilationUnit 1 4 %25 HLSL
+ %29 = OpExtInst %void %1 DebugTypeComposite %27 Structure %25 5 8 %26 %27 %uint_64 FlagIsProtected|FlagIsPrivate %30
+ %30 = OpExtInst %void %1 DebugTypeMember %31 %24 %25 7 12 %29 %uint_0 %uint_64 FlagIsProtected|FlagIsPrivate
+ %33 = OpExtInst %void %1 DebugTypeVector %23 4
+ %36 = OpExtInst %void %1 DebugTypeComposite %34 Structure %25 10 8 %26 %34 %uint_128 FlagIsProtected|FlagIsPrivate %37
+ %37 = OpExtInst %void %1 DebugTypeMember %38 %33 %25 12 12 %36 %uint_0 %uint_128 FlagIsProtected|FlagIsPrivate
+ %39 = OpExtInst %void %1 DebugTypeFunction FlagIsProtected|FlagIsPrivate %void %24 %33
+ %42 = OpExtInst %void %1 DebugFunction %40 %39 %25 15 1 %26 %41 FlagIsProtected|FlagIsPrivate 15 %61
+ %44 = OpExtInst %void %1 DebugLexicalBlock %25 15 47 %42
+ %46 = OpExtInst %void %1 DebugLocalVariable %45 %33 %25 15 43 %42 FlagIsLocal 2
+ %48 = OpExtInst %void %1 DebugLocalVariable %47 %24 %25 15 28 %42 FlagIsLocal 1
+ %49 = OpExtInst %void %1 DebugTypeFunction FlagIsProtected|FlagIsPrivate %36 %29
+ %51 = OpExtInst %void %1 DebugFunction %50 %49 %25 19 1 %26 %41 FlagIsProtected|FlagIsPrivate 20 %61
+ %53 = OpExtInst %void %1 DebugLexicalBlock %25 20 1 %51
+ %55 = OpExtInst %void %1 DebugLocalVariable %54 %33 %25 22 12 %53 FlagIsLocal
+ %57 = OpExtInst %void %1 DebugLocalVariable %56 %36 %25 21 15 %53 FlagIsLocal
+ %60 = OpExtInst %void %1 DebugLocalVariable %59 %29 %25 19 29 %51 FlagIsLocal 1
+ %64 = OpExtInst %void %1 DebugTypeComposite %62 Structure %25 0 0 %26 %63 %61 FlagIsProtected|FlagIsPrivate
+ %66 = OpExtInst %void %1 DebugGlobalVariable %65 %64 %25 3 14 %26 %65 %g_sAniso FlagIsDefinition
+ %69 = OpExtInst %void %1 DebugTypeComposite %67 Class %25 0 0 %26 %68 %61 FlagIsProtected|FlagIsPrivate
+ %71 = OpExtInst %void %1 DebugTypeTemplateParameter %70 %33 %61 %25 0 0
+ %72 = OpExtInst %void %1 DebugTypeTemplate %69 %71
+ %74 = OpExtInst %void %1 DebugGlobalVariable %73 %72 %25 1 11 %26 %73 %g_tColor FlagIsDefinition
+ %142 = OpExtInst %void %1 DebugInlinedAt 24 %53
+ %144 = OpExtInst %void %1 DebugExpression %145
+ %155 = OpExtInst %void %1 DebugExpression %145
+;CHECK: [[var_c:%\w+]] = OpExtInst %void [[set]] DebugLocalVariable [[str_c]]
+;CHECK: [[var_tc:%\w+]] = OpExtInst %void [[set]] DebugLocalVariable [[str_tc]]
+;CHECK: [[var_color:%\w+]] = OpExtInst %void [[set]] DebugLocalVariable [[str_color]]
+;CHECK: [[var_ps_output:%\w+]] = OpExtInst %void [[set]] DebugLocalVariable [[str_ps_output]]
+;CHECK: [[var_i:%\w+]] = OpExtInst %void [[set]] DebugLocalVariable [[str_i]]
+ %MainPs = OpFunction %void None %75
+ %76 = OpLabel
+ %153 = OpVariable %_ptr_Function_v2float Function
+ %149 = OpVariable %_ptr_Function_v4float Function
+ %157 = OpExtInst %void %1 DebugScope %53
+ %143 = OpVariable %_ptr_Function_v4float Function
+ %121 = OpVariable %_ptr_Function_v4float Function
+ %122 = OpVariable %_ptr_Function_v2float Function
+ %158 = OpExtInst %void %1 DebugScope %51
+ OpLine %7 19 29
+ %156 = OpExtInst %void %1 DebugValue %60 %153 %155 %int_0
+ %159 = OpExtInst %void %1 DebugScope %53
+ OpLine %7 21 15
+ %146 = OpExtInst %void %1 DebugValue %57 %143 %144 %int_0
+ OpNoLine
+ %160 = OpExtInst %void %1 DebugNoScope
+ %80 = OpLoad %v2float %in_var_TEXCOORD2
+ %81 = OpCompositeConstruct %PS_INPUT %80
+ %154 = OpCompositeExtract %v2float %81 0
+ OpStore %153 %154
+ %161 = OpExtInst %void %1 DebugScope %53
+ OpLine %7 22 12
+ %127 = OpExtInst %void %1 DebugDeclare %55 %121 %58
+ OpLine %7 24 17
+ %129 = OpLoad %v2float %153
+ OpStore %122 %129
+ %162 = OpExtInst %void %1 DebugScope %42 %142
+ OpLine %7 15 28
+ %135 = OpExtInst %void %1 DebugDeclare %48 %122 %58
+ OpLine %7 15 43
+ %136 = OpExtInst %void %1 DebugDeclare %46 %121 %58
+ %163 = OpExtInst %void %1 DebugScope %44 %142
+ OpLine %7 16 9
+ %137 = OpLoad %type_2d_image %g_tColor
+ OpLine %7 16 29
+ %138 = OpLoad %type_sampler %g_sAniso
+ OpLine %7 16 40
+ %139 = OpLoad %v2float %122
+ OpLine %7 16 9
+ %140 = OpSampledImage %type_sampled_image %137 %138
+ %141 = OpImageSampleImplicitLod %v4float %140 %139 None
+ OpLine %7 16 5
+ OpStore %121 %141
+ %164 = OpExtInst %void %1 DebugScope %53
+ OpLine %7 25 26
+ %131 = OpLoad %v4float %121
+ OpLine %7 25 5
+ OpStore %143 %131
+ OpLine %7 26 12
+ %147 = OpLoad %v4float %143
+ %148 = OpCompositeConstruct %PS_OUTPUT %147
+ OpLine %7 26 5
+ %150 = OpCompositeExtract %v4float %148 0
+ OpStore %149 %150
+ OpNoLine
+ %165 = OpExtInst %void %1 DebugNoScope
+ %151 = OpLoad %v4float %149
+ %152 = OpCompositeConstruct %PS_OUTPUT %151
+ %84 = OpCompositeExtract %v4float %152 0
+ OpStore %out_var_SV_Target0 %84
+ OpLine %7 27 1
+ OpReturn
+ OpFunctionEnd
+;CHECK: {{%\w+}} = OpExtInst %void [[set]] DebugValue [[var_i]]
+;CHECK: {{%\w+}} = OpExtInst %void [[set]] DebugValue [[var_tc]]
+;CHECK: {{%\w+}} = OpExtInst %void [[set]] DebugValue [[var_c]]
+;CHECK: {{%\w+}} = OpExtInst %void [[set]] DebugValue [[var_color]]
+;CHECK: {{%\w+}} = OpExtInst %void [[set]] DebugValue [[var_ps_output]]
+ )";
+
+ SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+ SinglePassRunAndMatch<LocalSingleStoreElimPass>(text, false);
+}
+
// TODO(greg-lunarg): Add tests to verify handling of these cases:
//
// Other types
diff --git a/test/opt/local_ssa_elim_test.cpp b/test/opt/local_ssa_elim_test.cpp
index 4b7542fed..45006ca65 100644
--- a/test/opt/local_ssa_elim_test.cpp
+++ b/test/opt/local_ssa_elim_test.cpp
@@ -2978,6 +2978,7 @@ TEST_F(LocalSSAElimTest, DebugValueForReferenceVariableInBB) {
; CHECK: OpExtInst %void [[ext]] DebugScope [[dbg_main]]
; CHECK: OpStore %f %float_0
+; CHECK-NEXT: OpExtInst %void [[ext]] DebugValue [[dbg_x]] %float_0
; CHECK-NEXT: OpExtInst %void [[ext]] DebugValue [[dbg_f]] %float_0
; CHECK-NEXT: OpStore %i %int_0
; CHECK-NEXT: OpExtInst %void [[ext]] DebugValue [[dbg_i]] %int_0
@@ -4251,6 +4252,1210 @@ OpFunctionEnd
SinglePassRunAndCheck<SSARewritePass>(text, text, false);
}
+TEST_F(LocalSSAElimTest, MissingDebugValue) {
+ // Make sure DebugValue for final fragcolor assignment is generated.
+
+ const std::string text =
+ R"(
+ OpCapability Shader
+ OpCapability ImageQuery
+ OpExtension "SPV_KHR_non_semantic_info"
+ %1 = OpExtInstImport "GLSL.std.450"
+ %2 = OpExtInstImport "NonSemantic.Shader.DebugInfo.100"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %in_var_TEXCOORD0 %out_var_SV_TARGET %textureposition %samplerposition %textureNormal %samplerNormal %textureAlbedo %samplerAlbedo %textureShadowMap %samplerShadowMap %ubo
+ OpExecutionMode %main OriginUpperLeft
+ %15 = OpString "d2.frag"
+ %55 = OpString "float"
+ %63 = OpString "// Copyright 2020 Google LLC
+
+Texture2D textureposition : register(t1);
+SamplerState samplerposition : register(s1);
+Texture2D textureNormal : register(t2);
+SamplerState samplerNormal : register(s2);
+Texture2D textureAlbedo : register(t3);
+SamplerState samplerAlbedo : register(s3);
+// Depth from the light's point of view
+//layout (binding = 5) uniform sampler2DShadow samplerShadowMap;
+Texture2DArray textureShadowMap : register(t5);
+SamplerState samplerShadowMap : register(s5);
+
+#define LIGHT_COUNT 3
+#define SHADOW_FACTOR 0.25
+#define AMBIENT_LIGHT 0.1
+#define USE_PCF
+
+struct Light
+{
+ float4 position;
+ float4 target;
+ float4 color;
+ float4x4 viewMatrix;
+};
+
+struct UBO
+{
+ float4 viewPos;
+ Light lights[LIGHT_COUNT];
+ int useShadows;
+ int displayDebugTarget;
+};
+
+cbuffer ubo : register(b4) { UBO ubo; }
+
+float textureProj(float4 P, float layer, float2 offset)
+{
+ float shadow = 1.0;
+ float4 shadowCoord = P / P.w;
+ shadowCoord.xy = shadowCoord.xy * 0.5 + 0.5;
+
+ if (shadowCoord.z > -1.0 && shadowCoord.z < 1.0)
+ {
+ float dist = textureShadowMap.Sample(samplerShadowMap, float3(shadowCoord.xy + offset, layer)).r;
+ if (shadowCoord.w > 0.0 && dist < shadowCoord.z)
+ {
+ shadow = SHADOW_FACTOR;
+ }
+ }
+ return shadow;
+}
+
+float filterPCF(float4 sc, float layer)
+{
+ int2 texDim; int elements; int levels;
+ textureShadowMap.GetDimensions(0, texDim.x, texDim.y, elements, levels);
+ float scale = 1.5;
+ float dx = scale * 1.0 / float(texDim.x);
+ float dy = scale * 1.0 / float(texDim.y);
+
+ float shadowFactor = 0.0;
+ int count = 0;
+ int range = 1;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ shadowFactor += textureProj(sc, layer, float2(dx*x, dy*y));
+ count++;
+ }
+
+ }
+ return shadowFactor / count;
+}
+
+float3 shadow(float3 fragcolor, float3 fragPos) {
+ for (int i = 0; i < LIGHT_COUNT; ++i)
+ {
+ float4 shadowClip = mul(ubo.lights[i].viewMatrix, float4(fragPos.xyz, 1.0));
+
+ float shadowFactor;
+ #ifdef USE_PCF
+ shadowFactor= filterPCF(shadowClip, i);
+ #else
+ shadowFactor = textureProj(shadowClip, i, float2(0.0, 0.0));
+ #endif
+
+ fragcolor *= shadowFactor;
+ }
+ return fragcolor;
+}
+
+float4 main([[vk::location(0)]] float2 inUV : TEXCOORD0) : SV_TARGET
+{
+ // Get G-Buffer values
+ float3 fragPos = textureposition.Sample(samplerposition, inUV).rgb;
+ float3 normal = textureNormal.Sample(samplerNormal, inUV).rgb;
+ float4 albedo = textureAlbedo.Sample(samplerAlbedo, inUV);
+
+ // Ambient part
+ float3 fragcolor = albedo.rgb * AMBIENT_LIGHT;
+
+ float3 N = normalize(normal);
+
+ for(int i = 0; i < LIGHT_COUNT; ++i)
+ {
+ // Vector to light
+ float3 L = ubo.lights[i].position.xyz - fragPos;
+ // Distance from light to fragment position
+ float dist = length(L);
+ L = normalize(L);
+
+ // Viewer to fragment
+ float3 V = ubo.viewPos.xyz - fragPos;
+ V = normalize(V);
+
+ float lightCosInnerAngle = cos(radians(15.0));
+ float lightCosOuterAngle = cos(radians(25.0));
+ float lightRange = 100.0;
+
+ // Direction vector from source to target
+ float3 dir = normalize(ubo.lights[i].position.xyz - ubo.lights[i].target.xyz);
+
+ // Dual cone spot light with smooth transition between inner and outer angle
+ float cosDir = dot(L, dir);
+ float spotEffect = smoothstep(lightCosOuterAngle, lightCosInnerAngle, cosDir);
+ float heightAttenuation = smoothstep(lightRange, 0.0f, dist);
+
+ // Diffuse lighting
+ float NdotL = max(0.0, dot(N, L));
+ float3 diff = NdotL.xxx;
+
+ // Specular lighting
+ float3 R = reflect(-L, N);
+ float NdotR = max(0.0, dot(R, V));
+ float3 spec = (pow(NdotR, 16.0) * albedo.a * 2.5).xxx;
+
+ fragcolor += float3((diff + spec) * spotEffect * heightAttenuation) * ubo.lights[i].color.rgb * albedo.rgb;
+ }
+
+ // Shadow calculations in a separate pass
+ if (ubo.useShadows > 0)
+ {
+ fragcolor = shadow(fragcolor, fragPos);
+ }
+
+ return float4(fragcolor, 1);
+}
+"
+ %68 = OpString "textureProj"
+ %69 = OpString ""
+ %78 = OpString "dist"
+ %82 = OpString "shadowCoord"
+ %85 = OpString "shadow"
+ %89 = OpString "offset"
+ %92 = OpString "layer"
+ %95 = OpString "P"
+ %99 = OpString "filterPCF"
+ %108 = OpString "int"
+ %110 = OpString "y"
+ %114 = OpString "x"
+ %118 = OpString "range"
+ %122 = OpString "count"
+ %125 = OpString "shadowFactor"
+ %128 = OpString "dy"
+ %131 = OpString "dx"
+ %134 = OpString "scale"
+ %137 = OpString "levels"
+ %141 = OpString "elements"
+ %145 = OpString "texDim"
+ %150 = OpString "sc"
+ %162 = OpString "shadowClip"
+ %166 = OpString "i"
+ %169 = OpString "fragPos"
+ %171 = OpString "fragcolor"
+ %175 = OpString "main"
+ %184 = OpString "spec"
+ %187 = OpString "NdotR"
+ %190 = OpString "R"
+ %193 = OpString "diff"
+ %196 = OpString "NdotL"
+ %199 = OpString "heightAttenuation"
+ %202 = OpString "spotEffect"
+ %205 = OpString "cosDir"
+ %208 = OpString "dir"
+ %211 = OpString "lightRange"
+ %214 = OpString "lightCosOuterAngle"
+ %217 = OpString "lightCosInnerAngle"
+ %220 = OpString "V"
+ %225 = OpString "L"
+ %230 = OpString "N"
+ %235 = OpString "albedo"
+ %238 = OpString "normal"
+ %244 = OpString "inUV"
+ %246 = OpString "viewPos"
+ %249 = OpString "position"
+ %252 = OpString "target"
+ %254 = OpString "color"
+ %259 = OpString "viewMatrix"
+ %263 = OpString "Light"
+ %267 = OpString "lights"
+ %271 = OpString "useShadows"
+ %275 = OpString "displayDebugTarget"
+ %278 = OpString "UBO"
+ %282 = OpString "ubo"
+ %285 = OpString "type.ubo"
+ %289 = OpString "@type.sampler"
+ %290 = OpString "type.sampler"
+ %292 = OpString "samplerShadowMap"
+ %295 = OpString "@type.2d.image.array"
+ %296 = OpString "type.2d.image.array"
+ %298 = OpString "TemplateParam"
+ %301 = OpString "textureShadowMap"
+ %304 = OpString "samplerAlbedo"
+ %306 = OpString "@type.2d.image"
+ %307 = OpString "type.2d.image"
+ %311 = OpString "textureAlbedo"
+ %313 = OpString "samplerNormal"
+ %315 = OpString "textureNormal"
+ %317 = OpString "samplerposition"
+ %319 = OpString "textureposition"
+ OpName %type_2d_image "type.2d.image"
+ OpName %textureposition "textureposition"
+ OpName %type_sampler "type.sampler"
+ OpName %samplerposition "samplerposition"
+ OpName %textureNormal "textureNormal"
+ OpName %samplerNormal "samplerNormal"
+ OpName %textureAlbedo "textureAlbedo"
+ OpName %samplerAlbedo "samplerAlbedo"
+ OpName %type_2d_image_array "type.2d.image.array"
+ OpName %textureShadowMap "textureShadowMap"
+ OpName %samplerShadowMap "samplerShadowMap"
+ OpName %type_ubo "type.ubo"
+ OpMemberName %type_ubo 0 "ubo"
+ OpName %UBO "UBO"
+ OpMemberName %UBO 0 "viewPos"
+ OpMemberName %UBO 1 "lights"
+ OpMemberName %UBO 2 "useShadows"
+ OpMemberName %UBO 3 "displayDebugTarget"
+ OpName %Light "Light"
+ OpMemberName %Light 0 "position"
+ OpMemberName %Light 1 "target"
+ OpMemberName %Light 2 "color"
+ OpMemberName %Light 3 "viewMatrix"
+ OpName %ubo "ubo"
+ OpName %in_var_TEXCOORD0 "in.var.TEXCOORD0"
+ OpName %out_var_SV_TARGET "out.var.SV_TARGET"
+ OpName %main "main"
+ OpName %param_var_inUV "param.var.inUV"
+ OpName %type_sampled_image "type.sampled.image"
+ OpName %type_sampled_image_0 "type.sampled.image"
+ OpDecorate %in_var_TEXCOORD0 Location 0
+ OpDecorate %out_var_SV_TARGET Location 0
+ OpDecorate %textureposition DescriptorSet 0
+ OpDecorate %textureposition Binding 1
+ OpDecorate %samplerposition DescriptorSet 0
+ OpDecorate %samplerposition Binding 1
+ OpDecorate %textureNormal DescriptorSet 0
+ OpDecorate %textureNormal Binding 2
+ OpDecorate %samplerNormal DescriptorSet 0
+ OpDecorate %samplerNormal Binding 2
+ OpDecorate %textureAlbedo DescriptorSet 0
+ OpDecorate %textureAlbedo Binding 3
+ OpDecorate %samplerAlbedo DescriptorSet 0
+ OpDecorate %samplerAlbedo Binding 3
+ OpDecorate %textureShadowMap DescriptorSet 0
+ OpDecorate %textureShadowMap Binding 5
+ OpDecorate %samplerShadowMap DescriptorSet 0
+ OpDecorate %samplerShadowMap Binding 5
+ OpDecorate %ubo DescriptorSet 0
+ OpDecorate %ubo Binding 4
+ OpMemberDecorate %Light 0 Offset 0
+ OpMemberDecorate %Light 1 Offset 16
+ OpMemberDecorate %Light 2 Offset 32
+ OpMemberDecorate %Light 3 Offset 48
+ OpMemberDecorate %Light 3 MatrixStride 16
+ OpMemberDecorate %Light 3 RowMajor
+ OpDecorate %_arr_Light_uint_3 ArrayStride 112
+ OpMemberDecorate %UBO 0 Offset 0
+ OpMemberDecorate %UBO 1 Offset 16
+ OpMemberDecorate %UBO 2 Offset 352
+ OpMemberDecorate %UBO 3 Offset 356
+ OpMemberDecorate %type_ubo 0 Offset 0
+ OpDecorate %type_ubo Block
+)"
+ R"( %float = OpTypeFloat 32
+%float_0_100000001 = OpConstant %float 0.100000001
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %int_1 = OpConstant %int 1
+ %float_15 = OpConstant %float 15
+ %float_25 = OpConstant %float 25
+ %float_100 = OpConstant %float 100
+ %float_0 = OpConstant %float 0
+ %float_16 = OpConstant %float 16
+ %float_2_5 = OpConstant %float 2.5
+ %int_2 = OpConstant %int 2
+ %float_1 = OpConstant %float 1
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+ %float_1_5 = OpConstant %float 1.5
+ %float_0_5 = OpConstant %float 0.5
+ %v2float = OpTypeVector %float 2
+ %35 = OpConstantComposite %v2float %float_0_5 %float_0_5
+ %float_n1 = OpConstant %float -1
+ %float_0_25 = OpConstant %float 0.25
+ %uint_32 = OpConstant %uint 32
+%type_2d_image = OpTypeImage %float 2D 2 0 0 1 Unknown
+%_ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %type_2d_image
+%type_sampler = OpTypeSampler
+%_ptr_UniformConstant_type_sampler = OpTypePointer UniformConstant %type_sampler
+%type_2d_image_array = OpTypeImage %float 2D 2 1 0 1 Unknown
+%_ptr_UniformConstant_type_2d_image_array = OpTypePointer UniformConstant %type_2d_image_array
+ %v4float = OpTypeVector %float 4
+ %uint_3 = OpConstant %uint 3
+%mat4v4float = OpTypeMatrix %v4float 4
+ %Light = OpTypeStruct %v4float %v4float %v4float %mat4v4float
+%_arr_Light_uint_3 = OpTypeArray %Light %uint_3
+ %UBO = OpTypeStruct %v4float %_arr_Light_uint_3 %int %int
+ %type_ubo = OpTypeStruct %UBO
+%_ptr_Uniform_type_ubo = OpTypePointer Uniform %type_ubo
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %void = OpTypeVoid
+ %uint_4 = OpConstant %uint 4
+ %uint_2 = OpConstant %uint 2
+ %uint_1 = OpConstant %uint 1
+ %uint_5 = OpConstant %uint 5
+ %uint_37 = OpConstant %uint 37
+ %uint_38 = OpConstant %uint 38
+ %uint_44 = OpConstant %uint 44
+ %uint_47 = OpConstant %uint 47
+ %uint_45 = OpConstant %uint 45
+ %uint_9 = OpConstant %uint 9
+ %uint_40 = OpConstant %uint 40
+ %uint_39 = OpConstant %uint 39
+ %uint_8 = OpConstant %uint 8
+ %uint_49 = OpConstant %uint 49
+ %uint_35 = OpConstant %uint 35
+ %uint_26 = OpConstant %uint 26
+ %uint_54 = OpConstant %uint 54
+ %uint_55 = OpConstant %uint 55
+ %uint_67 = OpConstant %uint 67
+ %uint_69 = OpConstant %uint 69
+ %uint_68 = OpConstant %uint 68
+ %uint_12 = OpConstant %uint 12
+ %uint_66 = OpConstant %uint 66
+ %uint_11 = OpConstant %uint 11
+ %uint_64 = OpConstant %uint 64
+ %uint_6 = OpConstant %uint 6
+ %uint_63 = OpConstant %uint 63
+ %uint_62 = OpConstant %uint 62
+ %uint_60 = OpConstant %uint 60
+ %uint_59 = OpConstant %uint 59
+ %uint_58 = OpConstant %uint 58
+ %uint_56 = OpConstant %uint 56
+ %uint_33 = OpConstant %uint 33
+ %uint_19 = OpConstant %uint 19
+ %uint_7 = OpConstant %uint 7
+ %uint_34 = OpConstant %uint 34
+ %uint_24 = OpConstant %uint 24
+ %uint_78 = OpConstant %uint 78
+ %uint_80 = OpConstant %uint 80
+ %uint_83 = OpConstant %uint 83
+ %uint_81 = OpConstant %uint 81
+ %uint_10 = OpConstant %uint 10
+ %uint_79 = OpConstant %uint 79
+ %uint_22 = OpConstant %uint 22
+ %uint_95 = OpConstant %uint 95
+ %uint_96 = OpConstant %uint 96
+ %uint_145 = OpConstant %uint 145
+ %uint_108 = OpConstant %uint 108
+ %uint_138 = OpConstant %uint 138
+ %uint_137 = OpConstant %uint 137
+ %uint_136 = OpConstant %uint 136
+ %uint_133 = OpConstant %uint 133
+ %uint_132 = OpConstant %uint 132
+ %uint_129 = OpConstant %uint 129
+ %uint_128 = OpConstant %uint 128
+ %uint_127 = OpConstant %uint 127
+ %uint_124 = OpConstant %uint 124
+ %uint_121 = OpConstant %uint 121
+ %uint_120 = OpConstant %uint 120
+ %uint_119 = OpConstant %uint 119
+ %uint_116 = OpConstant %uint 116
+ %uint_112 = OpConstant %uint 112
+ %uint_110 = OpConstant %uint 110
+ %uint_107 = OpConstant %uint 107
+ %uint_105 = OpConstant %uint 105
+ %uint_103 = OpConstant %uint 103
+ %uint_100 = OpConstant %uint 100
+ %uint_99 = OpConstant %uint 99
+ %uint_98 = OpConstant %uint 98
+ %uint_29 = OpConstant %uint 29
+ %uint_21 = OpConstant %uint 21
+ %uint_256 = OpConstant %uint 256
+ %uint_23 = OpConstant %uint 23
+ %uint_384 = OpConstant %uint 384
+ %uint_512 = OpConstant %uint 512
+ %uint_896 = OpConstant %uint 896
+ %uint_2688 = OpConstant %uint 2688
+ %uint_30 = OpConstant %uint 30
+ %uint_2816 = OpConstant %uint 2816
+ %uint_31 = OpConstant %uint 31
+ %uint_2848 = OpConstant %uint 2848
+ %uint_2880 = OpConstant %uint 2880
+ %uint_27 = OpConstant %uint 27
+ %uint_2944 = OpConstant %uint 2944
+ %uint_14 = OpConstant %uint 14
+ %uint_16 = OpConstant %uint 16
+ %321 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %uint_150 = OpConstant %uint 150
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_float = OpTypePointer Function %float
+ %uint_42 = OpConstant %uint 42
+%type_sampled_image = OpTypeSampledImage %type_2d_image
+ %uint_65 = OpConstant %uint 65
+ %uint_18 = OpConstant %uint 18
+ %uint_13 = OpConstant %uint 13
+ %uint_15 = OpConstant %uint 15
+ %uint_17 = OpConstant %uint 17
+ %bool = OpTypeBool
+ %uint_25 = OpConstant %uint 25
+%_ptr_Uniform_UBO = OpTypePointer Uniform %UBO
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+ %uint_28 = OpConstant %uint 28
+ %uint_43 = OpConstant %uint 43
+ %uint_113 = OpConstant %uint 113
+ %uint_117 = OpConstant %uint 117
+ %uint_46 = OpConstant %uint 46
+ %uint_76 = OpConstant %uint 76
+ %uint_53 = OpConstant %uint 53
+ %uint_73 = OpConstant %uint 73
+ %uint_48 = OpConstant %uint 48
+ %uint_140 = OpConstant %uint 140
+ %uint_52 = OpConstant %uint 52
+ %uint_93 = OpConstant %uint 93
+ %uint_87 = OpConstant %uint 87
+ %uint_106 = OpConstant %uint 106
+ %uint_36 = OpConstant %uint 36
+ %uint_144 = OpConstant %uint 144
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+ %uint_146 = OpConstant %uint 146
+ %uint_147 = OpConstant %uint 147
+ %uint_149 = OpConstant %uint 149
+ %uint_41 = OpConstant %uint 41
+%_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
+ %uint_77 = OpConstant %uint 77
+ %uint_85 = OpConstant %uint 85
+ %uint_90 = OpConstant %uint 90
+ %uint_92 = OpConstant %uint 92
+ %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+ %uint_57 = OpConstant %uint 57
+ %v3uint = OpTypeVector %uint 3
+ %uint_72 = OpConstant %uint 72
+ %uint_70 = OpConstant %uint 70
+ %uint_50 = OpConstant %uint 50
+ %uint_61 = OpConstant %uint 61
+ %uint_71 = OpConstant %uint 71
+ %uint_75 = OpConstant %uint 75
+ %uint_82 = OpConstant %uint 82
+%type_sampled_image_0 = OpTypeSampledImage %type_2d_image_array
+ %uint_51 = OpConstant %uint 51
+%textureposition = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+%samplerposition = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+%textureNormal = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+%samplerNormal = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+%textureAlbedo = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+%samplerAlbedo = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+%textureShadowMap = OpVariable %_ptr_UniformConstant_type_2d_image_array UniformConstant
+%samplerShadowMap = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+ %ubo = OpVariable %_ptr_Uniform_type_ubo Uniform
+%in_var_TEXCOORD0 = OpVariable %_ptr_Input_v2float Input
+%out_var_SV_TARGET = OpVariable %_ptr_Output_v4float Output
+ %uint_1792 = OpConstant %uint 1792
+ %uint_1869 = OpConstant %uint 1869
+ %uint_2060 = OpConstant %uint 2060
+ %288 = OpExtInst %void %2 DebugInfoNone
+ %243 = OpExtInst %void %2 DebugExpression
+ %57 = OpExtInst %void %2 DebugTypeBasic %55 %uint_32 %uint_3 %uint_0
+ %58 = OpExtInst %void %2 DebugTypeVector %57 %uint_4
+ %60 = OpExtInst %void %2 DebugTypeVector %57 %uint_2
+ %62 = OpExtInst %void %2 DebugTypeFunction %uint_3 %57 %58 %57 %60
+ %64 = OpExtInst %void %2 DebugSource %15 %63
+ %65 = OpExtInst %void %2 DebugCompilationUnit %uint_1 %uint_4 %64 %uint_5
+ %70 = OpExtInst %void %2 DebugFunction %68 %62 %64 %uint_37 %uint_1 %65 %69 %uint_3 %uint_38
+ %73 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_38 %uint_1 %70
+ %74 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_44 %uint_2 %73
+ %76 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_47 %uint_3 %74
+ %79 = OpExtInst %void %2 DebugLocalVariable %78 %57 %64 %uint_45 %uint_9 %74 %uint_4
+ %83 = OpExtInst %void %2 DebugLocalVariable %82 %58 %64 %uint_40 %uint_9 %73 %uint_4
+ %86 = OpExtInst %void %2 DebugLocalVariable %85 %57 %64 %uint_39 %uint_8 %73 %uint_4
+ %90 = OpExtInst %void %2 DebugLocalVariable %89 %60 %64 %uint_37 %uint_49 %70 %uint_4 %uint_3
+ %93 = OpExtInst %void %2 DebugLocalVariable %92 %57 %64 %uint_37 %uint_35 %70 %uint_4 %uint_2
+ %96 = OpExtInst %void %2 DebugLocalVariable %95 %58 %64 %uint_37 %uint_26 %70 %uint_4 %uint_1
+ %98 = OpExtInst %void %2 DebugTypeFunction %uint_3 %57 %58 %57
+ %100 = OpExtInst %void %2 DebugFunction %99 %98 %64 %uint_54 %uint_1 %65 %69 %uint_3 %uint_55
+ %103 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_55 %uint_1 %100
+ %104 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_67 %uint_2 %103
+ %106 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_69 %uint_3 %104
+ %109 = OpExtInst %void %2 DebugTypeBasic %108 %uint_32 %uint_4 %uint_0
+ %111 = OpExtInst %void %2 DebugLocalVariable %110 %109 %64 %uint_68 %uint_12 %104 %uint_4
+ %115 = OpExtInst %void %2 DebugLocalVariable %114 %109 %64 %uint_66 %uint_11 %103 %uint_4
+ %119 = OpExtInst %void %2 DebugLocalVariable %118 %109 %64 %uint_64 %uint_6 %103 %uint_4
+ %123 = OpExtInst %void %2 DebugLocalVariable %122 %109 %64 %uint_63 %uint_6 %103 %uint_4
+ %126 = OpExtInst %void %2 DebugLocalVariable %125 %57 %64 %uint_62 %uint_8 %103 %uint_4
+ %129 = OpExtInst %void %2 DebugLocalVariable %128 %57 %64 %uint_60 %uint_8 %103 %uint_4
+ %132 = OpExtInst %void %2 DebugLocalVariable %131 %57 %64 %uint_59 %uint_8 %103 %uint_4
+ %135 = OpExtInst %void %2 DebugLocalVariable %134 %57 %64 %uint_58 %uint_8 %103 %uint_4
+ %138 = OpExtInst %void %2 DebugLocalVariable %137 %109 %64 %uint_56 %uint_33 %103 %uint_4
+ %142 = OpExtInst %void %2 DebugLocalVariable %141 %109 %64 %uint_56 %uint_19 %103 %uint_4
+ %144 = OpExtInst %void %2 DebugTypeVector %109 %uint_2
+ %146 = OpExtInst %void %2 DebugLocalVariable %145 %144 %64 %uint_56 %uint_7 %103 %uint_4
+ %148 = OpExtInst %void %2 DebugLocalVariable %92 %57 %64 %uint_54 %uint_34 %100 %uint_4 %uint_2
+ %151 = OpExtInst %void %2 DebugLocalVariable %150 %58 %64 %uint_54 %uint_24 %100 %uint_4 %uint_1
+ %153 = OpExtInst %void %2 DebugTypeVector %57 %uint_3
+ %154 = OpExtInst %void %2 DebugTypeFunction %uint_3 %153 %153 %153
+ %155 = OpExtInst %void %2 DebugFunction %85 %154 %64 %uint_78 %uint_1 %65 %69 %uint_3 %uint_78
+ %157 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_78 %uint_49 %155
+ %158 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_80 %uint_2 %157
+ %160 = OpExtInst %void %2 DebugLocalVariable %125 %57 %64 %uint_83 %uint_9 %158 %uint_4
+ %163 = OpExtInst %void %2 DebugLocalVariable %162 %58 %64 %uint_81 %uint_10 %158 %uint_4
+ %167 = OpExtInst %void %2 DebugLocalVariable %166 %109 %64 %uint_79 %uint_11 %157 %uint_4
+ %170 = OpExtInst %void %2 DebugLocalVariable %169 %153 %64 %uint_78 %uint_40 %155 %uint_4 %uint_2
+ %172 = OpExtInst %void %2 DebugLocalVariable %171 %153 %64 %uint_78 %uint_22 %155 %uint_4 %uint_1
+ %174 = OpExtInst %void %2 DebugTypeFunction %uint_3 %58 %60
+ %176 = OpExtInst %void %2 DebugFunction %175 %174 %64 %uint_95 %uint_1 %65 %69 %uint_3 %uint_96
+ %179 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_96 %uint_1 %176
+ %180 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_145 %uint_2 %179
+ %182 = OpExtInst %void %2 DebugLexicalBlock %64 %uint_108 %uint_2 %179
+ %185 = OpExtInst %void %2 DebugLocalVariable %184 %153 %64 %uint_138 %uint_10 %182 %uint_4
+ %188 = OpExtInst %void %2 DebugLocalVariable %187 %57 %64 %uint_137 %uint_9 %182 %uint_4
+ %191 = OpExtInst %void %2 DebugLocalVariable %190 %153 %64 %uint_136 %uint_10 %182 %uint_4
+ %194 = OpExtInst %void %2 DebugLocalVariable %193 %153 %64 %uint_133 %uint_10 %182 %uint_4
+ %197 = OpExtInst %void %2 DebugLocalVariable %196 %57 %64 %uint_132 %uint_9 %182 %uint_4
+ %200 = OpExtInst %void %2 DebugLocalVariable %199 %57 %64 %uint_129 %uint_9 %182 %uint_4
+ %203 = OpExtInst %void %2 DebugLocalVariable %202 %57 %64 %uint_128 %uint_9 %182 %uint_4
+ %206 = OpExtInst %void %2 DebugLocalVariable %205 %57 %64 %uint_127 %uint_9 %182 %uint_4
+ %209 = OpExtInst %void %2 DebugLocalVariable %208 %153 %64 %uint_124 %uint_10 %182 %uint_4
+ %212 = OpExtInst %void %2 DebugLocalVariable %211 %57 %64 %uint_121 %uint_9 %182 %uint_4
+ %215 = OpExtInst %void %2 DebugLocalVariable %214 %57 %64 %uint_120 %uint_9 %182 %uint_4
+ %218 = OpExtInst %void %2 DebugLocalVariable %217 %57 %64 %uint_119 %uint_9 %182 %uint_4
+ %221 = OpExtInst %void %2 DebugLocalVariable %220 %153 %64 %uint_116 %uint_10 %182 %uint_4
+ %223 = OpExtInst %void %2 DebugLocalVariable %78 %57 %64 %uint_112 %uint_9 %182 %uint_4
+ %226 = OpExtInst %void %2 DebugLocalVariable %225 %153 %64 %uint_110 %uint_10 %182 %uint_4
+ %228 = OpExtInst %void %2 DebugLocalVariable %166 %109 %64 %uint_107 %uint_10 %179 %uint_4
+ %231 = OpExtInst %void %2 DebugLocalVariable %230 %153 %64 %uint_105 %uint_9 %179 %uint_4
+ %233 = OpExtInst %void %2 DebugLocalVariable %171 %153 %64 %uint_103 %uint_9 %179 %uint_4
+ %236 = OpExtInst %void %2 DebugLocalVariable %235 %58 %64 %uint_100 %uint_9 %179 %uint_4
+ %239 = OpExtInst %void %2 DebugLocalVariable %238 %153 %64 %uint_99 %uint_9 %179 %uint_4
+ %241 = OpExtInst %void %2 DebugLocalVariable %169 %153 %64 %uint_98 %uint_9 %179 %uint_4
+ %245 = OpExtInst %void %2 DebugLocalVariable %244 %60 %64 %uint_95 %uint_40 %176 %uint_4 %uint_1
+)"
+ R"( %247 = OpExtInst %void %2 DebugTypeMember %246 %58 %64 %uint_29 %uint_9 %uint_0 %uint_128 %uint_3
+ %250 = OpExtInst %void %2 DebugTypeMember %249 %58 %64 %uint_21 %uint_9 %uint_0 %uint_128 %uint_3
+ %253 = OpExtInst %void %2 DebugTypeMember %252 %58 %64 %uint_22 %uint_9 %uint_128 %uint_128 %uint_3
+ %256 = OpExtInst %void %2 DebugTypeMember %254 %58 %64 %uint_23 %uint_9 %uint_256 %uint_128 %uint_3
+ %258 = OpExtInst %void %2 DebugTypeArray %57 %uint_4 %uint_4
+ %262 = OpExtInst %void %2 DebugTypeMember %259 %258 %64 %uint_24 %uint_11 %uint_384 %uint_512 %uint_3
+ %265 = OpExtInst %void %2 DebugTypeComposite %263 %uint_1 %64 %uint_19 %uint_8 %65 %263 %uint_896 %uint_3 %250 %253 %256 %262
+ %266 = OpExtInst %void %2 DebugTypeArray %265 %uint_3
+ %269 = OpExtInst %void %2 DebugTypeMember %267 %266 %64 %uint_30 %uint_8 %uint_128 %uint_2688 %uint_3
+ %273 = OpExtInst %void %2 DebugTypeMember %271 %109 %64 %uint_31 %uint_6 %uint_2816 %uint_32 %uint_3
+ %277 = OpExtInst %void %2 DebugTypeMember %275 %109 %64 %uint_32 %uint_6 %uint_2848 %uint_32 %uint_3
+ %280 = OpExtInst %void %2 DebugTypeComposite %278 %uint_1 %64 %uint_27 %uint_8 %65 %278 %uint_2880 %uint_3 %247 %269 %273 %277
+ %284 = OpExtInst %void %2 DebugTypeMember %282 %280 %64 %uint_35 %uint_34 %uint_0 %uint_2944 %uint_3
+ %286 = OpExtInst %void %2 DebugTypeComposite %285 %uint_1 %64 %uint_35 %uint_9 %65 %285 %uint_2944 %uint_3 %284
+ %287 = OpExtInst %void %2 DebugGlobalVariable %282 %286 %64 %uint_35 %uint_9 %65 %282 %ubo %uint_8
+ %291 = OpExtInst %void %2 DebugTypeComposite %289 %uint_1 %64 %uint_0 %uint_0 %65 %290 %288 %uint_3
+ %293 = OpExtInst %void %2 DebugGlobalVariable %292 %291 %64 %uint_12 %uint_14 %65 %292 %samplerShadowMap %uint_8
+ %297 = OpExtInst %void %2 DebugTypeComposite %295 %uint_0 %64 %uint_0 %uint_0 %65 %296 %288 %uint_3
+ %299 = OpExtInst %void %2 DebugTypeTemplateParameter %298 %58 %288 %64 %uint_0 %uint_0
+ %300 = OpExtInst %void %2 DebugTypeTemplate %297 %299
+ %302 = OpExtInst %void %2 DebugGlobalVariable %301 %300 %64 %uint_11 %uint_16 %65 %301 %textureShadowMap %uint_8
+ %305 = OpExtInst %void %2 DebugGlobalVariable %304 %291 %64 %uint_8 %uint_14 %65 %304 %samplerAlbedo %uint_8
+ %308 = OpExtInst %void %2 DebugTypeComposite %306 %uint_0 %64 %uint_0 %uint_0 %65 %307 %288 %uint_3
+ %309 = OpExtInst %void %2 DebugTypeTemplateParameter %298 %58 %288 %64 %uint_0 %uint_0
+ %310 = OpExtInst %void %2 DebugTypeTemplate %308 %309
+ %312 = OpExtInst %void %2 DebugGlobalVariable %311 %310 %64 %uint_7 %uint_11 %65 %311 %textureAlbedo %uint_8
+ %314 = OpExtInst %void %2 DebugGlobalVariable %313 %291 %64 %uint_6 %uint_14 %65 %313 %samplerNormal %uint_8
+ %316 = OpExtInst %void %2 DebugGlobalVariable %315 %310 %64 %uint_5 %uint_11 %65 %315 %textureNormal %uint_8
+ %318 = OpExtInst %void %2 DebugGlobalVariable %317 %291 %64 %uint_4 %uint_14 %65 %317 %samplerposition %uint_8
+ %320 = OpExtInst %void %2 DebugGlobalVariable %319 %310 %64 %uint_3 %uint_11 %65 %319 %textureposition %uint_8
+ %1803 = OpExtInst %void %2 DebugInlinedAt %uint_1792 %180
+ %1885 = OpExtInst %void %2 DebugInlinedAt %uint_1869 %158 %1803
+ %2085 = OpExtInst %void %2 DebugInlinedAt %uint_2060 %106 %1885
+)"
+ R"( %main = OpFunction %void None %321
+ %322 = OpLabel
+ %2083 = OpVariable %_ptr_Function_float Function
+ %2086 = OpVariable %_ptr_Function_v4float Function
+ %1883 = OpVariable %_ptr_Function_v2int Function
+ %1891 = OpVariable %_ptr_Function_float Function
+ %1892 = OpVariable %_ptr_Function_int Function
+ %1894 = OpVariable %_ptr_Function_int Function
+ %1895 = OpVariable %_ptr_Function_int Function
+ %1896 = OpVariable %_ptr_Function_v4float Function
+ %1801 = OpVariable %_ptr_Function_int Function
+ %1447 = OpVariable %_ptr_Function_v4float Function
+ %1448 = OpVariable %_ptr_Function_v3float Function
+ %1450 = OpVariable %_ptr_Function_int Function
+ %1451 = OpVariable %_ptr_Function_v3float Function
+ %1453 = OpVariable %_ptr_Function_v3float Function
+ %1466 = OpVariable %_ptr_Function_v3float Function
+%param_var_inUV = OpVariable %_ptr_Function_v2float Function
+ %325 = OpExtInst %void %2 DebugFunctionDefinition %176 %main
+ %326 = OpLoad %v2float %in_var_TEXCOORD0
+ OpStore %param_var_inUV %326
+ %2290 = OpExtInst %void %2 DebugScope %176
+ %1620 = OpExtInst %void %2 DebugLine %64 %uint_95 %uint_95 %uint_33 %uint_40
+ %1470 = OpExtInst %void %2 DebugDeclare %245 %param_var_inUV %243
+ %2291 = OpExtInst %void %2 DebugScope %179
+ %1621 = OpExtInst %void %2 DebugLine %64 %uint_98 %uint_98 %uint_19 %uint_19
+ %1471 = OpLoad %type_2d_image %textureposition
+ %1622 = OpExtInst %void %2 DebugLine %64 %uint_98 %uint_98 %uint_42 %uint_42
+ %1472 = OpLoad %type_sampler %samplerposition
+ %1624 = OpExtInst %void %2 DebugLine %64 %uint_98 %uint_98 %uint_19 %uint_63
+ %1474 = OpSampledImage %type_sampled_image %1471 %1472
+ %1475 = OpImageSampleImplicitLod %v4float %1474 %326 None
+ %1626 = OpExtInst %void %2 DebugLine %64 %uint_98 %uint_98 %uint_19 %uint_65
+ %1476 = OpVectorShuffle %v3float %1475 %1475 0 1 2
+ %2241 = OpExtInst %void %2 DebugLine %64 %uint_98 %uint_98 %uint_2 %uint_65
+ %2240 = OpExtInst %void %2 DebugValue %241 %1476 %243
+ %1629 = OpExtInst %void %2 DebugLine %64 %uint_99 %uint_99 %uint_18 %uint_18
+ %1478 = OpLoad %type_2d_image %textureNormal
+ %1630 = OpExtInst %void %2 DebugLine %64 %uint_99 %uint_99 %uint_39 %uint_39
+ %1479 = OpLoad %type_sampler %samplerNormal
+ %1632 = OpExtInst %void %2 DebugLine %64 %uint_99 %uint_99 %uint_18 %uint_58
+ %1481 = OpSampledImage %type_sampled_image %1478 %1479
+ %1482 = OpImageSampleImplicitLod %v4float %1481 %326 None
+ %1634 = OpExtInst %void %2 DebugLine %64 %uint_99 %uint_99 %uint_18 %uint_60
+ %1483 = OpVectorShuffle %v3float %1482 %1482 0 1 2
+ %2244 = OpExtInst %void %2 DebugLine %64 %uint_99 %uint_99 %uint_2 %uint_60
+ %2243 = OpExtInst %void %2 DebugValue %239 %1483 %243
+ %1637 = OpExtInst %void %2 DebugLine %64 %uint_100 %uint_100 %uint_18 %uint_18
+ %1485 = OpLoad %type_2d_image %textureAlbedo
+ %1638 = OpExtInst %void %2 DebugLine %64 %uint_100 %uint_100 %uint_39 %uint_39
+ %1486 = OpLoad %type_sampler %samplerAlbedo
+ %1640 = OpExtInst %void %2 DebugLine %64 %uint_100 %uint_100 %uint_18 %uint_58
+ %1488 = OpSampledImage %type_sampled_image %1485 %1486
+ %1489 = OpImageSampleImplicitLod %v4float %1488 %326 None
+ %1642 = OpExtInst %void %2 DebugLine %64 %uint_100 %uint_100 %uint_2 %uint_58
+ OpStore %1447 %1489
+ %1490 = OpExtInst %void %2 DebugDeclare %236 %1447 %243
+ %1645 = OpExtInst %void %2 DebugLine %64 %uint_103 %uint_103 %uint_22 %uint_29
+ %1492 = OpVectorShuffle %v3float %1489 %1489 0 1 2
+ %1646 = OpExtInst %void %2 DebugLine %64 %uint_103 %uint_103 %uint_22 %uint_35
+ %1493 = OpVectorTimesScalar %v3float %1492 %float_0_100000001
+ %1647 = OpExtInst %void %2 DebugLine %64 %uint_103 %uint_103 %uint_2 %uint_35
+ OpStore %1448 %1493
+ %1494 = OpExtInst %void %2 DebugDeclare %233 %1448 %243
+ %1650 = OpExtInst %void %2 DebugLine %64 %uint_105 %uint_105 %uint_13 %uint_29
+ %1496 = OpExtInst %v3float %1 Normalize %1483
+ %2247 = OpExtInst %void %2 DebugLine %64 %uint_105 %uint_105 %uint_2 %uint_29
+ %2246 = OpExtInst %void %2 DebugValue %231 %1496 %243
+ %1653 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_6 %uint_14
+ OpStore %1450 %int_0
+ %1498 = OpExtInst %void %2 DebugDeclare %228 %1450 %243
+ %1655 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_6 %uint_15
+ OpBranch %1499
+ %1499 = OpLabel
+ %2292 = OpExtInst %void %2 DebugScope %179
+ %1656 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_17 %uint_17
+ %1500 = OpLoad %int %1450
+ %1657 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_17 %uint_21
+ %1501 = OpSLessThan %bool %1500 %int_3
+ %2293 = OpExtInst %void %2 DebugNoScope
+ OpLoopMerge %1605 %1602 None
+ OpBranchConditional %1501 %1502 %1605
+ %1502 = OpLabel
+ %2294 = OpExtInst %void %2 DebugScope %182
+ %1660 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_25 %uint_25
+ %1503 = OpLoad %int %1450
+ %1661 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_14 %uint_37
+ %1504 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1505 = OpAccessChain %_ptr_Uniform_v4float %1504 %int_1 %1503 %int_0
+ %1663 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_14 %uint_28
+ %1506 = OpLoad %v4float %1505
+ %1664 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_14 %uint_37
+ %1507 = OpVectorShuffle %v3float %1506 %1506 0 1 2
+ %1666 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_14 %uint_43
+ %1509 = OpFSub %v3float %1507 %1476
+ %1667 = OpExtInst %void %2 DebugLine %64 %uint_110 %uint_110 %uint_3 %uint_43
+ OpStore %1451 %1509
+ %1510 = OpExtInst %void %2 DebugDeclare %226 %1451 %243
+ %1670 = OpExtInst %void %2 DebugLine %64 %uint_112 %uint_112 %uint_16 %uint_24
+ %1512 = OpExtInst %float %1 Length %1509
+ %2250 = OpExtInst %void %2 DebugLine %64 %uint_112 %uint_112 %uint_3 %uint_24
+ %2249 = OpExtInst %void %2 DebugValue %223 %1512 %243
+ %1674 = OpExtInst %void %2 DebugLine %64 %uint_113 %uint_113 %uint_7 %uint_18
+ %1515 = OpExtInst %v3float %1 Normalize %1509
+ %1675 = OpExtInst %void %2 DebugLine %64 %uint_113 %uint_113 %uint_3 %uint_18
+ OpStore %1451 %1515
+ %1676 = OpExtInst %void %2 DebugLine %64 %uint_116 %uint_116 %uint_14 %uint_26
+ %1516 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1517 = OpAccessChain %_ptr_Uniform_v4float %1516 %int_0
+ %1678 = OpExtInst %void %2 DebugLine %64 %uint_116 %uint_116 %uint_14 %uint_18
+ %1518 = OpLoad %v4float %1517
+ %1679 = OpExtInst %void %2 DebugLine %64 %uint_116 %uint_116 %uint_14 %uint_26
+ %1519 = OpVectorShuffle %v3float %1518 %1518 0 1 2
+ %1681 = OpExtInst %void %2 DebugLine %64 %uint_116 %uint_116 %uint_14 %uint_32
+ %1521 = OpFSub %v3float %1519 %1476
+ %1682 = OpExtInst %void %2 DebugLine %64 %uint_116 %uint_116 %uint_3 %uint_32
+ OpStore %1453 %1521
+ %1522 = OpExtInst %void %2 DebugDeclare %221 %1453 %243
+ %1685 = OpExtInst %void %2 DebugLine %64 %uint_117 %uint_117 %uint_7 %uint_18
+ %1524 = OpExtInst %v3float %1 Normalize %1521
+ %1686 = OpExtInst %void %2 DebugLine %64 %uint_117 %uint_117 %uint_3 %uint_18
+ OpStore %1453 %1524
+ %1687 = OpExtInst %void %2 DebugLine %64 %uint_119 %uint_119 %uint_34 %uint_46
+ %1525 = OpExtInst %float %1 Radians %float_15
+ %1688 = OpExtInst %void %2 DebugLine %64 %uint_119 %uint_119 %uint_30 %uint_47
+ %1526 = OpExtInst %float %1 Cos %1525
+ %2253 = OpExtInst %void %2 DebugLine %64 %uint_119 %uint_119 %uint_3 %uint_47
+ %2252 = OpExtInst %void %2 DebugValue %218 %1526 %243
+ %1691 = OpExtInst %void %2 DebugLine %64 %uint_120 %uint_120 %uint_34 %uint_46
+ %1528 = OpExtInst %float %1 Radians %float_25
+ %1692 = OpExtInst %void %2 DebugLine %64 %uint_120 %uint_120 %uint_30 %uint_47
+ %1529 = OpExtInst %float %1 Cos %1528
+ %2256 = OpExtInst %void %2 DebugLine %64 %uint_120 %uint_120 %uint_3 %uint_47
+ %2255 = OpExtInst %void %2 DebugValue %215 %1529 %243
+ %2259 = OpExtInst %void %2 DebugLine %64 %uint_121 %uint_121 %uint_3 %uint_22
+ %2258 = OpExtInst %void %2 DebugValue %212 %float_100 %243
+ %1698 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_26 %uint_49
+ %1533 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1534 = OpAccessChain %_ptr_Uniform_v4float %1533 %int_1 %1503 %int_0
+ %1700 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_26 %uint_40
+ %1535 = OpLoad %v4float %1534
+ %1701 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_26 %uint_49
+ %1536 = OpVectorShuffle %v3float %1535 %1535 0 1 2
+ %1703 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_55 %uint_76
+ %1538 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1539 = OpAccessChain %_ptr_Uniform_v4float %1538 %int_1 %1503 %int_1
+ %1705 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_55 %uint_69
+ %1540 = OpLoad %v4float %1539
+ %1706 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_55 %uint_76
+ %1541 = OpVectorShuffle %v3float %1540 %1540 0 1 2
+ %1707 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_26 %uint_76
+ %1542 = OpFSub %v3float %1536 %1541
+ %1708 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_16 %uint_79
+ %1543 = OpExtInst %v3float %1 Normalize %1542
+ %2262 = OpExtInst %void %2 DebugLine %64 %uint_124 %uint_124 %uint_3 %uint_79
+ %2261 = OpExtInst %void %2 DebugValue %209 %1543 %243
+ %1713 = OpExtInst %void %2 DebugLine %64 %uint_127 %uint_127 %uint_18 %uint_28
+ %1547 = OpDot %float %1515 %1543
+ %2265 = OpExtInst %void %2 DebugLine %64 %uint_127 %uint_127 %uint_3 %uint_28
+ %2264 = OpExtInst %void %2 DebugValue %206 %1547 %243
+ %1719 = OpExtInst %void %2 DebugLine %64 %uint_128 %uint_128 %uint_22 %uint_79
+ %1552 = OpExtInst %float %1 SmoothStep %1529 %1526 %1547
+ %2268 = OpExtInst %void %2 DebugLine %64 %uint_128 %uint_128 %uint_3 %uint_79
+ %2267 = OpExtInst %void %2 DebugValue %203 %1552 %243
+ %1724 = OpExtInst %void %2 DebugLine %64 %uint_129 %uint_129 %uint_29 %uint_62
+ %1556 = OpExtInst %float %1 SmoothStep %float_100 %float_0 %1512
+ %2271 = OpExtInst %void %2 DebugLine %64 %uint_129 %uint_129 %uint_3 %uint_62
+ %2270 = OpExtInst %void %2 DebugValue %200 %1556 %243
+ %1729 = OpExtInst %void %2 DebugLine %64 %uint_132 %uint_132 %uint_26 %uint_34
+ %1560 = OpDot %float %1496 %1515
+ %1730 = OpExtInst %void %2 DebugLine %64 %uint_132 %uint_132 %uint_17 %uint_35
+ %1561 = OpExtInst %float %1 FMax %float_0 %1560
+ %2274 = OpExtInst %void %2 DebugLine %64 %uint_132 %uint_132 %uint_3 %uint_35
+ %2273 = OpExtInst %void %2 DebugValue %197 %1561 %243
+ %1734 = OpExtInst %void %2 DebugLine %64 %uint_133 %uint_133 %uint_17 %uint_23
+ %1564 = OpCompositeConstruct %v3float %1561 %1561 %1561
+ %2277 = OpExtInst %void %2 DebugLine %64 %uint_133 %uint_133 %uint_3 %uint_23
+ %2276 = OpExtInst %void %2 DebugValue %194 %1564 %243
+ %1738 = OpExtInst %void %2 DebugLine %64 %uint_136 %uint_136 %uint_22 %uint_23
+ %1567 = OpFNegate %v3float %1515
+ %1740 = OpExtInst %void %2 DebugLine %64 %uint_136 %uint_136 %uint_14 %uint_27
+ %1569 = OpExtInst %v3float %1 Reflect %1567 %1496
+ %2280 = OpExtInst %void %2 DebugLine %64 %uint_136 %uint_136 %uint_3 %uint_27
+ %2279 = OpExtInst %void %2 DebugValue %191 %1569 %243
+ %1745 = OpExtInst %void %2 DebugLine %64 %uint_137 %uint_137 %uint_26 %uint_34
+ %1573 = OpDot %float %1569 %1524
+ %1746 = OpExtInst %void %2 DebugLine %64 %uint_137 %uint_137 %uint_17 %uint_35
+ %1574 = OpExtInst %float %1 FMax %float_0 %1573
+ %2283 = OpExtInst %void %2 DebugLine %64 %uint_137 %uint_137 %uint_3 %uint_35
+ %2282 = OpExtInst %void %2 DebugValue %188 %1574 %243
+ %1750 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_18 %uint_33
+ %1577 = OpExtInst %float %1 Pow %1574 %float_16
+ %1751 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_37 %uint_44
+ %1578 = OpAccessChain %_ptr_Function_float %1447 %int_3
+ %1579 = OpLoad %float %1578
+ %1753 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_18 %uint_44
+ %1580 = OpFMul %float %1577 %1579
+ %1754 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_18 %uint_48
+ %1581 = OpFMul %float %1580 %float_2_5
+ %1755 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_17 %uint_53
+ %1582 = OpCompositeConstruct %v3float %1581 %1581 %1581
+ %2286 = OpExtInst %void %2 DebugLine %64 %uint_138 %uint_138 %uint_3 %uint_53
+ %2285 = OpExtInst %void %2 DebugValue %185 %1582 %243
+ %1760 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_24 %uint_31
+ %1586 = OpFAdd %v3float %1564 %1582
+ %1762 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_23 %uint_39
+ %1588 = OpVectorTimesScalar %v3float %1586 %1552
+ %1764 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_23 %uint_52
+ %1590 = OpVectorTimesScalar %v3float %1588 %1556
+ %1766 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_73 %uint_93
+ %1592 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1593 = OpAccessChain %_ptr_Uniform_v4float %1592 %int_1 %1503 %int_2
+ %1768 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_73 %uint_87
+ %1594 = OpLoad %v4float %1593
+ %1769 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_73 %uint_93
+ %1595 = OpVectorShuffle %v3float %1594 %1594 0 1 2
+ %1770 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_16 %uint_93
+ %1596 = OpFMul %v3float %1590 %1595
+ %1772 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_99 %uint_106
+ %1598 = OpVectorShuffle %v3float %1489 %1489 0 1 2
+ %1773 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_16 %uint_106
+ %1599 = OpFMul %v3float %1596 %1598
+ %1774 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_3 %uint_3
+ %1600 = OpLoad %v3float %1448
+ %1775 = OpExtInst %void %2 DebugLine %64 %uint_140 %uint_140 %uint_3 %uint_106
+ %1601 = OpFAdd %v3float %1600 %1599
+ OpStore %1448 %1601
+ %2295 = OpExtInst %void %2 DebugScope %179
+ %1777 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_34 %uint_36
+ OpBranch %1602
+ %1602 = OpLabel
+ %2296 = OpExtInst %void %2 DebugScope %179
+ %1778 = OpExtInst %void %2 DebugLine %64 %uint_107 %uint_107 %uint_34 %uint_36
+ %1603 = OpLoad %int %1450
+ %1604 = OpIAdd %int %1603 %int_1
+ OpStore %1450 %1604
+ OpBranch %1499
+ %1605 = OpLabel
+ %2297 = OpExtInst %void %2 DebugScope %179
+ %1782 = OpExtInst %void %2 DebugLine %64 %uint_144 %uint_144 %uint_6 %uint_10
+ %1606 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1607 = OpAccessChain %_ptr_Uniform_int %1606 %int_2
+ %1608 = OpLoad %int %1607
+ %1785 = OpExtInst %void %2 DebugLine %64 %uint_144 %uint_144 %uint_6 %uint_23
+ %1609 = OpSGreaterThan %bool %1608 %int_0
+ %2298 = OpExtInst %void %2 DebugNoScope
+ OpSelectionMerge %1614 None
+ OpBranchConditional %1609 %1610 %1614
+)"
+ R"( %1610 = OpLabel
+ %2299 = OpExtInst %void %2 DebugScope %180
+ %1788 = OpExtInst %void %2 DebugLine %64 %uint_146 %uint_146 %uint_22 %uint_22
+ %1611 = OpLoad %v3float %1448
+ OpStore %1466 %1611
+ %2300 = OpExtInst %void %2 DebugScope %155 %1803
+ %1842 = OpExtInst %void %2 DebugLine %64 %uint_78 %uint_78 %uint_15 %uint_22
+ %1810 = OpExtInst %void %2 DebugDeclare %172 %1466 %243
+ %2301 = OpExtInst %void %2 DebugScope %180
+ %2289 = OpExtInst %void %2 DebugLine %64 %uint_146 %uint_146 %uint_33 %uint_33
+ %2288 = OpExtInst %void %2 DebugValue %170 %1476 %243
+ %2302 = OpExtInst %void %2 DebugScope %157 %1803
+ %1844 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_7 %uint_15
+ OpStore %1801 %int_0
+ %1813 = OpExtInst %void %2 DebugDeclare %167 %1801 %243
+ %1846 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_7 %uint_16
+ OpBranch %1814
+ %1814 = OpLabel
+ %2303 = OpExtInst %void %2 DebugScope %157 %1803
+ %1847 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_18 %uint_18
+ %1815 = OpLoad %int %1801
+ %1848 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_18 %uint_22
+ %1816 = OpSLessThan %bool %1815 %int_3
+ %2304 = OpExtInst %void %2 DebugNoScope
+ OpLoopMerge %1840 %1837 None
+ OpBranchConditional %1816 %1817 %1840
+ %1817 = OpLabel
+ %2305 = OpExtInst %void %2 DebugScope %158 %1803
+ %1851 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_38 %uint_38
+ %1818 = OpLoad %int %1801
+ %1852 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_27 %uint_41
+ %1819 = OpAccessChain %_ptr_Uniform_UBO %ubo %int_0
+ %1820 = OpAccessChain %_ptr_Uniform_mat4v4float %1819 %int_1 %1818 %int_3
+ %1821 = OpLoad %mat4v4float %1820
+ %1856 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_60 %uint_68
+ %1823 = OpCompositeExtract %float %1476 0
+ %1824 = OpCompositeExtract %float %1476 1
+ %1825 = OpCompositeExtract %float %1476 2
+ %1859 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_53 %uint_76
+ %1826 = OpCompositeConstruct %v4float %1823 %1824 %1825 %float_1
+ %1860 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_23 %uint_77
+ %1827 = OpVectorTimesMatrix %v4float %1826 %1821
+ %2229 = OpExtInst %void %2 DebugLine %64 %uint_81 %uint_81 %uint_3 %uint_77
+ %2228 = OpExtInst %void %2 DebugValue %163 %1827 %243
+ %1867 = OpExtInst %void %2 DebugLine %64 %uint_85 %uint_85 %uint_40 %uint_40
+ %1832 = OpConvertSToF %float %1818
+ %2235 = OpExtInst %void %2 DebugLine %64 %uint_85 %uint_85 %uint_28 %uint_28
+ %2234 = OpExtInst %void %2 DebugValue %151 %1827 %243
+ %2238 = OpExtInst %void %2 DebugLine %64 %uint_85 %uint_85 %uint_40 %uint_40
+ %2237 = OpExtInst %void %2 DebugValue %148 %1832 %243
+ %2306 = OpExtInst %void %2 DebugScope %103 %1885
+ %1983 = OpExtInst %void %2 DebugLine %64 %uint_56 %uint_56 %uint_2 %uint_7
+ %1904 = OpExtInst %void %2 DebugDeclare %146 %1883 %243
+ %1986 = OpExtInst %void %2 DebugLine %64 %uint_57 %uint_57 %uint_2 %uint_2
+ %1907 = OpLoad %type_2d_image_array %textureShadowMap
+)"
+ R"( %1987 = OpExtInst %void %2 DebugLine %64 %uint_57 %uint_57 %uint_2 %uint_72
+ %1908 = OpImageQuerySizeLod %v3uint %1907 %uint_0
+ %1909 = OpCompositeExtract %uint %1908 0
+ %1910 = OpBitcast %int %1909
+ %1911 = OpAccessChain %_ptr_Function_int %1883 %int_0
+ OpStore %1911 %1910
+ %1912 = OpCompositeExtract %uint %1908 1
+ %1913 = OpBitcast %int %1912
+ %1914 = OpAccessChain %_ptr_Function_int %1883 %int_1
+ OpStore %1914 %1913
+ %1915 = OpCompositeExtract %uint %1908 2
+ %1916 = OpBitcast %int %1915
+ %2204 = OpExtInst %void %2 DebugValue %142 %1916 %243
+ %1999 = OpExtInst %void %2 DebugLine %64 %uint_57 %uint_57 %uint_19 %uint_19
+ %1917 = OpImageQueryLevels %uint %1907
+ %2000 = OpExtInst %void %2 DebugLine %64 %uint_57 %uint_57 %uint_2 %uint_72
+ %1918 = OpBitcast %int %1917
+ %2207 = OpExtInst %void %2 DebugValue %138 %1918 %243
+ %2211 = OpExtInst %void %2 DebugLine %64 %uint_58 %uint_58 %uint_2 %uint_16
+ %2210 = OpExtInst %void %2 DebugValue %135 %float_1_5 %243
+ %2005 = OpExtInst %void %2 DebugLine %64 %uint_59 %uint_59 %uint_13 %uint_21
+ %1921 = OpFMul %float %float_1_5 %float_1
+ %2006 = OpExtInst %void %2 DebugLine %64 %uint_59 %uint_59 %uint_33 %uint_40
+ %1922 = OpAccessChain %_ptr_Function_int %1883 %int_0
+ %1923 = OpLoad %int %1922
+ %1924 = OpConvertSToF %float %1923
+ %2009 = OpExtInst %void %2 DebugLine %64 %uint_59 %uint_59 %uint_13 %uint_41
+ %1925 = OpFDiv %float %1921 %1924
+ %2214 = OpExtInst %void %2 DebugLine %64 %uint_59 %uint_59 %uint_2 %uint_41
+ %2213 = OpExtInst %void %2 DebugValue %132 %1925 %243
+ %2013 = OpExtInst %void %2 DebugLine %64 %uint_60 %uint_60 %uint_13 %uint_21
+ %1928 = OpFMul %float %float_1_5 %float_1
+ %2014 = OpExtInst %void %2 DebugLine %64 %uint_60 %uint_60 %uint_33 %uint_40
+ %1929 = OpAccessChain %_ptr_Function_int %1883 %int_1
+ %1930 = OpLoad %int %1929
+ %1931 = OpConvertSToF %float %1930
+ %2017 = OpExtInst %void %2 DebugLine %64 %uint_60 %uint_60 %uint_13 %uint_41
+ %1932 = OpFDiv %float %1928 %1931
+ %2217 = OpExtInst %void %2 DebugLine %64 %uint_60 %uint_60 %uint_2 %uint_41
+ %2216 = OpExtInst %void %2 DebugValue %129 %1932 %243
+ %2020 = OpExtInst %void %2 DebugLine %64 %uint_62 %uint_62 %uint_2 %uint_23
+ OpStore %1891 %float_0
+ %1934 = OpExtInst %void %2 DebugDeclare %126 %1891 %243
+ %2022 = OpExtInst %void %2 DebugLine %64 %uint_63 %uint_63 %uint_2 %uint_14
+ OpStore %1892 %int_0
+ %1935 = OpExtInst %void %2 DebugDeclare %123 %1892 %243
+ %2220 = OpExtInst %void %2 DebugLine %64 %uint_64 %uint_64 %uint_2 %uint_14
+ %2219 = OpExtInst %void %2 DebugValue %119 %int_1 %243
+ %2027 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_15 %uint_16
+ %1938 = OpSNegate %int %int_1
+ %2028 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_7 %uint_16
+ OpStore %1894 %1938
+ %1939 = OpExtInst %void %2 DebugDeclare %115 %1894 %243
+ %2030 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_7 %uint_21
+ OpBranch %1940
+ %1940 = OpLabel
+ %2307 = OpExtInst %void %2 DebugScope %103 %1885
+ %2031 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_23 %uint_23
+ %1941 = OpLoad %int %1894
+ %2033 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_23 %uint_28
+ %1943 = OpSLessThanEqual %bool %1941 %int_1
+ %2308 = OpExtInst %void %2 DebugNoScope
+ OpLoopMerge %1976 %1973 None
+ OpBranchConditional %1943 %1944 %1976
+ %1944 = OpLabel
+ %2309 = OpExtInst %void %2 DebugScope %104 %1885
+ %2037 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_16 %uint_17
+ %1946 = OpSNegate %int %int_1
+ %2038 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_8 %uint_17
+ OpStore %1895 %1946
+ %1947 = OpExtInst %void %2 DebugDeclare %111 %1895 %243
+ %2040 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_8 %uint_22
+ OpBranch %1948
+ %1948 = OpLabel
+ %2310 = OpExtInst %void %2 DebugScope %104 %1885
+ %2041 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_24 %uint_24
+ %1949 = OpLoad %int %1895
+ %2043 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_24 %uint_29
+ %1951 = OpSLessThanEqual %bool %1949 %int_1
+ %2311 = OpExtInst %void %2 DebugNoScope
+ OpLoopMerge %1972 %1969 None
+ OpBranchConditional %1951 %1952 %1972
+ %1952 = OpLabel
+ %2312 = OpExtInst %void %2 DebugScope %106 %1885
+ %2047 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_32 %uint_32
+ OpStore %1896 %1827
+ %2051 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_53 %uint_53
+ %1956 = OpLoad %int %1894
+ %1957 = OpConvertSToF %float %1956
+ %2053 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_50 %uint_53
+ %1958 = OpFMul %float %1925 %1957
+ %2055 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_59 %uint_59
+ %1960 = OpLoad %int %1895
+ %1961 = OpConvertSToF %float %1960
+ %2057 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_56 %uint_59
+ %1962 = OpFMul %float %1932 %1961
+ %2058 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_43 %uint_60
+ %1963 = OpCompositeConstruct %v2float %1958 %1962
+ %2313 = OpExtInst %void %2 DebugScope %70 %2085
+ %2141 = OpExtInst %void %2 DebugLine %64 %uint_37 %uint_37 %uint_19 %uint_26
+ %2090 = OpExtInst %void %2 DebugDeclare %96 %1896 %243
+ %2314 = OpExtInst %void %2 DebugScope %106 %1885
+ %2223 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_36 %uint_36
+ %2222 = OpExtInst %void %2 DebugValue %93 %1832 %243
+ %2226 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_43 %uint_60
+ %2225 = OpExtInst %void %2 DebugValue %90 %1963 %243
+ %2315 = OpExtInst %void %2 DebugScope %73 %2085
+ %2144 = OpExtInst %void %2 DebugLine %64 %uint_39 %uint_39 %uint_2 %uint_17
+ OpStore %2083 %float_1
+ %2094 = OpExtInst %void %2 DebugDeclare %86 %2083 %243
+ %2147 = OpExtInst %void %2 DebugLine %64 %uint_40 %uint_40 %uint_27 %uint_29
+ %2096 = OpAccessChain %_ptr_Function_float %1896 %int_3
+ %2097 = OpLoad %float %2096
+ %2098 = OpCompositeConstruct %v4float %2097 %2097 %2097 %2097
+ %2150 = OpExtInst %void %2 DebugLine %64 %uint_40 %uint_40 %uint_23 %uint_29
+ %2099 = OpFDiv %v4float %1827 %2098
+ %2151 = OpExtInst %void %2 DebugLine %64 %uint_40 %uint_40 %uint_2 %uint_29
+ OpStore %2086 %2099
+ %2100 = OpExtInst %void %2 DebugDeclare %83 %2086 %243
+ %2154 = OpExtInst %void %2 DebugLine %64 %uint_41 %uint_41 %uint_19 %uint_31
+ %2102 = OpVectorShuffle %v2float %2099 %2099 0 1
+ %2155 = OpExtInst %void %2 DebugLine %64 %uint_41 %uint_41 %uint_19 %uint_36
+ %2103 = OpVectorTimesScalar %v2float %2102 %float_0_5
+ %2156 = OpExtInst %void %2 DebugLine %64 %uint_41 %uint_41 %uint_19 %uint_42
+ %2104 = OpFAdd %v2float %2103 %35
+ %2158 = OpExtInst %void %2 DebugLine %64 %uint_41 %uint_41 %uint_2 %uint_42
+ %2106 = OpVectorShuffle %v4float %2099 %2104 4 5 2 3
+ OpStore %2086 %2106
+ %2160 = OpExtInst %void %2 DebugLine %64 %uint_43 %uint_43 %uint_6 %uint_18
+ %2107 = OpAccessChain %_ptr_Function_float %2086 %int_2
+ %2108 = OpLoad %float %2107
+ %2162 = OpExtInst %void %2 DebugLine %64 %uint_43 %uint_43 %uint_6 %uint_23
+ %2109 = OpFOrdGreaterThan %bool %2108 %float_n1
+ %2163 = OpExtInst %void %2 DebugLine %64 %uint_43 %uint_43 %uint_30 %uint_42
+ %2110 = OpAccessChain %_ptr_Function_float %2086 %int_2
+ %2111 = OpLoad %float %2110
+ %2165 = OpExtInst %void %2 DebugLine %64 %uint_43 %uint_43 %uint_30 %uint_46
+ %2112 = OpFOrdLessThan %bool %2111 %float_1
+ %2166 = OpExtInst %void %2 DebugLine %64 %uint_43 %uint_43 %uint_6 %uint_46
+ %2113 = OpLogicalAnd %bool %2109 %2112
+ %2316 = OpExtInst %void %2 DebugNoScope
+ OpSelectionMerge %2139 None
+ OpBranchConditional %2113 %2114 %2139
+ %2114 = OpLabel
+ %2317 = OpExtInst %void %2 DebugScope %74 %2085
+ %2169 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_16 %uint_16
+ %2115 = OpLoad %type_2d_image_array %textureShadowMap
+ %2170 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_40 %uint_40
+ %2116 = OpLoad %type_sampler %samplerShadowMap
+ %2171 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_65 %uint_65
+ %2117 = OpLoad %v4float %2086
+ %2172 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_65 %uint_77
+ %2118 = OpVectorShuffle %v2float %2117 %2117 0 1
+ %2174 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_65 %uint_82
+ %2120 = OpFAdd %v2float %2118 %1963
+ %2122 = OpCompositeExtract %float %2120 0
+ %2123 = OpCompositeExtract %float %2120 1
+ %2178 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_58 %uint_95
+ %2124 = OpCompositeConstruct %v3float %2122 %2123 %1832
+ %2179 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_16 %uint_96
+ %2125 = OpSampledImage %type_sampled_image_0 %2115 %2116
+ %2126 = OpImageSampleImplicitLod %v4float %2125 %2124 None
+ %2181 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_16 %uint_98
+ %2127 = OpCompositeExtract %float %2126 0
+ %2202 = OpExtInst %void %2 DebugLine %64 %uint_45 %uint_45 %uint_3 %uint_98
+ %2201 = OpExtInst %void %2 DebugValue %79 %2127 %243
+ %2184 = OpExtInst %void %2 DebugLine %64 %uint_46 %uint_46 %uint_7 %uint_19
+ %2129 = OpAccessChain %_ptr_Function_float %2086 %int_3
+ %2130 = OpLoad %float %2129
+ %2186 = OpExtInst %void %2 DebugLine %64 %uint_46 %uint_46 %uint_7 %uint_23
+ %2131 = OpFOrdGreaterThan %bool %2130 %float_0
+ %2188 = OpExtInst %void %2 DebugLine %64 %uint_46 %uint_46 %uint_37 %uint_49
+ %2133 = OpAccessChain %_ptr_Function_float %2086 %int_2
+ %2134 = OpLoad %float %2133
+ %2190 = OpExtInst %void %2 DebugLine %64 %uint_46 %uint_46 %uint_30 %uint_49
+ %2135 = OpFOrdLessThan %bool %2127 %2134
+ %2191 = OpExtInst %void %2 DebugLine %64 %uint_46 %uint_46 %uint_7 %uint_49
+ %2136 = OpLogicalAnd %bool %2131 %2135
+ %2318 = OpExtInst %void %2 DebugNoScope
+ OpSelectionMerge %2138 None
+ OpBranchConditional %2136 %2137 %2138
+ %2137 = OpLabel
+ %2319 = OpExtInst %void %2 DebugScope %76 %2085
+ %2194 = OpExtInst %void %2 DebugLine %64 %uint_48 %uint_48 %uint_4 %uint_13
+ OpStore %2083 %float_0_25
+ %2320 = OpExtInst %void %2 DebugScope %74 %2085
+ %2195 = OpExtInst %void %2 DebugLine %64 %uint_49 %uint_49 %uint_3 %uint_3
+ OpBranch %2138
+ %2138 = OpLabel
+ %2321 = OpExtInst %void %2 DebugScope %73 %2085
+ %2196 = OpExtInst %void %2 DebugLine %64 %uint_50 %uint_50 %uint_2 %uint_2
+ OpBranch %2139
+ %2139 = OpLabel
+ %2322 = OpExtInst %void %2 DebugScope %73 %2085
+ %2197 = OpExtInst %void %2 DebugLine %64 %uint_51 %uint_51 %uint_9 %uint_9
+ %2140 = OpLoad %float %2083
+ %2323 = OpExtInst %void %2 DebugScope %106 %1885
+ %2061 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_4 %uint_4
+ %1965 = OpLoad %float %1891
+ %2062 = OpExtInst %void %2 DebugLine %64 %uint_70 %uint_70 %uint_4 %uint_61
+ %1966 = OpFAdd %float %1965 %2140
+ OpStore %1891 %1966
+ %2064 = OpExtInst %void %2 DebugLine %64 %uint_71 %uint_71 %uint_4 %uint_9
+ %1967 = OpLoad %int %1892
+ %1968 = OpIAdd %int %1967 %int_1
+ OpStore %1892 %1968
+ %2324 = OpExtInst %void %2 DebugScope %104 %1885
+ %2067 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_36 %uint_37
+ OpBranch %1969
+ %1969 = OpLabel
+ %2325 = OpExtInst %void %2 DebugScope %104 %1885
+ %2068 = OpExtInst %void %2 DebugLine %64 %uint_68 %uint_68 %uint_36 %uint_37
+ %1970 = OpLoad %int %1895
+ %1971 = OpIAdd %int %1970 %int_1
+ OpStore %1895 %1971
+ OpBranch %1948
+ %1972 = OpLabel
+ %2326 = OpExtInst %void %2 DebugScope %103 %1885
+ %2072 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_35 %uint_36
+ OpBranch %1973
+ %1973 = OpLabel
+ %2327 = OpExtInst %void %2 DebugScope %103 %1885
+ %2073 = OpExtInst %void %2 DebugLine %64 %uint_66 %uint_66 %uint_35 %uint_36
+ %1974 = OpLoad %int %1894
+ %1975 = OpIAdd %int %1974 %int_1
+ OpStore %1894 %1975
+ OpBranch %1940
+ %1976 = OpLabel
+ %2328 = OpExtInst %void %2 DebugScope %103 %1885
+ %2077 = OpExtInst %void %2 DebugLine %64 %uint_75 %uint_75 %uint_9 %uint_9
+ %1977 = OpLoad %float %1891
+ %2078 = OpExtInst %void %2 DebugLine %64 %uint_75 %uint_75 %uint_24 %uint_24
+ %1978 = OpLoad %int %1892
+ %1979 = OpConvertSToF %float %1978
+ %2080 = OpExtInst %void %2 DebugLine %64 %uint_75 %uint_75 %uint_9 %uint_24
+ %1980 = OpFDiv %float %1977 %1979
+ %2329 = OpExtInst %void %2 DebugScope %158 %1803
+ %2232 = OpExtInst %void %2 DebugLine %64 %uint_85 %uint_85 %uint_4 %uint_41
+ %2231 = OpExtInst %void %2 DebugValue %160 %1980 %243
+ %1872 = OpExtInst %void %2 DebugLine %64 %uint_90 %uint_90 %uint_3 %uint_3
+ %1835 = OpLoad %v3float %1466
+ %1873 = OpExtInst %void %2 DebugLine %64 %uint_90 %uint_90 %uint_3 %uint_16
+ %1836 = OpVectorTimesScalar %v3float %1835 %1980
+ OpStore %1466 %1836
+ %2330 = OpExtInst %void %2 DebugScope %157 %1803
+ %1875 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_35 %uint_37
+ OpBranch %1837
+ %1837 = OpLabel
+ %2331 = OpExtInst %void %2 DebugScope %157 %1803
+ %1876 = OpExtInst %void %2 DebugLine %64 %uint_79 %uint_79 %uint_35 %uint_37
+ %1838 = OpLoad %int %1801
+ %1839 = OpIAdd %int %1838 %int_1
+ OpStore %1801 %1839
+ OpBranch %1814
+ %1840 = OpLabel
+ %2332 = OpExtInst %void %2 DebugScope %157 %1803
+ %1880 = OpExtInst %void %2 DebugLine %64 %uint_92 %uint_92 %uint_9 %uint_9
+ %1841 = OpLoad %v3float %1466
+ %2333 = OpExtInst %void %2 DebugScope %180
+ %1793 = OpExtInst %void %2 DebugLine %64 %uint_146 %uint_146 %uint_3 %uint_40
+ OpStore %1448 %1841
+ %2334 = OpExtInst %void %2 DebugScope %179
+ %1794 = OpExtInst %void %2 DebugLine %64 %uint_147 %uint_147 %uint_2 %uint_2
+ OpBranch %1614
+ %1614 = OpLabel
+;CHECK: %1614 = OpLabel
+;CHECK-NEXT: [[phi:%\w+]] = OpPhi
+;CHECK-NEXT: {{%\w+}} = OpExtInst %void {{%\w+}} DebugValue %233
+ %2335 = OpExtInst %void %2 DebugScope %179
+ %1795 = OpExtInst %void %2 DebugLine %64 %uint_149 %uint_149 %uint_16 %uint_16
+ %1615 = OpLoad %v3float %1448
+ %1616 = OpCompositeExtract %float %1615 0
+ %1617 = OpCompositeExtract %float %1615 1
+ %1618 = OpCompositeExtract %float %1615 2
+ %1799 = OpExtInst %void %2 DebugLine %64 %uint_149 %uint_149 %uint_9 %uint_28
+ %1619 = OpCompositeConstruct %v4float %1616 %1617 %1618 %float_1
+ %2336 = OpExtInst %void %2 DebugNoLine
+ %2337 = OpExtInst %void %2 DebugNoScope
+ OpStore %out_var_SV_TARGET %1619
+ %329 = OpExtInst %void %2 DebugLine %64 %uint_150 %uint_150 %uint_1 %uint_1
+ OpReturn
+ OpFunctionEnd
+)";
+
+ SetTargetEnv(SPV_ENV_VULKAN_1_2);
+ SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+ SinglePassRunAndMatch<SSARewritePass>(text, true);
+}
+
// TODO(greg-lunarg): Add tests to verify handling of these cases:
//
// No optimization in the presence of