17#ifndef P4_STRENGTHREDUCTION_H_
18#define P4_STRENGTHREDUCTION_H_
20#include "frontends/common/resolveReferences/referenceMap.h"
21#include "frontends/p4/sideEffects.h"
22#include "frontends/p4/typeChecking/typeChecker.h"
23#include "frontends/p4/typeMap.h"
47 bool isOne(
const IR::Expression *expr)
const;
49 bool isZero(
const IR::Expression *expr)
const;
51 bool isTrue(
const IR::Expression *expr)
const;
53 bool isFalse(
const IR::Expression *expr)
const;
55 bool isAllOnes(
const IR::Expression *expr)
const;
58 int isPowerOf2(
const IR::Expression *expr)
const;
70 setName(
"StrengthReduction");
73 using Transform::postorder;
75 const IR::Node *
postorder(IR::Cmpl *expr)
override;
76 const IR::Node *
postorder(IR::BAnd *expr)
override;
77 const IR::Node *
postorder(IR::BOr *expr)
override;
78 const IR::Node *
postorder(IR::Equ *expr)
override;
79 const IR::Node *
postorder(IR::Neq *expr)
override;
80 const IR::Node *
postorder(IR::BXor *expr)
override;
81 const IR::Node *
postorder(IR::LAnd *expr)
override;
82 const IR::Node *
postorder(IR::LOr *expr)
override;
83 const IR::Node *
postorder(IR::LNot *expr)
override;
84 const IR::Node *
postorder(IR::Sub *expr)
override;
85 const IR::Node *
postorder(IR::Add *expr)
override;
86 const IR::Node *
postorder(IR::UPlus *expr)
override;
87 const IR::Node *
postorder(IR::Shl *expr)
override;
88 const IR::Node *
postorder(IR::Shr *expr)
override;
89 const IR::Node *
postorder(IR::Mul *expr)
override;
90 const IR::Node *
postorder(IR::Div *expr)
override;
91 const IR::Node *
postorder(IR::Mod *expr)
override;
92 const IR::Node *
postorder(IR::Mux *expr)
override;
93 const IR::Node *
postorder(IR::Slice *expr)
override;
94 const IR::Node *
postorder(IR::Mask *expr)
override;
95 const IR::Node *
postorder(IR::Range *expr)
override;
96 const IR::Node *
postorder(IR::Concat *expr)
override;
97 const IR::Node *
postorder(IR::ArrayIndex *expr)
override;
99 const IR::BlockStatement *preorder(IR::BlockStatement *bs)
override {
100 if (bs->annotations->getSingle(
"disable_optimization")) prune();
109 if (typeMap !=
nullptr) {
110 if (!typeChecking) typeChecking =
new TypeChecking(refMap, typeMap,
true);
111 passes.push_back(typeChecking);
Definition strengthReduction.h:45
const IR::Node * postorder(IR::Cmpl *expr) override
Definition strengthReduction.cpp:71
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
static bool check(const IR::Expression *expression, const Visitor *calledBy, ReferenceMap *refMap, TypeMap *typeMap)
Definition sideEffects.h:108
Definition strengthReduction.h:105
Definition typeChecker.h:60
Definition has_side_effects.h:26
Definition applyOptionsPragmas.cpp:24