Ignore:
Timestamp:
Nov 18, 2016, 1:46:55 PM (2 years ago)
Author:
nmedfort
Message:

Merged PabloFunction? and PabloKernel? classes. Updated projects where necessary.

File:
1 edited

Legend:

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

    r5202 r5217  
    1818    bool outside = false;
    1919    for (const PabloAST * user : var->users()) {
    20         if (isa<Assign>(user)) {
    21             // is this var assigned a value within the scope of the branch?
     20        if (isa<Assign>(user)) {           
     21
    2222            const PabloBlock * const scope = cast<Assign>(user)->getParent();
    2323
     24            // Is this Var assigned a value within the body of this branch?
    2425            for (const PabloBlock * test = scope; test; test = test->getPredecessor()) {
    2526                if (test == br->getBody()) {
     
    2829                    }
    2930                    inside = true;
    30                     break;
     31                    goto outer_loop;
    3132                }
    3233            }
    3334
    34             for (const PabloBlock * test = br->getParent(); test; test = test->getPredecessor()) {
    35                 // technically we should check whether this user dominates the branch but if it
    36                 // doesn't, then the program is illegal anyway and the error will be found.
     35            // Is there an assignment to this Var that dominates this branch?
     36            const Branch * check = br;
     37            for (const PabloBlock * test = br->getParent(); test; ) {
    3738                if (test == scope) {
    38                     if (inside) {
    39                         return true;
     39                    // verify this assignment actually dominates the branch
     40                    const Statement * temp1 = cast<Assign>(user);
     41                    const Statement * temp2 = check;
     42                    while (temp1 && temp2) {
     43                        if (temp1 == check) {
     44                            break;
     45                        } else if (temp2 == cast<Assign>(user)) {
     46                            temp1 = nullptr;
     47                            break;
     48                        }
     49                        temp1 = temp1->getNextNode();
     50                        temp2 = temp2->getNextNode();
    4051                    }
    41                     outside = true;
     52                    if (temp1 != nullptr) {
     53                        if (inside) {
     54                            return true;
     55                        }
     56                        outside = true;
     57                    }
    4258                    break;
    4359                }
     60                check = test->getBranch();
     61                if (LLVM_UNLIKELY(check == nullptr)) {
     62                    break;
     63                }
     64                test = check->getParent();
    4465            }
    45 
    4666        }
     67outer_loop: continue;
    4768    }
    4869    return false;
     
    5475std::vector<Var *> Branch::getEscaped() const {
    5576
    56     PabloFunction * const f = getParent()->getParent();
     77    const auto f = getParent()->getParent();
    5778    const auto n = f->getNumOfVariables();
    5879
Note: See TracChangeset for help on using the changeset viewer.