Ignore:
Timestamp:
Sep 23, 2015, 12:54:17 AM (4 years ago)
Author:
nmedfort
Message:

Misc changes + potential SIGBUS fix for issue reported by Hongpu.

File:
1 edited

Legend:

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

    r4775 r4788  
    217217    // body or we'll lose track of them.
    218218    if (LLVM_UNLIKELY(isa<If>(this) || isa<While>(this))) {
    219         if (isa<If>(this)) {
    220             // Eliminate the relationship between the If node and its defined vars ...
    221             for (PabloAST * var : cast<If>(this)->getDefined()) {
    222                 var->removeUser(this);
    223                 this->removeUser(var);
    224                 var->replaceAllUsesWith(mParent->createZeroes());
    225             }
    226         }
    227219        PabloBlock & body = isa<If>(this) ? cast<If>(this)->getBody() : cast<While>(this)->getBody();
    228220        Statement * stmt = body.front();
    229221        while (stmt) {
    230222            stmt = stmt->eraseFromParent(recursively);
    231         }       
    232     }
     223        }
     224    } else if (LLVM_UNLIKELY(isa<Assign>(this))) {
     225        for (PabloAST * use : mUsers) {
     226            if (If * ifNode = dyn_cast<If>(use)) {
     227                const auto & defs = ifNode->getDefined();
     228                if (LLVM_LIKELY(std::find(defs.begin(), defs.end(), this) != defs.end())) {
     229                    this->removeUser(ifNode);
     230                    ifNode->removeUser(this);
     231                    break;
     232                }
     233            }
     234        }
     235    } else if (LLVM_UNLIKELY(isa<Next>(this))) {
     236        for (PabloAST * use : mUsers) {
     237            if (While * whileNode = dyn_cast<While>(use)) {
     238                const auto & vars = whileNode->getVariants();
     239                if (LLVM_LIKELY(std::find(vars.begin(), vars.end(), this) != vars.end())) {
     240                    this->removeUser(whileNode);
     241                    whileNode->removeUser(this);
     242                    break;
     243                }
     244            }
     245        }
     246    }
     247
     248    replaceAllUsesWith(PabloBlock::createZeroes());
    233249
    234250    if (recursively) {
     
    240256        }
    241257    }
     258
    242259    return removeFromParent();
    243260}
Note: See TracChangeset for help on using the changeset viewer.