Changeset 5723 for icGREP


Ignore:
Timestamp:
Nov 3, 2017, 10:47:20 AM (16 months ago)
Author:
cameron
Message:

hasAssertion predicate, fix to simplifier

Location:
icGREP/icgrep-devel/icgrep/re
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_analysis.cpp

    r5720 r5723  
    323323        return true;
    324324    } else if (const Seq * seq = dyn_cast<Seq>(re)) {
    325     for (const RE * re : *seq) {
    326         if (!isTypeForLocal(re)) {
    327             return false;
    328         }
    329     }
     325        for (const RE * re : *seq) {
     326            if (!isTypeForLocal(re)) {
     327                return false;
     328            }
     329        }
    330330        return true;
    331331    } else if (const Rep * rep = dyn_cast<Rep>(re)) {
    332332        if (rep->getLB() != 0 || rep->getUB() != Rep::UNBOUNDED_REP) {
    333333            return false;
    334         } 
     334        }
    335335        return true;
    336336    } else if (const Diff * diff = dyn_cast<Diff>(re)) {
     
    344344}
    345345
     346bool hasAssertion(const RE * re) {
     347    if (isa<CC>(re)) {
     348        return false;
     349    } else if (const Name * n = dyn_cast<Name>(re)) {
     350        return hasAssertion(n->getDefinition());
     351    } else if (const Alt * alt = dyn_cast<Alt>(re)) {
     352        for (const RE * re : *alt) {
     353            if (hasAssertion(re)) return true;
     354        }
     355        return false;
     356    } else if (const Seq * seq = dyn_cast<Seq>(re)) {
     357        for (const RE * re : *seq) {
     358            if (hasAssertion(re)) return true;
     359        }
     360        return false;
     361    } else if (const Rep * rep = dyn_cast<Rep>(re)) {
     362        return hasAssertion(rep->getRE());
     363    } else if (const Diff * diff = dyn_cast<Diff>(re)) {
     364        return hasAssertion(diff->getLH()) || hasAssertion(diff->getRH());
     365    } else if (const Intersect * e = dyn_cast<Intersect>(re)) {
     366        return hasAssertion(e->getLH()) || hasAssertion(e->getRH());
     367    } else if (isa<Start>(re) || isa<End>(re) || isa<Assertion>(re)) {
     368        return true;
     369    }
     370    else llvm_unreachable("Unknown RE type");
     371}
     372
    346373void UndefinedNameError(const Name * n) {
    347374    report_fatal_error("Error: Undefined name in regular expression: \"" + n->getName() + "\".");
  • icGREP/icgrep-devel/icgrep/re/re_analysis.h

    r5682 r5723  
    2828bool isTypeForLocal(const RE * re);
    2929   
     30bool hasAssertion(const RE * re);
     31   
    3032void UndefinedNameError (const Name * n);
    31 
    3233}
    3334
  • icGREP/icgrep-devel/icgrep/re/re_simplifier.cpp

    r5630 r5723  
    2121            for (RE * item : *alt) {
    2222                item = simplify(item);
    23                 if (LLVM_UNLIKELY(isa<Vector>(item) && cast<Vector>(item)->empty())) {
     23                if (LLVM_UNLIKELY(isa<Alt>(item) && cast<Alt>(item)->empty())) {
    2424                    continue;
    2525                }
     
    3232            for (RE * item : *seq) {
    3333                item = simplify(item);
    34                 if (LLVM_UNLIKELY(isa<Vector>(item) && cast<Vector>(item)->empty())) {
     34                if (LLVM_UNLIKELY(isa<Seq>(item) && cast<Seq>(item)->empty())) {
    3535                    continue;
    3636                }
Note: See TracChangeset for help on using the changeset viewer.