Skip to content

Stack overflow from spvtools::opt::SSARewriter::GetReachingDef recursion #6465

@devshgraphicsprogramming

Description

Achieved on a similar test case to #6104

We're compiling this HLSL shader which we need to compile with -fcgl to get to the SPIR-V
https://godbolt.org/z/r75PE1xWM

The resulting SPIR-V attached

I don't know how to invoke the spv-opt properly on Godbolt with illegal SPIR-V, probably assembler complains before even seeing --legalize-hlsl
https://godbolt.org/z/fEMcoKTv3

Results in this callstack before crashing in DXC without the -fcgl flag inside of SPIR-V Opt.

 	msvcp140d.dll!00007ff8c692076e()	Unknown
 	msvcp140d.dll!00007ff8c691ea06()	Unknown
>	dxcompiler.dll!std::_Iterator_base12::_Adopt_locked(const std::_Container_base12 * _Parent) Line 1367	C++
 	dxcompiler.dll!std::_Iterator_base12::_Adopt(const std::_Container_base12 * _Parent) Line 1307	C++
 	dxcompiler.dll!std::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>,std::_Iterator_base12>::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>,std::_Iterator_base12>(std::_List_node<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>,void *> * _Pnode, const std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>> * _Plist) Line 38	C++
 	dxcompiler.dll!std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>>::_List_const_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>>(std::_List_node<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>,void *> *)	C++
 	dxcompiler.dll!std::_List_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>>::_List_iterator<std::_List_val<std::_List_simple_types<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>>(std::_List_node<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>,void *> *)	C++
 	dxcompiler.dll!std::list<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>,std::allocator<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>>::_Make_iter(std::_List_node<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>,void *> * _Where) Line 1137	C++
 	dxcompiler.dll!std::_Hash<std::_Umap_traits<spvtools::opt::BasicBlock *,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>,std::_Uhash_compare<spvtools::opt::BasicBlock *,std::hash<spvtools::opt::BasicBlock *>,std::equal_to<spvtools::opt::BasicBlock *>>,std::allocator<std::pair<spvtools::opt::BasicBlock * const,std::unordered_map<unsigned int,unsigned int,std::hash<unsigned int>,std::equal_to<unsigned int>,std::allocator<std::pair<unsigned int const ,unsigned int>>>>>,0>>::find(spvtools::opt::BasicBlock * const & _Keyval) Line 1231	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetValueAtBlock(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 247	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 260	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
 	dxcompiler.dll!spvtools::opt::SSARewriter::GetReachingDef(unsigned int var_id, spvtools::opt::BasicBlock * bb) Line 268	C++
...
 	The maximum number of stack frames supported by Visual Studio has been exceeded.

Its also possible that the illegal SPIR-V emitted by DXC is causing infinite recursion / loops in the parsed SPIR-V, because the input HLSL is just a simple unit-test shader, so I doubt the chains are so deep to actually overflow the stack which is a few megs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions