fix FIND_PRIVATE_ARRAYS
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -64,18 +64,13 @@ static vector<ArrayDimension> DimensionDifference(const ArrayDimension& dim1, co
|
||||
result.push_back({ dim1.start, dim1.step, (intersection->start - dim1.start) / dim1.step, dim1.array});
|
||||
|
||||
/* add the parts between intersection steps */
|
||||
uint64_t start = (intersection->start - dim1.start) / dim1.step;
|
||||
uint64_t interValue = intersection->start;
|
||||
for (int64_t i = start; dim1.start + i * dim1.step <= intersection->start + intersection->step * (intersection->tripCount - 1); i++)
|
||||
if (intersection->step > dim1.step)
|
||||
{
|
||||
uint64_t centerValue = dim1.start + i * dim1.step;
|
||||
if (centerValue == interValue)
|
||||
uint64_t start = (intersection->start - dim1.start) / dim1.step;
|
||||
uint64_t interValue = intersection->start;
|
||||
for (int64_t i = start; interValue <= intersection->start + intersection->step * (intersection->tripCount - 1); i++)
|
||||
{
|
||||
if (i - start > 1)
|
||||
{
|
||||
result.push_back({ dim1.start + (start + 1) * dim1.step, dim1.step, i - start - 1, dim1.array });
|
||||
start = i;
|
||||
}
|
||||
result.push_back({interValue + dim1.step, dim1.step, intersection->step / dim1.step, dim1.array});
|
||||
interValue += intersection->step;
|
||||
}
|
||||
}
|
||||
@@ -216,6 +211,10 @@ void AccessingSet::Insert(const vector<ArrayDimension>& element)
|
||||
}
|
||||
|
||||
AccessingSet AccessingSet::Union(const AccessingSet& source) {
|
||||
if (source.GetElements().empty())
|
||||
return *this;
|
||||
if (allElements.empty())
|
||||
return source;
|
||||
AccessingSet result;
|
||||
for (auto& element : source.GetElements())
|
||||
result.Insert(element);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include<unordered_map>
|
||||
#include<string>
|
||||
#include <numeric>
|
||||
#include <iostream>
|
||||
|
||||
#include "range_structures.h"
|
||||
#include "region.h"
|
||||
@@ -108,11 +109,7 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
|
||||
{
|
||||
vector<SAPFOR::Argument*> index_vars;
|
||||
vector<int> refPos;
|
||||
string array_name;
|
||||
if (operation == SAPFOR::CFG_OP::STORE)
|
||||
array_name = instruction->getInstruction()->getArg1()->getValue();
|
||||
else
|
||||
array_name = instruction->getInstruction()->getArg2()->getValue();
|
||||
string array_name = instruction->getInstruction()->getArg1()->getValue();
|
||||
|
||||
int j = i - 1;
|
||||
while (j >= 0 && instructions[j]->getInstruction()->getOperation() == SAPFOR::CFG_OP::REF)
|
||||
@@ -128,6 +125,7 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
|
||||
|
||||
auto* ref = isSgArrayRefExp(instruction->getInstruction()->getExpression());
|
||||
vector<pair<int, int>> coefsForDims;
|
||||
int subs = ref->numberOfSubscripts();
|
||||
for (int i = 0; ref && i < ref->numberOfSubscripts(); ++i)
|
||||
{
|
||||
const vector<int*>& coefs = getAttributes<SgExpression*, int*>(ref->subscript(i), set<int>{ INT_VAL });
|
||||
@@ -174,13 +172,17 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint64_t start = currentLoop->startVal * currentCoefs.first + currentCoefs.second;
|
||||
uint64_t step = currentCoefs.first;
|
||||
current_dim = { start, step, (uint64_t)currentLoop->calculatedCountOfIters, ref };
|
||||
uint64_t start = currentLoop->startVal;
|
||||
uint64_t step = currentLoop->stepVal;
|
||||
uint64_t iters = currentLoop->calculatedCountOfIters;
|
||||
current_dim = { start, step, iters, ref };
|
||||
}
|
||||
|
||||
accessPoint[n - index_vars.size()] = current_dim;
|
||||
fillCount++;
|
||||
if (current_dim.start != 0 && current_dim.step != 0 && current_dim.tripCount != 0)
|
||||
{
|
||||
accessPoint[n - index_vars.size()] = current_dim;
|
||||
fillCount++;
|
||||
}
|
||||
index_vars.pop_back();
|
||||
refPos.pop_back();
|
||||
coefsForDims.pop_back();
|
||||
@@ -230,8 +232,11 @@ static Region* CreateSubRegion(LoopGraph* loop, const vector<SAPFOR::BasicBlock*
|
||||
region->addBasickBlocks(bbToRegion.at(block));
|
||||
|
||||
for (LoopGraph* childLoop : loop->children)
|
||||
{
|
||||
if (!childLoop->isFor())
|
||||
continue;
|
||||
region->addSubRegions(CreateSubRegion(childLoop, Blocks, bbToRegion));
|
||||
|
||||
}
|
||||
return region;
|
||||
}
|
||||
|
||||
@@ -250,5 +255,9 @@ Region::Region(LoopGraph* loop, const vector<SAPFOR::BasicBlock*>& Blocks)
|
||||
SetConnections(bbToRegion, blockSet);
|
||||
//create subRegions
|
||||
for (LoopGraph* childLoop : loop->children)
|
||||
{
|
||||
if (!childLoop->isFor())
|
||||
continue;
|
||||
subRegions.insert(CreateSubRegion(childLoop, Blocks, bbToRegion));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user