Skip to content

Commit a054285

Browse files
committed
Simplify rematerialization candidates.
1 parent af86a80 commit a054285

File tree

1 file changed

+7
-17
lines changed

1 file changed

+7
-17
lines changed

libyul/optimiser/StackCompressor.cpp

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,15 @@ class RematCandidateSelector: public DataFlowAnalyzer
6161
/// @returns a map from function name to rematerialisation costs to a vector of variables to rematerialise
6262
/// and variables that occur in their expression.
6363
/// 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()
6565
{
66-
map<YulString, map<size_t, vector<tuple<YulString, set<YulString>>>>> cand;
66+
map<YulString, map<size_t, vector<YulString>>> cand;
6767
for (auto const& [functionName, candidate]: m_candidates)
6868
{
6969
if (size_t const* cost = util::valueOrNullptr(m_expressionCodeCost, candidate))
7070
{
7171
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);
7473
}
7574
}
7675
return cand;
@@ -144,25 +143,16 @@ class RematCandidateSelector: public DataFlowAnalyzer
144143

145144
/// Selects at most @a _numVariables among @a _candidates.
146145
set<YulString> chooseVarsToEliminate(
147-
map<size_t, vector<tuple<YulString, set<YulString>>>> const& _candidates,
146+
map<size_t, vector<YulString>> const& _candidates,
148147
size_t _numVariables
149148
)
150149
{
151150
set<YulString> varsToEliminate;
152151
for (auto&& [cost, candidates]: _candidates)
153-
for (auto&& [candidate, references]: candidates)
152+
for (auto&& candidate: candidates)
154153
{
155154
if (varsToEliminate.size() >= _numVariables)
156155
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;
166156
varsToEliminate.insert(candidate);
167157
}
168158
return varsToEliminate;
@@ -177,7 +167,7 @@ void eliminateVariables(
177167
{
178168
RematCandidateSelector selector{_dialect};
179169
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();
181171

182172
set<YulString> varsToEliminate;
183173
for (auto const& [functionName, numVariables]: _numVariables)
@@ -209,7 +199,7 @@ void eliminateVariablesOptimizedCodegen(
209199
for (auto const& [functionName, candidatesInFunction]: selector.candidates())
210200
for (auto [cost, candidatesWithCost]: candidatesInFunction)
211201
for (auto candidate: candidatesWithCost)
212-
candidates[get<0>(candidate)] = cost;
202+
candidates[candidate] = cost;
213203

214204
set<YulString> varsToEliminate;
215205

0 commit comments

Comments
 (0)