Further fixes to the optimizer.

This commit is contained in:
chriseth 2016-08-01 23:13:56 +02:00
parent fb90e8876f
commit c0afb4549e
3 changed files with 9 additions and 5 deletions

View File

@ -250,10 +250,11 @@ void ControlFlowGraph::gatherKnowledge()
KnownStatePointer state = item.state;
if (block.startState)
{
if (m_joinKnowledge)
state->reduceToCommonKnowledge(*block.startState, !item.blocksSeen.count(item.blockId));
else
// We call reduceToCommonKnowledge even in the non-join setting to get the correct
// sequence number
if (!m_joinKnowledge)
state->reset();
state->reduceToCommonKnowledge(*block.startState, !item.blocksSeen.count(item.blockId));
if (*state == *block.startState)
continue;
}

View File

@ -116,7 +116,7 @@ private:
unsigned m_lastUsedId = 0;
AssemblyItems const& m_items;
bool m_joinKnowledge;
bool m_joinKnowledge = true;
std::map<BlockId, BasicBlock> m_blocks;
};

View File

@ -282,6 +282,8 @@ BOOST_AUTO_TEST_CASE(storage_write_in_loops)
compareVersions("f(uint256)", 36);
}
// Test disabled with https://github.com/ethereum/solidity/pull/762
// Information in joining branches is not retained anymore.
BOOST_AUTO_TEST_CASE(retain_information_in_branches)
{
// This tests that the optimizer knows that we already have "z == sha3(y)" inside both branches.
@ -315,7 +317,8 @@ BOOST_AUTO_TEST_CASE(retain_information_in_branches)
if (_instr == Instruction::SHA3)
numSHA3s++;
});
BOOST_CHECK_EQUAL(1, numSHA3s);
// TEST DISABLED - OPTIMIZER IS NOT EFFECTIVE ON THIS ONE ANYMORE
// BOOST_CHECK_EQUAL(1, numSHA3s);
}
BOOST_AUTO_TEST_CASE(store_tags_as_unions)