@@ -32,39 +32,44 @@ using namespace std;
32
32
using namespace solidity ;
33
33
using namespace solidity ::yul;
34
34
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 )
36
36
{
37
- Rematerialiser{_dialect, _ast, std::move (_varsToAlwaysRematerialize)}(_ast);
37
+ Rematerialiser{_dialect, _ast, std::move (_varsToAlwaysRematerialize), _onlySelectedVariables }(_ast);
38
38
}
39
39
40
40
void Rematerialiser::run (
41
41
Dialect const & _dialect,
42
42
FunctionDefinition& _function,
43
- set<YulString> _varsToAlwaysRematerialize
43
+ set<YulString> _varsToAlwaysRematerialize,
44
+ bool _onlySelectedVariables
44
45
)
45
46
{
46
- Rematerialiser{_dialect, _function, std::move (_varsToAlwaysRematerialize)}(_function);
47
+ Rematerialiser{_dialect, _function, std::move (_varsToAlwaysRematerialize), _onlySelectedVariables }(_function);
47
48
}
48
49
49
50
Rematerialiser::Rematerialiser (
50
51
Dialect const & _dialect,
51
52
Block& _ast,
52
- set<YulString> _varsToAlwaysRematerialize
53
+ set<YulString> _varsToAlwaysRematerialize,
54
+ bool _onlySelectedVariables
53
55
):
54
56
DataFlowAnalyzer(_dialect),
55
57
m_referenceCounts(ReferencesCounter::countReferences(_ast)),
56
- m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize))
58
+ m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize)),
59
+ m_onlySelectedVariables(_onlySelectedVariables)
57
60
{
58
61
}
59
62
60
63
Rematerialiser::Rematerialiser (
61
64
Dialect const & _dialect,
62
65
FunctionDefinition& _function,
63
- set<YulString> _varsToAlwaysRematerialize
66
+ set<YulString> _varsToAlwaysRematerialize,
67
+ bool _onlySelectedVariables
64
68
):
65
69
DataFlowAnalyzer(_dialect),
66
70
m_referenceCounts(ReferencesCounter::countReferences(_function)),
67
- m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize))
71
+ m_varsToAlwaysRematerialize(std::move(_varsToAlwaysRematerialize)),
72
+ m_onlySelectedVariables(_onlySelectedVariables)
68
73
{
69
74
}
70
75
@@ -81,10 +86,13 @@ void Rematerialiser::visit(Expression& _e)
81
86
size_t refs = m_referenceCounts[name];
82
87
size_t cost = CodeCost::codeCost (m_dialect, *value.value );
83
88
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)
88
96
)
89
97
{
90
98
assertThrow (m_referenceCounts[name] > 0 , OptimizerException, " " );
0 commit comments