From ff82ea6d6e36be28bda536d03ccc2e3a47bd7ed4 Mon Sep 17 00:00:00 2001 From: Alex Coyte Date: Tue, 5 Apr 2016 11:07:26 +1000 Subject: [PATCH] smallwrite: don't recompile the dfa if prune fails --- src/nfa/mcclellancompile_util.cpp | 6 ++++-- src/nfa/mcclellancompile_util.h | 8 +++++++- src/smallwrite/smallwrite_build.cpp | 24 +++++++++++++----------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/nfa/mcclellancompile_util.cpp b/src/nfa/mcclellancompile_util.cpp index 2c946520..234574d8 100644 --- a/src/nfa/mcclellancompile_util.cpp +++ b/src/nfa/mcclellancompile_util.cpp @@ -228,13 +228,13 @@ void calc_min_dist_to_accept(const raw_dfa &raw, } } -void prune_overlong(raw_dfa &raw, u32 max_offset) { +bool prune_overlong(raw_dfa &raw, u32 max_offset) { DEBUG_PRINTF("pruning to at most %u\n", max_offset); vector bob_dist; u32 max_min_dist_bob = calc_min_dist_from_bob(raw, &bob_dist); if (max_min_dist_bob <= max_offset) { - return; + return false; } vector > in_edges; @@ -282,6 +282,8 @@ void prune_overlong(raw_dfa &raw, u32 max_offset) { /* update specials */ raw.start_floating = new_ids[raw.start_floating]; raw.start_anchored = new_ids[raw.start_anchored]; + + return true; } set all_reports(const raw_dfa &rdfa) { diff --git a/src/nfa/mcclellancompile_util.h b/src/nfa/mcclellancompile_util.h index 7015893b..7b6c033a 100644 --- a/src/nfa/mcclellancompile_util.h +++ b/src/nfa/mcclellancompile_util.h @@ -37,7 +37,13 @@ namespace ue2 { u32 remove_leading_dots(raw_dfa &raw); -void prune_overlong(raw_dfa &raw, u32 max_offset); + +/** + * Prunes any states which cannot be reached within max_offset from start of + * stream. Returns false if no changes are made to the rdfa + */ +bool prune_overlong(raw_dfa &raw, u32 max_offset); + std::set all_reports(const raw_dfa &rdfa); bool has_eod_accepts(const raw_dfa &rdfa); bool has_non_eod_accepts(const raw_dfa &rdfa); diff --git a/src/smallwrite/smallwrite_build.cpp b/src/smallwrite/smallwrite_build.cpp index 097e0432..dfefe5e8 100644 --- a/src/smallwrite/smallwrite_build.cpp +++ b/src/smallwrite/smallwrite_build.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -317,21 +317,23 @@ aligned_unique_ptr prepEngine(raw_dfa &rdfa, u32 roseQuality, } if (is_slow(rdfa, accel_states, roseQuality)) { + DEBUG_PRINTF("is slow\n"); *small_region = cc.grey.smallWriteLargestBufferBad; if (*small_region <= *start_offset) { return nullptr; } - prune_overlong(rdfa, *small_region - *start_offset); - if (rdfa.start_anchored == DEAD_STATE) { - DEBUG_PRINTF("all patterns pruned out\n"); - return nullptr; - } + if (prune_overlong(rdfa, *small_region - *start_offset)) { + if (rdfa.start_anchored == DEAD_STATE) { + DEBUG_PRINTF("all patterns pruned out\n"); + return nullptr; + } - nfa = mcclellanCompile(rdfa, cc, &accel_states); - if (!nfa) { - DEBUG_PRINTF("mcclellan compile failed for smallwrite NFA\n"); - assert(0); /* we were able to build orig dfa but not the trimmed? */ - return nullptr; + nfa = mcclellanCompile(rdfa, cc, &accel_states); + if (!nfa) { + DEBUG_PRINTF("mcclellan compile failed for smallwrite NFA\n"); + assert(0); /* able to build orig dfa but not the trimmed? */ + return nullptr; + } } } else { *small_region = cc.grey.smallWriteLargestBuffer;