7 Commits

Author SHA1 Message Date
678c2cf351 Merge pull request 'add directives' (#69) from private_arrays into master 2025-12-11 08:30:47 +00:00
40cfd83de5 add directives 2025-12-10 01:46:26 +03:00
ALEXks
a0cea2df91 added new function for visualizer 2025-11-08 20:17:32 +03:00
ALEXks
4b7df86b8a version updated 2025-11-08 20:08:22 +03:00
836894fef1 Merge pull request 'private_arrays' (#68) from private_arrays into master 2025-11-08 17:07:07 +00:00
9ac15eec79 fix codestyle 2025-11-08 20:06:07 +03:00
03f565f50b add multifile support 2025-11-08 20:06:07 +03:00
8 changed files with 109 additions and 22 deletions

View File

@@ -121,21 +121,93 @@ static void SolveDataFlow(Region* DFG)
Collapse(DFG); Collapse(DFG);
} }
unsigned long long CalculateLength(const AccessingSet& array)
{
if (array.GetElements().empty())
return 0;
unsigned long long result = 1;
for (const auto& range : array.GetElements())
{
for (const auto& dim : range)
{
result *= (dim.step * dim.tripCount);
}
}
return result;
}
void AddPrivateArraysToLoop(LoopGraph* loop, ArrayAccessingIndexes privates)
{
SgStatement* spfStat = new SgStatement(SPF_ANALYSIS_DIR);
spfStat->setlineNumber(loop->lineNum);
spfStat->setFileName((char*)loop->loop->fileName());
SgExpression* toAdd = new SgExpression(EXPR_LIST, new SgExpression(ACC_PRIVATE_OP), NULL, NULL);
set<SgSymbol*> arraysToInsert;
for (const auto& [_, accessingSet] : privates)
{
for (const auto& arrayElement : accessingSet.GetElements())
{
if (arrayElement.empty())
continue;
arraysToInsert.insert(arrayElement[0].array->symbol());
}
}
spfStat->setExpression(0, *toAdd);
toAdd = toAdd->lhs();
bool first = true;
for (auto& elem : arraysToInsert)
{
if (first)
{
toAdd->setLhs(new SgExpression(EXPR_LIST));
toAdd = toAdd->lhs();
first = false;
}
else
{
toAdd->setRhs(new SgExpression(EXPR_LIST));
toAdd = toAdd->rhs();
}
toAdd->setLhs(new SgVarRefExp(elem));
}
loop->loop->addAttribute(SPF_ANALYSIS_DIR, spfStat, sizeof(SgStatement));
}
map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR) map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR)
{ {
map<LoopGraph*, ArrayAccessingIndexes> result; map<LoopGraph*, ArrayAccessingIndexes> result;
for (const auto& [loopName, loops] : loopGraph) for (const auto& [fileName, loops] : loopGraph)
{ {
SgFile::switchToFile(fileName);
for (const auto& loop : loops) for (const auto& loop : loops)
{ {
SgStatement* search_func = loop->loop->GetOriginal();
while (search_func && (!isSgProgHedrStmt(search_func)))
search_func = search_func->controlParent();
for (const auto& [funcInfo, blocks]: FullIR) for (const auto& [funcInfo, blocks]: FullIR)
{
if (funcInfo->fileName == fileName && funcInfo->funcPointer->GetOriginal() == search_func)
{ {
Region* loopRegion = new Region(loop, blocks); Region* loopRegion = new Region(loop, blocks);
if (loopRegion->getBasickBlocks().size() <= 1)
{
delete(loopRegion);
continue;
}
SolveDataFlow(loopRegion); SolveDataFlow(loopRegion);
result[loop] = loopRegion->array_priv; result[loop] = loopRegion->array_priv;
delete(loopRegion); delete(loopRegion);
} }
} }
if (result.find(loop) != result.end() && !result[loop].empty())
{
AddPrivateArraysToLoop(loop, result[loop]);
}
}
} }
return result; return result;
} }

View File

@@ -47,7 +47,7 @@ static ArrayDimension* DimensionIntersection(const ArrayDimension& dim1, const A
uint64_t start3 = dim1.start + x0 * dim1.step; uint64_t start3 = dim1.start + x0 * dim1.step;
uint64_t step3 = c * dim1.step; uint64_t step3 = c * dim1.step;
ArrayDimension* result = new(ArrayDimension){ start3, step3, tMax + 1 }; ArrayDimension* result = new(ArrayDimension){ start3, step3, tMax + 1 , dim1.array};
return result; return result;
} }
@@ -61,7 +61,7 @@ static vector<ArrayDimension> DimensionDifference(const ArrayDimension& dim1, co
vector<ArrayDimension> result; vector<ArrayDimension> result;
/* add the part before intersection */ /* add the part before intersection */
if (dim1.start < intersection->start) if (dim1.start < intersection->start)
result.push_back({ dim1.start, dim1.step, (intersection->start - dim1.start) / dim1.step }); result.push_back({ dim1.start, dim1.step, (intersection->start - dim1.start) / dim1.step, dim1.array});
/* add the parts between intersection steps */ /* add the parts between intersection steps */
uint64_t start = (intersection->start - dim1.start) / dim1.step; uint64_t start = (intersection->start - dim1.start) / dim1.step;
@@ -73,7 +73,7 @@ static vector<ArrayDimension> DimensionDifference(const ArrayDimension& dim1, co
{ {
if (i - start > 1) if (i - start > 1)
{ {
result.push_back({ dim1.start + (start + 1) * dim1.step, dim1.step, i - start - 1 }); result.push_back({ dim1.start + (start + 1) * dim1.step, dim1.step, i - start - 1, dim1.array });
start = i; start = i;
} }
interValue += intersection->step; interValue += intersection->step;
@@ -85,7 +85,7 @@ static vector<ArrayDimension> DimensionDifference(const ArrayDimension& dim1, co
/* first value after intersection */ /* first value after intersection */
uint64_t right_start = intersection->start + intersection->step * (intersection->tripCount - 1) + dim1.step; uint64_t right_start = intersection->start + intersection->step * (intersection->tripCount - 1) + dim1.step;
uint64_t tripCount = (dim1.start + dim1.step * dim1.tripCount - right_start) / dim1.step; uint64_t tripCount = (dim1.start + dim1.step * dim1.tripCount - right_start) / dim1.step;
result.push_back({ right_start, dim1.step, tripCount }); result.push_back({ right_start, dim1.step, tripCount, dim1.array });
} }
delete(intersection); delete(intersection);
return result; return result;

View File

@@ -6,9 +6,12 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
#include "SgUtils.h"
struct ArrayDimension struct ArrayDimension
{ {
uint64_t start, step, tripCount; uint64_t start, step, tripCount;
SgArrayRefExp* array;
}; };
class AccessingSet { class AccessingSet {

View File

@@ -139,17 +139,16 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
} }
if(coefsForDims.empty()) int fillCount = 0;
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
while (!index_vars.empty()) while (!index_vars.empty() && !refPos.empty() && !coefsForDims.empty())
{ {
auto var = index_vars.back(); auto var = index_vars.back();
int currentVarPos = refPos.back(); int currentVarPos = refPos.back();
pair<int, int> currentCoefs = coefsForDims.back(); pair<int, int> currentCoefs = coefsForDims.back();
ArrayDimension current_dim; ArrayDimension current_dim;
if (var->getType() == SAPFOR::CFG_ARG_TYPE::CONST) if (var->getType() == SAPFOR::CFG_ARG_TYPE::CONST)
current_dim = { stoul(var->getValue()), 1, 1 }; current_dim = { stoul(var->getValue()), 1, 1, ref};
else else
{ {
string name, full_name = var->getValue(); string name, full_name = var->getValue();
@@ -177,21 +176,25 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
uint64_t start = currentLoop->startVal * currentCoefs.first + currentCoefs.second; uint64_t start = currentLoop->startVal * currentCoefs.first + currentCoefs.second;
uint64_t step = currentCoefs.first; uint64_t step = currentCoefs.first;
current_dim = { start, step, (uint64_t)currentLoop->calculatedCountOfIters }; current_dim = { start, step, (uint64_t)currentLoop->calculatedCountOfIters, ref };
} }
accessPoint[n - index_vars.size()] = current_dim; accessPoint[n - index_vars.size()] = current_dim;
fillCount++;
index_vars.pop_back(); index_vars.pop_back();
refPos.pop_back(); refPos.pop_back();
coefsForDims.pop_back(); coefsForDims.pop_back();
} }
if (fillCount == accessPoint.size())
{
if (operation == SAPFOR::CFG_OP::STORE) if (operation == SAPFOR::CFG_OP::STORE)
def[array_name].Insert(accessPoint); def[array_name].Insert(accessPoint);
else else
use[array_name].Insert(accessPoint); use[array_name].Insert(accessPoint);
} }
} }
}
return 0; return 0;
} }

View File

@@ -1019,8 +1019,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
if(func->funcPointer->variant() != ENTRY_STAT) if(func->funcPointer->variant() != ENTRY_STAT)
countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks);
} }
else if (curr_regime == FIND_PRIVATE_ARRAYS)
FindPrivateArrays(loopGraph, fullIR);
else if (curr_regime == TEST_PASS) else if (curr_regime == TEST_PASS)
{ {
//test pass //test pass
@@ -1916,6 +1914,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
} }
else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS) else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS)
transformAssumedSizeParameters(allFuncInfo); transformAssumedSizeParameters(allFuncInfo);
else if (curr_regime == FIND_PRIVATE_ARRAYS)
auto result = FindPrivateArrays(loopGraph, fullIR);
const float elapsed = duration_cast<milliseconds>(high_resolution_clock::now() - timeForPass).count() / 1000.; const float elapsed = duration_cast<milliseconds>(high_resolution_clock::now() - timeForPass).count() / 1000.;
const float elapsedGlobal = duration_cast<milliseconds>(high_resolution_clock::now() - globalTime).count() / 1000.; const float elapsedGlobal = duration_cast<milliseconds>(high_resolution_clock::now() - globalTime).count() / 1000.;

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2446" #define VERSION_SPF "2447"

View File

@@ -1793,6 +1793,13 @@ int SPF_RenameIncludes(void*& context, int winHandler, short* options, short* pr
return simpleTransformPass(RENAME_INLCUDES, options, projName, folderName, output, outputMessage); return simpleTransformPass(RENAME_INLCUDES, options, projName, folderName, output, outputMessage);
} }
int SPF_InsertPrivateArrayDirectives(void*& context, int winHandler, short* options, short* projName, short* folderName, string& output, string& outputMessage)
{
MessageManager::clearCache();
MessageManager::setWinHandler(winHandler);
return simpleTransformPass(FIND_PRIVATE_ARRAYS, options, projName, folderName, output, outputMessage);
}
static inline void convertBackSlash(char *str, int strL) static inline void convertBackSlash(char *str, int strL)
{ {
for (int z = 0; z < strL; ++z) for (int z = 0; z < strL; ++z)
@@ -2499,6 +2506,8 @@ const wstring Sapfor_RunTransformation(const char* transformName_c, const char*
retCode = SPF_InsertImplicitNone(context, winHandler, optSh, projSh, fold, output, outputMessage); retCode = SPF_InsertImplicitNone(context, winHandler, optSh, projSh, fold, output, outputMessage);
else if (whichRun == "SPF_RenameIncludes") else if (whichRun == "SPF_RenameIncludes")
retCode = SPF_RenameIncludes(context, winHandler, optSh, projSh, fold, output, outputMessage); retCode = SPF_RenameIncludes(context, winHandler, optSh, projSh, fold, output, outputMessage);
else if (whichRun == "SPF_InsertPrivateArrayDirectives")
retCode = SPF_InsertPrivateArrayDirectives(context, winHandler, optSh, projSh, fold, output, outputMessage);
else if (whichRun == "SPF_CreateParallelVariant") else if (whichRun == "SPF_CreateParallelVariant")
{ {
vector<string> splited; vector<string> splited;