77 std::map<const IR::Declaration_Constant *, const IR::Expression *>
constants;
80 bool assignmentTarget;
83 const IR::Expression *
getConstant(
const IR::Expression *expr)
const;
86 const IR::Constant *
cast(
const IR::Constant *node,
unsigned base,
87 const IR::Type_Bits *type)
const;
90 const IR::Node *
binary(
const IR::Operation_Binary *op,
91 std::function<big_int(big_int, big_int)> func,
bool saturating =
false);
94 const IR::Node *
compare(
const IR::Operation_Binary *op);
97 const IR::Node *
shift(
const IR::Operation_Binary *op);
111 Result setContains(
const IR::Expression *keySet,
const IR::Expression *constant)
const;
118 this->policy = policy;
120 this->policy =
new ConstantFoldingPolicy();
123 setName(
"DoConstantFolding");
124 assignmentTarget =
false;
127 const IR::Node *postorder(IR::Declaration_Constant *d)
override;
128 const IR::Node *postorder(IR::PathExpression *e)
override;
129 const IR::Node *postorder(IR::Cmpl *e)
override;
130 const IR::Node *postorder(IR::Neg *e)
override;
131 const IR::Node *postorder(IR::UPlus *e)
override;
132 const IR::Node *postorder(IR::LNot *e)
override;
133 const IR::Node *postorder(IR::LAnd *e)
override;
134 const IR::Node *postorder(IR::LOr *e)
override;
135 const IR::Node *postorder(IR::Slice *e)
override;
136 const IR::Node *postorder(IR::Add *e)
override;
137 const IR::Node *postorder(IR::AddSat *e)
override;
138 const IR::Node *postorder(IR::Sub *e)
override;
139 const IR::Node *postorder(IR::SubSat *e)
override;
140 const IR::Node *postorder(IR::Mul *e)
override;
141 const IR::Node *postorder(IR::Div *e)
override;
142 const IR::Node *postorder(IR::Mod *e)
override;
143 const IR::Node *postorder(IR::BXor *e)
override;
144 const IR::Node *postorder(IR::BAnd *e)
override;
145 const IR::Node *postorder(IR::BOr *e)
override;
146 const IR::Node *postorder(IR::Equ *e)
override;
147 const IR::Node *postorder(IR::Neq *e)
override;
148 const IR::Node *postorder(IR::Lss *e)
override;
149 const IR::Node *postorder(IR::Grt *e)
override;
150 const IR::Node *postorder(IR::Leq *e)
override;
151 const IR::Node *postorder(IR::Geq *e)
override;
152 const IR::Node *postorder(IR::Shl *e)
override;
153 const IR::Node *postorder(IR::Shr *e)
override;
154 const IR::Node *postorder(IR::Concat *e)
override;
155 const IR::Node *postorder(IR::Member *e)
override;
156 const IR::Node *postorder(IR::Cast *e)
override;
157 const IR::Node *postorder(IR::Mux *e)
override;
158 const IR::Node *postorder(IR::Type_Bits *type)
override;
159 const IR::Node *postorder(IR::Type_Varbits *type)
override;
160 const IR::Node *postorder(IR::SelectExpression *e)
override;
161 const IR::Node *postorder(IR::IfStatement *statement)
override;
162 const IR::Node *preorder(IR::AssignmentStatement *statement)
override;
163 const IR::Node *preorder(IR::ArrayIndex *e)
override;
164 const IR::BlockStatement *preorder(IR::BlockStatement *bs)
override {
165 if (bs->annotations->getSingle(
"disable_optimization")) prune();
std::map< const IR::Declaration_Constant *, const IR::Expression * > constants
Maps declaration constants to constant expressions.
Definition constantFolding.h:77
const IR::Node * binary(const IR::Operation_Binary *op, std::function< big_int(big_int, big_int)> func, bool saturating=false)
Statically evaluate binary operation e implemented by func.
Definition constantFolding.cpp:445
const IR::Constant * cast(const IR::Constant *node, unsigned base, const IR::Type_Bits *type) const
Statically cast constant node to type represented in the specified base.
Definition constantFolding.cpp:301