Skip to content

Commit be95a81

Browse files
authored
Merge pull request #11891 from ethereum/guidedRematerializer
Allow the Rematerializer to be restricted to an exact set of variables.
2 parents e9b70b1 + 646421f commit be95a81

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

libyul/optimiser/Rematerialiser.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,39 +32,44 @@ using namespace std;
3232
using namespace solidity;
3333
using namespace solidity::yul;
3434

35-
void Rematerialiser::run(Dialect const& _dialect, Block& _ast, set<YulString> _varsToAlwaysRematerialize)
35+
void Rematerialiser::run(Dialect const& _dialect, Block& _ast, set<YulString> _varsToAlwaysRematerialize, bool _onlySelectedVariables)
3636
{
37-
Rematerialiser{_dialect, _ast, std::move(_varsToAlwaysRematerialize)}(_ast);
37+
Rematerialiser{_dialect, _ast, std::move(_varsToAlwaysRematerialize), _onlySelectedVariables}(_ast);
3838
}
3939

4040
void Rematerialiser::run(
4141
Dialect const& _dialect,
4242
FunctionDefinition& _function,
43-
set<YulString> _varsToAlwaysRematerialize
43+
set<YulString> _varsToAlwaysRematerialize,
44+
bool _onlySelectedVariables
4445
)
4546
{
46-
Rematerialiser{_dialect, _function, std::move(_varsToAlwaysRematerialize)}(_function);
47+
Rematerialiser{_dialect, _function, std::move(_varsToAlwaysRematerialize), _onlySelectedVariables}(_function);
4748
}
4849

4950
Rematerialiser::Rematerialiser(
5051
Dialect const& _dialect,
5152
Block& _ast,
52-
set<YulString> _varsToAlwaysRematerialize
53+
set<YulString> _varsToAlwaysRematerialize,
54+
bool _onlySelectedVariables
5355
):
5456
DataFlowAnalyzer(_dialect),
5557
m_referenceCounts(ReferencesCounter::countReferences(_ast)),
56-
m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize))
58+
m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize)),
59+
m_onlySelectedVariables(_onlySelectedVariables)
5760
{
5861
}
5962

6063
Rematerialiser::Rematerialiser(
6164
Dialect const& _dialect,
6265
FunctionDefinition& _function,
63-
set<YulString> _varsToAlwaysRematerialize
66+
set<YulString> _varsToAlwaysRematerialize,
67+
bool _onlySelectedVariables
6468
):
6569
DataFlowAnalyzer(_dialect),
6670
m_referenceCounts(ReferencesCounter::countReferences(_function)),
67-
m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize))
71+
m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize)),
72+
m_onlySelectedVariables(_onlySelectedVariables)
6873
{
6974
}
7075

@@ -81,10 +86,13 @@ void Rematerialiser::visit(Expression& _e)
8186
size_t refs = m_referenceCounts[name];
8287
size_t cost = CodeCost::codeCost(m_dialect, *value.value);
8388
if (
84-
(refs <= 1 && value.loopDepth == m_loopDepth) ||
85-
cost == 0 ||
86-
(refs <= 5 && cost <= 1 && m_loopDepth == 0) ||
87-
m_varsToAlwaysRematerialize.count(name)
89+
(
90+
!m_onlySelectedVariables && (
91+
(refs <= 1 && value.loopDepth == m_loopDepth) ||
92+
cost == 0 ||
93+
(refs <= 5 && cost <= 1 && m_loopDepth == 0)
94+
)
95+
) || m_varsToAlwaysRematerialize.count(name)
8896
)
8997
{
9098
assertThrow(m_referenceCounts[name] > 0, OptimizerException, "");

libyul/optimiser/Rematerialiser.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,28 @@ class Rematerialiser: public DataFlowAnalyzer
5050
static void run(
5151
Dialect const& _dialect,
5252
Block& _ast,
53-
std::set<YulString> _varsToAlwaysRematerialize = {}
53+
std::set<YulString> _varsToAlwaysRematerialize = {},
54+
bool _onlySelectedVariables = false
5455
);
5556
static void run(
5657
Dialect const& _dialect,
5758
FunctionDefinition& _function,
58-
std::set<YulString> _varsToAlwaysRematerialize = {}
59+
std::set<YulString> _varsToAlwaysRematerialize = {},
60+
bool _onlySelectedVariables = false
5961
);
6062

6163
protected:
6264
Rematerialiser(
6365
Dialect const& _dialect,
6466
Block& _ast,
65-
std::set<YulString> _varsToAlwaysRematerialize = {}
67+
std::set<YulString> _varsToAlwaysRematerialize = {},
68+
bool _onlySelectedVariables = false
6669
);
6770
Rematerialiser(
6871
Dialect const& _dialect,
6972
FunctionDefinition& _function,
70-
std::set<YulString> _varsToAlwaysRematerialize = {}
73+
std::set<YulString> _varsToAlwaysRematerialize = {},
74+
bool _onlySelectedVariables = false
7175
);
7276

7377
using DataFlowAnalyzer::operator();
@@ -77,6 +81,7 @@ class Rematerialiser: public DataFlowAnalyzer
7781

7882
std::map<YulString, size_t> m_referenceCounts;
7983
std::set<YulString> m_varsToAlwaysRematerialize;
84+
bool m_onlySelectedVariables = false;
8085
};
8186

8287
/**

0 commit comments

Comments
 (0)