Ignore:
Timestamp:
Sep 27, 2015, 1:32:27 AM (4 years ago)
Author:
nmedfort
Message:

Progress on multi-target UCD compiler.

File:
1 edited

Legend:

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

    r4788 r4797  
    2929bool equals(const PabloAST * expr1, const PabloAST * expr2) {
    3030    assert (expr1 && expr2);
    31     if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
     31    if (expr1 == expr2) {
     32        return true;
     33    } else if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
    3234        if ((isa<Zeroes>(expr1)) || (isa<Ones>(expr1))) {
    3335            return true;
    34         }
    35         else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
     36        } else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
    3637            if (const Var * var2 = cast<const Var>(expr2)) {
    3738                return (var1->getName() == var2->getName());
    3839            }
    39         }
    40         else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
     40        } else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
    4141            if (const Not* not2 = cast<const Not>(expr2)) {
    4242                return equals(not1->getExpr(), not2->getExpr());
    4343            }
    44         }
    45         else if (const And* and1 = dyn_cast<const And>(expr1)) {
     44        } else if (const And* and1 = dyn_cast<const And>(expr1)) {
    4645            if (const And* and2 = cast<const And>(expr2)) {
    4746                if (equals(and1->getExpr1(), and2->getExpr1())) {
    4847                    return equals(and1->getExpr2(), and2->getExpr2());
    49                 }
    50                 else if (equals(and1->getExpr1(), and2->getExpr2())) {
     48                } else if (equals(and1->getExpr1(), and2->getExpr2())) {
    5149                    return equals(and1->getExpr2(), and2->getExpr1());
    5250                }
    5351            }
    54         }
    55         else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
     52        } else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
    5653            if (const Or* or2 = cast<const Or>(expr2)) {
    5754                if (equals(or1->getExpr1(), or2->getExpr1())) {
    5855                    return equals(or1->getExpr2(), or2->getExpr2());
    59                 }
    60                 else if (equals(or1->getExpr1(), or2->getExpr2())) {
     56                } else if (equals(or1->getExpr1(), or2->getExpr2())) {
    6157                    return equals(or1->getExpr2(), or2->getExpr1());
    6258                }
    6359            }
    64         }
    65         else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
     60        } else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
    6661            if (const Xor * xor2 = cast<const Xor>(expr2)) {
    6762                if (equals(xor1->getExpr1(), xor2->getExpr1())) {
    6863                    return equals(xor1->getExpr2(), xor2->getExpr2());
    69                 }
    70                 else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
     64                } else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
    7165                    return equals(xor1->getExpr2(), xor2->getExpr1());
    7266                }
    7367            }
    74         }
    75         else if (const Sel* sel1 = dyn_cast<const Sel>(expr1)) {
    76             if (const Sel* sel2 = cast<const Sel>(expr2)) {
    77                 if (equals(sel1->getCondition(), sel2->getCondition())) {
    78                     if (equals(sel1->getTrueExpr(), sel2->getTrueExpr())) {
    79                         return equals(sel1->getFalseExpr(), sel2->getFalseExpr());
    80                     }
    81                 }
    82             }
     68        } else if (isa<Integer>(expr1) || isa<String>(expr1) || isa<Call>(expr1)) {
     69            // If these weren't equivalent by address they won't be equivalent by their operands.
     70            return false;
     71        } else { // Non-reassociatable functions (i.e., Sel, Advance, ScanThru, MatchStar)
     72            const Statement * stmt1 = cast<Statement>(expr1);
     73            const Statement * stmt2 = cast<Statement>(expr2);
     74            assert (stmt1->getNumOperands() == stmt2->getNumOperands());
     75            for (unsigned i = 0; i != stmt1->getNumOperands(); ++i) {
     76                if (!equals(stmt1->getOperand(i), stmt2->getOperand(i))) {
     77                    return false;
     78                }
     79            }
     80            return true;
    8381        }
    8482    }
Note: See TracChangeset for help on using the changeset viewer.