First simplify switch with known constant expression.

This commit is contained in:
chriseth 2019-03-06 19:39:29 +01:00
parent 0f336f30ca
commit 791fde953d
6 changed files with 23 additions and 14 deletions

View File

@ -180,6 +180,9 @@ void StructuralSimplifier::simplify(std::vector<yul::Statement>& _statements)
return {}; return {};
}, },
[&](Switch& _switchStmt) -> OptionalStatements { [&](Switch& _switchStmt) -> OptionalStatements {
if (boost::optional<u256> const constExprVal = hasLiteralValue(*_switchStmt.expression))
return replaceConstArgSwitch(_switchStmt, constExprVal.get());
removeEmptyDefaultFromSwitch(_switchStmt); removeEmptyDefaultFromSwitch(_switchStmt);
removeEmptyCasesFromSwitch(_switchStmt); removeEmptyCasesFromSwitch(_switchStmt);
@ -187,8 +190,6 @@ void StructuralSimplifier::simplify(std::vector<yul::Statement>& _statements)
return reduceNoCaseSwitch(_switchStmt); return reduceNoCaseSwitch(_switchStmt);
else if (_switchStmt.cases.size() == 1) else if (_switchStmt.cases.size() == 1)
return reduceSingleCaseSwitch(_switchStmt); return reduceSingleCaseSwitch(_switchStmt);
else if (boost::optional<u256> const constExprVal = hasLiteralValue(*_switchStmt.expression))
return replaceConstArgSwitch(_switchStmt, constExprVal.get());
return {}; return {};
}, },

View File

@ -5,7 +5,7 @@
case 1 { } case 1 { }
default { } default { }
switch 4 switch mload(4)
case 0 { } case 0 { }
case 1 { } case 1 { }
default { } default { }
@ -15,5 +15,5 @@
// { // {
// let y := 200 // let y := 200
// pop(add(y, 4)) // pop(add(y, 4))
// pop(4) // pop(mload(4))
// } // }

View File

@ -1,15 +1,19 @@
{ {
let y := 200 let y := 200
switch y switch calldataload(0)
case 0 { } case 0 { }
case 1 { y := 9 } case 1 { y := 9 }
case 2 { y := 10 }
} }
// ---- // ----
// structuralSimplifier // structuralSimplifier
// { // {
// let y := 200 // let y := 200
// if eq(1, y) // switch calldataload(0)
// { // case 1 {
// y := 9 // y := 9
// } // }
// case 2 {
// y := 10
// }
// } // }

View File

@ -1,6 +1,6 @@
{ {
let y := 200 let y := 200
switch y switch calldataload(0)
case 0 { } case 0 { }
case 1 { y := 9 } case 1 { y := 9 }
default { } default { }
@ -9,7 +9,7 @@
// structuralSimplifier // structuralSimplifier
// { // {
// let y := 200 // let y := 200
// if eq(1, y) // if eq(1, calldataload(0))
// { // {
// y := 9 // y := 9
// } // }

View File

@ -1,15 +1,19 @@
{ {
let y := 200 let y := 200
switch y switch calldataload(0)
case 1 { y := 9 } case 1 { y := 9 }
case 2 { y := 10 }
default { } default { }
} }
// ---- // ----
// structuralSimplifier // structuralSimplifier
// { // {
// let y := 200 // let y := 200
// if eq(1, y) // switch calldataload(0)
// { // case 1 {
// y := 9 // y := 9
// } // }
// case 2 {
// y := 10
// }
// } // }

View File

@ -1,10 +1,10 @@
{ {
switch 1 case 2 { mstore(0, 0) } switch calldataload(0) case 2 { mstore(0, 0) }
} }
// ---- // ----
// structuralSimplifier // structuralSimplifier
// { // {
// if eq(2, 1) // if eq(2, calldataload(0))
// { // {
// mstore(0, 0) // mstore(0, 0)
// } // }