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

Last change on this file was 5763, checked in by cameron, 6 months ago

Range RE objects

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