retdec
Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | List of all members
retdec::llvmir2hll::ThreeOperandsSubOptimizer Class Referencefinal

This optimizer changes expressions which have two operators and at least two operands are constants. More...

#include <three_operands_sub_optimizer.h>

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

Public Member Functions

 ThreeOperandsSubOptimizer (ShPtr< ArithmExprEvaluator > arithmExprEvaluator)
 Constructs the ThreeOperandsSubOptimizer. More...
 
virtual std::string getId () const override
 Returns the ID of the optimizer. More...
 
- Public Member Functions inherited from retdec::llvmir2hll::SubOptimizer
virtual bool tryOptimize (ShPtr< Expression > expr)
 Run optimization and try to optimize. 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< 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< 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< 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< ModOpExpr > expr) override
 
virtual void visit (ShPtr< MulOpExpr > expr) override
 
virtual void visit (ShPtr< NegOpExpr > expr) override
 
virtual void visit (ShPtr< NotOpExpr > expr) override
 
virtual void visit (ShPtr< StructIndexOpExpr > 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
 

Static Public Member Functions

static ShPtr< SubOptimizercreate (ShPtr< ArithmExprEvaluator > arithmExprEvaluator)
 Creates a new ThreeOperandsSubOptimizer. More...
 

Private Types

using ExprPair = std::pair< ShPtr< Expression >, ShPtr< Expression > >
 Pair of expressions. More...
 

Private Member Functions

bool analyzeOpOperOp (ShPtr< Expression > &constant, ShPtr< Expression > &expr, ShPtr< BinaryOpExpr > exprToAnalyze) const
 Find the Constant in exprToAnalyze. More...
 
ShPtr< ExpressiongetResult (ShPtr< Expression > expr) const
 Evaluate expr and return result. More...
 
void tryOptimizeBitXorOpWithRelationalOperator (ShPtr< BitXorOpExpr > expr)
 Try optimize BitXorOpExpr when one operand is relational operator and the second one is a ConstBool operand. More...
 
std::optional< ExprPairtryOptimizeExpressionWithRelationalOperator (ShPtr< BinaryOpExpr > expr)
 Try to optimize relational expr. More...
 
void tryOptimizeOrOpExprWithRelOperators (ShPtr< OrOpExpr >)
 Optimizes expression like. More...
 
Visitor Interface
virtual void visit (ShPtr< AddOpExpr > expr) override
 
virtual void visit (ShPtr< SubOpExpr > expr) override
 
virtual void visit (ShPtr< LtOpExpr > expr) override
 
virtual void visit (ShPtr< LtEqOpExpr > expr) override
 
virtual void visit (ShPtr< GtOpExpr > expr) override
 
virtual void visit (ShPtr< GtEqOpExpr > expr) override
 
virtual void visit (ShPtr< EqOpExpr > expr) override
 
virtual void visit (ShPtr< NeqOpExpr > expr) override
 
virtual void visit (ShPtr< BitXorOpExpr > expr) override
 
virtual void visit (ShPtr< OrOpExpr > expr) override
 

Additional Inherited Members

- Protected Member Functions inherited from retdec::llvmir2hll::SubOptimizer
 SubOptimizer (ShPtr< ArithmExprEvaluator > arithmExprEvaluator)
 Constructs the SubOptimizer. More...
 
bool isConstFloatOrConstInt (ShPtr< Expression > expr) const
 Check if expression is a ConstInt or ConstFloat. More...
 
void optimizeExpr (ShPtr< Expression > oldExpr, ShPtr< Expression > newExpr)
 Optimize expression from oldExpr to newExpr. More...
 
bool tryOptimizeAndReturnIfCodeChanged (ShPtr< Expression > expr)
 Start traversal in abstract syntax tree. 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::SubOptimizer
ShPtr< ArithmExprEvaluatorarithmExprEvaluator
 The used evaluator of arithmetical expressions. 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

This optimizer changes expressions which have two operators and at least two operands are constants.

Optimizations are now only on these operators: +, -, <, <=, >, >=, ==, !=, ^.

List of performed simplifications (by examples):

Operator +
ConstInt/ConstFloat + (ConstInt/ConstFloat +/- anytyhing).
return 2 + (2 - a);
can be optimized to
return 4 + a;
ConstInt/ConstFloat + (anytyhing +/- ConstInt/ConstFloat).
return 2 + (a + 2);
can be optimized to
return 4 + a;
(ConstInt/ConstFloat +/- anytyhing) + ConstInt/ConstFloat.
return (2 - a) + 4;
can be optimized to
return 6 - a;
(anytyhing +/- ConstInt/ConstFloat) + ConstInt/ConstFloat.
return (a + 2) + 2;
can be optimized to
return a + 4;
Operator -
ConstInt/ConstFloat - (ConstInt/ConstFloat +/- anytyhing).
return 2 - (1 - a);
can be optimized to
return 1 + a;
ConstInt/ConstFloat - (anytyhing +/- ConstInt/ConstFloat).
return 2 - (a + 1);
can be optimized to
return 1 - a;
(ConstInt/ConstFloat +/- anytyhing) - ConstInt/ConstFloat.
return (2 - a) - 1;
can be optimized to
return 1 - a;
(anytyhing +/- ConstInt/ConstFloat) - ConstInt/ConstFloat.
return (a + 2) - 1;
can be optimized to
return a + 1;
Operator <, <=, >, >=, ==, !=
(ConstInt/ConstFloat +/- anytyhing) <, <=, >, >=, ==, != ConstInt/ConstFloat.
return (2 - a) <, <=, >, >=, ==, != 3;
can be optimized to
return a(negOpExpr) <, <=, >, >=, ==, != 1;
(anytyhing +/- ConstInt/ConstFloat) <, <=, >, >=, ==, != ConstInt/ConstFloat.
return (a + 2) <, <=, >, >=, ==, != 3;
can be optimized to
return a <, <=, >, >=, ==, != 1;
Operator ^
(anything relational operator anytyhing) ^ True - vice versa.
return (2 < a) ^ True;
can be optimized to
return !(2 < a);
Operator ||
(var == ConstInt) || (var <= ConstInt).
return (a == 2) || (a <= 4);
can be optimized to
return (a <= 4);

Instances of this class have reference object semantics.

This is a concrete sub optimizer which should not be subclassed.

Member Typedef Documentation

◆ ExprPair

Pair of expressions.

Constructor & Destructor Documentation

◆ ThreeOperandsSubOptimizer()

retdec::llvmir2hll::ThreeOperandsSubOptimizer::ThreeOperandsSubOptimizer ( ShPtr< ArithmExprEvaluator arithmExprEvaluator)

Constructs the ThreeOperandsSubOptimizer.

Parameters
[in]arithmExprEvaluatorThe used evaluator of arithmetical expressions.

Member Function Documentation

◆ analyzeOpOperOp()

bool retdec::llvmir2hll::ThreeOperandsSubOptimizer::analyzeOpOperOp ( ShPtr< Expression > &  constant,
ShPtr< Expression > &  expr,
ShPtr< BinaryOpExpr exprToAnalyze 
) const
private

Find the Constant in exprToAnalyze.

Parameters
[in,out]constantFinded constant save to this parameter.
[in,out]exprSecond expresion from exprToAnalyze save to this parameter.
[in]exprToAnalyzeExpression to analyze.
Returns
If exprToAnalyze is the null pointer or Constant was not fined return false, otherwise return true.

◆ create()

ShPtr< SubOptimizer > retdec::llvmir2hll::ThreeOperandsSubOptimizer::create ( ShPtr< ArithmExprEvaluator arithmExprEvaluator)
static

Creates a new ThreeOperandsSubOptimizer.

Parameters
[in]arithmExprEvaluatorThe used evaluator of arithmetical expressions.

◆ getId()

std::string retdec::llvmir2hll::ThreeOperandsSubOptimizer::getId ( ) const
overridevirtual

Returns the ID of the optimizer.

Implements retdec::llvmir2hll::SubOptimizer.

◆ getResult()

ShPtr< Expression > retdec::llvmir2hll::ThreeOperandsSubOptimizer::getResult ( ShPtr< Expression expr) const
private

Evaluate expr and return result.

Parameters
[in]exprExpression to evaluate.
Returns
The result. If counting was not successful return the null pointer.

◆ tryOptimizeBitXorOpWithRelationalOperator()

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::tryOptimizeBitXorOpWithRelationalOperator ( ShPtr< BitXorOpExpr expr)
private

Try optimize BitXorOpExpr when one operand is relational operator and the second one is a ConstBool operand.

Parameters
[in]exprBitXorOpExpr to optimize.

◆ tryOptimizeExpressionWithRelationalOperator()

std::optional< ThreeOperandsSubOptimizer::ExprPair > retdec::llvmir2hll::ThreeOperandsSubOptimizer::tryOptimizeExpressionWithRelationalOperator ( ShPtr< BinaryOpExpr expr)
private

Try to optimize relational expr.

Parameters
[in]exprAn expression to optimize.
Returns
If expr can be optimized return the new first and the new second operand, otherwise the null pointer.
Preconditions

◆ tryOptimizeOrOpExprWithRelOperators()

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::tryOptimizeOrOpExprWithRelOperators ( ShPtr< OrOpExpr expr)
private

Optimizes expression like.

(var == ConstInt) || (var <= ConstInt)

to

var <= ConstInt

.

Parameters
[in]exprExpression to optimize.

◆ visit() [1/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< AddOpExpr expr)
overrideprivatevirtual

◆ visit() [2/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< BitXorOpExpr expr)
overrideprivatevirtual

◆ visit() [3/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< EqOpExpr expr)
overrideprivatevirtual

◆ visit() [4/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< GtEqOpExpr expr)
overrideprivatevirtual

◆ visit() [5/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< GtOpExpr expr)
overrideprivatevirtual

◆ visit() [6/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< LtEqOpExpr expr)
overrideprivatevirtual

◆ visit() [7/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< LtOpExpr expr)
overrideprivatevirtual

◆ visit() [8/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< NeqOpExpr expr)
overrideprivatevirtual

◆ visit() [9/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< OrOpExpr expr)
overrideprivatevirtual

◆ visit() [10/10]

void retdec::llvmir2hll::ThreeOperandsSubOptimizer::visit ( ShPtr< SubOpExpr expr)
overrideprivatevirtual

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