retdec
compound_op_manager.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_HLL_COMPOUND_OP_MANAGER_H
8 #define RETDEC_LLVMIR2HLL_HLL_COMPOUND_OP_MANAGER_H
9 
10 #include <string>
11 
16 
17 namespace retdec {
18 namespace llvmir2hll {
19 
20 class BinaryOpExpr;
21 
34 public:
38  class CompoundOp {
39  public:
40  CompoundOp(std::string op);
41  CompoundOp(std::string op, ShPtr<Expression> operand);
42 
43  const std::string &getOperator() const;
45  bool isUnaryOperator() const;
46  bool isBinaryOperator() const;
47 
48  private:
50  std::string op;
51 
54  };
55 
56 public:
58 
62  virtual std::string getId() const = 0;
63 
67  ShPtr<Expression> rhs);
68 
69 protected:
70  void createResultingUnaryCompoundOp(const std::string &op);
71  void createResultingBinaryCompoundOp(const std::string &op,
72  ShPtr<Expression> operand);
73 
74 private:
78  virtual void visit(ShPtr<AddOpExpr> expr) override;
79  virtual void visit(ShPtr<SubOpExpr> expr) override;
80  virtual void visit(ShPtr<MulOpExpr> expr) override;
81  virtual void visit(ShPtr<ModOpExpr> expr) override;
82  virtual void visit(ShPtr<DivOpExpr> expr) override;
83  virtual void visit(ShPtr<BitAndOpExpr> expr) override;
84  virtual void visit(ShPtr<BitOrOpExpr> expr) override;
85  virtual void visit(ShPtr<BitXorOpExpr> expr) override;
86  virtual void visit(ShPtr<BitShlOpExpr> expr) override;
87  virtual void visit(ShPtr<BitShrOpExpr> expr) override;
89 
92  virtual void optimizeToCompoundOp(ShPtr<AddOpExpr> expr,
93  ShPtr<Expression> operand);
94  virtual void optimizeToCompoundOp(ShPtr<SubOpExpr> expr,
95  ShPtr<Expression> operand);
96  virtual void optimizeToCompoundOp(ShPtr<MulOpExpr> expr,
97  ShPtr<Expression> operand);
98  virtual void optimizeToCompoundOp(ShPtr<ModOpExpr> expr,
99  ShPtr<Expression> operand);
100  virtual void optimizeToCompoundOp(ShPtr<DivOpExpr> expr,
101  ShPtr<Expression> operand);
102  virtual void optimizeToCompoundOp(ShPtr<BitAndOpExpr> expr,
103  ShPtr<Expression> operand);
104  virtual void optimizeToCompoundOp(ShPtr<BitOrOpExpr> expr,
105  ShPtr<Expression> operand);
106  virtual void optimizeToCompoundOp(ShPtr<BitXorOpExpr> expr,
107  ShPtr<Expression> operand);
108  virtual void optimizeToCompoundOp(ShPtr<BitShlOpExpr> expr,
109  ShPtr<Expression> operand);
110  virtual void optimizeToCompoundOp(ShPtr<BitShrOpExpr> expr,
111  ShPtr<Expression> operand);
113 
114  template<typename ToOptimizeExpr>
116  expr);
117  template<typename ToOptimizeExpr>
119  expr);
120 
122  BinaryOpExpr> expr);
123 
124 private:
127 
130 };
131 
132 } // namespace llvmir2hll
133 } // namespace retdec
134 
135 #endif
A base class for all binary operators.
Definition: binary_op_expr.h:21
Stores the resulting compound operator.
Definition: compound_op_manager.h:38
CompoundOp(std::string op)
A constructor of a unary compound operator.
Definition: compound_op_manager.cpp:51
const std::string & getOperator() const
Returns the operator.
Definition: compound_op_manager.cpp:73
ShPtr< Expression > operand
The right-hand side operand of a binary operator.
Definition: compound_op_manager.h:53
bool isBinaryOperator() const
Returns true if the operator is binary, false otherwise.
Definition: compound_op_manager.cpp:106
std::string op
The resulting operator.
Definition: compound_op_manager.h:50
bool isUnaryOperator() const
Returns true if the operator is unary, false otherwise.
Definition: compound_op_manager.cpp:95
ShPtr< Expression > getOperand() const
Returns the operand of a binary operator.
Definition: compound_op_manager.cpp:83
A base class for compound operator managers.
Definition: compound_op_manager.h:33
void createResultingUnaryCompoundOp(const std::string &op)
Creates the resulting unary compound operator and saves it into compoundOp.
Definition: compound_op_manager.cpp:287
CompoundOp tryOptimizeToCompoundOp(ShPtr< AssignStmt > stmt)
Tries to optimize stmt to a compound operator.
Definition: compound_op_manager.cpp:124
CompoundOpManager()
Constructs a new base class for compound operator managers.
Definition: compound_op_manager.cpp:113
void createResultingBinaryCompoundOp(const std::string &op, ShPtr< Expression > operand)
Creates the resulting binary compound operator and saves it into compoundOp.
Definition: compound_op_manager.cpp:298
ShPtr< Expression > getNextOpIfSecondOneIsEqWithLhsOfAssign(ShPtr< BinaryOpExpr > expr)
Checks if one of the operands is equal with the saved left-hand side of AssignStmt.
Definition: compound_op_manager.cpp:312
virtual std::string getId() const =0
Returns the ID of the manager.
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
CompoundOp compoundOp
Resulting operator.
Definition: compound_op_manager.h:129
virtual void optimizeToCompoundOp(ShPtr< AddOpExpr > expr, ShPtr< Expression > operand)
Sets the resulting operator to the default one which is the same like nothing is to be optimized.
Definition: compound_op_manager.cpp:222
void tryOptimizeWhenLeftOperandEqWithLhsOfAssignStmt(ShPtr< ToOptimizeExpr > expr)
Tries to optimize expr to compound operator when left operand is equal with left-hand side of AssignS...
Definition: compound_op_manager.cpp:345
ShPtr< Expression > lhsOfAssignStmt
Saved left-hand side of an assign statement.
Definition: compound_op_manager.h:126
void tryOptimizeWhenOneOfOperandsEqWithLhsOfAssignStmt(ShPtr< ToOptimizeExpr > expr)
Tries to optimize expr to compound operator when one of operands is equal with left-hand side of Assi...
Definition: compound_op_manager.cpp:330
A visitor that visits everything in an ordered way.
Definition: ordered_all_visitor.h:44
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
A mixin to make classes non-copyable.
Definition: non_copyable.h:27
A library providing API for working with back-end IR.
std::shared_ptr< T > ShPtr
An alias for a shared pointer.
Definition: smart_ptr.h:18
Definition: archive_wrapper.h:19
A mixin to make classes non-copyable.
A visitor that visits everything in an ordered way.
Declarations, aliases, macros, etc. for the use of smart pointers.
Aliases for several useful types.