retdec
|
A base class of all optimizers. More...
#include <optimizer.h>
Public Member Functions | |
Optimizer (ShPtr< Module > module) | |
Constructs a new optimizer. More... | |
virtual std::string | getId () const =0 |
Returns the ID of the 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< 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 |
![]() | |
virtual | ~Visitor ()=default |
Static Public Member Functions | |
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... | |
Protected Member Functions | |
virtual void | doInitialization () |
Performs pre-optimization matters. More... | |
virtual void | doOptimization () |
Performs the optimization. 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 | |
Protected Attributes | |
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... | |
Additional Inherited Members | |
![]() | |
NonCopyable (const NonCopyable &)=delete | |
NonCopyable & | operator= (const NonCopyable &)=delete |
NonCopyable ()=default | |
~NonCopyable ()=default | |
A base class of all optimizers.
Concrete optimizers should:
using OrderedAllVisitor::visit;
declaration; otherwise, they'll be hidden by the overridden ones)accessedStmts
set to avoid looping over the same statements. Also, when a statement is accessed, it should check this set before accessing any of its "nested statements". For example, an if statement should check whether its body has already been accessed or not. visitStmt() takes care of that, so you can use it to visit statements (blocks).To use it (or any more concrete optimizer), either instantiate it and call optimize() in it, or use any of the templated optimize() static functions as a shorthand.
Instances of this class have reference object semantics.
Constructs a new optimizer.
[in] | module | Module to be optimized. |
|
protectedvirtual |
Performs post-optimization matters.
This function is called after all optimizations are done.
By default, this function does nothing.
|
protectedvirtual |
Performs pre-optimization matters.
This function is called before any optimizations are done.
By default, this function does nothing.
|
protectedvirtual |
Performs the optimization.
This function is called after doInitialization()
and before doFinalization()
, and should perform all the optimizations of the specific optimizer.
By default, this function does nothing.
Reimplemented in retdec::llvmir2hll::WhileTrueToUForLoopOptimizer, retdec::llvmir2hll::WhileTrueToForLoopOptimizer, retdec::llvmir2hll::VarDefStmtOptimizer, retdec::llvmir2hll::UnusedGlobalVarOptimizer, retdec::llvmir2hll::SimplifyArithmExprOptimizer, retdec::llvmir2hll::SimpleCopyPropagationOptimizer, retdec::llvmir2hll::PreWhileTrueLoopConvOptimizer, retdec::llvmir2hll::LLVMIntrinsicsOptimizer, retdec::llvmir2hll::IfBeforeLoopOptimizer, retdec::llvmir2hll::EmptyArrayToStringOptimizer, retdec::llvmir2hll::DerefToArrayIndexOptimizer, retdec::llvmir2hll::DeadLocalAssignOptimizer, retdec::llvmir2hll::CopyPropagationOptimizer, retdec::llvmir2hll::BitShiftOptimizer, retdec::llvmir2hll::AggressiveGlobalToLocalOptimizer, and retdec::llvmir2hll::FuncOptimizer.
|
pure virtual |
Returns the ID of the optimizer.
Implemented in retdec::llvmir2hll::WhileTrueToWhileCondOptimizer, retdec::llvmir2hll::WhileTrueToUForLoopOptimizer, retdec::llvmir2hll::WhileTrueToForLoopOptimizer, retdec::llvmir2hll::VoidReturnOptimizer, retdec::llvmir2hll::VarDefStmtOptimizer, retdec::llvmir2hll::VarDefForLoopOptimizer, retdec::llvmir2hll::UnusedGlobalVarOptimizer, retdec::llvmir2hll::SimplifyArithmExprOptimizer, retdec::llvmir2hll::SimpleCopyPropagationOptimizer, retdec::llvmir2hll::SelfAssignOptimizer, retdec::llvmir2hll::RemoveUselessCastsOptimizer, retdec::llvmir2hll::RemoveAllCastsOptimizer, retdec::llvmir2hll::PreWhileTrueLoopConvOptimizer, retdec::llvmir2hll::NoInitVarDefOptimizer, retdec::llvmir2hll::LoopLastContinueOptimizer, retdec::llvmir2hll::LLVMIntrinsicsOptimizer, retdec::llvmir2hll::IfToSwitchOptimizer, retdec::llvmir2hll::IfStructureOptimizer, retdec::llvmir2hll::IfBeforeLoopOptimizer, retdec::llvmir2hll::GotoStmtOptimizer, retdec::llvmir2hll::EmptyStmtOptimizer, retdec::llvmir2hll::EmptyArrayToStringOptimizer, retdec::llvmir2hll::DerefToArrayIndexOptimizer, retdec::llvmir2hll::DerefAddressOptimizer, retdec::llvmir2hll::DeadLocalAssignOptimizer, retdec::llvmir2hll::DeadCodeOptimizer, retdec::llvmir2hll::CopyPropagationOptimizer, retdec::llvmir2hll::CCastOptimizer, retdec::llvmir2hll::CArrayArgOptimizer, retdec::llvmir2hll::BreakContinueReturnOptimizer, retdec::llvmir2hll::BitShiftOptimizer, retdec::llvmir2hll::BitOpToLogOpOptimizer, retdec::llvmir2hll::AggressiveGlobalToLocalOptimizer, and retdec::llvmir2hll::AggressiveDerefOptimizer.
Performs all the optimizations of the specific optimizer.
This function calls the following functions (in the specified order), so subclass any of them to implement the desired behavior.
(1) doInitialization() (2) doOptimization() (3) doFinalization()