41 lines
1.3 KiB
Diff
41 lines
1.3 KiB
Diff
# UNDF: UNDF-2026-000000293
|
|
--- a/spirv_cfg.hpp
|
|
+++ b/spirv_cfg.hpp
|
|
@@ -78,6 +78,7 @@ private:
|
|
std::vector<uint32_t> post_order;
|
|
std::unordered_map<uint32_t, VisitOrder> visit_order;
|
|
SmallVector<uint32_t> visit_stack;
|
|
+ std::unordered_set<uint32_t> 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);
|
|
}
|
|
}
|