mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #9295 from ethereum/requireFLIR
Require for loop init rewriter for SSA.
This commit is contained in:
commit
b9b24daa8a
@ -194,7 +194,7 @@ void IntroduceControlFlowSSA::operator()(FunctionDefinition& _function)
|
|||||||
|
|
||||||
void IntroduceControlFlowSSA::operator()(ForLoop& _for)
|
void IntroduceControlFlowSSA::operator()(ForLoop& _for)
|
||||||
{
|
{
|
||||||
(*this)(_for.pre);
|
yulAssert(_for.pre.statements.empty(), "For loop init rewriter not run.");
|
||||||
|
|
||||||
Assignments assignments;
|
Assignments assignments;
|
||||||
assignments(_for.body);
|
assignments(_for.body);
|
||||||
@ -357,11 +357,7 @@ void PropagateValues::operator()(Assignment& _assignment)
|
|||||||
|
|
||||||
void PropagateValues::operator()(ForLoop& _for)
|
void PropagateValues::operator()(ForLoop& _for)
|
||||||
{
|
{
|
||||||
// This will clear the current value in case of a reassignment inside the
|
yulAssert(_for.pre.statements.empty(), "For loop init rewriter not run.");
|
||||||
// init part, although the new variable would still be in scope inside the whole loop.
|
|
||||||
// This small inefficiency is fine if we move the pre part of all for loops out
|
|
||||||
// of the for loop.
|
|
||||||
(*this)(_for.pre);
|
|
||||||
|
|
||||||
Assignments assignments;
|
Assignments assignments;
|
||||||
assignments(_for.body);
|
assignments(_for.body);
|
||||||
|
@ -85,7 +85,7 @@ class NameDispenser;
|
|||||||
*
|
*
|
||||||
* TODO Which transforms are required to keep this idempotent?
|
* TODO Which transforms are required to keep this idempotent?
|
||||||
*
|
*
|
||||||
* Prerequisite: Disambiguator.
|
* Prerequisite: Disambiguator, ForLoopInitRewriter.
|
||||||
*/
|
*/
|
||||||
class SSATransform: public ASTModifier
|
class SSATransform: public ASTModifier
|
||||||
{
|
{
|
||||||
|
@ -255,6 +255,7 @@ TestCase::TestResult YulOptimizerTest::run(ostream& _stream, string const& _line
|
|||||||
else if (m_optimizerStep == "ssaTransform")
|
else if (m_optimizerStep == "ssaTransform")
|
||||||
{
|
{
|
||||||
disambiguate();
|
disambiguate();
|
||||||
|
ForLoopInitRewriter::run(*m_context, *m_ast);
|
||||||
SSATransform::run(*m_context, *m_ast);
|
SSATransform::run(*m_context, *m_ast);
|
||||||
}
|
}
|
||||||
else if (m_optimizerStep == "redundantAssignEliminator")
|
else if (m_optimizerStep == "redundantAssignEliminator")
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
for { let x := 0 } 1 { x := 2 } {
|
||||||
|
for { let y := 0 } 1 { y := 6 } {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// step: ssaTransform
|
||||||
|
//
|
||||||
|
// {
|
||||||
|
// let x_1 := 0
|
||||||
|
// let x := x_1
|
||||||
|
// for { }
|
||||||
|
// 1
|
||||||
|
// {
|
||||||
|
// let x_7 := x
|
||||||
|
// let x_2 := 2
|
||||||
|
// x := x_2
|
||||||
|
// }
|
||||||
|
// {
|
||||||
|
// let x_5 := x
|
||||||
|
// let y_3 := 0
|
||||||
|
// let y := y_3
|
||||||
|
// for { }
|
||||||
|
// 1
|
||||||
|
// {
|
||||||
|
// let y_6 := y
|
||||||
|
// let y_4 := 6
|
||||||
|
// y := y_4
|
||||||
|
// }
|
||||||
|
// { }
|
||||||
|
// }
|
||||||
|
// }
|
@ -12,7 +12,8 @@
|
|||||||
// {
|
// {
|
||||||
// let a_1 := mload(0)
|
// let a_1 := mload(0)
|
||||||
// let a := a_1
|
// let a := a_1
|
||||||
// for { mstore(0, a_1) }
|
// mstore(0, a_1)
|
||||||
|
// for { }
|
||||||
// a
|
// a
|
||||||
// {
|
// {
|
||||||
// let a_4 := a
|
// let a_4 := a
|
||||||
|
@ -12,19 +12,9 @@
|
|||||||
// {
|
// {
|
||||||
// let a_1 := mload(0)
|
// let a_1 := mload(0)
|
||||||
// let a := a_1
|
// let a := a_1
|
||||||
// for {
|
// let a_2 := add(a_1, 3)
|
||||||
// let a_2 := add(a_1, 3)
|
// a := a_2
|
||||||
// a := a_2
|
// for { } a_2 { mstore(0, a_2) }
|
||||||
// }
|
// { mstore(0, a_2) }
|
||||||
// a
|
// mstore(0, a_2)
|
||||||
// {
|
|
||||||
// let a_4 := a
|
|
||||||
// mstore(0, a_4)
|
|
||||||
// }
|
|
||||||
// {
|
|
||||||
// let a_3 := a
|
|
||||||
// mstore(0, a_3)
|
|
||||||
// }
|
|
||||||
// let a_5 := a
|
|
||||||
// mstore(0, a_5)
|
|
||||||
// }
|
// }
|
||||||
|
@ -12,7 +12,8 @@
|
|||||||
// {
|
// {
|
||||||
// let a_1 := mload(0)
|
// let a_1 := mload(0)
|
||||||
// let a := a_1
|
// let a := a_1
|
||||||
// for { mstore(0, a_1) }
|
// mstore(0, a_1)
|
||||||
|
// for { }
|
||||||
// a
|
// a
|
||||||
// {
|
// {
|
||||||
// let a_4 := a
|
// let a_4 := a
|
||||||
|
@ -32,10 +32,9 @@
|
|||||||
// a := a_4
|
// a := a_4
|
||||||
// }
|
// }
|
||||||
// let a_10 := a
|
// let a_10 := a
|
||||||
// for {
|
// let a_5 := add(a_10, 3)
|
||||||
// let a_5 := add(a_10, 3)
|
// a := a_5
|
||||||
// a := a_5
|
// for { }
|
||||||
// }
|
|
||||||
// a
|
// a
|
||||||
// {
|
// {
|
||||||
// let a_12 := a
|
// let a_12 := a
|
||||||
|
Loading…
Reference in New Issue
Block a user