Ignore:
Timestamp:
Oct 11, 2015, 1:45:52 PM (4 years ago)
Author:
nmedfort
Message:

Back-up check in

File:
1 edited

Legend:

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

    r4805 r4829  
    212212        mOperand[i]->removeUser(this);
    213213    }
     214    Statement * redundantBranch = nullptr;
    214215    // If this is an If or While statement, we'll have to remove the statements within the
    215216    // body or we'll lose track of them.
     
    217218        PabloBlock & body = isa<If>(this) ? cast<If>(this)->getBody() : cast<While>(this)->getBody();
    218219        Statement * stmt = body.front();
     220        // Note: by erasing the body, any Assign/Next nodes will be replaced with Zero.
    219221        while (stmt) {
    220222            stmt = stmt->eraseFromParent(recursively);
     
    223225        for (PabloAST * use : mUsers) {
    224226            if (If * ifNode = dyn_cast<If>(use)) {
    225                 const auto & defs = ifNode->getDefined();
    226                 if (LLVM_LIKELY(std::find(defs.begin(), defs.end(), this) != defs.end())) {
     227                auto & defs = ifNode->getDefined();
     228                auto f = std::find(defs.begin(), defs.end(), this);
     229                if (LLVM_LIKELY(f != defs.end())) {
    227230                    this->removeUser(ifNode);
    228231                    ifNode->removeUser(this);
     232                    defs.erase(f);
     233                    if (LLVM_UNLIKELY(defs.empty())) {
     234                        redundantBranch = ifNode;
     235                    }
    229236                    break;
    230237                }
     
    234241        for (PabloAST * use : mUsers) {
    235242            if (While * whileNode = dyn_cast<While>(use)) {
    236                 const auto & vars = whileNode->getVariants();
    237                 if (LLVM_LIKELY(std::find(vars.begin(), vars.end(), this) != vars.end())) {
     243                auto & vars = whileNode->getVariants();
     244                auto f = std::find(vars.begin(), vars.end(), this);
     245                if (LLVM_LIKELY(f != vars.end())) {
    238246                    this->removeUser(whileNode);
    239247                    whileNode->removeUser(this);
     248                    vars.erase(f);
     249                    if (LLVM_UNLIKELY(vars.empty())) {
     250                        redundantBranch = whileNode;
     251                    }
    240252                    break;
    241253                }
     
    249261        for (unsigned i = 0; i != mOperands; ++i) {
    250262            PabloAST * const op = mOperand[i];
    251             if (op->getNumUses() == 0 && isa<Statement>(op)) {
    252                 cast<Statement>(op)->eraseFromParent(true);
    253             }
     263            if (LLVM_LIKELY(isa<Statement>(op))) {
     264                bool erase = false;
     265                if (op->getNumUses() == 0) {
     266                    erase = true;
     267                } else if ((isa<Assign>(op) || isa<Next>(op)) && op->getNumUses() == 1) {
     268                    erase = true;
     269                }
     270                if (erase) {
     271                    cast<Statement>(op)->eraseFromParent(true);
     272                }
     273            }
     274        }
     275        if (LLVM_UNLIKELY(redundantBranch != nullptr)) {
     276            redundantBranch->eraseFromParent(true);
    254277        }
    255278    }
Note: See TracChangeset for help on using the changeset viewer.