Merge pull request #1434 from ethereum/addpop

optimizing ADD; POP and similar
This commit is contained in:
chriseth 2016-11-24 20:46:40 +01:00 committed by GitHub
commit a077a3a5ec
2 changed files with 29 additions and 3 deletions

View File

@ -14,7 +14,7 @@
You should have received a copy of the GNU General Public License
along with solidity. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file Assembly.h
/** @file AssemblyItem.h
* @author Gav Wood <i@gavwood.com>
* @date 2014
*/

View File

@ -15,7 +15,7 @@
along with solidity. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file PeepholeOptimiser.h
* @file PeepholeOptimiser.cpp
* Performs local optimising code changes to assembly.
*/
@ -57,6 +57,32 @@ struct PushPop
}
};
struct AddPop
{
static size_t windowSize() { return 2; }
static bool apply(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out)
{
if (_in[1] == Instruction::POP &&
_in[0].type() == Operation
)
{
Instruction i0 = _in[0].instruction();
if (instructionInfo(i0).ret == 1 &&
!SemanticInformation::invalidatesMemory(i0) &&
!SemanticInformation::invalidatesStorage(i0) &&
!SemanticInformation::altersControlFlow(i0) &&
!instructionInfo(i0).sideEffects
)
{
for (int j = 0; j < instructionInfo(i0).args; j++)
*_out = Instruction::POP;
return true;
}
}
return false;
}
};
struct DoubleSwap
{
static size_t windowSize() { return 2; }
@ -136,7 +162,7 @@ bool PeepholeOptimiser::optimise()
{
OptimiserState state {m_items, 0, std::back_inserter(m_optimisedItems)};
while (state.i < m_items.size())
applyMethods(state, PushPop(), DoubleSwap(), JumpToNext(), TagConjunctions(), Identity());
applyMethods(state, PushPop(), AddPop(), DoubleSwap(), JumpToNext(), TagConjunctions(), Identity());
if (m_optimisedItems.size() < m_items.size())
{
m_items = std::move(m_optimisedItems);