Ignore:
Timestamp:
Dec 23, 2015, 4:28:42 PM (3 years ago)
Author:
nmedfort
Message:

Work on lowering + minor bug fixes.

File:
1 edited

Legend:

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

    r4885 r4899  
    144144
    145145/** ------------------------------------------------------------------------------------------------------------- *
     146 * @brief throwUncontainedEscapedValueError
     147 ** ------------------------------------------------------------------------------------------------------------- */
     148static void throwUncontainedEscapedValueError(const Statement * const stmt, const PabloAST * const value) {
     149    std::string tmp;
     150    raw_string_ostream str(tmp);
     151    str << "PabloVerifier: structure error: escaped value \"";
     152    PabloPrinter::print(value, str);
     153    str << "\" is not contained within the body of ";
     154    PabloPrinter::print(stmt, str);
     155    throw std::runtime_error(str.str());
     156}
     157
     158/** ------------------------------------------------------------------------------------------------------------- *
     159 * @brief throwEscapedValueUsageError
     160 ** ------------------------------------------------------------------------------------------------------------- */
     161static void throwEscapedValueUsageError(const Statement * const stmt, const PabloAST * const value, const PabloAST * const def, const PabloAST * const user, const unsigned count) {
     162    std::string tmp;
     163    raw_string_ostream str(tmp);
     164    str << "PabloVerifier: structure error: ";
     165    PabloPrinter::print(value, str);
     166    str << " is an escaped value of ";
     167    PabloPrinter::print(stmt, str);
     168    str << " but ";
     169    PabloPrinter::print(user, str);
     170    if (count == 0) {
     171        str << " is not recorded in ";
     172    } else if (count > 0) {
     173        str << " is recorded" << count << " times in ";
     174    }
     175    PabloPrinter::print(def, str);
     176    str << "'s user list.";
     177    throw std::runtime_error(str.str());
     178}
     179
     180/** ------------------------------------------------------------------------------------------------------------- *
    146181 * @brief verifyProgramStructure
    147182 ** ------------------------------------------------------------------------------------------------------------- */
     
    191226                }
    192227            }
    193             const Statement * badEscapedValue = nullptr;
    194228            if (isa<If>(stmt)) {
    195229                for (const Assign * def : cast<If>(stmt)->getDefined()) {
    196                     if (unreachable(def, nested)) {
    197                         badEscapedValue = def;
    198                         break;
     230                    if (LLVM_UNLIKELY(unreachable(def, nested))) {
     231                        throwUncontainedEscapedValueError(stmt, def);
     232                    }
     233                    unsigned count = std::count(stmt->user_begin(), stmt->user_end(), def);
     234                    if (LLVM_UNLIKELY(count != 1)) {
     235                        throwEscapedValueUsageError(stmt, def, stmt, def, count);
     236                    }
     237                    count = std::count(def->user_begin(), def->user_end(), stmt);
     238                    if (LLVM_UNLIKELY(count != 1)) {
     239                        throwEscapedValueUsageError(stmt, def, def, stmt, count);
    199240                    }
    200241                }
    201242            } else {
    202243                for (const Next * var : cast<While>(stmt)->getVariants()) {
    203                     if (unreachable(var, nested)) {
    204                         badEscapedValue = var;
    205                         break;
    206                     }
    207                 }
    208             }
    209             if (badEscapedValue) {
    210                 std::string tmp;
    211                 raw_string_ostream str(tmp);
    212                 str << "PabloVerifier: structure error: escaped value \"";
    213                 PabloPrinter::print(badEscapedValue, str);
    214                 str << "\" is not contained within the body of ";
    215                 PabloPrinter::print(stmt, str);
    216                 throw std::runtime_error(str.str());
    217             }
    218             if (isa<If>(stmt)) {
    219                 for (const Assign * def : cast<If>(stmt)->getDefined()) {
    220                     if (LLVM_UNLIKELY(std::find(stmt->user_begin(), stmt->user_end(), def) == stmt->user_end())) {
    221                         badEscapedValue = def;
    222                         break;
    223                     }
    224                 }
    225             } else {
    226                 for (const Next * var : cast<While>(stmt)->getVariants()) {
    227                     if (LLVM_UNLIKELY(std::find(stmt->user_begin(), stmt->user_end(), var) == stmt->user_end())) {
    228                         badEscapedValue = var;
    229                         break;
    230                     }
    231                 }
    232             }
    233             if (badEscapedValue) {
    234                 std::string tmp;
    235                 raw_string_ostream str(tmp);
    236                 str << "PabloVerifier: structure error: ";
    237                 PabloPrinter::print(badEscapedValue, str);
    238                 str << " is an escaped value of ";
    239                 PabloPrinter::print(stmt, str);
    240                 str << " but not a user";
    241                 throw std::runtime_error(str.str());
     244                    if (LLVM_UNLIKELY(unreachable(var, nested))) {
     245                        throwUncontainedEscapedValueError(stmt, var);
     246                    }
     247                    unsigned count = std::count(stmt->user_begin(), stmt->user_end(), var);
     248                    if (LLVM_UNLIKELY(count != 1)) {
     249                        throwEscapedValueUsageError(stmt, var, stmt, var, count);
     250                    }
     251                    count = std::count(var->user_begin(), var->user_end(), stmt);
     252                    if (LLVM_UNLIKELY(count != 1)) {
     253                        throwEscapedValueUsageError(stmt, var, var, stmt, count);
     254                    }
     255                }
    242256            }
    243257            verifyProgramStructure(nested);
Note: See TracChangeset for help on using the changeset viewer.