mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Yul Optimizer: Remove dead code
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include <libyul/optimiser/BlockFlattener.h>
|
||||
#include <libyul/optimiser/VarDeclInitializer.h>
|
||||
#include <libyul/optimiser/VarNameCleaner.h>
|
||||
#include <libyul/optimiser/DeadCodeEliminator.h>
|
||||
#include <libyul/optimiser/Disambiguator.h>
|
||||
#include <libyul/optimiser/CommonSubexpressionEliminator.h>
|
||||
#include <libyul/optimiser/NameCollector.h>
|
||||
@@ -190,6 +191,7 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
CommonSubexpressionEliminator{*m_dialect}(*m_ast);
|
||||
ExpressionSimplifier::run(*m_dialect, *m_ast);
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
DeadCodeEliminator{}(*m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
ExpressionJoiner::run(*m_ast);
|
||||
}
|
||||
@@ -198,6 +200,11 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
|
||||
disambiguate();
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "deadCodeEliminator")
|
||||
{
|
||||
disambiguate();
|
||||
DeadCodeEliminator{}(*m_ast);
|
||||
}
|
||||
else if (m_optimizerStep == "ssaTransform")
|
||||
{
|
||||
disambiguate();
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
if lt(a, 0)
|
||||
{ break }
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// if lt(a, 0)
|
||||
// {
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
break
|
||||
mstore(0, a)
|
||||
a := add(a, 10)
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
continue
|
||||
mstore(0, a)
|
||||
a := add(a, 10)
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// continue
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
let b := 20
|
||||
revert(0, 0)
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
mstore(0, a)
|
||||
a := add(a, 10)
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// let b := 20
|
||||
// revert(0, 0)
|
||||
// }
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
let b := 20
|
||||
stop()
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
mstore(0, a)
|
||||
a := add(a, 10)
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// let b := 20
|
||||
// stop()
|
||||
// }
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
fun()
|
||||
|
||||
revert(0, 0)
|
||||
|
||||
function fun()
|
||||
{
|
||||
return(1, 1)
|
||||
|
||||
pop(sub(10, 5))
|
||||
}
|
||||
|
||||
pop(add(1, 1))
|
||||
}
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// fun()
|
||||
// revert(0, 0)
|
||||
// function fun()
|
||||
// {
|
||||
// return(1, 1)
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
let y := mload(0)
|
||||
switch y
|
||||
case 0 {
|
||||
y := 8 }
|
||||
case 1 {
|
||||
y := 9
|
||||
revert(0, 0)
|
||||
y := 10
|
||||
}
|
||||
default {
|
||||
y := 10 }
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// let y := mload(0)
|
||||
// switch y
|
||||
// case 0 {
|
||||
// y := 8
|
||||
// }
|
||||
// case 1 {
|
||||
// y := 9
|
||||
// revert(0, 0)
|
||||
// }
|
||||
// default {
|
||||
// y := 10
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
{
|
||||
revert(0, 0)
|
||||
}
|
||||
mstore(0, 0)
|
||||
}
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// {
|
||||
// revert(0, 0)
|
||||
// }
|
||||
// mstore(0, 0)
|
||||
// }
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// continue
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
let b := 20
|
||||
for {
|
||||
let a := 20
|
||||
}
|
||||
lt(a, 40)
|
||||
{
|
||||
a := add(a, 2)
|
||||
}
|
||||
{
|
||||
a := a
|
||||
mstore(0, a)
|
||||
a := add(a, 10)
|
||||
}
|
||||
stop()
|
||||
}
|
||||
|
||||
// ----
|
||||
// deadCodeEliminator
|
||||
// {
|
||||
// let b := 20
|
||||
// for {
|
||||
// let a := 20
|
||||
// }
|
||||
// lt(a, 40)
|
||||
// {
|
||||
// a := add(a, 2)
|
||||
// }
|
||||
// {
|
||||
// a := a
|
||||
// mstore(0, a)
|
||||
// a := add(a, 10)
|
||||
// }
|
||||
// stop()
|
||||
// }
|
||||
@@ -332,8 +332,6 @@
|
||||
// }
|
||||
// mstore(i_1, 0x01)
|
||||
// return(i_1, 0x20)
|
||||
// mstore(i_1, 404)
|
||||
// revert(i_1, 0x20)
|
||||
// function validatePairing(t2)
|
||||
// {
|
||||
// let t2_x := calldataload(t2)
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <libyul/optimiser/Rematerialiser.h>
|
||||
#include <libyul/optimiser/ExpressionSimplifier.h>
|
||||
#include <libyul/optimiser/UnusedPruner.h>
|
||||
#include <libyul/optimiser/DeadCodeEliminator.h>
|
||||
#include <libyul/optimiser/ExpressionJoiner.h>
|
||||
#include <libyul/optimiser/RedundantAssignEliminator.h>
|
||||
#include <libyul/optimiser/SSAReverser.h>
|
||||
@@ -132,7 +133,7 @@ public:
|
||||
cout << " (e)xpr inline/(i)nline/(s)implify/varname c(l)eaner/(u)nusedprune/ss(a) transform/" << endl;
|
||||
cout << " (r)edundant assign elim./re(m)aterializer/f(o)r-loop-pre-rewriter/" << endl;
|
||||
cout << " s(t)ructural simplifier/equi(v)alent function combiner/ssa re(V)erser/? " << endl;
|
||||
cout << " stack com(p)ressor? " << endl;
|
||||
cout << " stack com(p)ressor/(D)ead code eliminator/? " << endl;
|
||||
cout.flush();
|
||||
int option = readStandardInputChar();
|
||||
cout << ' ' << char(option) << endl;
|
||||
@@ -182,6 +183,9 @@ public:
|
||||
case 'u':
|
||||
UnusedPruner::runUntilStabilised(*m_dialect, *m_ast);
|
||||
break;
|
||||
case 'D':
|
||||
DeadCodeEliminator{}(*m_ast);
|
||||
break;
|
||||
case 'a':
|
||||
SSATransform::run(*m_ast, *m_nameDispenser);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user