improved private arrays analysis

This commit is contained in:
ALEXks
2026-05-01 12:56:32 +03:00
parent e1bcaeba5c
commit 51f97e2be9
6 changed files with 52 additions and 29 deletions

View File

@@ -311,7 +311,7 @@ static bool checkDimensionLength(const AccessingSet& array, const map<tuple<int,
return false;
}
static void addPrivateArraysToLoop(LoopGraph* loop, const arrayAccessingIndexes& privates, set<SgStatement*>& insertedPrivates,
static int addPrivateArraysToLoop(LoopGraph* loop, const arrayAccessingIndexes& privates, set<SgStatement*>& insertedPrivates,
map<string, vector<Messages>>& SPF_messages,
const map<tuple<int, string, string>, pair<DIST::Array*, DIST::ArrayAccessInfo*>>& declaredArrays)
{
@@ -367,7 +367,7 @@ static void addPrivateArraysToLoop(LoopGraph* loop, const arrayAccessingIndexes&
}
}
void findPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*,
int findPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*,
vector<SAPFOR::BasicBlock*>>& FullIR,
set<SgStatement*>& insertedPrivates,
map<string, vector<Messages>>& SPF_messages,
@@ -419,4 +419,26 @@ void findPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*
addPrivateArraysToLoop(loop, result[loop], insertedPrivates, SPF_messages, declaredArrays);
}
}
for (const auto& [loop, accesing] : result)
{
if (accesing.size())
{
__spf_print(1, "found for loop on line %d in file %s\n", loop->lineNum, loop->fileName.c_str());
for (const auto& [name, accesingSet] : accesing)
{
const auto& byDimention = accesingSet.GetElements();
__spf_print(1, " for array %s with dimention %d\n", name.c_str(), byDimention.size());
for (int z = 0; z < byDimention.size(); ++z)
{
__spf_print(1, " dim %d (start, step, tripCount):\n", z);
for (auto& elem : byDimention[z])
__spf_print(1, " [%ld %ld %ld]\n", elem.start, elem.step, elem.tripCount);
}
}
}
}
return insertedPrivates.size();
}

View File

@@ -8,7 +8,7 @@
#include "graph_loops.h"
#include "CFGraph/CFGraph.h"
void findPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*,
std::vector<SAPFOR::BasicBlock*>>& FullIR, std::set<SgStatement*>& insertedPrivates,
std::map<std::string, std::vector<Messages>>& SPF_messages,
const std::map<std::tuple<int, std::string, std::string>, std::pair<DIST::Array*, DIST::ArrayAccessInfo*>>& declaredArrays);
int findPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*,
std::vector<SAPFOR::BasicBlock*>>& FullIR, std::set<SgStatement*>& insertedPrivates,
std::map<std::string, std::vector<Messages>>& SPF_messages,
const std::map<std::tuple<int, std::string, std::string>, std::pair<DIST::Array*, DIST::ArrayAccessInfo*>>& declaredArrays);

View File

@@ -203,7 +203,7 @@ void AccessingSet::FindCoveredBy(const vector<ArrayDimension>& element, vector<v
}
}
vector<vector<ArrayDimension>> AccessingSet::GetElements() const { return allElements; }
const vector<vector<ArrayDimension>>& AccessingSet::GetElements() const { return allElements; }
void AccessingSet::Insert(const vector<ArrayDimension>& element)
{

View File

@@ -22,7 +22,7 @@ public:
AccessingSet(std::vector<std::vector<ArrayDimension>> input) : allElements(input) {};
AccessingSet() {};
AccessingSet(const AccessingSet& a) { allElements = a.GetElements(); };
std::vector<std::vector<ArrayDimension>> GetElements() const;
const std::vector<std::vector<ArrayDimension>>& GetElements() const;
void Insert(const std::vector<ArrayDimension>& element);
AccessingSet Union(const AccessingSet& source);
AccessingSet Intersect(const AccessingSet& secondSet) const;