retdec
|
Optimizes while loops into universal for loops. More...
#include <while_true_to_ufor_loop_optimizer.h>
Public Member Functions | |
WhileTrueToUForLoopOptimizer (ShPtr< Module > module, ShPtr< ValueAnalysis > va) | |
Constructs a new optimizer. More... | |
virtual std::string | getId () const override |
Returns the ID of the optimizer. More... | |
![]() | |
Optimizer (ShPtr< Module > module) | |
Constructs a new optimizer. More... | |
ShPtr< Module > | optimize () |
Performs all the optimizations of the specific optimizer. More... | |
![]() | |
virtual void | visit (ShPtr< GlobalVarDef > varDef) override |
virtual void | visit (ShPtr< Function > func) override |
virtual void | visit (ShPtr< AssignStmt > stmt) override |
virtual void | visit (ShPtr< BreakStmt > stmt) override |
virtual void | visit (ShPtr< CallStmt > stmt) override |
virtual void | visit (ShPtr< ContinueStmt > stmt) override |
virtual void | visit (ShPtr< EmptyStmt > stmt) override |
virtual void | visit (ShPtr< ForLoopStmt > stmt) override |
virtual void | visit (ShPtr< UForLoopStmt > stmt) override |
virtual void | visit (ShPtr< GotoStmt > stmt) override |
virtual void | visit (ShPtr< IfStmt > stmt) override |
virtual void | visit (ShPtr< ReturnStmt > stmt) override |
virtual void | visit (ShPtr< SwitchStmt > stmt) override |
virtual void | visit (ShPtr< UnreachableStmt > stmt) override |
virtual void | visit (ShPtr< VarDefStmt > stmt) override |
virtual void | visit (ShPtr< AddOpExpr > expr) override |
virtual void | visit (ShPtr< AddressOpExpr > expr) override |
virtual void | visit (ShPtr< AndOpExpr > expr) override |
virtual void | visit (ShPtr< ArrayIndexOpExpr > expr) override |
virtual void | visit (ShPtr< AssignOpExpr > expr) override |
virtual void | visit (ShPtr< BitAndOpExpr > expr) override |
virtual void | visit (ShPtr< BitOrOpExpr > expr) override |
virtual void | visit (ShPtr< BitShlOpExpr > expr) override |
virtual void | visit (ShPtr< BitShrOpExpr > expr) override |
virtual void | visit (ShPtr< BitXorOpExpr > expr) override |
virtual void | visit (ShPtr< CallExpr > expr) override |
virtual void | visit (ShPtr< CommaOpExpr > expr) override |
virtual void | visit (ShPtr< DerefOpExpr > expr) override |
virtual void | visit (ShPtr< DivOpExpr > expr) override |
virtual void | visit (ShPtr< EqOpExpr > expr) override |
virtual void | visit (ShPtr< GtEqOpExpr > expr) override |
virtual void | visit (ShPtr< GtOpExpr > expr) override |
virtual void | visit (ShPtr< LtEqOpExpr > expr) override |
virtual void | visit (ShPtr< LtOpExpr > expr) override |
virtual void | visit (ShPtr< ModOpExpr > expr) override |
virtual void | visit (ShPtr< MulOpExpr > expr) override |
virtual void | visit (ShPtr< NegOpExpr > expr) override |
virtual void | visit (ShPtr< NeqOpExpr > expr) override |
virtual void | visit (ShPtr< NotOpExpr > expr) override |
virtual void | visit (ShPtr< OrOpExpr > expr) override |
virtual void | visit (ShPtr< StructIndexOpExpr > expr) override |
virtual void | visit (ShPtr< SubOpExpr > expr) override |
virtual void | visit (ShPtr< TernaryOpExpr > expr) override |
virtual void | visit (ShPtr< Variable > var) override |
virtual void | visit (ShPtr< BitCastExpr > expr) override |
virtual void | visit (ShPtr< ExtCastExpr > expr) override |
virtual void | visit (ShPtr< FPToIntCastExpr > expr) override |
virtual void | visit (ShPtr< IntToFPCastExpr > expr) override |
virtual void | visit (ShPtr< IntToPtrCastExpr > expr) override |
virtual void | visit (ShPtr< PtrToIntCastExpr > expr) override |
virtual void | visit (ShPtr< TruncCastExpr > expr) override |
virtual void | visit (ShPtr< ConstArray > constant) override |
virtual void | visit (ShPtr< ConstBool > constant) override |
virtual void | visit (ShPtr< ConstFloat > constant) override |
virtual void | visit (ShPtr< ConstInt > constant) override |
virtual void | visit (ShPtr< ConstNullPointer > constant) override |
virtual void | visit (ShPtr< ConstString > constant) override |
virtual void | visit (ShPtr< ConstStruct > constant) override |
virtual void | visit (ShPtr< ConstSymbol > constant) override |
virtual void | visit (ShPtr< ArrayType > type) override |
virtual void | visit (ShPtr< FloatType > type) override |
virtual void | visit (ShPtr< IntType > type) override |
virtual void | visit (ShPtr< PointerType > type) override |
virtual void | visit (ShPtr< StringType > type) override |
virtual void | visit (ShPtr< StructType > type) override |
virtual void | visit (ShPtr< FunctionType > type) override |
virtual void | visit (ShPtr< VoidType > type) override |
virtual void | visit (ShPtr< UnknownType > type) override |
![]() | |
virtual | ~Visitor ()=default |
Private Member Functions | |
virtual void | doOptimization () override |
Performs the optimization on all functions in the module. More... | |
void | tryReplacementWithUForLoop (ShPtr< WhileLoopStmt > whileLoop) |
Tries to replace the given while loop with a universal for loop. More... | |
void | initializeReplacement (ShPtr< WhileLoopStmt > stmt) |
Initialize a new replacement. More... | |
bool | gatherInfoAboutOptimizedWhileLoop () |
Gathers information about the loop. More... | |
ShPtr< UForLoopStmt > | tryConversionToUForLoop () |
Tries to convert the "while true" loop into a universal for loop. More... | |
ShPtr< EmptyStmt > | getLastEmptyStatement (ShPtr< Statement > stmts) const |
Returns the last empty statement in the given statements. More... | |
void | removeUselessSucessors (ShPtr< UForLoopStmt > forLoop) |
Removes useless successors (if any) of the given universal for loop. More... | |
void | performReplacement (ShPtr< UForLoopStmt > forLoop) |
Performs the replacement. More... | |
void | removeStatementsToBeRemoved () |
Removes statements that are to be removed after a successful optimization. More... | |
Visitor Interface | |
virtual void | visit (ShPtr< WhileLoopStmt > stmt) override |
virtual void | visit (ShPtr< GlobalVarDef > varDef) override |
virtual void | visit (ShPtr< Function > func) override |
virtual void | visit (ShPtr< AssignStmt > stmt) override |
virtual void | visit (ShPtr< BreakStmt > stmt) override |
virtual void | visit (ShPtr< CallStmt > stmt) override |
virtual void | visit (ShPtr< ContinueStmt > stmt) override |
virtual void | visit (ShPtr< EmptyStmt > stmt) override |
virtual void | visit (ShPtr< ForLoopStmt > stmt) override |
virtual void | visit (ShPtr< UForLoopStmt > stmt) override |
virtual void | visit (ShPtr< GotoStmt > stmt) override |
virtual void | visit (ShPtr< IfStmt > stmt) override |
virtual void | visit (ShPtr< ReturnStmt > stmt) override |
virtual void | visit (ShPtr< SwitchStmt > stmt) override |
virtual void | visit (ShPtr< UnreachableStmt > stmt) override |
virtual void | visit (ShPtr< VarDefStmt > stmt) override |
virtual void | visit (ShPtr< WhileLoopStmt > stmt) override |
virtual void | visit (ShPtr< AddOpExpr > expr) override |
virtual void | visit (ShPtr< AddressOpExpr > expr) override |
virtual void | visit (ShPtr< AndOpExpr > expr) override |
virtual void | visit (ShPtr< ArrayIndexOpExpr > expr) override |
virtual void | visit (ShPtr< AssignOpExpr > expr) override |
virtual void | visit (ShPtr< BitAndOpExpr > expr) override |
virtual void | visit (ShPtr< BitOrOpExpr > expr) override |
virtual void | visit (ShPtr< BitShlOpExpr > expr) override |
virtual void | visit (ShPtr< BitShrOpExpr > expr) override |
virtual void | visit (ShPtr< BitXorOpExpr > expr) override |
virtual void | visit (ShPtr< CallExpr > expr) override |
virtual void | visit (ShPtr< CommaOpExpr > expr) override |
virtual void | visit (ShPtr< DerefOpExpr > expr) override |
virtual void | visit (ShPtr< DivOpExpr > expr) override |
virtual void | visit (ShPtr< EqOpExpr > expr) override |
virtual void | visit (ShPtr< GtEqOpExpr > expr) override |
virtual void | visit (ShPtr< GtOpExpr > expr) override |
virtual void | visit (ShPtr< LtEqOpExpr > expr) override |
virtual void | visit (ShPtr< LtOpExpr > expr) override |
virtual void | visit (ShPtr< ModOpExpr > expr) override |
virtual void | visit (ShPtr< MulOpExpr > expr) override |
virtual void | visit (ShPtr< NegOpExpr > expr) override |
virtual void | visit (ShPtr< NeqOpExpr > expr) override |
virtual void | visit (ShPtr< NotOpExpr > expr) override |
virtual void | visit (ShPtr< OrOpExpr > expr) override |
virtual void | visit (ShPtr< StructIndexOpExpr > expr) override |
virtual void | visit (ShPtr< SubOpExpr > expr) override |
virtual void | visit (ShPtr< TernaryOpExpr > expr) override |
virtual void | visit (ShPtr< Variable > var) override |
virtual void | visit (ShPtr< BitCastExpr > expr) override |
virtual void | visit (ShPtr< ExtCastExpr > expr) override |
virtual void | visit (ShPtr< FPToIntCastExpr > expr) override |
virtual void | visit (ShPtr< IntToFPCastExpr > expr) override |
virtual void | visit (ShPtr< IntToPtrCastExpr > expr) override |
virtual void | visit (ShPtr< PtrToIntCastExpr > expr) override |
virtual void | visit (ShPtr< TruncCastExpr > expr) override |
virtual void | visit (ShPtr< ConstArray > constant) override |
virtual void | visit (ShPtr< ConstBool > constant) override |
virtual void | visit (ShPtr< ConstFloat > constant) override |
virtual void | visit (ShPtr< ConstInt > constant) override |
virtual void | visit (ShPtr< ConstNullPointer > constant) override |
virtual void | visit (ShPtr< ConstString > constant) override |
virtual void | visit (ShPtr< ConstStruct > constant) override |
virtual void | visit (ShPtr< ConstSymbol > constant) override |
virtual void | visit (ShPtr< ArrayType > type) override |
virtual void | visit (ShPtr< FloatType > type) override |
virtual void | visit (ShPtr< IntType > type) override |
virtual void | visit (ShPtr< PointerType > type) override |
virtual void | visit (ShPtr< StringType > type) override |
virtual void | visit (ShPtr< StructType > type) override |
virtual void | visit (ShPtr< FunctionType > type) override |
virtual void | visit (ShPtr< VoidType > type) override |
virtual void | visit (ShPtr< UnknownType > type) override |
Private Attributes | |
ShPtr< ValueAnalysis > | va |
Analysis of values. More... | |
ShPtr< WhileLoopStmt > | whileLoop |
While loop that is being optimized. More... | |
ShPtr< SplittedWhileTrueLoop > | splittedLoop |
Splitted loop that is being optimized. More... | |
bool | canBeOptimized |
Can the loop be optimized? More... | |
StmtSet | toRemoveStmts |
Statements to be removed when the optimization is successful. More... | |
Additional Inherited Members | |
![]() | |
template<class OptimizerType , typename... Args> | |
static ShPtr< Module > | optimize (ShPtr< Module > module, Args &&... args) |
Creates an instance of OptimizerType with the given arguments and optimizes the given module by it. More... | |
![]() | |
FuncOptimizer (ShPtr< Module > module) | |
Constructs a new function optimizer. More... | |
virtual void | runOnFunction (ShPtr< Function > func) |
Performs all optimizations on the given function. More... | |
template<typename T > | |
void | visitNestedAndSuccessorStatements (ShPtr< T > stmt) |
Visits the given statement, its nested statements, and successor statements (depending on the settings of the visitor). More... | |
![]() | |
virtual void | doInitialization () |
Performs pre-optimization matters. More... | |
virtual void | doFinalization () |
Performs post-optimization matters. More... | |
![]() | |
OrderedAllVisitor (bool visitSuccessors=true, bool visitNestedStmts=true) | |
Constructs a new visitor. More... | |
virtual void | visitStmt (ShPtr< Statement > stmt, bool visitSuccessors=true, bool visitNestedStmts=true) |
Visits the given statement, and possibly its successors or nested statements. More... | |
void | restart (bool visitSuccessors=true, bool visitNestedStmts=true) |
"Restarts" the visitor so it is in the state like it was when it was created. More... | |
bool | makeAccessedAndCheckIfAccessed (ShPtr< Type > type) |
Makes the given type accessed. More... | |
![]() | |
Visitor ()=default | |
![]() | |
ShPtr< Function > | currFunc |
Function that is currently being optimized. More... | |
![]() | |
ShPtr< Module > | module |
The module that is being optimized. More... | |
![]() | |
ShPtr< Statement > | lastStmt |
Statement that has been accessed as the last one. More... | |
StmtUSet | accessedStmts |
A set of all accessed statements. More... | |
TypeUSet | accessedTypes |
A set of all accessed types. More... | |
bool | visitSuccessors |
Should statements' successor be accessed? More... | |
bool | visitNestedStmts |
Should nested statements be accessed? More... | |
Optimizes while loops into universal for loops.
Instances of this class have reference object semantics.
This is a concrete optimizer which should not be subclassed.
retdec::llvmir2hll::WhileTrueToUForLoopOptimizer::WhileTrueToUForLoopOptimizer | ( | ShPtr< Module > | module, |
ShPtr< ValueAnalysis > | va | ||
) |
Constructs a new optimizer.
[in] | module | Module to be optimized. |
[in] | va | Analysis of values. |
|
overrideprivatevirtual |
Performs the optimization on all functions in the module.
This function calls runOnFunction() for each function in the module.
Only redefine if you want to prescribe the order in which functions are optimized; otherwise, just override runOnFunction().
Reimplemented from retdec::llvmir2hll::FuncOptimizer.
|
private |
Gathers information about the loop.
true
if the information was gathered successfully, false
otherwise.
|
inlineoverridevirtual |
Returns the ID of the optimizer.
Implements retdec::llvmir2hll::Optimizer.
|
private |
Returns the last empty statement in the given statements.
|
private |
Initialize a new replacement.
|
private |
Performs the replacement.
|
private |
Removes statements that are to be removed after a successful optimization.
|
private |
Removes useless successors (if any) of the given universal for loop.
|
private |
Tries to convert the "while true" loop into a universal for loop.
|
private |
Tries to replace the given while loop with a universal for loop.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
private |
Can the loop be optimized?
|
private |
Splitted loop that is being optimized.
|
private |
Statements to be removed when the optimization is successful.
|
private |
Analysis of values.
|
private |
While loop that is being optimized.