Add a peephole optimization pass to the regex compiler

This commit is contained in:
Maxime Coste 2019-01-06 11:28:39 +11:00
parent 0364a99827
commit 77b1216ace
2 changed files with 19 additions and 1 deletions

View File

@ -684,6 +684,7 @@ struct RegexCompiler
{
m_program.forward_start_desc = compute_start_desc<RegexMode::Forward>();
compile_node<RegexMode::Forward>(0);
peephole_optimize(0, m_program.instructions.size());
push_inst(CompiledRegex::Match);
}
@ -692,6 +693,7 @@ struct RegexCompiler
m_program.first_backward_inst = m_program.instructions.size();
m_program.backward_start_desc = compute_start_desc<RegexMode::Backward>();
compile_node<RegexMode::Backward>(0);
peephole_optimize(m_program.first_backward_inst, m_program.instructions.size());
push_inst(CompiledRegex::Match);
}
else
@ -1019,6 +1021,21 @@ private:
return std::make_unique<CompiledRegex::StartDesc>(start_desc);
}
void peephole_optimize(size_t begin, size_t end)
{
if (not (m_flags & RegexCompileFlags::Optimize))
return;
// Move saves after all assertions on the same character
auto is_assertion = [](CompiledRegex::Op op) { return op >= CompiledRegex::LineStart; };
for (auto i = begin, j = begin + 1; j < end; ++i, ++j)
{
if (m_program.instructions[i].op == CompiledRegex::Save and
is_assertion(m_program.instructions[j].op))
std::swap(m_program.instructions[i], m_program.instructions[j]);
}
}
const ParsedRegex::Node& get_node(ParsedRegex::NodeIndex index) const
{
return m_parsed_regex.nodes[index];

View File

@ -471,7 +471,8 @@ private:
release_saves(m_captures);
m_captures = -1;
m_threads.grow_ifn();
const int16_t first_inst = &config.instructions[0] - &m_program.instructions[0];
const int16_t first_inst = forward ? 0 : m_program.first_backward_inst;
m_threads.push_current({first_inst, -1});
const auto& start_desc = forward ? m_program.forward_start_desc : m_program.backward_start_desc;