Ignore:
Timestamp:
Oct 31, 2015, 12:20:31 PM (4 years ago)
Author:
nmedfort
Message:

Bug fix for use-def correctness regarding escaping values of If and While nodes.

Location:
icGREP/icgrep-devel/icgrep/pablo/optimizers
Files:
2 edited

Legend:

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

    r4854 r4856  
    4747}
    4848
    49 
    5049/** ------------------------------------------------------------------------------------------------------------- *
    5150 * @brief isSafeToMove
  • icGREP/icgrep-devel/icgrep/pablo/optimizers/pablo_simplifier.cpp

    r4852 r4856  
    200200 * @brief removeIdenticalEscapedValues
    201201 ** ------------------------------------------------------------------------------------------------------------- */
    202 template <class ValueList>
     202template <class ValueList, class ValueType = typename ValueList::value_type>
    203203inline void removeIdenticalEscapedValues(ValueList & list) {
     204    std::vector<ValueType> identicalValues;
    204205    for (auto i = list.begin(); i != list.end(); ++i) {
    205         for (auto j = i + 1; j != list.end(); ) {
     206        for (auto j = i + 1; j != list.end(); ++j) {
    206207            if (LLVM_UNLIKELY(equals(*i, *j))) {
    207                 Statement * redundantValue = *j;
    208                 j = list.erase(j);
    209                 redundantValue->replaceWith(*i, false, true);
    210                 continue;
    211             }
    212             ++j;
    213         }
     208                identicalValues.push_back(*j);
     209            }
     210        }
     211        for (ValueType identicalValue : identicalValues) {
     212            identicalValue->replaceWith(*i);
     213        }
     214        identicalValues.clear();
    214215    }
    215216}
     
    279280                while (nested) {
    280281                    Statement * next = nested->removeFromParent();
     282                    if (isa<Assign>(nested)) {
     283                        ifNode->removeDefined(cast<Assign>(nested));
     284                    }
    281285                    nested->insertAfter(stmt);
    282286                    stmt = nested;
    283287                    nested = next;
    284288                }
    285                 ifNode->getDefined().clear();
    286289                stmt = ifNode->eraseFromParent(true);
    287290                continue;
Note: See TracChangeset for help on using the changeset viewer.