From bddbcbe6a4a78efa3e40d86eac4657c593bb5d31 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 20 Feb 2020 16:17:09 +0100 Subject: [PATCH] Use bool type in word size transform. --- libyul/backends/wasm/EVMToEwasmTranslator.cpp | 2 +- libyul/backends/wasm/WordSizeTransform.cpp | 47 ++++++++++++++----- libyul/backends/wasm/WordSizeTransform.h | 14 ++---- test/libyul/YulOptimizerTest.cpp | 2 +- .../wordSizeTransform/switch_3.yul | 8 ++-- .../wordSizeTransform/switch_4.yul | 12 ++--- .../wordSizeTransform/switch_5.yul | 2 +- 7 files changed, 52 insertions(+), 35 deletions(-) diff --git a/libyul/backends/wasm/EVMToEwasmTranslator.cpp b/libyul/backends/wasm/EVMToEwasmTranslator.cpp index a5b88d053..dc69d913a 100644 --- a/libyul/backends/wasm/EVMToEwasmTranslator.cpp +++ b/libyul/backends/wasm/EVMToEwasmTranslator.cpp @@ -1235,7 +1235,7 @@ Object EVMToEwasmTranslator::run(Object const& _object) MainFunction{}(ast); ForLoopConditionIntoBody::run(context, ast); ExpressionSplitter::run(context, ast); - WordSizeTransform::run(m_dialect, WasmDialect::instance().defaultType, ast, nameDispenser); + WordSizeTransform::run(m_dialect, WasmDialect::instance(), ast, nameDispenser); NameDisplacer{nameDispenser, m_polyfillFunctions}(ast); for (auto const& st: m_polyfill->statements) diff --git a/libyul/backends/wasm/WordSizeTransform.cpp b/libyul/backends/wasm/WordSizeTransform.cpp index 9ebf31738..eec04fae6 100644 --- a/libyul/backends/wasm/WordSizeTransform.cpp +++ b/libyul/backends/wasm/WordSizeTransform.cpp @@ -45,7 +45,7 @@ void WordSizeTransform::operator()(FunctionCall& _fc) if (fun->literalArguments) { for (Expression& arg: _fc.arguments) - get(arg).type = m_defaultType; + get(arg).type = m_targetDialect.defaultType; return; } @@ -106,12 +106,17 @@ void WordSizeTransform::operator()(Block& _block) for (int i = 0; i < 3; i++) ret.push_back(VariableDeclaration{ varDecl.location, - {TypedName{varDecl.location, newLhs[i], m_defaultType}}, - make_unique(Literal{locationOf(*varDecl.value), LiteralKind::Number, "0"_yulstring, m_defaultType}) + {TypedName{varDecl.location, newLhs[i], m_targetDialect.defaultType}}, + make_unique(Literal{ + locationOf(*varDecl.value), + LiteralKind::Number, + "0"_yulstring, + m_targetDialect.defaultType + }) }); ret.push_back(VariableDeclaration{ varDecl.location, - {TypedName{varDecl.location, newLhs[3], m_defaultType}}, + {TypedName{varDecl.location, newLhs[3], m_targetDialect.defaultType}}, std::move(varDecl.value) }); return {std::move(ret)}; @@ -133,7 +138,7 @@ void WordSizeTransform::operator()(Block& _block) ret.push_back( VariableDeclaration{ varDecl.location, - {TypedName{varDecl.location, newLhs[i], m_defaultType}}, + {TypedName{varDecl.location, newLhs[i], m_targetDialect.defaultType}}, std::move(newRhs[i]) } ); @@ -163,7 +168,12 @@ void WordSizeTransform::operator()(Block& _block) ret.push_back(Assignment{ assignment.location, {Identifier{assignment.location, newLhs[i]}}, - make_unique(Literal{locationOf(*assignment.value), LiteralKind::Number, "0"_yulstring, m_defaultType}) + make_unique(Literal{ + locationOf(*assignment.value), + LiteralKind::Number, + "0"_yulstring, + m_targetDialect.defaultType + }) }); ret.push_back(Assignment{ assignment.location, @@ -209,14 +219,25 @@ void WordSizeTransform::operator()(Block& _block) void WordSizeTransform::run( Dialect const& _inputDialect, - YulString _targetDefaultType, + Dialect const& _targetDialect, Block& _ast, NameDispenser& _nameDispenser ) { // Free the name `or_bool`. NameDisplacer{_nameDispenser, {"or_bool"_yulstring}}(_ast); - WordSizeTransform{_inputDialect, _nameDispenser, _targetDefaultType}(_ast); + WordSizeTransform{_inputDialect, _targetDialect, _nameDispenser}(_ast); +} + +WordSizeTransform::WordSizeTransform( + Dialect const& _inputDialect, + Dialect const& _targetDialect, + NameDispenser& _nameDispenser +): + m_inputDialect(_inputDialect), + m_targetDialect(_targetDialect), + m_nameDispenser(_nameDispenser) +{ } void WordSizeTransform::rewriteVarDeclList(TypedNameList& _nameList) @@ -227,7 +248,7 @@ void WordSizeTransform::rewriteVarDeclList(TypedNameList& _nameList) { TypedNameList ret; for (auto newName: generateU64IdentifierNames(_n.name)) - ret.emplace_back(TypedName{_n.location, newName, m_defaultType}); + ret.emplace_back(TypedName{_n.location, newName, m_targetDialect.defaultType}); return ret; } ); @@ -291,7 +312,7 @@ vector WordSizeTransform::handleSwitchInternal( for (auto& c: cases) { - Literal label{_location, LiteralKind::Number, YulString(c.first.str()), m_defaultType}; + Literal label{_location, LiteralKind::Number, YulString(c.first.str()), m_targetDialect.defaultType}; ret.cases.emplace_back(Case{ c.second.front().location, make_unique(std::move(label)), @@ -312,7 +333,7 @@ vector WordSizeTransform::handleSwitchInternal( Assignment{ _location, {{_location, _runDefaultFlag}}, - make_unique(Literal{_location, LiteralKind::Number, "1"_yulstring, m_defaultType}) + make_unique(Literal{_location, LiteralKind::Boolean, "true"_yulstring, m_targetDialect.boolType}) } )} }); @@ -337,7 +358,7 @@ std::vector WordSizeTransform::handleSwitch(Switch& _switch) _switch.cases.pop_back(); ret.emplace_back(VariableDeclaration{ _switch.location, - {TypedName{_switch.location, runDefaultFlag, m_defaultType}}, + {TypedName{_switch.location, runDefaultFlag, m_targetDialect.boolType}}, {} }); } @@ -392,7 +413,7 @@ array, 4> WordSizeTransform::expandValue(Expression const lit.location, LiteralKind::Number, YulString(currentVal.str()), - m_defaultType + m_targetDialect.defaultType } ); } diff --git a/libyul/backends/wasm/WordSizeTransform.h b/libyul/backends/wasm/WordSizeTransform.h index 2e4db8446..67dfe8864 100644 --- a/libyul/backends/wasm/WordSizeTransform.h +++ b/libyul/backends/wasm/WordSizeTransform.h @@ -69,7 +69,7 @@ public: static void run( Dialect const& _inputDialect, - YulString _targetDefaultType, + Dialect const& _targetDialect, Block& _ast, NameDispenser& _nameDispenser ); @@ -77,13 +77,9 @@ public: private: explicit WordSizeTransform( Dialect const& _inputDialect, - NameDispenser& _nameDispenser, - YulString _defaultType - ): - m_inputDialect(_inputDialect), - m_nameDispenser(_nameDispenser), - m_defaultType(_defaultType) - { } + Dialect const& _targetDialect, + NameDispenser& _nameDispenser + ); void rewriteVarDeclList(std::vector&); void rewriteIdentifierList(std::vector&); @@ -103,8 +99,8 @@ private: std::vector expandValueToVector(Expression const& _e); Dialect const& m_inputDialect; + Dialect const& m_targetDialect; NameDispenser& m_nameDispenser; - YulString m_defaultType; /// maps original u256 variable's name to corresponding u64 variables' names std::map> m_variableMapping; }; diff --git a/test/libyul/YulOptimizerTest.cpp b/test/libyul/YulOptimizerTest.cpp index 699a767d0..e488460fc 100644 --- a/test/libyul/YulOptimizerTest.cpp +++ b/test/libyul/YulOptimizerTest.cpp @@ -359,7 +359,7 @@ TestCase::TestResult YulOptimizerTest::run(ostream& _stream, string const& _line { disambiguate(); ExpressionSplitter::run(*m_context, *m_ast); - WordSizeTransform::run(*m_dialect, ""_yulstring, *m_ast, *m_nameDispenser); + WordSizeTransform::run(*m_dialect, *m_dialect, *m_ast, *m_nameDispenser); } else if (m_optimizerStep == "fullSuite") { diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul index 50a36f61f..617eebb64 100644 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul +++ b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul @@ -67,13 +67,13 @@ // let _10_3 := 3 // sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // if run_default // { // let _11_0 := 0 diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul index 106941302..20f81d614 100644 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul +++ b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul @@ -45,9 +45,9 @@ // let _8_3 := 2 // sstore(_8_0, _8_1, _8_2, _8_3, _7_0, _7_1, _7_2, _7_3) // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // } // case 536870912 { // switch _2_2 @@ -75,13 +75,13 @@ // let _10_3 := 3 // sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // } -// default { run_default := 1 } +// default { run_default := true } // if run_default // { // let _11_0 := 0 diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul index eb05e0a6c..2a42adefe 100644 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul +++ b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul @@ -13,7 +13,7 @@ // let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) // let run_default // switch _2_0 -// default { run_default := 1 } +// default { run_default := true } // if run_default // { // let _3_0 := 0