P4C
The P4 Compiler
Loading...
Searching...
No Matches
strengthReduction.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef FRONTENDS_P4_STRENGTHREDUCTION_H_
9#define FRONTENDS_P4_STRENGTHREDUCTION_H_
10
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/p4/sideEffects.h"
13#include "frontends/p4/typeChecking/typeChecker.h"
14#include "frontends/p4/typeMap.h"
15#include "ir/ir.h"
16
17namespace P4 {
18
19using namespace literals;
20
43
61class DoStrengthReduction final : public Transform, P4WriteContext {
62 protected:
63 TypeMap *typeMap = nullptr;
65
67 bool isOne(const IR::Expression *expr) const;
69 bool isZero(const IR::Expression *expr) const;
71 bool isTrue(const IR::Expression *expr) const;
73 bool isFalse(const IR::Expression *expr) const;
75 bool isAllOnes(const IR::Expression *expr) const;
78 int isPowerOf2(const IR::Expression *expr) const;
79
83 bool hasSideEffects(const IR::Expression *expr) const {
84 return SideEffects::check(expr, this, nullptr, nullptr);
85 }
86
87 public:
89 : typeMap(typeMap), policy(policy ? policy : new StrengthReductionPolicy()) {
90 visitDagOnce = true;
91 setName("StrengthReduction");
92 }
93
94 DoStrengthReduction() : DoStrengthReduction(nullptr, nullptr) {}
95
96 using Transform::postorder;
97
98 const IR::Node *postorder(IR::Cmpl *expr) override;
99 const IR::Node *postorder(IR::BAnd *expr) override;
100 const IR::Node *postorder(IR::BOr *expr) override;
101 const IR::Node *postorder(IR::Equ *expr) override;
102 const IR::Node *postorder(IR::Neq *expr) override;
103 const IR::Node *relation(IR::Operation_Relation *expr, bool grt, bool eq);
104 const IR::Node *postorder(IR::Geq *expr) override { return relation(expr, true, true); }
105 const IR::Node *postorder(IR::Grt *expr) override { return relation(expr, true, false); }
106 const IR::Node *postorder(IR::Leq *expr) override { return relation(expr, false, true); }
107 const IR::Node *postorder(IR::Lss *expr) override { return relation(expr, false, false); }
108 const IR::Node *postorder(IR::BXor *expr) override;
109 const IR::Node *postorder(IR::LAnd *expr) override;
110 const IR::Node *postorder(IR::LOr *expr) override;
111 const IR::Node *postorder(IR::LNot *expr) override;
112 const IR::Node *postorder(IR::Sub *expr) override;
113 const IR::Node *postorder(IR::SubSat *expr) override;
114 const IR::Node *postorder(IR::Add *expr) override;
115 const IR::Node *postorder(IR::AddSat *expr) override;
116 const IR::Node *postorder(IR::UPlus *expr) override;
117 const IR::Node *postorder(IR::Shl *expr) override;
118 const IR::Node *postorder(IR::Shr *expr) override;
119 const IR::Node *postorder(IR::Mul *expr) override;
120 const IR::Node *postorder(IR::Div *expr) override;
121 const IR::Node *postorder(IR::Mod *expr) override;
122 const IR::Node *postorder(IR::Mux *expr) override;
123 const IR::Node *postorder(IR::Slice *expr) override;
124 const IR::Node *postorder(IR::PlusSlice *expr) override;
125 const IR::Node *postorder(IR::Cast *expr) override;
126 const IR::Node *postorder(IR::Mask *expr) override;
127 const IR::Node *postorder(IR::Range *expr) override;
128 const IR::Node *postorder(IR::Concat *expr) override;
129 const IR::Node *postorder(IR::ArrayIndex *expr) override;
130
131 const IR::BlockStatement *preorder(IR::BlockStatement *bs) override {
132 // FIXME: Do we need to check for expression, so we'd be able to fine tune, e.g.
133 // @disable_optimization("strength_reduce")
134 if (bs->hasAnnotation(IR::Annotation::disableOptimizationAnnotation)) prune();
135 return bs;
136 }
137};
138
139class StrengthReduction : public PassManager {
140 public:
141 explicit StrengthReduction(TypeMap *typeMap, TypeChecking *typeChecking = nullptr,
142 StrengthReductionPolicy *policy = nullptr) {
143 if (typeMap != nullptr) {
144 if (!typeChecking) typeChecking = new TypeChecking(nullptr, typeMap, true);
145 passes.push_back(typeChecking);
146 }
147 passes.push_back(new DoStrengthReduction(typeMap, policy));
148 }
149
150 explicit StrengthReduction(TypeMap *typeMap, StrengthReductionPolicy *policy)
151 : StrengthReduction(typeMap, nullptr, policy) {}
152};
153
154} // namespace P4
155
156#endif /* FRONTENDS_P4_STRENGTHREDUCTION_H_ */
Definition strengthReduction.h:61
const IR::Node * postorder(IR::Cmpl *expr) override
Definition strengthReduction.cpp:60
bool isZero(const IR::Expression *expr) const
Definition strengthReduction.cpp:18
bool isFalse(const IR::Expression *expr) const
Definition strengthReduction.cpp:33
bool isAllOnes(const IR::Expression *expr) const
Definition strengthReduction.cpp:49
bool isTrue(const IR::Expression *expr) const
Definition strengthReduction.cpp:27
bool isOne(const IR::Expression *expr) const
Definition strengthReduction.cpp:12
bool hasSideEffects(const IR::Expression *expr) const
Definition strengthReduction.h:83
int isPowerOf2(const IR::Expression *expr) const
Definition strengthReduction.cpp:39
Definition visitor.h:802
static bool check(const IR::Expression *expression, const Visitor *calledBy, TypeMap *typeMap=nullptr, const Visitor::Context *ctxt=nullptr)
Definition sideEffects.h:81
Definition strengthReduction.h:21
bool enablePlusSliceToShiftTransform
Definition strengthReduction.h:41
bool enableNarrowingCastToSliceTransform
Definition strengthReduction.h:37
bool enableSubConstToAddTransform
Definition strengthReduction.h:33
Definition visitor.h:433
Definition typeChecker.h:46
Definition typeMap.h:32
Definition cstring.h:71
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13