mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add test for jumpdest removal.
This commit is contained in:
parent
d15526f877
commit
223235c97e
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <libevmasm/CommonSubexpressionEliminator.h>
|
#include <libevmasm/CommonSubexpressionEliminator.h>
|
||||||
#include <libevmasm/PeepholeOptimiser.h>
|
#include <libevmasm/PeepholeOptimiser.h>
|
||||||
|
#include <libevmasm/JumpdestRemover.h>
|
||||||
#include <libevmasm/ControlFlowGraph.h>
|
#include <libevmasm/ControlFlowGraph.h>
|
||||||
#include <libevmasm/BlockDeduplicator.h>
|
#include <libevmasm/BlockDeduplicator.h>
|
||||||
#include <libevmasm/Assembly.h>
|
#include <libevmasm/Assembly.h>
|
||||||
@ -840,6 +841,89 @@ BOOST_AUTO_TEST_CASE(peephole_double_push)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(jumpdest_removal)
|
||||||
|
{
|
||||||
|
AssemblyItems items{
|
||||||
|
AssemblyItem(Tag, 2),
|
||||||
|
AssemblyItem(PushTag, 1),
|
||||||
|
u256(5),
|
||||||
|
AssemblyItem(Tag, 10),
|
||||||
|
AssemblyItem(Tag, 3),
|
||||||
|
u256(6),
|
||||||
|
AssemblyItem(Tag, 1),
|
||||||
|
Instruction::JUMP,
|
||||||
|
};
|
||||||
|
AssemblyItems expectation{
|
||||||
|
AssemblyItem(PushTag, 1),
|
||||||
|
u256(5),
|
||||||
|
u256(6),
|
||||||
|
AssemblyItem(Tag, 1),
|
||||||
|
Instruction::JUMP
|
||||||
|
};
|
||||||
|
JumpdestRemover jdr(items);
|
||||||
|
BOOST_REQUIRE(jdr.optimise({}));
|
||||||
|
BOOST_CHECK_EQUAL_COLLECTIONS(
|
||||||
|
items.begin(), items.end(),
|
||||||
|
expectation.begin(), expectation.end()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(jumpdest_removal_subassemblies)
|
||||||
|
{
|
||||||
|
// This tests that tags from subassemblies are not removed
|
||||||
|
// if they are referenced by a super-assembly. Furthermore,
|
||||||
|
// tag unifications (due to block deduplication) is also
|
||||||
|
// visible at the super-assembly.
|
||||||
|
|
||||||
|
Assembly main;
|
||||||
|
AssemblyPointer sub = make_shared<Assembly>();
|
||||||
|
|
||||||
|
sub->append(u256(1));
|
||||||
|
auto t1 = sub->newTag();
|
||||||
|
sub->append(t1);
|
||||||
|
sub->append(u256(2));
|
||||||
|
sub->append(Instruction::JUMP);
|
||||||
|
auto t2 = sub->newTag();
|
||||||
|
sub->append(t2); // Identical to T1, will be unified
|
||||||
|
sub->append(u256(2));
|
||||||
|
sub->append(Instruction::JUMP);
|
||||||
|
auto t3 = sub->newTag();
|
||||||
|
sub->append(t3);
|
||||||
|
auto t4 = sub->newTag();
|
||||||
|
sub->append(t4);
|
||||||
|
auto t5 = sub->newTag();
|
||||||
|
sub->append(t5); // This will be removed
|
||||||
|
sub->append(u256(7));
|
||||||
|
sub->append(t4.pushTag());
|
||||||
|
sub->append(Instruction::JUMP);
|
||||||
|
|
||||||
|
size_t subId = size_t(main.appendSubroutine(sub).data());
|
||||||
|
main.append(t1.toSubAssemblyTag(subId));
|
||||||
|
main.append(t1.toSubAssemblyTag(subId));
|
||||||
|
main.append(u256(8));
|
||||||
|
|
||||||
|
main.optimise(true);
|
||||||
|
|
||||||
|
AssemblyItems expectationMain{
|
||||||
|
AssemblyItem(PushSubSize, 0),
|
||||||
|
t1.toSubAssemblyTag(subId).pushTag(),
|
||||||
|
t1.toSubAssemblyTag(subId).pushTag(),
|
||||||
|
u256(8)
|
||||||
|
};
|
||||||
|
BOOST_CHECK_EQUAL_COLLECTIONS(
|
||||||
|
main.items().begin(), main.items().end(),
|
||||||
|
expectationMain.begin(), expectationMain.end()
|
||||||
|
);
|
||||||
|
|
||||||
|
AssemblyItems expectationSub{
|
||||||
|
u256(1), t1.tag(), u256(2), Instruction::JUMP, t4.tag(), u256(7), t4.pushTag(), Instruction::JUMP
|
||||||
|
};
|
||||||
|
BOOST_CHECK_EQUAL_COLLECTIONS(
|
||||||
|
sub->items().begin(), sub->items().end(),
|
||||||
|
expectationSub.begin(), expectationSub.end()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(cse_sub_zero)
|
BOOST_AUTO_TEST_CASE(cse_sub_zero)
|
||||||
{
|
{
|
||||||
checkCSE({
|
checkCSE({
|
||||||
|
Loading…
Reference in New Issue
Block a user