Use side effects of user-defined functions in other optimizer steps.

This commit is contained in:
chriseth
2021-11-02 11:59:01 +01:00
parent 5eb97fa6ee
commit d6c461ed61
8 changed files with 88 additions and 32 deletions
+8 -1
View File
@@ -19,6 +19,7 @@
#include <libyul/optimiser/Semantics.h>
#include <libyul/AST.h>
#include <libyul/optimiser/NameCollector.h>
#include <libyul/ControlFlowSideEffectsCollector.h>
#include <libsolutil/CommonData.h>
using namespace std;
@@ -26,6 +27,12 @@ using namespace solidity;
using namespace solidity::yul;
using namespace solidity::util;
void ConditionalSimplifier::run(OptimiserStepContext& _context, Block& _ast)
{
ControlFlowSideEffectsCollector sideEffects(_context.dialect, _ast);
ConditionalSimplifier{_context.dialect, sideEffects.functionSideEffects()}(_ast);
}
void ConditionalSimplifier::operator()(Switch& _switch)
{
visit(*_switch.expression);
@@ -65,7 +72,7 @@ void ConditionalSimplifier::operator()(Block& _block)
if (
holds_alternative<Identifier>(*_if.condition) &&
!_if.body.statements.empty() &&
TerminationFinder(m_dialect).controlFlowKind(_if.body.statements.back()) !=
TerminationFinder(m_dialect, &m_functionSideEffects).controlFlowKind(_if.body.statements.back()) !=
TerminationFinder::ControlFlow::FlowOut
)
{