control_flow: emplace elements in place within TryQuery()
Places data structures where they'll eventually be moved to to avoid needing to even move them in the first place.
This commit is contained in:
parent
fcd0145eb5
commit
0dc6967ff1
|
@ -547,13 +547,13 @@ bool TryQuery(CFGRebuildState& state) {
|
||||||
gather_labels(q2.ssy_stack, state.ssy_labels, block);
|
gather_labels(q2.ssy_stack, state.ssy_labels, block);
|
||||||
gather_labels(q2.pbk_stack, state.pbk_labels, block);
|
gather_labels(q2.pbk_stack, state.pbk_labels, block);
|
||||||
if (std::holds_alternative<SingleBranch>(*block.branch)) {
|
if (std::holds_alternative<SingleBranch>(*block.branch)) {
|
||||||
const auto branch = std::get_if<SingleBranch>(block.branch.get());
|
auto* branch = std::get_if<SingleBranch>(block.branch.get());
|
||||||
if (!branch->condition.IsUnconditional()) {
|
if (!branch->condition.IsUnconditional()) {
|
||||||
q2.address = block.end + 1;
|
q2.address = block.end + 1;
|
||||||
state.queries.push_back(q2);
|
state.queries.push_back(q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
Query conditional_query{q2};
|
auto& conditional_query = state.queries.emplace_back(q2);
|
||||||
if (branch->is_sync) {
|
if (branch->is_sync) {
|
||||||
if (branch->address == unassigned_branch) {
|
if (branch->address == unassigned_branch) {
|
||||||
branch->address = conditional_query.ssy_stack.top();
|
branch->address = conditional_query.ssy_stack.top();
|
||||||
|
@ -567,15 +567,15 @@ bool TryQuery(CFGRebuildState& state) {
|
||||||
conditional_query.pbk_stack.pop();
|
conditional_query.pbk_stack.pop();
|
||||||
}
|
}
|
||||||
conditional_query.address = branch->address;
|
conditional_query.address = branch->address;
|
||||||
state.queries.push_back(std::move(conditional_query));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const auto multi_branch = std::get_if<MultiBranch>(block.branch.get());
|
|
||||||
|
const auto* multi_branch = std::get_if<MultiBranch>(block.branch.get());
|
||||||
for (const auto& branch_case : multi_branch->branches) {
|
for (const auto& branch_case : multi_branch->branches) {
|
||||||
Query conditional_query{q2};
|
auto& conditional_query = state.queries.emplace_back(q2);
|
||||||
conditional_query.address = branch_case.address;
|
conditional_query.address = branch_case.address;
|
||||||
state.queries.push_back(std::move(conditional_query));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue