Ignore:
Timestamp:
Nov 16, 2015, 4:20:15 PM (4 years ago)
Author:
nmedfort
Message:

Minor improvements to the optimizers and AST manipulation.

File:
1 edited

Legend:

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

    r4870 r4871  
    99#include <llvm/Support/Compiler.h>
    1010#include <pablo/printer_pablos.h>
    11 #include <iostream>
     11#include <llvm/ADT/SmallVector.h>
    1212
    1313namespace pablo {
     
    8686 * @brief replaceAllUsesWith
    8787 ** ------------------------------------------------------------------------------------------------------------- */
    88 void PabloAST::replaceAllUsesWith(PabloAST * expr) {   
     88void PabloAST::replaceAllUsesWith(PabloAST * expr) {
     89    if (LLVM_UNLIKELY(this == expr)) {
     90        return;
     91    }
    8992    Statement * replacements[mUsers.size()];
    9093    Vector::size_type users = 0;
     
    108111
    109112/** ------------------------------------------------------------------------------------------------------------- *
    110  * @brief checkForReplacementInEscapedValueList
     113 * @brief checkEscapedValueList
    111114 ** ------------------------------------------------------------------------------------------------------------- */
    112115template <class ValueType, class ValueList>
    113 inline void Statement::checkForReplacementInEscapedValueList(Statement * branch, PabloAST * const from, PabloAST * const to, ValueList & list) {
     116inline void Statement::checkEscapedValueList(Statement * branch, PabloAST * const from, PabloAST * const to, ValueList & list) {
    114117    if (LLVM_LIKELY(isa<ValueType>(from))) {
    115118        auto f = std::find(list.begin(), list.end(), cast<ValueType>(from));
     
    125128                assert (std::find(list.begin(), list.end(), cast<ValueType>(to)) != list.end());
    126129                assert (std::find(branch->user_begin(), branch->user_end(), cast<ValueType>(to)) != branch->user_end());
    127             } else { // replacement error occured
    128                 std::string tmp;
    129                 raw_string_ostream str(tmp);
    130                 str << "cannot replace escaped value ";
    131                 PabloPrinter::print(from, str);
    132                 str << " with ";
    133                 PabloPrinter::print(to, str);
    134                 str << " in ";
    135                 PabloPrinter::print(branch, str);
    136                 throw std::runtime_error(str.str());
     130            } else {
     131                list.erase(f);
     132                branch->removeUser(from);
    137133            }
    138134        }               
     
    146142 ** ------------------------------------------------------------------------------------------------------------- */
    147143void Statement::replaceUsesOfWith(PabloAST * const from, PabloAST * const to) {
     144    if (LLVM_UNLIKELY(from == to)) {
     145        return;
     146    }
    148147    for (unsigned i = 0; i != getNumOperands(); ++i) {
    149148       if (getOperand(i) == from) {
     
    152151    }
    153152    if (LLVM_UNLIKELY(isa<If>(this))) {
    154         checkForReplacementInEscapedValueList<Assign>(this, from, to, cast<If>(this)->getDefined());
     153        checkEscapedValueList<Assign>(this, from, to, cast<If>(this)->getDefined());
    155154    } else if (LLVM_UNLIKELY(isa<While>(this))) {
    156         checkForReplacementInEscapedValueList<Next>(this, from, to, cast<While>(this)->getVariants());
     155        checkEscapedValueList<Next>(this, from, to, cast<While>(this)->getVariants());
    157156    }
    158157}
     
    222221    if (LLVM_UNLIKELY(statement == this)) {
    223222        return;
    224     }
    225     else if (LLVM_UNLIKELY(statement == nullptr)) {
     223    } else if (LLVM_UNLIKELY(statement == nullptr)) {
    226224        throw std::runtime_error("cannot insert after null statement!");
    227     }
    228     else if (LLVM_UNLIKELY(statement->mParent == nullptr)) {
     225    } else if (LLVM_UNLIKELY(statement->mParent == nullptr)) {
    229226        throw std::runtime_error("statement is not contained in a pablo block!");
    230227    }
     
    288285        mOperand[i]->removeUser(this);
    289286    }
    290     Statement * redundantBranch = nullptr;
     287    SmallVector<Statement *, 1> redundantBranches;
    291288    // If this is an If or While statement, we'll have to remove the statements within the
    292289    // body or we'll lose track of them.
     
    304301                    defs.erase(f);
    305302                    if (LLVM_UNLIKELY(defs.empty())) {
    306                         redundantBranch = ifNode;
     303                        redundantBranches.push_back(ifNode);
    307304                    }
    308                     break;
    309305                }
    310306            }
     
    320316                    vars.erase(f);
    321317                    if (LLVM_UNLIKELY(vars.empty())) {
    322                         redundantBranch = whileNode;
     318                        redundantBranches.push_back(whileNode);
    323319                    }
    324                     break;
    325320                }
    326321            }
     
    334329            PabloAST * const op = mOperand[i];
    335330            if (LLVM_LIKELY(isa<Statement>(op))) {
    336                 bool erase = false;
    337331                if (op->getNumUses() == 0) {
    338                     erase = true;
    339                 } else if ((isa<Assign>(op) || isa<Next>(op)) && op->getNumUses() == 1) {
    340                     erase = true;
    341                 }
    342                 if (erase) {
    343332                    cast<Statement>(op)->eraseFromParent(true);
    344333                }
    345334            }
    346335        }
    347         if (LLVM_UNLIKELY(redundantBranch != nullptr)) {
     336        if (LLVM_UNLIKELY(redundantBranches.size() != 0)) {
    348337            // By eliminating this redundant branch, we may inadvertantly delete the scope block this statement
    349338            // resides within. Check and return null if so.
    350             const PabloBlock * const body = isa<If>(redundantBranch) ? cast<If>(redundantBranch)->getBody() : cast<While>(redundantBranch)->getBody();
    351             const bool eliminatedScope = (body == getParent());
    352             redundantBranch->eraseFromParent(true);
     339            bool eliminatedScope = false;
     340            for (Statement * br : redundantBranches) {
     341                const PabloBlock * const body = isa<If>(br) ? cast<If>(br)->getBody() : cast<While>(br)->getBody();
     342                if (LLVM_UNLIKELY(body == getParent())) {
     343                    eliminatedScope = true;
     344                }
     345                br->eraseFromParent(true);
     346            }
    353347            if (eliminatedScope) {
    354348                return nullptr;
Note: See TracChangeset for help on using the changeset viewer.