diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-04-04 13:20:59 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-04-04 17:27:17 +0300 |
commit | fb085543370ac95ffa422f9547687b46088fed8b (patch) | |
tree | 2b6db25398a158e23c0be0ccaf761ddd76ae9b02 | |
parent | dfa103fe8197e82d95bd105dde70ca392753008d (diff) |
Refactor out some common variables.
Makes debug stepping easier.
-rw-r--r-- | cfg_structurizer.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/cfg_structurizer.cpp b/cfg_structurizer.cpp index 15a162b..b603b07 100644 --- a/cfg_structurizer.cpp +++ b/cfg_structurizer.cpp @@ -3317,12 +3317,13 @@ CFGNode *CFGStructurizer::get_target_break_block_for_inner_header(const CFGNode for (size_t j = header_index; j && !target_header; j--) { - if (node->headers[j - 1]->merge == MergeType::Loop) + auto *candidate_header = node->headers[j - 1]; + + if (candidate_header->merge == MergeType::Loop) { // We might have two loops, each at equal scopes. // In order to break out to an outer loop, we must verify that the loops actually nest. // We must not introduce any backwards branches here. - auto *candidate_header = node->headers[j - 1]; CFGNode *candidate_merge = nullptr; if (candidate_header->loop_ladder_block) candidate_merge = candidate_header->loop_ladder_block; @@ -3333,7 +3334,7 @@ CFGNode *CFGStructurizer::get_target_break_block_for_inner_header(const CFGNode continue; // Check for backwards branch. - if (query_reachability(*candidate_merge, *node->headers[header_index])) + if (query_reachability(*candidate_merge, *inner_header)) continue; // An outer header is expected to dominate the inner header. Otherwise, they live in @@ -3587,10 +3588,12 @@ void CFGStructurizer::split_merge_blocks() // This ladder block will break to outer scope, or keep executing the old merge block. for (size_t i = node->headers.size() - 1; i; i--) { + auto *current_node = node->headers[i]; + // Find innermost loop header scope we can break to when resolving ladders. CFGNode *target_header = get_target_break_block_for_inner_header(node, i); - if (node->headers[i]->merge == MergeType::Loop) + if (current_node->merge == MergeType::Loop) { auto *loop_ladder = get_or_create_ladder_block(node, i); @@ -3604,22 +3607,22 @@ void CFGStructurizer::split_merge_blocks() if (loop_ladder) { new_ladder_block = build_ladder_block_for_escaping_edge_handling( - node, node->headers[i], loop_ladder, + node, current_node, loop_ladder, target_header, full_break_target, normal_preds[i]); } // We won't analyze this again, so make sure header knows // about the new merge block. - if (node->headers[i]->freeze_structured_analysis) + if (current_node->freeze_structured_analysis) { if (new_ladder_block) - node->headers[i]->loop_ladder_block = new_ladder_block; - node->headers[i]->loop_merge_block = node->headers[i]->loop_ladder_block; - node->headers[i]->loop_ladder_block = nullptr; + current_node->loop_ladder_block = new_ladder_block; + current_node->loop_merge_block = current_node->loop_ladder_block; + current_node->loop_ladder_block = nullptr; } } - else if (node->headers[i]->merge == MergeType::Selection) + else if (current_node->merge == MergeType::Selection) { if (target_header) { @@ -3631,13 +3634,13 @@ void CFGStructurizer::split_merge_blocks() rewrite_to = target_header->loop_merge_block; if (rewrite_to) - node->headers[i]->traverse_dominated_blocks_and_rewrite_branch(node, rewrite_to); + current_node->traverse_dominated_blocks_and_rewrite_branch(node, rewrite_to); else LOGW("No loop merge block?\n"); } else if (full_break_target) { - node->headers[i]->traverse_dominated_blocks_and_rewrite_branch(node, full_break_target); + current_node->traverse_dominated_blocks_and_rewrite_branch(node, full_break_target); } else { |