@@ -61,16 +61,15 @@ class RematCandidateSelector: public DataFlowAnalyzer
61
61
// / @returns a map from function name to rematerialisation costs to a vector of variables to rematerialise
62
62
// / and variables that occur in their expression.
63
63
// / While the map is sorted by cost, the contained vectors are sorted by the order of occurrence.
64
- map<YulString, map<size_t , vector<tuple< YulString, set<YulString>> >>> candidates ()
64
+ map<YulString, map<size_t , vector<YulString>>> candidates ()
65
65
{
66
- map<YulString, map<size_t , vector<tuple< YulString, set<YulString>> >>> cand;
66
+ map<YulString, map<size_t , vector<YulString>>> cand;
67
67
for (auto const & [functionName, candidate]: m_candidates)
68
68
{
69
69
if (size_t const * cost = util::valueOrNullptr (m_expressionCodeCost, candidate))
70
70
{
71
71
size_t numRef = m_numReferences[candidate];
72
- set<YulString> const * ref = references (candidate);
73
- cand[functionName][*cost * numRef].emplace_back (candidate, ref ? move (*ref) : set<YulString>{});
72
+ cand[functionName][*cost * numRef].emplace_back (candidate);
74
73
}
75
74
}
76
75
return cand;
@@ -144,25 +143,16 @@ class RematCandidateSelector: public DataFlowAnalyzer
144
143
145
144
// / Selects at most @a _numVariables among @a _candidates.
146
145
set<YulString> chooseVarsToEliminate (
147
- map<size_t , vector<tuple< YulString, set<YulString>> >> const & _candidates,
146
+ map<size_t , vector<YulString>> const & _candidates,
148
147
size_t _numVariables
149
148
)
150
149
{
151
150
set<YulString> varsToEliminate;
152
151
for (auto && [cost, candidates]: _candidates)
153
- for (auto && [ candidate, references] : candidates)
152
+ for (auto && candidate: candidates)
154
153
{
155
154
if (varsToEliminate.size () >= _numVariables)
156
155
return varsToEliminate;
157
- // If a variable we would like to eliminate references another one
158
- // we already selected for elimination, then stop selecting
159
- // candidates. If we would add that variable, then the cost calculation
160
- // for the previous variable would be off. Furthermore, we
161
- // do not skip the variable because it would be better to properly re-compute
162
- // the costs of all other variables instead.
163
- for (YulString const & referencedVar: references)
164
- if (varsToEliminate.count (referencedVar))
165
- return varsToEliminate;
166
156
varsToEliminate.insert (candidate);
167
157
}
168
158
return varsToEliminate;
@@ -177,7 +167,7 @@ void eliminateVariables(
177
167
{
178
168
RematCandidateSelector selector{_dialect};
179
169
selector (_ast);
180
- map<YulString, map<size_t , vector<tuple< YulString, set<YulString>> >>> candidates = selector.candidates ();
170
+ map<YulString, map<size_t , vector<YulString>>> candidates = selector.candidates ();
181
171
182
172
set<YulString> varsToEliminate;
183
173
for (auto const & [functionName, numVariables]: _numVariables)
@@ -209,7 +199,7 @@ void eliminateVariablesOptimizedCodegen(
209
199
for (auto const & [functionName, candidatesInFunction]: selector.candidates ())
210
200
for (auto [cost, candidatesWithCost]: candidatesInFunction)
211
201
for (auto candidate: candidatesWithCost)
212
- candidates[get< 0 >( candidate) ] = cost;
202
+ candidates[candidate] = cost;
213
203
214
204
set<YulString> varsToEliminate;
215
205
0 commit comments