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

Last change on this file was 5630, checked in by nmedfort, 2 weeks ago

Partial check-in for avoidance of compiling Pablo/LLVM code to determine the Kernel struct type when using a cached object. Inactive RE alternation minimization check in.

File size: 3.3 KB
Line 
1#include "re_memoizer.hpp"
2#include <re/re_alt.h>
3#include <re/re_cc.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 <llvm/Support/ErrorHandling.h>
10
11using llvm::cast;
12
13namespace re {
14
15static bool compare(const RE * const lh, const RE * const rh);
16
17static bool lessThan(const Vector * const lh, const Vector * const rh) {
18    assert (lh->getClassTypeId() == rh->getClassTypeId());
19    assert (lh->getClassTypeId() == RE::ClassTypeId::Alt || lh->getClassTypeId() == RE::ClassTypeId::Seq);
20    if (lh->size() != rh->size()) {
21        return lh->size() < rh->size();
22    }
23    for (auto i = lh->begin(), j = rh->begin(); i != lh->end(); ++i, ++j) {
24        assert (*i && *j);
25        if (compare(*i, *j)) {
26            return true;
27        }
28    }
29    return false;
30}
31
32inline bool lessThan(const Assertion * const lh, const Assertion * const rh) {
33    if (lh->getKind() != rh->getKind()) {
34        return lh->getKind() < rh->getKind();
35    }
36    if (lh->getSense() != rh->getSense()) {
37        return lh->getSense() < rh->getSense();
38    }
39    return compare(lh->getAsserted(), rh->getAsserted());
40}
41
42inline bool lessThan(const Rep * const lh, const Rep * const rh) {
43    if (lh->getLB() != rh->getLB()) {
44        return lh->getLB() < rh->getLB();
45    }
46    if (lh->getUB() != rh->getUB()) {
47        return lh->getUB() < rh->getUB();
48    }
49    return compare(lh->getRE(), rh->getRE());
50}
51
52inline bool lessThan(const Diff * const lh, const Diff * const rh) {
53    return compare(lh->getLH(), rh->getLH()) || compare(lh->getRH(), rh->getRH());
54}
55
56static bool lessThan(const Intersect * const lh, const Intersect * const rh) {
57    return compare(lh->getLH(), rh->getLH()) || compare(lh->getRH(), rh->getRH());
58}
59
60inline bool compare(const RE * const lh, const RE * const rh) {
61    using Type = RE::ClassTypeId;
62    assert (lh && rh);
63    const auto typeL = lh->getClassTypeId();
64    const auto typeR = rh->getClassTypeId();
65    if (LLVM_LIKELY(typeL != typeR)) {
66        if ((typeL == Type::CC || typeR == Type::CC) && (typeL == Type::Name || typeR == Type::Name)) {
67            if (typeL == Type::Name) {
68                return *cast<Name>(lh) < *cast<CC>(rh);
69            } else {
70                return *cast<Name>(rh) > *cast<CC>(lh);
71            }
72        }
73        return typeL < typeR;
74    }
75    switch (typeL) {
76        case Type::Alt:
77        case Type::Seq:
78            return lessThan(cast<Vector>(lh), cast<Vector>(rh));
79        case Type::Any: case Type::End: case Type::Start:
80            return false;
81        case Type::Assertion:
82            return lessThan(cast<Assertion>(lh), cast<Assertion>(rh));
83        case Type::CC:
84            return *cast<CC>(lh) < *cast<CC>(rh);
85        case Type::Name:
86            return *cast<Name>(lh) < *cast<Name>(rh);
87        case Type::Diff:
88            return lessThan(cast<Diff>(lh), cast<Diff>(rh));
89        case Type::Intersect:
90            return lessThan(cast<Intersect>(lh), cast<Intersect>(rh));
91        case Type::Rep:
92            return lessThan(cast<Rep>(lh), cast<Rep>(rh));
93        default:
94            llvm_unreachable("RE object of unknown type given to Memoizer");
95            return false;
96    }
97}
98
99bool MemoizerComparator::operator()(const RE * const lh, const RE * const rh) const {
100    return compare(lh, rh);
101}
102
103}
Note: See TracBrowser for help on using the repository browser.