Ignore:
Timestamp:
Sep 30, 2014, 2:44:40 PM (5 years ago)
Author:
nmedfort
Message:

Replaced dynamic_cast with llvm::dyn_cast in pablo code; implemented make functions for pablo constructors. Disabled RTTI.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/pe_or.cpp

    r4199 r4200  
    66
    77#include "pe_or.h"
     8#include "pe_all.h"
     9#include "pe_not.h"
     10#include "pe_and.h"
     11
     12namespace pablo {
     13
     14PabloE * make_or(PabloE * expr1, PabloE * expr2) {
     15    if (All * all = dyn_cast<All>(expr1)) {
     16        if (all->getValue() == 1) {
     17            return all; //Return a true literal.
     18        }
     19        else {
     20            return expr2;
     21        }
     22    }
     23    else if (All * all = dyn_cast<All>(expr2)) {
     24        if (all->getValue() == 1) {
     25            return all; //Return a true literal.
     26        }
     27        else {
     28            return expr1;
     29        }
     30    }
     31    else if (Not * not1 = dyn_cast<Not>(expr1)) {
     32        // ¬a√b = ¬¬(¬a√b) = ¬(a ∧ ¬b)
     33        return make_not(make_and(not1->getExpr(), make_not(expr2)));
     34    }
     35    else if (Not * not2 = dyn_cast<Not>(expr2)) {
     36        // a√¬b = ¬¬(¬b√a) = ¬(b ∧ ¬a)
     37        return make_not(make_and(not2->getExpr(), make_not(expr1)));
     38    }
     39    else if (equals(expr1, expr2)) {
     40        return expr1;
     41    }
     42    else if (And * and_expr1 = dyn_cast<And>(expr1)) {
     43        if (And * and_expr2 = dyn_cast<And>(expr2)) {
     44            PabloE * const expr1a = and_expr1->getExpr1();
     45            PabloE * const expr1b = and_expr1->getExpr2();
     46            PabloE * const expr2a = and_expr2->getExpr1();
     47            PabloE * const expr2b = and_expr2->getExpr1();
     48            //These optimizations factor out common components that can occur when sets are formed by union
     49            //(e.g., union of [a-z] and [A-Z].
     50            if (equals(expr1a, expr2a)) {
     51                return make_and(expr1a, make_or(expr1b, expr2b));
     52            }
     53            else if (equals(expr1b, expr2b)) {
     54                return make_and(expr1b, make_or(expr1a, expr2a));
     55            }
     56            else if (equals(expr1a, expr2b)) {
     57                return make_and(expr1a, make_or(expr1b, expr2a));
     58            }
     59            else if (equals(expr1b, expr2a)) {
     60                return make_and(expr1b, make_or(expr1a, expr2b));
     61            }
     62        }
     63    }
     64
     65    return new Or(expr1, expr2);
     66}
     67
     68}
Note: See TracChangeset for help on using the changeset viewer.