Ignore:
Timestamp:
Feb 18, 2015, 3:56:47 PM (4 years ago)
Author:
nmedfort
Message:

Many memory deallocation fixes.

File:
1 edited

Legend:

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

    r4443 r4510  
    88#include <pablo/codegenstate.h>
    99#include <llvm/Support/Compiler.h>
    10 
     10#ifndef NDEBUG
     11#include <queue>
     12#endif
    1113namespace pablo {
    1214
    1315PabloAST::Allocator PabloAST::mAllocator;
     16PabloAST::VectorAllocator PabloAST::mVectorAllocator;
    1417
    1518/*
     
    2427    assert (expr1 && expr2);
    2528    if (expr1->getClassTypeId() == expr2->getClassTypeId()) {
    26         if ((isa<const Zeroes>(expr1)) || (isa<const Ones>(expr1))) {
     29        if ((isa<Zeroes>(expr1)) || (isa<Ones>(expr1))) {
    2730            return true;
    2831        }
     
    8083}
    8184
    82 void PabloAST::replaceAllUsesWith(PabloAST * expr) {
     85void PabloAST::replaceAllUsesWith(PabloAST * expr) {   
     86    Statement * user[mUsers.size()];
     87    Users::size_type users = 0;
     88    for (PabloAST * u : mUsers) {
     89        if (isa<Statement>(u)) {
     90            user[users++] = cast<Statement>(u);
     91        }
     92    }
     93    mUsers.clear();
    8394    assert (expr);
    84     Users Q;
    85     Q.swap(mUsers);
    86     for (PabloAST * user : Q) {
    87         if (isa<Statement>(user)) {
    88             cast<Statement>(user)->replaceUsesOfWith(this, expr);
    89         }
    90     }
    91     Q.clear();
    92 }
     95    for (auto i = 0; i != users; ++i) {
     96        user[i]->replaceUsesOfWith(this, expr);
     97    }
     98}
     99
     100
    93101
    94102void Statement::setOperand(const unsigned index, PabloAST * const value) {
    95103    assert (index < getNumOperands());
     104    assert (noRecursiveOperand(value));
    96105    if (LLVM_UNLIKELY(getOperand(index) == value)) {
    97106        return;
     
    206215}
    207216
     217#ifndef NDEBUG
     218    bool Statement::noRecursiveOperand(const PabloAST * const operand) {
     219        if (operand && isa<Statement>(operand)) {
     220            std::queue<const Statement *> Q;
     221            Q.push(cast<Statement>(operand));
     222            while (!Q.empty()) {
     223                const Statement * stmt = Q.front();
     224                if (stmt == this) {
     225                    return false;
     226                }
     227                Q.pop();
     228                for (auto i = 0; i != stmt->getNumOperands(); ++i) {
     229                    const PabloAST * op = stmt->getOperand(i);
     230                    if (isa<Statement>(op)) {
     231                        Q.push(cast<Statement>(op));
     232                    }
     233                }
     234            }
     235        }
     236        return true;
     237    }
     238#endif
     239
    208240void StatementList::insert(Statement * const statement) {
    209241    if (LLVM_UNLIKELY(mInsertionPoint == nullptr)) {
Note: See TracChangeset for help on using the changeset viewer.