mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
86f35b6d93
Introduced various untangle algorithm improvements: - Improve untangle edge reorganization: improve the criterion used for reorganizing the edges between the old postdominator and the cloned one, after an inline procedure is attempted during the untangle. - Untangle counter: introduce two new counters which take into account the number of times the untangle procedure is attempted and the actual times it is performed. - Disable not dominated restriction: disable the criterion which restricts the untangle opportunities if we do not dominate entirely at least one of the two branches. This has likely broken the assumption that the postdominators of nodes do not changes after each untangle step has been carried out. - Change dominance criterion: the dominance of the nodes belonging to the `then` and `else` nodes is now checked not with respect to the conditional node, but to the `then` and `else` edges of the conditional node. - Untangle eager inlining: now, when the untangle procedure finds a suitable candidate for the inlining, proceed the complete inlining starting from the selected branch. By default new clones of all the nodes till the exit are created and attached to the branch, while the original nodes are detached. An additional pass which removes eventual dandling nodes (nodes which are not reachable from the entry node of the graph) is performed after the eager inlining. This means that if no other incoming edges to this group of nodes is present the original nodes will be purged. The post dominator now is updated during the inlining analysis, and the paths conducting to inlined exits are not taken into account for the post dominator computation. - Enable untangle for mixed branches: perform the untangle even if the `then` and `else` branches share nodes. This was not feasible before because without the eager inlining we couldn't decide which edge to attach to the new postdominator clone. This problem is not present anymore, so we can handle any kind of topology in the untangle. - Improved also the analysis information serialized by the decompiler.
18 lines
499 B
C++
18 lines
499 B
C++
/// \file RegionCFGTree.cpp
|
|
/// \brief FunctionPass that applies the comb to the RegionCFG of a function
|
|
|
|
//
|
|
// This file is distributed under the MIT License. See LICENSE.md for details.
|
|
//
|
|
|
|
// Local libraries includes
|
|
#include "revng-c/RestructureCFGPass/RegionCFGTreeImpl.h"
|
|
|
|
// Explicit instantation for the `RegionCFG` template class.
|
|
template class RegionCFG<llvm::BasicBlock *>;
|
|
|
|
unsigned DuplicationCounter = 0;
|
|
|
|
unsigned UntangleTentativeCounter = 0;
|
|
unsigned UntanglePerformedCounter = 0;
|