68 bool hasJumped =
false;
72 bool movedToIfBranch =
false;
74 bool preorder(IR::BlockStatement *)
override;
75 bool moveFromParentTo(
const IR::Statement *&child);
76 bool preorder(IR::IfStatement *)
override;
77 bool preorder(IR::SwitchStatement *)
override;
78 void postorder(IR::LoopStatement *)
override;
84 bool preorder(IR::BreakStatement *)
override {
return branch(); }
85 bool preorder(IR::ContinueStatement *)
override {
return branch(); }
86 bool preorder(IR::ExitStatement *)
override {
return branch(); }
87 bool preorder(IR::ReturnStatement *)
override {
return branch(); }
89 bool preorder(IR::Expression *)
override {
return false; }
92 MoveToElseAfterBranch() {}
120 std::vector<TernaryBool> stack;
121 void push() { stack.push_back(TernaryBool::No); }
122 void pop() { stack.pop_back(); }
123 void set(TernaryBool r) {
124 BUG_CHECK(!stack.empty(),
"Empty stack");
127 TernaryBool hasReturned() {
128 BUG_CHECK(!stack.empty(),
"Empty stack");
133 explicit DoRemoveReturns(
cstring varName =
"hasReturned"_cs,
cstring retValName =
"retval"_cs)
134 : variableName(varName), retValName(retValName) {
135 visitDagOnce =
false;
136 setName(
"DoRemoveReturns");
139 const IR::Node *preorder(IR::Function *function)
override;
140 const IR::Node *preorder(IR::BlockStatement *statement)
override;
141 const IR::Node *preorder(IR::ReturnStatement *statement)
override;
142 const IR::Node *preorder(IR::ExitStatement *statement)
override;
143 const IR::Node *preorder(IR::IfStatement *statement)
override;
144 const IR::Node *preorder(IR::SwitchStatement *statement)
override;
146 const IR::Node *preorder(IR::P4Action *action)
override;
147 const IR::Node *preorder(IR::P4Control *control)
override;
148 const IR::Node *preorder(IR::P4Parser *parser)
override {
153 const IR::Node *postorder(IR::LoopStatement *loop)
override;
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13