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/passes/factorizedfg.cpp

    r4885 r4886  
    2222 * @brief finalize
    2323 ** ------------------------------------------------------------------------------------------------------------- */
    24 inline void FactorizeDFG::finalize(Variadic * const var, PabloBlock * block) {
     24inline Statement * FactorizeDFG::finalize(Variadic * const var, PabloBlock * block) {
     25    PabloAST * result = nullptr;
     26    assert (var->getNumOperands() > 2);
    2527    block->setInsertPoint(var->getPrevNode());
    26     std::sort(var->begin(), var->end());
    27     while (var->getNumOperands() > 2) {
     28    while (var->getNumOperands() > 1) {
     29        PabloAST * const op2 = var->removeOperand(1);
    2830        PabloAST * const op1 = var->removeOperand(0);
    29         PabloAST * const op2 = var->removeOperand(0);
    30         PabloAST * newOp = nullptr;
     31        assert (op1 != op2);
    3132        if (isa<And>(var)) {
    32             newOp = block->createAnd(op1, op2);
     33            result = block->createAnd(op1, op2);
    3334        } else if (isa<Or>(var)) {
    34             newOp = block->createOr(op1, op2);
     35            result = block->createOr(op1, op2);
    3536        } else { // if (isa<Xor>(var)) {
    36             newOp = block->createXor(op1, op2);
    37         }
    38         var->addOperand(newOp);
    39     }
     37            result = block->createXor(op1, op2);
     38        }
     39        var->addOperand(result);
     40    }
     41    return var->replaceWith(result, true);
    4042}
    4143
     
    4850        if (isa<If>(stmt) || isa<While>(stmt)) {
    4951            finalize(isa<If>(stmt) ? cast<If>(stmt)->getBody() : cast<While>(stmt)->getBody());
    50         } else if ((isa<And>(stmt) || isa<Or>(stmt) || isa<Xor>(stmt))) {
    51             finalize(cast<Variadic>(stmt), block);
     52        } else if ((isa<And>(stmt) || isa<Or>(stmt) || isa<Xor>(stmt)) && (stmt->getNumOperands() > 2)) {
     53            stmt = finalize(cast<Variadic>(stmt), block);
     54            continue;
    5255        }
    5356        stmt = stmt->getNextNode();
     
    317320    PabloVerifier::verify(function, "post-factorize");
    318321    #endif
    319     Simplifier::optimize(function);
    320322    ldfg.finalize(function.getEntryBlock());
    321323    #ifndef NDEBUG
    322324    PabloVerifier::verify(function, "post-finalize");
    323325    #endif
    324 }
    325 
    326 }
     326    Simplifier::optimize(function);
     327}
     328
     329}
Note: See TracChangeset for help on using the changeset viewer.