YulOpt: Remove empty cases

This commit is contained in:
Mathias Baumann 2019-03-05 19:49:34 +01:00 committed by chriseth
parent 433175b19e
commit 3ce7069766
5 changed files with 87 additions and 2 deletions

View File

@ -21,6 +21,9 @@
#include <libdevcore/CommonData.h> #include <libdevcore/CommonData.h>
#include <libdevcore/Visitor.h> #include <libdevcore/Visitor.h>
#include <boost/range/algorithm_ext/erase.hpp>
#include <boost/range/algorithm/find_if.hpp>
using namespace std; using namespace std;
using namespace dev; using namespace dev;
using namespace yul; using namespace yul;
@ -137,8 +140,23 @@ void StructuralSimplifier::simplify(std::vector<yul::Statement>& _statements)
return s; return s;
} }
else
return {}; // Remove cases with empty body if no default case exists
auto const defaultCase = boost::find_if(
cases,
[](Case const& _case) { return !_case.value; });
if (
(defaultCase != cases.end() &&
defaultCase->body.statements.empty()) ||
defaultCase == cases.end()
)
boost::remove_erase_if(
cases,
[](Case const& _case) { return _case.body.statements.empty(); }
);
return {};
}, },
[&](ForLoop& _forLoop) -> OptionalStatements { [&](ForLoop& _forLoop) -> OptionalStatements {
if (expressionAlwaysFalse(*_forLoop.condition)) if (expressionAlwaysFalse(*_forLoop.condition))

View File

@ -0,0 +1,21 @@
{
let y := 200
switch y
case 0 { }
case 1 { y := 9 }
default { y := 100 }
}
// ----
// structuralSimplifier
// {
// let y := 200
// switch y
// case 0 {
// }
// case 1 {
// y := 9
// }
// default {
// y := 100
// }
// }

View File

@ -0,0 +1,15 @@
{
let y := 200
switch y
case 0 { }
case 1 { y := 9 }
}
// ----
// structuralSimplifier
// {
// let y := 200
// switch y
// case 1 {
// y := 9
// }
// }

View File

@ -0,0 +1,16 @@
{
let y := 200
switch y
case 0 { }
case 1 { y := 9 }
default { }
}
// ----
// structuralSimplifier
// {
// let y := 200
// switch y
// case 1 {
// y := 9
// }
// }

View File

@ -0,0 +1,15 @@
{
let y := 200
switch y
case 1 { y := 9 }
default { }
}
// ----
// structuralSimplifier
// {
// let y := 200
// switch y
// case 1 {
// y := 9
// }
// }