Ignore:
Timestamp:
Nov 22, 2015, 3:17:10 PM (4 years ago)
Author:
nmedfort
Message:

More work on n-ary operations.

File:
1 edited

Legend:

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

    r4876 r4878  
    3636
    3737/** ------------------------------------------------------------------------------------------------------------- *
    38  * @brief isReassociatable
    39  ** ------------------------------------------------------------------------------------------------------------- */
    40 inline bool isReassociatable(const Statement * const stmt) {
     38 * @brief isReassociative
     39 ** ------------------------------------------------------------------------------------------------------------- */
     40inline bool isReassociative(const Statement * const stmt) {
    4141    switch (stmt->getClassTypeId()) {
    4242        case PabloAST::ClassTypeId::And:
     
    5454
    5555    assert (var);
     56
     57    bool negated = false;
     58    if (LLVM_UNLIKELY(isa<Xor>(var))) {
     59        for (unsigned i = 0; i != var->getNumOperands(); ++i) {
     60            if (isa<Not>(var->getOperand(i))) {
     61                // (A ⊕ ¬B) = ¬(A ⊕ B)
     62                var->setOperand(i, cast<Not>(var->getOperand(i))->getOperand(0));
     63                negated = !negated;
     64            }
     65        }
     66    }
    5667
    5768    // Ensure all operands of a reassociatiable function are consistently ordered.
     
    7384    }
    7485
    75     // Apply the complementation law whenever possible.
    76     bool negated = false;
    77     for (unsigned i = 0; i < var->getNumOperands(); ++i) {
    78         if (isa<Not>(var->getOperand(i))) {
    79             PabloAST * const negatedOp = cast<Not>(var->getOperand(i))->getOperand(0);
    80             bool complementation = false;
    81             for (unsigned j = 0; j != var->getNumOperands(); ++j) {
    82                 if (LLVM_UNLIKELY(var->getOperand(j) == negatedOp)) {
    83                     if (isa<And>(var)) { // (A ∧ ¬A) ∧ B = 0 for any B
    84                         return PabloBlock::createZeroes();
    85                     } else if (isa<Or>(var)) { // (A √ ¬A) √ B = 1 for any B
    86                         return PabloBlock::createOnes();
    87                     }
    88                     var->removeOperand(i); // (A ⊕ ¬A) ⊕ B = 1 ⊕ B = ¬B for any B
    89                     var->removeOperand(j);
    90                     negated = !negated;
    91                     complementation = true;
    92                     break;
    93                 }
    94             }
    95             if (complementation) {
    96                 continue;
    97             }
    98         }
    99         ++i;
     86    if (LLVM_LIKELY(!isa<Xor>(var))) {
     87        // Apply the complementation law whenever possible.
     88        for (unsigned i = 0; i < var->getNumOperands(); ++i) {
     89            if (isa<Not>(var->getOperand(i))) {
     90                const PabloAST * const negatedOp = cast<Not>(var->getOperand(i))->getOperand(0);
     91                for (unsigned j = 0; j != var->getNumOperands(); ++j) {
     92                    if (LLVM_UNLIKELY(var->getOperand(j) == negatedOp)) {
     93                        if (isa<And>(var)) { // (A ∧ ¬A) ∧ B = 0 for any B
     94                            return PabloBlock::createZeroes();
     95                        } else if (isa<Or>(var)) { // (A √ ¬A) √ B = 1 for any B
     96                            return PabloBlock::createOnes();
     97                        }
     98                    }
     99                }
     100            }
     101        }
    100102    }
    101103
     
    392394        } else {
    393395            PabloAST * folded = nullptr;
    394             if (isReassociatable(stmt)) {
     396            if (isReassociative(stmt)) {
    395397                folded =  foldReassociativeFunction(cast<Variadic>(stmt), block);
    396398            } else {
Note: See TracChangeset for help on using the changeset viewer.