diff --git a/src/Transformations/MoveOperators/move_operators.cpp b/src/Transformations/MoveOperators/move_operators.cpp index be51ce1..a92ece2 100644 --- a/src/Transformations/MoveOperators/move_operators.cpp +++ b/src/Transformations/MoveOperators/move_operators.cpp @@ -354,22 +354,6 @@ static map> analyzeBasicBlockIntraDependencies(c collectUsedKeysFromExpression(arrayRef->subscript(i), usedKeys); }; - auto addOperatorDependencies = [&](SgStatement* stmt, - const set& usedKeys, - const map& varDeclarations, - map>& operatorsDependencies) - { - if (!stmt) - return; - - for (const string& key : usedKeys) - { - auto it = varDeclarations.find(key); - if (it != varDeclarations.end() && it->second && it->second != stmt) - operatorsDependencies[stmt].insert(it->second); - } - }; - auto declarationKeyFromLeftPart = [&](SgStatement* stmt) -> string { if (!stmt || stmt->variant() != ASSIGN_STAT) @@ -392,6 +376,31 @@ static map> analyzeBasicBlockIntraDependencies(c return string(); }; + auto addOperatorDependencies = [&](SgStatement* stmt, + const set& usedKeys, + const map& varDeclarations, + const map& varUsages, + map>& operatorsDependencies) + { + if (!stmt) + return; + + for (const string& key : usedKeys) + { + auto it = varDeclarations.find(key); + if (it != varDeclarations.end() && it->second && it->second != stmt) + operatorsDependencies[stmt].insert(it->second); + } + + const string defKey = declarationKeyFromLeftPart(stmt); + if (!defKey.empty()) + { + auto itu = varUsages.find(defKey); + if (itu != varUsages.end() && itu->second && itu->second != stmt) + operatorsDependencies[stmt].insert(itu->second); + } + }; + vector operatorsOrder; set seenOperators; @@ -410,6 +419,7 @@ static map> analyzeBasicBlockIntraDependencies(c } map varDeclarations; + map varUsages; map> operatorsDependencies; for (SgStatement* stmt : operatorsOrder) @@ -420,11 +430,14 @@ static map> analyzeBasicBlockIntraDependencies(c collectUsedKeysFromExpression(stmt->expr(1), usedKeys); collectUsedKeysFromArraySubscripts(isSgArrayRefExp(stmt->expr(0)), usedKeys); } - addOperatorDependencies(stmt, usedKeys, varDeclarations, operatorsDependencies); + addOperatorDependencies(stmt, usedKeys, varDeclarations, varUsages, operatorsDependencies); const string declarationKey = declarationKeyFromLeftPart(stmt); if (!declarationKey.empty()) varDeclarations[declarationKey] = stmt; + + for (const string& key : usedKeys) + varUsages[key] = stmt; } return operatorsDependencies;