fix FIND_PRIVATE_ARRAYS

This commit is contained in:
2025-12-19 01:55:23 +03:00
committed by Egor Mayorov
parent d94cb3c062
commit a75012b6b6
9 changed files with 381 additions and 21 deletions

View File

@@ -16,6 +16,35 @@
using namespace std;
static void RemoveEmptyPoints(ArrayAccessingIndexes& container)
{
ArrayAccessingIndexes resultContainer;
unordered_set<string> toRemove;
for (auto& [arrayName, accessingSet] : container)
{
vector<vector<ArrayDimension>> points;
for (auto& arrayPoint : accessingSet.GetElements())
{
if (!arrayPoint.empty())
points.push_back(arrayPoint);
}
if (points.size() < accessingSet.GetElements().size() && !points.empty())
resultContainer[arrayName] = points;
if (points.empty())
toRemove.insert(arrayName);
}
for (const string& name : toRemove)
{
container.erase(name);
}
for (auto& [arrayName, accessingSet] : resultContainer)
{
container[arrayName] = accessingSet;
}
}
static void Collapse(Region* region)
{
if (region->getBasickBlocks().empty())
@@ -188,6 +217,8 @@ void FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*
SgFile::switchToFile(fileName);
for (const auto& loop : loops)
{
if (!loop->isFor())
continue;
SgStatement* search_func = loop->loop->GetOriginal();
while (search_func && (!isSgProgHedrStmt(search_func)))
@@ -204,6 +235,7 @@ void FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*
continue;
}
SolveDataFlow(loopRegion);
RemoveEmptyPoints(loopRegion->array_priv);
result[loop] = loopRegion->array_priv;
delete(loopRegion);
}