retdec
Public Member Functions | Private Attributes | List of all members
retdec::llvmir2hll::CCastOptimizer Class Referencefinal

Removes casts that are in the C language implicit. More...

#include <c_cast_optimizer.h>

Inheritance diagram for retdec::llvmir2hll::CCastOptimizer:
Inheritance graph
[legend]
Collaboration diagram for retdec::llvmir2hll::CCastOptimizer:
Collaboration graph
[legend]

Public Member Functions

 CCastOptimizer (ShPtr< Module > module)
 Constructs a new optimizer. More...
 
ShPtr< ExpressioncheckAndOptimize (ShPtr< Expression > dst, ShPtr< Expression > src)
 Removes cast expression of source expression, if destination expression doesn't need this cast. More...
 
virtual std::string getId () const override
 Returns the ID of the optimizer. More...
 
Visitor Interface
virtual void visit (ShPtr< CallExpr > expr) override
 
virtual void visit (ShPtr< AssignStmt > stmt) override
 
virtual void visit (ShPtr< VarDefStmt > stmt) override
 
virtual void visit (ShPtr< ReturnStmt > 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
 
- Public Member Functions inherited from retdec::llvmir2hll::Optimizer
 Optimizer (ShPtr< Module > module)
 Constructs a new optimizer. More...
 
ShPtr< Moduleoptimize ()
 Performs all the optimizations of the specific optimizer. More...
 
- Public Member Functions inherited from retdec::llvmir2hll::OrderedAllVisitor
virtual void visit (ShPtr< GlobalVarDef > varDef) override
 
virtual void visit (ShPtr< Function > func) 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< SwitchStmt > stmt) override
 
virtual void visit (ShPtr< UnreachableStmt > 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< 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
 
- Public Member Functions inherited from retdec::llvmir2hll::Visitor
virtual ~Visitor ()=default
 

Private Attributes

bool optimized
 true if a part of code has been optimized, false otherwise. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from retdec::llvmir2hll::Optimizer
template<class OptimizerType , typename... Args>
static ShPtr< Moduleoptimize (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 inherited from retdec::llvmir2hll::FuncOptimizer
 FuncOptimizer (ShPtr< Module > module)
 Constructs a new function optimizer. More...
 
virtual void doOptimization () override
 Performs the optimization on all functions in the module. 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...
 
- Protected Member Functions inherited from retdec::llvmir2hll::Optimizer
virtual void doInitialization ()
 Performs pre-optimization matters. More...
 
virtual void doFinalization ()
 Performs post-optimization matters. More...
 
- Protected Member Functions inherited from retdec::llvmir2hll::OrderedAllVisitor
 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...
 
- Protected Member Functions inherited from retdec::llvmir2hll::Visitor
 Visitor ()=default
 
- Protected Attributes inherited from retdec::llvmir2hll::FuncOptimizer
ShPtr< FunctioncurrFunc
 Function that is currently being optimized. More...
 
- Protected Attributes inherited from retdec::llvmir2hll::Optimizer
ShPtr< Modulemodule
 The module that is being optimized. More...
 
- Protected Attributes inherited from retdec::llvmir2hll::OrderedAllVisitor
ShPtr< StatementlastStmt
 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...
 

Detailed Description

Removes casts that are in the C language implicit.

The following conversions in the C language are automatic, so we can remove them.

  1. From integer to integer:
    int16_t a = 42;
    int32_t b = (int32_t)a;
    int32_t c = (int16_t)a;
    is replaced with
    int16_t a = 42;
    int32_t b = a;
    int32_t c = a;
  2. From float to integer:
    float32_t a = 23.452;
    int32_t b = (int32_t)a;
    is replaced with
    float32_t a = 23.452;
    int32_t b = a;
  3. From integer to float:
    int32_t a = 42;
    float32_t b = (float32_t)a;
    is replaced with
    int32_t a = 42;
    float32_t b = a;
  4. From float to float:
    float16_t a = 23.452;
    float32_t b = (float32_t)a;
    is replaced with
    float16_t a = 23.452;
    float32_t b = a;

These optimizations are used in the following expressions and statements:

- Assignments: float32_t b; b = (float32_t)a;
- Variable definitions: float32_t b = (float32_t)a;
- Call expressions and statements: func((float32_t)a);
- Return statements: int32_t random() { return (int32_t)4; }
- Binary expressions: (int32_t)a + (int16_t)b

Instances of this class have reference object semantics.

This is a concrete optimizer which should not be subclassed.

Constructor & Destructor Documentation

◆ CCastOptimizer()

retdec::llvmir2hll::CCastOptimizer::CCastOptimizer ( ShPtr< Module module)

Constructs a new optimizer.

Parameters
[in]moduleModule to be optimized.
Preconditions
  • module is non-null

Member Function Documentation

◆ checkAndOptimize()

ShPtr< Expression > retdec::llvmir2hll::CCastOptimizer::checkAndOptimize ( ShPtr< Expression dst,
ShPtr< Expression src 
)

Removes cast expression of source expression, if destination expression doesn't need this cast.

Parameters
[in]dstDestination expression.
[in]srcSource expression.
Note
For the optimization of the casts we need to check the destination type of the expression dst, type of the cast src and type of the casted operand.

◆ getId()

virtual std::string retdec::llvmir2hll::CCastOptimizer::getId ( ) const
inlineoverridevirtual

Returns the ID of the optimizer.

Implements retdec::llvmir2hll::Optimizer.

◆ visit() [1/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [2/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [3/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [4/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [5/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [6/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [7/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [8/73]

void retdec::llvmir2hll::CCastOptimizer::visit ( ShPtr< AssignStmt stmt)
overridevirtual

◆ visit() [9/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [10/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [11/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [12/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [13/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [14/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [15/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [16/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [17/73]

void retdec::llvmir2hll::CCastOptimizer::visit ( ShPtr< CallExpr expr)
overridevirtual

◆ visit() [18/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [19/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [20/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [21/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [22/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [23/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [24/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [25/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [26/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [27/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [28/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [29/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [30/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [31/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [32/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [33/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [34/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [35/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [36/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [37/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [38/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [39/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [40/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [41/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [42/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [43/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [44/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [45/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [46/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [47/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [48/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [49/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [50/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [51/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [52/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [53/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [54/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [55/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [56/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [57/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [58/73]

void retdec::llvmir2hll::CCastOptimizer::visit ( ShPtr< ReturnStmt stmt)
overridevirtual

◆ visit() [59/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [60/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [61/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [62/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [63/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [64/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [65/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [66/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [67/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [68/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [69/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [70/73]

void retdec::llvmir2hll::CCastOptimizer::visit ( ShPtr< VarDefStmt stmt)
overridevirtual

◆ visit() [71/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [72/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

◆ visit() [73/73]

void retdec::llvmir2hll::OrderedAllVisitor::visit
override

Member Data Documentation

◆ optimized

bool retdec::llvmir2hll::CCastOptimizer::optimized
private

true if a part of code has been optimized, false otherwise.


The documentation for this class was generated from the following files: