Test multiple instructions with the (non)commutative peephole optimiser

This commit is contained in:
Alex Beregszaszi 2018-04-03 18:05:06 +02:00
parent 17bcabb6cf
commit be6051bead

View File

@ -860,53 +860,78 @@ BOOST_AUTO_TEST_CASE(peephole_pop_calldatasize)
BOOST_AUTO_TEST_CASE(peephole_commutative_swap1)
{
AssemblyItems items{
u256(1),
u256(2),
Instruction::SWAP1,
vector<Instruction> ops{
Instruction::ADD,
u256(4),
u256(5)
Instruction::MUL,
Instruction::EQ,
Instruction::AND,
Instruction::OR,
Instruction::XOR
};
AssemblyItems expectation{
u256(1),
u256(2),
Instruction::ADD,
u256(4),
u256(5)
};
PeepholeOptimiser peepOpt(items);
BOOST_REQUIRE(peepOpt.optimise());
BOOST_CHECK_EQUAL_COLLECTIONS(
for (Instruction const op: ops)
{
AssemblyItems items{
u256(1),
u256(2),
Instruction::SWAP1,
op,
u256(4),
u256(5)
};
AssemblyItems expectation{
u256(1),
u256(2),
op,
u256(4),
u256(5)
};
PeepholeOptimiser peepOpt(items);
BOOST_REQUIRE(peepOpt.optimise());
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
);
expectation.begin(), expectation.end()
);
}
}
BOOST_AUTO_TEST_CASE(peephole_noncommutative_swap1)
{
AssemblyItems items{
u256(1),
u256(2),
Instruction::SWAP1,
// NOTE: not comprehensive
vector<Instruction> ops{
Instruction::SUB,
u256(4),
u256(5)
Instruction::DIV,
Instruction::SDIV,
Instruction::MOD,
Instruction::SMOD,
Instruction::EXP,
Instruction::LT,
Instruction::GT
};
AssemblyItems expectation{
u256(1),
u256(2),
Instruction::SWAP1,
Instruction::SUB,
u256(4),
u256(5)
};
PeepholeOptimiser peepOpt(items);
BOOST_REQUIRE(!peepOpt.optimise());
BOOST_CHECK_EQUAL_COLLECTIONS(
for (Instruction const op: ops)
{
AssemblyItems items{
u256(1),
u256(2),
Instruction::SWAP1,
op,
u256(4),
u256(5)
};
AssemblyItems expectation{
u256(1),
u256(2),
Instruction::SWAP1,
op,
u256(4),
u256(5)
};
PeepholeOptimiser peepOpt(items);
BOOST_REQUIRE(!peepOpt.optimise());
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
);
expectation.begin(), expectation.end()
);
}
}
BOOST_AUTO_TEST_CASE(jumpdest_removal)