Ignore:
Timestamp:
Jun 21, 2015, 4:38:51 PM (4 years ago)
Author:
nmedfort
Message:

Multiplexing bug fix and some CC changes.

File:
1 edited

Legend:

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

    r4611 r4612  
    347347    switch (stmt->getClassTypeId()) {
    348348        case PabloAST::ClassTypeId::Assign:
    349             bdd = input[0];
    350             break;
     349            return input[0];
    351350        case PabloAST::ClassTypeId::And:
    352351            bdd = And(input[0], input[1]);
     
    354353        case PabloAST::ClassTypeId::Next:
    355354        case PabloAST::ClassTypeId::Or:
    356             bdd = Or(input[0], input[1]);
    357             break;
     355            return Or(input[0], input[1]);
    358356        case PabloAST::ClassTypeId::Xor:
    359             bdd = Xor(input[0], input[1]);
    360             break;
     357            return Xor(input[0], input[1]);
    361358        case PabloAST::ClassTypeId::Not:
    362             bdd = Not(input[0]);
    363             break;
     359            return Not(input[0]);
    364360        case PabloAST::ClassTypeId::Sel:
    365361            bdd = Ite(input[0], input[1], input[2]);
     
    371367        case PabloAST::ClassTypeId::MatchStar:
    372368            if (LLVM_UNLIKELY(isZero(input[0]) || isZero(input[1]))) {
    373                 bdd = Zero();
    374                 break;
     369                return Zero();
    375370            }
    376371        case PabloAST::ClassTypeId::Call:
    377             bdd = NewVar();
    378             break;
     372            return NewVar();
    379373        case PabloAST::ClassTypeId::Advance:
    380             bdd = characterize(cast<Advance>(stmt), input[0]);
    381             break;
     374            return characterize(cast<Advance>(stmt), input[0]);
    382375        default:
    383376            throw std::runtime_error("Unexpected statement type " + stmt->getName()->to_string());
    384377    }
    385 
    386     assert ("Failed to generate a BDD." && (bdd));
    387378
    388379    if (LLVM_UNLIKELY(noSatisfyingAssignment(bdd))) {
     
    566557
    567558/** ------------------------------------------------------------------------------------------------------------- *
     559 * @brief prohibited
     560 *
     561 * If this statement is an Assign or Next node or any of its operands is a non-superfluous Assign or Next node,
     562 * then we're prohibited from minimizing this statement.
     563 ** ------------------------------------------------------------------------------------------------------------- */
     564inline bool prohibited(const Statement * const stmt) {
     565    if (isa<Assign>(stmt) || isa<Next>(stmt)) {
     566        return true;
     567    }
     568    for (unsigned i = 0; i != stmt->getNumOperands(); ++i) {
     569        const PabloAST * const  op = stmt->getOperand(i);
     570        const Assign * const assign = dyn_cast<Assign>(op);
     571        if (LLVM_UNLIKELY((assign && !assign->superfluous()) || isa<Next>(op))) {
     572            return true;
     573        }
     574    }
     575    return false;
     576}
     577
     578/** ------------------------------------------------------------------------------------------------------------- *
    568579 * @brief minimize
    569580 ** ------------------------------------------------------------------------------------------------------------- */
     
    578589        }
    579590
    580         if (isa<Assign>(stmt) || isa<Next>(stmt)) {
     591        if (LLVM_UNLIKELY(prohibited(stmt))) {
    581592            continue;
    582593        }
Note: See TracChangeset for help on using the changeset viewer.