Ignore:
Timestamp:
Nov 30, 2015, 4:30:02 PM (4 years ago)
Author:
nmedfort
Message:

More work on n-ary operations. Unresolved bug in DistributionPass?.

File:
1 edited

Legend:

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

    r4880 r4885  
    1010#include <unordered_set>
    1111#endif
    12 #include <iostream>
    1312
    1413namespace pablo {
     
    2726bool Simplifier::optimize(PabloFunction & function) {
    2827    eliminateRedundantCode(function.getEntryBlock());
     28    #ifndef NDEBUG
     29    PabloVerifier::verify(function, "post-eliminate-redundant-code");
     30    #endif
    2931    deadCodeElimination(function.getEntryBlock());
     32    #ifndef NDEBUG
     33    PabloVerifier::verify(function, "post-dead-code-elimination");
     34    #endif
    3035    strengthReduction(function.getEntryBlock());
    3136    #ifndef NDEBUG
    32     PabloVerifier::verify(function, "post-simplification");
     37    PabloVerifier::verify(function, "post-strength-reduction");
    3338    #endif
    3439    return true;
     
    5964        for (unsigned i = 0; i != var->getNumOperands(); ++i) {
    6065            if (isa<Not>(var->getOperand(i))) {
    61                 // (A ⊕ ¬B) = ¬(A ⊕ B)
     66                // (A ⊕ ¬B) = (A ⊕ (B ⊕ 1)) = ¬(A ⊕ B)
    6267                var->setOperand(i, cast<Not>(var->getOperand(i))->getOperand(0));
    6368                negated = !negated;
     
    9095                const PabloAST * const negatedOp = cast<Not>(var->getOperand(i))->getOperand(0);
    9196                for (unsigned j = 0; j != var->getNumOperands(); ++j) {
    92                     if (LLVM_UNLIKELY(var->getOperand(j) == negatedOp)) {
     97                    if (LLVM_UNLIKELY(equals(var->getOperand(j), negatedOp))) {
    9398                        if (isa<And>(var)) { // (A ∧ ¬A) ∧ B = 0 for any B
    9499                            return PabloBlock::createZeroes();
     
    194199inline bool Simplifier::isSuperfluous(const Assign * const assign) {
    195200    for (const PabloAST * inst : assign->users()) {
    196         if (isa<Next>(inst) || isa<PabloFunction>(inst)) {
    197             return false;
    198         } else if (isa<If>(inst)) {
    199             const If * ifNode = cast<If>(inst);
    200             if (ifNode->getCondition() == assign) {
    201                 bool notFound = true;
    202                 for (Assign * defVar : ifNode->getDefined()) {
    203                     if (defVar == assign) {
    204                         notFound = false;
    205                         break;
    206                     }
    207                 }
    208                 if (notFound) {
    209                     continue;
    210                 }
    211             }
     201        if (isa<Next>(inst) || isa<PabloFunction>(inst) || (isa<If>(inst) && (cast<If>(inst)->getCondition() != assign))) {
    212202            return false;
    213203        }
Note: See TracChangeset for help on using the changeset viewer.