36 class EmptyStatementRemover final :
public Transform {
38 EmptyStatementRemover() {}
39 const IR::Node *postorder(IR::EmptyStatement *statement)
override;
40 const IR::Node *postorder(IR::BlockStatement *statement)
override;
48 class ExpressionReplacer final :
public Transform {
51 const IR::AssignmentStatement *
const statement;
54 const std::vector<bool> &traversalPath;
56 std::vector<const IR::Expression *> &conditions;
58 unsigned currentNestingLevel = 0;
60 bool visitingIndex =
false;
63 explicit ExpressionReplacer(
const IR::AssignmentStatement *a, std::vector<bool> &t,
64 std::vector<const IR::Expression *> &c)
65 : statement(a), traversalPath(t), conditions(c) {
68 const IR::Mux *preorder(IR::Mux *mux)
override;
69 void emplaceExpression(IR::Mux *mux);
70 void visitBranch(IR::Mux *mux,
bool then);
71 void setVisitingIndex(
bool val);
77 EmptyStatementRemover remover;
80 bool modifyIndex =
false;
82 unsigned ifNestingLevel;
84 unsigned depNestingLevel;
88 std::vector<cstring> dependentNames;
91 std::vector<bool> traversalPath;
92 std::vector<cstring> dependencies;
95 std::map<cstring, const IR::AssignmentStatement *> liveAssignments;
99 std::vector<const IR::AssignmentStatement *> liveAssigns;
102 std::vector<const IR::Declaration *> indexDeclarations;
106 std::map<cstring, bool> isStatementDependent;
107 const IR::Statement *error(
const IR::Statement *statement)
const {
108 if (inside_action && ifNestingLevel > 0)
110 "%1%: Conditional execution in actions unsupported on this target",
116 explicit Predication() : inside_action(
false), ifNestingLevel(0), depNestingLevel(0) {
117 setName(
"Predication");
120 auto rv = Transform::init_apply(node);
121 node->apply(generator);
126 const IR::Expression *clone(
const IR::Expression *expression);
127 const IR::AssignmentStatement *clone(
const IR::AssignmentStatement *statement);
128 const IR::Node *preorder(IR::IfStatement *statement)
override;
129 const IR::Node *preorder(IR::P4Action *action)
override;
130 const IR::Node *postorder(IR::P4Action *action)
override;
131 const IR::Node *preorder(IR::AssignmentStatement *statement)
override;
132 const IR::Node *preorder(IR::OpAssignmentStatement *statement)
override;
134 const IR::Node *preorder(IR::PathExpression *pathExpr)
override;
135 const IR::Node *preorder(IR::Member *member)
override;
136 const IR::Node *preorder(IR::ArrayIndex *arrInd)
override;
138 const IR::Node *postorder(IR::MethodCallStatement *statement)
override {
139 return error(statement);
141 const IR::Node *postorder(IR::ReturnStatement *statement)
override {
return error(statement); }
142 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:58