aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Fischer <greg@lunarg.com>2022-08-15 15:23:23 -0600
committerGitHub <noreply@github.com>2022-08-15 15:23:23 -0600
commit9abacb34a5726d6cb40e798de48bc4f02b92808b (patch)
tree7c4c3cc3383d768865cffb13646a06e32a765d13
parent3a8a961cffb7699422a05dcbafdd721226b4547d (diff)
downloadSPIRV-Tools-9abacb34a5726d6cb40e798de48bc4f02b92808b.tar.gz
Fix ADCE to not eliminate top level DebugInfo instructions (#4889)
Specifically, DebugSourceContinued, DebugCompilationUnit, and DebugEntryPoint. These instructions are top-level instructions which do not or may not have a user except for the tool and so should not be eliminated.
-rw-r--r--source/opt/aggressive_dead_code_elim_pass.cpp10
-rw-r--r--source/opt/debug_info_manager.cpp2
-rw-r--r--test/opt/aggressive_dead_code_elim_test.cpp100
3 files changed, 111 insertions, 1 deletions
diff --git a/source/opt/aggressive_dead_code_elim_pass.cpp b/source/opt/aggressive_dead_code_elim_pass.cpp
index ffb499f6..116ab69a 100644
--- a/source/opt/aggressive_dead_code_elim_pass.cpp
+++ b/source/opt/aggressive_dead_code_elim_pass.cpp
@@ -630,6 +630,16 @@ void AggressiveDCEPass::InitializeModuleScopeLiveInstructions() {
auto dbg_none = context()->get_debug_info_mgr()->GetDebugInfoNone();
AddToWorklist(dbg_none);
}
+
+ // Add top level DebugInfo to worklist
+ for (auto& dbg : get_module()->ext_inst_debuginfo()) {
+ auto op = dbg.GetShader100DebugOpcode();
+ if (op == NonSemanticShaderDebugInfo100DebugCompilationUnit ||
+ op == NonSemanticShaderDebugInfo100DebugEntryPoint ||
+ op == NonSemanticShaderDebugInfo100DebugSourceContinued) {
+ AddToWorklist(&dbg);
+ }
+ }
}
Pass::Status AggressiveDCEPass::ProcessImpl() {
diff --git a/source/opt/debug_info_manager.cpp b/source/opt/debug_info_manager.cpp
index c1df6258..cef095fb 100644
--- a/source/opt/debug_info_manager.cpp
+++ b/source/opt/debug_info_manager.cpp
@@ -849,7 +849,7 @@ void DebugInfoManager::ClearDebugInfo(Instruction* instr) {
fn_id_to_dbg_fn_.erase(fn_id);
}
if (instr->GetShader100DebugOpcode() ==
- NonSemanticShaderDebugInfo100DebugFunction) {
+ NonSemanticShaderDebugInfo100DebugFunctionDefinition) {
auto fn_id = instr->GetSingleWordOperand(
kDebugFunctionDefinitionOperandOpFunctionIndex);
fn_id_to_dbg_fn_.erase(fn_id);
diff --git a/test/opt/aggressive_dead_code_elim_test.cpp b/test/opt/aggressive_dead_code_elim_test.cpp
index 89cb56f5..e51098ed 100644
--- a/test/opt/aggressive_dead_code_elim_test.cpp
+++ b/test/opt/aggressive_dead_code_elim_test.cpp
@@ -7677,6 +7677,106 @@ TEST_F(AggressiveDCETest, FunctionBecomesUnreachableAfterDCE) {
SinglePassRunAndMatch<AggressiveDCEPass>(text, true);
}
+TEST_F(AggressiveDCETest, KeepTopLevelDebugInfo) {
+ // Don't eliminate DebugCompilationUnit, DebugSourceContinued, and
+ // DebugEntryPoint
+ const std::string text = R"(
+ OpCapability Shader
+ OpExtension "SPV_KHR_non_semantic_info"
+ %1 = OpExtInstImport "NonSemantic.Shader.DebugInfo.100"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %MainPs "MainPs" %out_var_SV_Target0
+ OpExecutionMode %MainPs OriginUpperLeft
+ %4 = OpString "foo2.frag"
+ %5 = OpString "
+struct PS_OUTPUT
+{
+ float4 vColor : SV_Target0 ;
+} ;
+
+"
+ %6 = OpString "
+PS_OUTPUT MainPs ( )
+{
+ PS_OUTPUT ps_output ;
+ ps_output . vColor = float4( 1.0, 0.0, 0.0, 0.0 );
+ return ps_output ;
+}
+
+"
+ %7 = OpString "float"
+ %8 = OpString "vColor"
+ %9 = OpString "PS_OUTPUT"
+ %10 = OpString "MainPs"
+ %11 = OpString ""
+ %12 = OpString "ps_output"
+ %13 = OpString "97a939fb"
+ %14 = OpString " foo2.frag -E MainPs -T ps_6_1 -spirv -fspv-target-env=vulkan1.2 -fspv-debug=vulkan-with-source -fcgl -Fo foo2.frag.nopt.spv -Qembed_debug"
+ OpName %out_var_SV_Target0 "out.var.SV_Target0"
+ OpName %MainPs "MainPs"
+ OpDecorate %out_var_SV_Target0 Location 0
+ %float = OpTypeFloat 32
+ %float_1 = OpConstant %float 1
+ %float_0 = OpConstant %float 0
+ %v4float = OpTypeVector %float 4
+ %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_0
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %uint = OpTypeInt 32 0
+ %uint_32 = OpConstant %uint 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %void = OpTypeVoid
+ %uint_1 = OpConstant %uint 1
+ %uint_4 = OpConstant %uint 4
+ %uint_5 = OpConstant %uint 5
+ %uint_3 = OpConstant %uint 3
+ %uint_0 = OpConstant %uint 0
+ %uint_128 = OpConstant %uint 128
+ %uint_12 = OpConstant %uint 12
+ %uint_2 = OpConstant %uint 2
+ %uint_8 = OpConstant %uint 8
+ %uint_7 = OpConstant %uint 7
+ %uint_9 = OpConstant %uint 9
+ %uint_15 = OpConstant %uint 15
+ %42 = OpTypeFunction %void
+ %uint_10 = OpConstant %uint 10
+ %uint_53 = OpConstant %uint 53
+%out_var_SV_Target0 = OpVariable %_ptr_Output_v4float Output
+ %49 = OpExtInst %void %1 DebugExpression
+ %50 = OpExtInst %void %1 DebugSource %4 %5
+ %51 = OpExtInst %void %1 DebugSourceContinued %6
+; CHECK: %51 = OpExtInst %void %1 DebugSourceContinued %6
+ %52 = OpExtInst %void %1 DebugCompilationUnit %uint_1 %uint_4 %50 %uint_5
+; CHECK: %52 = OpExtInst %void %1 DebugCompilationUnit %uint_1 %uint_4 %50 %uint_5
+ %53 = OpExtInst %void %1 DebugTypeBasic %7 %uint_32 %uint_3 %uint_0
+ %54 = OpExtInst %void %1 DebugTypeVector %53 %uint_4
+ %55 = OpExtInst %void %1 DebugTypeMember %8 %54 %50 %uint_4 %uint_12 %uint_0 %uint_128 %uint_3
+ %56 = OpExtInst %void %1 DebugTypeComposite %9 %uint_1 %50 %uint_2 %uint_8 %52 %9 %uint_128 %uint_3 %55
+ %57 = OpExtInst %void %1 DebugTypeFunction %uint_3 %56
+ %58 = OpExtInst %void %1 DebugFunction %10 %57 %50 %uint_7 %uint_1 %52 %11 %uint_3 %uint_8
+ %59 = OpExtInst %void %1 DebugLexicalBlock %50 %uint_8 %uint_1 %58
+ %60 = OpExtInst %void %1 DebugLocalVariable %12 %56 %50 %uint_9 %uint_15 %59 %uint_4
+ %61 = OpExtInst %void %1 DebugEntryPoint %58 %52 %13 %14
+; CHECK: %61 = OpExtInst %void %1 DebugEntryPoint %58 %52 %13 %14
+ %MainPs = OpFunction %void None %42
+ %62 = OpLabel
+ %63 = OpExtInst %void %1 DebugFunctionDefinition %58 %MainPs
+ %112 = OpExtInst %void %1 DebugScope %59
+ %111 = OpExtInst %void %1 DebugLine %50 %uint_10 %uint_10 %uint_5 %uint_53
+ %110 = OpExtInst %void %1 DebugValue %60 %23 %49 %int_0
+ %113 = OpExtInst %void %1 DebugNoLine
+ %114 = OpExtInst %void %1 DebugNoScope
+ OpStore %out_var_SV_Target0 %23
+ %66 = OpExtInst %void %1 DebugLine %50 %uint_12 %uint_12 %uint_1 %uint_1
+ OpReturn
+ OpFunctionEnd
+)";
+
+ SetTargetEnv(SPV_ENV_VULKAN_1_2);
+ SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+ SinglePassRunAndMatch<AggressiveDCEPass>(text, true);
+}
+
} // namespace
} // namespace opt
} // namespace spvtools