source: icGREP/icgrep-devel/icgrep/re/re_simplifier.cpp

Last change on this file was 5723, checked in by cameron, 3 weeks ago

hasAssertion predicate, fix to simplifier

File size: 2.0 KB
Line 
1#include "re_simplifier.h"
2#include <re/re_name.h>
3#include <re/re_alt.h>
4#include <re/re_seq.h>
5#include <re/re_rep.h>
6#include <re/re_diff.h>
7#include <re/re_intersect.h>
8#include <re/re_assertion.h>
9#include <re/re_memoizer.hpp>
10#include <boost/container/flat_set.hpp>
11
12using namespace llvm;
13
14namespace re {
15
16struct PassContainer {
17    RE * simplify(RE * re) {
18        if (Alt * alt = dyn_cast<Alt>(re)) {
19            boost::container::flat_set<RE *> list;
20            list.reserve(alt->size());
21            for (RE * item : *alt) {
22                item = simplify(item);
23                if (LLVM_UNLIKELY(isa<Alt>(item) && cast<Alt>(item)->empty())) {
24                    continue;
25                }
26                list.insert(item);
27            }
28            re = makeAlt(list.begin(), list.end());
29        } else if (Seq * seq = dyn_cast<Seq>(re)) {
30            std::vector<RE *> list;
31            list.reserve(seq->size());
32            for (RE * item : *seq) {
33                item = simplify(item);
34                if (LLVM_UNLIKELY(isa<Seq>(item) && cast<Seq>(item)->empty())) {
35                    continue;
36                }
37                list.push_back(item);
38            }
39            re = makeSeq(list.begin(), list.end());
40        } else if (Assertion * a = dyn_cast<Assertion>(re)) {
41            re = makeAssertion(simplify(a->getAsserted()), a->getKind(), a->getSense());
42        } else if (Rep * rep = dyn_cast<Rep>(re)) {
43            RE * expr = simplify(rep->getRE());
44            re = makeRep(expr, rep->getLB(), rep->getUB());
45        } else if (Diff * diff = dyn_cast<Diff>(re)) {
46            re = makeDiff(simplify(diff->getLH()), simplify(diff->getRH()));
47        } else if (Intersect * e = dyn_cast<Intersect>(re)) {
48            re = makeIntersect(simplify(e->getLH()), simplify(e->getRH()));
49        }
50        return mMemoizer.memoize(re);
51    }
52private:
53    Memoizer mMemoizer;
54};
55
56RE * RE_Simplifier::simplify(RE * re) {
57    PassContainer pc;
58    return pc.simplify(re);
59}
60
61}
Note: See TracBrowser for help on using the repository browser.