@@ -52,17 +52,14 @@ class SSACFG
5252 struct BlockId
5353 {
5454 size_t value = std::numeric_limits<size_t >::max();
55- bool operator <(BlockId const & _rhs) const { return value < _rhs.value ; }
56- bool operator ==(BlockId const & _rhs) const { return value == _rhs.value ; }
57- bool operator !=(BlockId const & _rhs) const { return value != _rhs.value ; }
55+ auto operator <=>(BlockId const &) const = default ;
5856 };
5957 struct ValueId
6058 {
61- size_t value = std::numeric_limits<size_t >::max();
62- bool hasValue () const { return value != std::numeric_limits<size_t >::max (); }
63- bool operator <(ValueId const & _rhs) const { return value < _rhs.value ; }
64- bool operator ==(ValueId const & _rhs) const { return value == _rhs.value ; }
65- bool operator !=(ValueId const & _rhs) const { return value != _rhs.value ; }
59+ using ValueType = size_t ;
60+ ValueType value = std::numeric_limits<ValueType>::max();
61+ bool hasValue () const { return value != std::numeric_limits<ValueType>::max (); }
62+ auto operator <=>(ValueId const &) const = default ;
6663 };
6764
6865 struct BuiltinCall
@@ -93,26 +90,26 @@ class SSACFG
9390 struct MainExit {};
9491 struct ConditionalJump
9592 {
96- langutil::DebugData::ConstPtr debugData;
93+ langutil::DebugData::ConstPtr debugData{} ;
9794 ValueId condition;
9895 BlockId nonZero;
9996 BlockId zero;
10097 };
10198 struct Jump
10299 {
103- langutil::DebugData::ConstPtr debugData;
100+ langutil::DebugData::ConstPtr debugData{} ;
104101 BlockId target;
105102 };
106103 struct JumpTable
107104 {
108- langutil::DebugData::ConstPtr debugData;
105+ langutil::DebugData::ConstPtr debugData{} ;
109106 ValueId value;
110107 std::map<u256, BlockId> cases;
111108 BlockId defaultCase;
112109 };
113110 struct FunctionReturn
114111 {
115- langutil::DebugData::ConstPtr debugData;
112+ langutil::DebugData::ConstPtr debugData{} ;
116113 std::vector<ValueId> returnValues;
117114 };
118115 struct Terminated {};
@@ -138,6 +135,26 @@ class SSACFG
138135 _callable (jumpTable->defaultCase );
139136 }
140137 }
138+
139+ bool isMainExitBlock () const
140+ {
141+ return std::holds_alternative<MainExit>(exit);
142+ }
143+
144+ bool isTerminationBlock () const
145+ {
146+ return std::holds_alternative<Terminated>(exit);
147+ }
148+
149+ bool isFunctionReturnBlock () const
150+ {
151+ return std::holds_alternative<FunctionReturn>(exit);
152+ }
153+
154+ bool isJumpBlock () const
155+ {
156+ return std::holds_alternative<Jump>(exit);
157+ }
141158 };
142159 BlockId makeBlock (langutil::DebugData::ConstPtr _debugData)
143160 {
@@ -148,6 +165,7 @@ class SSACFG
148165 BasicBlock& block (BlockId _id) { return m_blocks.at (_id.value ); }
149166 BasicBlock const & block (BlockId _id) const { return m_blocks.at (_id.value ); }
150167 size_t numBlocks () const { return m_blocks.size (); }
168+
151169private:
152170 std::vector<BasicBlock> m_blocks;
153171public:
@@ -170,13 +188,21 @@ class SSACFG
170188 {
171189 return std::holds_alternative<LiteralValue>(valueInfo (_var));
172190 }
191+ bool isPhiValue (ValueId const _var) const
192+ {
193+ return std::holds_alternative<PhiValue>(valueInfo (_var));
194+ }
173195 ValueInfo& valueInfo (ValueId const _var)
174196 {
175197 return m_valueInfos.at (_var.value );
176198 }
177199 ValueInfo const & valueInfo (ValueId const _var) const
178200 {
179- return m_valueInfos.at (_var.value );
201+ return valueInfo (_var.value );
202+ }
203+ ValueInfo const & valueInfo (ValueId::ValueType const _var) const
204+ {
205+ return m_valueInfos.at (_var);
180206 }
181207 ValueId newPhi (BlockId const _definingBlock)
182208 {
0 commit comments