Skip to content

Commit

Permalink
Keep canonical form of Yul code at all times.
Browse files Browse the repository at this point in the history
  • Loading branch information
ekpyron committed Nov 9, 2021
1 parent fc41083 commit 9fb77b1
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 7 deletions.
12 changes: 12 additions & 0 deletions libyul/optimiser/BlockFlattener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,15 @@ void BlockFlattener::operator()(Block& _block)
}
);
}

void BlockFlattener::run(OptimiserStepContext&, Block& _ast)
{
BlockFlattener flattener;
for (auto& statement: _ast.statements)
if (auto* block = get_if<Block>(&statement))
flattener(*block);
else if (auto* function = get_if<FunctionDefinition>(&statement))
flattener(function->body);
else
yulAssert(false, "BlockFlattener requires the FunctionGrouper.");
}
2 changes: 1 addition & 1 deletion libyul/optimiser/BlockFlattener.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class BlockFlattener: public ASTModifier
{
public:
static constexpr char const* name{"BlockFlattener"};
static void run(OptimiserStepContext&, Block& _ast) { BlockFlattener{}(_ast); }
static void run(OptimiserStepContext&, Block& _ast);

using ASTModifier::operator();
void operator()(Block& _block) override;
Expand Down
2 changes: 2 additions & 0 deletions libyul/optimiser/CircularReferencesPruner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <libyul/optimiser/CircularReferencesPruner.h>

#include <libyul/optimiser/CallGraphGenerator.h>
#include <libyul/optimiser/FunctionGrouper.h>
#include <libyul/optimiser/OptimizerUtilities.h>
#include <libyul/AST.h>

Expand All @@ -29,6 +30,7 @@ using namespace solidity::yul;
void CircularReferencesPruner::run(OptimiserStepContext& _context, Block& _ast)
{
CircularReferencesPruner{_context.reservedIdentifiers}(_ast);
FunctionGrouper::run(_context, _ast);
}

void CircularReferencesPruner::operator()(Block& _block)
Expand Down
4 changes: 3 additions & 1 deletion libyul/optimiser/ExpressionJoiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include <libyul/optimiser/ExpressionJoiner.h>

#include <libyul/optimiser/FunctionGrouper.h>
#include <libyul/optimiser/NameCollector.h>
#include <libyul/optimiser/OptimizerUtilities.h>
#include <libyul/Exceptions.h>
Expand All @@ -37,9 +38,10 @@ using namespace std;
using namespace solidity;
using namespace solidity::yul;

void ExpressionJoiner::run(OptimiserStepContext&, Block& _ast)
void ExpressionJoiner::run(OptimiserStepContext& _context, Block& _ast)
{
ExpressionJoiner{_ast}(_ast);
FunctionGrouper::run(_context, _ast);
}


Expand Down
2 changes: 1 addition & 1 deletion libyul/optimiser/FunctionGrouper.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct OptimiserStepContext;
* all function definitions.
*
* After this step, a block is of the form
* { { I...} F... }
* { { I... } F... }
* Where I are (non-function-definition) instructions and F are function definitions.
*/
class FunctionGrouper
Expand Down
2 changes: 2 additions & 0 deletions libyul/optimiser/OptimizerUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ namespace solidity::yul
{

/// Removes statements that are just empty blocks (non-recursive).
/// If this is run on the outermost block, the FunctionGrouper should be run afterwards to keep
/// the canonical form.
void removeEmptyBlocks(Block& _block);

/// Returns true if a given literal can not be used as an identifier.
Expand Down
2 changes: 1 addition & 1 deletion libyul/optimiser/Suite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void OptimiserSuite::run(

// Some steps depend on properties ensured by FunctionHoister, BlockFlattener, FunctionGrouper and
// ForLoopInitRewriter. Run them first to be able to run arbitrary sequences safely.
suite.runSequence("hfgo", ast);
suite.runSequence("hgfo", ast);

NameSimplifier::run(suite.m_context, ast);
// Now the user-supplied part
Expand Down
7 changes: 7 additions & 0 deletions libyul/optimiser/UnusedPruner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <libyul/optimiser/UnusedPruner.h>

#include <libyul/optimiser/CallGraphGenerator.h>
#include <libyul/optimiser/FunctionGrouper.h>
#include <libyul/optimiser/NameCollector.h>
#include <libyul/optimiser/Semantics.h>
#include <libyul/optimiser/OptimizerUtilities.h>
Expand All @@ -33,6 +34,12 @@ using namespace std;
using namespace solidity;
using namespace solidity::yul;

void UnusedPruner::run(OptimiserStepContext& _context, Block& _ast)
{
UnusedPruner::runUntilStabilisedOnFullAST(_context.dialect, _ast, _context.reservedIdentifiers);
FunctionGrouper::run(_context, _ast);
}

UnusedPruner::UnusedPruner(
Dialect const& _dialect,
Block& _ast,
Expand Down
4 changes: 1 addition & 3 deletions libyul/optimiser/UnusedPruner.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,7 @@ class UnusedPruner: public ASTModifier
{
public:
static constexpr char const* name{"UnusedPruner"};
static void run(OptimiserStepContext& _context, Block& _ast) {
UnusedPruner::runUntilStabilisedOnFullAST(_context.dialect, _ast, _context.reservedIdentifiers);
}
static void run(OptimiserStepContext& _context, Block& _ast);


using ASTModifier::operator();
Expand Down

0 comments on commit 9fb77b1

Please sign in to comment.