source: icGREP/icgrep-devel/icgrep/pablo/branch.h @ 5486

Last change on this file since 5486 was 5454, checked in by nmedfort, 2 years ago

Bug fix check in for DumpTrace?, compilation of DoBlock? / DoFinalBlock? functions. Pablo CodeMotionPass? optimized and enabled by default.

File size: 2.2 KB
Line 
1#ifndef BRANCH_H
2#define BRANCH_H
3
4#include <pablo/pabloAST.h>
5namespace pablo { class Var; }
6namespace pablo { class PabloBlock; }
7
8namespace pablo {
9
10class Branch : public Statement {
11    friend class PabloBlock;
12    friend class Statement;
13    friend class Simplifier;
14public:
15    using EscapedVars = std::vector<Var *>;
16    static inline bool classof(const PabloAST * e) {
17        switch (e->getClassTypeId()) {
18            case ClassTypeId::If:
19            case ClassTypeId::While:
20                return true;
21            default:
22                return false;
23        }
24    }
25    static inline bool classof(const void *) {
26        return false;
27    }
28    inline PabloAST * getCondition() const {
29        return getOperand(0);
30    }
31    inline void setCondition(PabloAST * const condition) {
32        return setOperand(0, condition);
33    }
34    inline PabloBlock * getBody() {
35        return mBody;
36    }
37    inline  PabloBlock * getBody() const {
38        return mBody;
39    }
40    PabloBlock * setBody(PabloBlock * const body);
41    EscapedVars getEscaped() const;
42protected:
43    void addEscaped(PabloAST * const node);
44    void removeEscaped(PabloAST * const node);
45    Branch(const ClassTypeId typeId, PabloAST * condition, PabloBlock * body, Allocator & allocator);
46protected:
47    PabloBlock *    mBody;
48    unsigned        mEscapedCount;
49    unsigned        mEscapedCapacity;
50    PabloAST **     mEscaped;
51};
52
53class If final : public Branch {
54    friend class PabloBlock;
55    friend class Statement;
56    friend class Simplifier;
57public:
58    static inline bool classof(const PabloAST * e) {
59        return e->getClassTypeId() == ClassTypeId::If;
60    }
61protected:
62    If(PabloAST * condition, PabloBlock * body, Allocator & allocator)
63    : Branch(ClassTypeId::If, condition, body, allocator) {
64
65    }
66};
67
68class While final : public Branch {
69    friend class PabloBlock;
70    friend class Statement;
71    friend class Simplifier;
72public:
73    static inline bool classof(const PabloAST * e) {
74        return e->getClassTypeId() == ClassTypeId::While;
75    }
76protected:
77    While(PabloAST * condition, PabloBlock * body, Allocator & allocator)
78    : Branch(ClassTypeId::While, condition, body, allocator) {
79
80    }
81};
82
83
84}
85
86#endif // BRANCH_H
Note: See TracBrowser for help on using the repository browser.