17#ifndef COMMON_CONSTANTFOLDING_H_ 
   18#define COMMON_CONSTANTFOLDING_H_ 
   20#include "frontends/common/resolveReferences/referenceMap.h" 
   21#include "frontends/common/resolveReferences/resolveReferences.h" 
   22#include "frontends/p4/typeChecking/typeChecker.h" 
   27using namespace literals;
 
   80    std::map<const IR::Declaration_Constant *, const IR::Expression *> 
constants;
 
   83    bool assignmentTarget;
 
   86    const IR::Expression *
getConstant(
const IR::Expression *expr) 
const;
 
   89    const IR::Constant *
cast(
const IR::Constant *node, 
unsigned base,
 
   90                             const IR::Type_Bits *type) 
const;
 
   94                           std::function<big_int(big_int, big_int)> func, 
bool saturating = 
false);
 
  114    Result setContains(
const IR::Expression *keySet, 
const IR::Expression *constant) 
const;
 
  121            this->policy = policy;
 
  123            this->policy = 
new ConstantFoldingPolicy();
 
  126        setName(
"DoConstantFolding");
 
  127        assignmentTarget = 
false;
 
  131    explicit DoConstantFolding(
const TypeMap *
typeMap, 
bool warnings = 
true,
 
  132                               ConstantFoldingPolicy *policy = 
nullptr)
 
  135    const IR::Node *postorder(IR::Declaration_Constant *d) 
override;
 
  136    const IR::Node *postorder(IR::PathExpression *e) 
override;
 
  137    const IR::Node *postorder(IR::Cmpl *e) 
override;
 
  138    const IR::Node *postorder(IR::Neg *e) 
override;
 
  139    const IR::Node *postorder(IR::UPlus *e) 
override;
 
  140    const IR::Node *postorder(IR::LNot *e) 
override;
 
  141    const IR::Node *postorder(IR::LAnd *e) 
override;
 
  142    const IR::Node *postorder(IR::LOr *e) 
override;
 
  143    const IR::Node *postorder(IR::Slice *e) 
override;
 
  144    const IR::Node *postorder(IR::Add *e) 
override;
 
  145    const IR::Node *postorder(IR::AddSat *e) 
override;
 
  146    const IR::Node *postorder(IR::Sub *e) 
override;
 
  147    const IR::Node *postorder(IR::SubSat *e) 
override;
 
  148    const IR::Node *postorder(IR::Mul *e) 
override;
 
  149    const IR::Node *postorder(IR::Div *e) 
override;
 
  150    const IR::Node *postorder(IR::Mod *e) 
override;
 
  151    const IR::Node *postorder(IR::BXor *e) 
override;
 
  152    const IR::Node *postorder(IR::BAnd *e) 
override;
 
  153    const IR::Node *postorder(IR::BOr *e) 
override;
 
  154    const IR::Node *postorder(IR::Equ *e) 
override;
 
  155    const IR::Node *postorder(IR::Neq *e) 
override;
 
  156    const IR::Node *postorder(IR::Lss *e) 
override;
 
  157    const IR::Node *postorder(IR::Grt *e) 
override;
 
  158    const IR::Node *postorder(IR::Leq *e) 
override;
 
  159    const IR::Node *postorder(IR::Geq *e) 
override;
 
  160    const IR::Node *postorder(IR::Shl *e) 
override;
 
  161    const IR::Node *postorder(IR::Shr *e) 
override;
 
  162    const IR::Node *postorder(IR::Concat *e) 
override;
 
  163    const IR::Node *postorder(IR::Member *e) 
override;
 
  164    const IR::Node *postorder(IR::Cast *e) 
override;
 
  165    const IR::Node *postorder(IR::Mux *e) 
override;
 
  166    const IR::Node *postorder(IR::Type_Bits *type) 
override;
 
  167    const IR::Node *postorder(IR::Type_Varbits *type) 
override;
 
  168    const IR::Node *postorder(IR::SelectExpression *e) 
override;
 
  169    const IR::Node *postorder(IR::IfStatement *statement) 
override;
 
  170    const IR::Node *preorder(IR::AssignmentStatement *statement) 
override;
 
  171    const IR::Node *preorder(IR::ArrayIndex *e) 
override;
 
  172    const IR::Node *preorder(IR::SwitchCase *c) 
override;
 
  173    const IR::BlockStatement *preorder(IR::BlockStatement *bs)
 override {
 
  174        if (bs->annotations->getSingle(
"disable_optimization"_cs)) prune();
 
 
  190        if (typeMap != 
nullptr) {
 
  191            if (!typeChecking) typeChecking = 
new TypeChecking(refMap, typeMap);
 
  192            passes.push_back(typeChecking);
 
  195        if (typeMap != 
nullptr) passes.push_back(
new ClearTypeMap(typeMap));
 
  196        setName(
"ConstantFolding");
 
  208        if (typeMap != 
nullptr) {
 
  209            if (!typeChecking) typeChecking = 
new TypeChecking(
nullptr, typeMap);
 
  210            passes.push_back(typeChecking);
 
  213        if (typeMap != 
nullptr) passes.push_back(
new ClearTypeMap(typeMap));
 
  214        setName(
"ConstantFolding");
 
 
Definition typeChecker.h:32
 
Definition constantFolding.h:183
 
Definition constantFolding.h:35
 
virtual const IR::Node * hook(Visitor &, IR::PathExpression *)
The default hook does not modify anything.
Definition constantFolding.h:38
 
Definition referenceMap.h:57
 
statically evaluates many constant expressions.
Definition constantFolding.h:61
 
Result
Result type for setContains.
Definition constantFolding.h:103
 
const DeclarationLookup * refMap
Definition constantFolding.h:67
 
const IR::Node * shift(const IR::Operation_Binary *op)
Statically evaluate shift operation e.
Definition constantFolding.cpp:764
 
std::map< const IR::Declaration_Constant *, const IR::Expression * > constants
Maps declaration constants to constant expressions.
Definition constantFolding.h:80
 
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:483
 
const TypeMap * typeMap
Definition constantFolding.h:71
 
bool warnings
If true then emit warnings.
Definition constantFolding.h:77
 
Result setContains(const IR::Expression *keySet, const IR::Expression *constant) const
Definition constantFolding.cpp:892
 
bool typesKnown
Set to true iff typeMap is not nullptr.
Definition constantFolding.h:74
 
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:339
 
const IR::Expression * getConstant(const IR::Expression *expr) const
Definition constantFolding.cpp:54
 
const IR::Node * compare(const IR::Operation_Binary *op)
Definition constantFolding.cpp:428
 
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
 
Visitor mixin for looking up names in enclosing scopes from the Visitor::Context.
Definition resolveReferences.h:32
 
Definition typeChecker.h:55
 
Definition pass_manager.h:38
 
Definition applyOptionsPragmas.cpp:24