36 class EmptyStatementRemover final :
public Transform {
38 EmptyStatementRemover() {}
39 const IR::Node *postorder(IR::ForStatement *)
override;
40 const IR::Node *postorder(IR::ForInStatement *)
override;
41 const IR::Node *postorder(IR::EmptyStatement *statement)
override;
42 const IR::Node *postorder(IR::BlockStatement *statement)
override;
50 class ExpressionReplacer final :
public Transform {
53 const IR::AssignmentStatement *
const statement;
56 const std::vector<bool> &traversalPath;
58 std::vector<const IR::Expression *> &conditions;
60 unsigned currentNestingLevel = 0;
62 bool visitingIndex =
false;
65 explicit ExpressionReplacer(
const IR::AssignmentStatement *a, std::vector<bool> &t,
66 std::vector<const IR::Expression *> &c)
67 : statement(a), traversalPath(t), conditions(c) {
70 const IR::Mux *preorder(IR::Mux *mux)
override;
71 void emplaceExpression(IR::Mux *mux);
72 void visitBranch(IR::Mux *mux,
bool then);
73 void setVisitingIndex(
bool val);
79 EmptyStatementRemover remover;
82 bool modifyIndex =
false;
84 unsigned ifNestingLevel;
86 unsigned depNestingLevel;
90 std::vector<cstring> dependentNames;
93 std::vector<bool> traversalPath;
94 std::vector<cstring> dependencies;
97 std::map<cstring, const IR::AssignmentStatement *> liveAssignments;
101 std::vector<const IR::AssignmentStatement *> liveAssigns;
104 std::vector<const IR::Declaration *> indexDeclarations;
108 std::map<cstring, bool> isStatementDependent;
109 const IR::Statement *error(
const IR::Statement *statement)
const {
110 if (inside_action && ifNestingLevel > 0)
112 "%1%: Conditional execution in actions unsupported on this target",
118 explicit Predication() : inside_action(
false), ifNestingLevel(0), depNestingLevel(0) {
119 setName(
"Predication");
122 auto rv = Transform::init_apply(node);
123 node->apply(generator);
128 const IR::Expression *clone(
const IR::Expression *expression);
129 const IR::AssignmentStatement *clone(
const IR::AssignmentStatement *statement);
130 const IR::Node *preorder(IR::IfStatement *statement)
override;
131 const IR::Node *preorder(IR::P4Action *action)
override;
132 const IR::Node *postorder(IR::P4Action *action)
override;
133 const IR::Node *preorder(IR::AssignmentStatement *statement)
override;
134 const IR::Node *preorder(IR::OpAssignmentStatement *statement)
override;
136 const IR::Node *preorder(IR::PathExpression *pathExpr)
override;
137 const IR::Node *preorder(IR::Member *member)
override;
138 const IR::Node *preorder(IR::ArrayIndex *arrInd)
override;
140 const IR::Node *postorder(IR::MethodCallStatement *statement)
override {
141 return error(statement);
143 const IR::Node *postorder(IR::ReturnStatement *statement)
override {
return error(statement); }
144 const IR::Node *postorder(IR::ExitStatement *statement)
override {
return error(statement); }
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:48