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:
Lioncash 2020-09-22 22:54:32 -04:00
parent fcd0145eb5
commit 0dc6967ff1

View file

@ -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;
} }