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

Last change on this file since 5755 was 5755, checked in by nmedfort, 22 months ago

Bug fixes and simplified MultiBlockKernel? logic

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