Ignore:
Timestamp:
Dec 1, 2015, 5:13:00 PM (3 years ago)
Author:
nmedfort
Message:

Bug fixes

File:
1 edited

Legend:

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

    r4878 r4886  
    2929        if ((isa<Zeroes>(expr1)) || (isa<Ones>(expr1))) {
    3030            return true;
    31         } else if (const Var * var1 = dyn_cast<const Var>(expr1)) {
    32             if (const Var * var2 = cast<const Var>(expr2)) {
    33                 return (var1->getName() == var2->getName());
    34             }
    35         } else if (const Not* not1 = dyn_cast<const Not>(expr1)) {
    36             if (const Not* not2 = cast<const Not>(expr2)) {
    37                 return equals(not1->getExpr(), not2->getExpr());
    38             }
    39         } else if (const And* and1 = dyn_cast<const And>(expr1)) {
    40             if (const And* and2 = cast<const And>(expr2)) {
    41                 if (equals(and1->getOperand(0), and2->getOperand(0))) {
    42                     return equals(and1->getOperand(1), and2->getOperand(1));
    43                 } else if (equals(and1->getOperand(0), and2->getOperand(1))) {
    44                     return equals(and1->getOperand(1), and2->getOperand(0));
    45                 }
    46             }
    47         } else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
    48             if (const Or* or2 = cast<const Or>(expr2)) {
    49                 if (equals(or1->getOperand(0), or2->getOperand(0))) {
    50                     return equals(or1->getOperand(1), or2->getOperand(1));
    51                 } else if (equals(or1->getOperand(0), or2->getOperand(1))) {
    52                     return equals(or1->getOperand(1), or2->getOperand(0));
    53                 }
    54             }
    55         } else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
    56             if (const Xor * xor2 = cast<const Xor>(expr2)) {
    57                 if (equals(xor1->getOperand(0), xor2->getOperand(0))) {
    58                     return equals(xor1->getOperand(1), xor2->getOperand(1));
    59                 } else if (equals(xor1->getOperand(0), xor2->getOperand(1))) {
    60                     return equals(xor1->getOperand(1), xor2->getOperand(0));
    61                 }
     31        } else if (isa<Var>(expr1)) {
     32            return (cast<Var>(expr1)->getName() == cast<Var>(expr2)->getName());
     33        } else if (isa<Not>(expr1)) {
     34            return equals(cast<Not>(expr1)->getOperand(0), cast<Not>(expr2)->getOperand(0));
     35        } else if (isa<Variadic>(expr1)) {
     36            const Variadic * const var1 = cast<Variadic>(expr1);
     37            const Variadic * const var2 = cast<Variadic>(expr2);
     38            if (var1->getNumOperands() == var2->getNumOperands()) {
     39                const unsigned operands = var1->getNumOperands();
     40                for (unsigned i = 0; i != operands; ++i) {
     41                    bool missing = true;
     42                    for (unsigned j = 0; j != operands; ++j) {
     43                        // odds are both variadics will be sorted; optimize towards testing them in order.
     44                        unsigned k = i + j;
     45                        if (LLVM_UNLIKELY(k >= operands)) {
     46                            k -= operands;
     47                        }
     48                        if (equals(var1->getOperand(i), var2->getOperand(k))) {
     49                            missing = false;
     50                            break;
     51                        }
     52                    }
     53                    if (missing) {
     54                        return false;
     55                    }
     56                }
     57                return true;
    6258            }
    6359        } else if (isa<Integer>(expr1) || isa<String>(expr1) || isa<Call>(expr1)) {
    64             // If these weren't equivalent by address they won't be equivalent by their operands.
    65             return false;
     60            return false; // If these weren't equivalent by address they won't be equivalent by their operands.
    6661        } else { // Non-reassociatable functions (i.e., Sel, Advance, ScanThru, MatchStar, Assign, Next)
    6762            const Statement * stmt1 = cast<Statement>(expr1);
Note: See TracChangeset for help on using the changeset viewer.