# UNDF: UNDF-2026-000000293 --- a/spirv_cfg.hpp +++ b/spirv_cfg.hpp @@ -78,6 +78,7 @@ private: std::vector post_order; std::unordered_map visit_order; SmallVector visit_stack; + std::unordered_set visit_stack_set; // O(1) membership mirror of visit_stack uint32_t last_visited_size = 0; void post_order_visit_entry(uint32_t block); --- a/spirv_cfg.cpp +++ b/spirv_cfg.cpp @@ -99,6 +99,7 @@ void CFG::post_order_visit_entry(uint32_t block) { visit_stack.push_back(block); + visit_stack_set.insert(block); while (!visit_stack.empty()) { @@ -118,6 +119,7 @@ void CFG::post_order_visit_entry(uint32_t block) while (!visit_stack.empty() && visit_order[visit_stack.back()].visited_branches) { post_order_visit_resolve(visit_stack.back()); + visit_stack_set.erase(visit_stack.back()); visit_stack.pop_back(); } } @@ -126,8 +128,7 @@ void CFG::post_order_visit_entry(uint32_t block) void CFG::visit_branch(uint32_t block_id) { // Prune obvious duplicates. - if (std::find(visit_stack.begin() + last_visited_size, visit_stack.end(), block_id) == visit_stack.end() && - !has_visited_branch(block_id)) + if (visit_stack_set.find(block_id) == visit_stack_set.end() && + !has_visited_branch(block_id)) { visit_stack.push_back(block_id); + visit_stack_set.insert(block_id); } }