41 Commits

Author SHA1 Message Date
b6665271dd fix algorythm 2026-02-19 20:47:24 +03:00
ALEXks
68b6883f30 improved fix_common_blocks 2026-02-19 20:47:24 +03:00
ALEXks
fe81822c96 fixed getModuleSymbols 2026-02-19 20:47:24 +03:00
2a0cfdb68e fix some compiler warnings 2026-02-19 20:47:24 +03:00
4229041da4 PRIVATE_ANALYSIS_IR: handle unreachable loops 2026-02-19 20:47:24 +03:00
ALEXks
14e3bc54f1 dvm updated 2026-02-19 20:47:24 +03:00
ALEXks
46ff7761d6 dvm updated 2026-02-19 20:47:23 +03:00
ALEXks
19254c0641 fixed shadow grouping 2026-02-19 20:47:23 +03:00
ALEXks
78aa84f8e5 added CFG_withUnreachable option 2026-02-19 20:47:23 +03:00
ALEXks
aa7f9cfa4f improved CFG settings 2026-02-19 20:47:23 +03:00
ALEXks
ef76988301 turn on staticShadowAnalysis option 2026-02-19 20:47:23 +03:00
ALEXks
0b46007f8e fixed private filling 2026-02-19 20:47:23 +03:00
ALEXks
3024a52963 fixed deps 2026-02-19 20:47:23 +03:00
ALEXks
4245afa5c8 fixed getNameInLocation for module functions 2026-02-19 20:47:23 +03:00
ALEXks
7d8c4b4714 fixed unparsing COMMON list 2026-02-19 20:47:23 +03:00
ALEXks
557c58f879 fixed GetDeclSymbol 2026-02-19 20:47:23 +03:00
ALEXks
b8d8bb9ddc fixed ChangeName function for common 2026-02-19 20:47:23 +03:00
ALEXks
5c6a2444f3 fixed different names of same arrays in common 2026-02-19 20:47:22 +03:00
ALEXks
e958fdbc7c fixed private analysis 2026-02-19 20:47:22 +03:00
ALEXks
390b1f7076 updated submodule libpredictor 2026-02-19 20:47:22 +03:00
ALEXks
9f3c4310ed fixed submodule libpredictor 2026-02-19 20:47:22 +03:00
ALEXks
1c0e02dd9c version updated 2026-02-19 20:47:22 +03:00
ALEXks
ece05bf29a dvm submodule updated 2026-02-19 20:47:22 +03:00
ALEXks
0f4e970adf refactored, added pass to Visualizer calls 2026-02-19 20:47:22 +03:00
ALEXks
05b72fe9b7 refactored 2026-02-19 20:47:22 +03:00
Egor Mayorov
806365daa8 fixes & improvements 2026-02-19 20:47:22 +03:00
Egor Mayorov
b27539edea Adding handing of nested loops and conditional statements 2026-02-19 20:47:22 +03:00
Egor Mayorov
7a62268f61 Make pass correct 2026-02-19 20:47:22 +03:00
Egor Mayorov
88e9a1532e attempt to build new ast 2026-02-19 20:47:22 +03:00
087247b11f moved to transformations 2026-02-19 20:47:22 +03:00
Egor Mayorov
de5c17b46f swap operators in AST 2026-02-19 20:47:21 +03:00
Egor Mayorov
d5f70c3604 Use more complex algorythm for building new order of statements 2026-02-19 20:47:21 +03:00
Egor Mayorov
af7b343ebd update in new order 2026-02-19 20:47:21 +03:00
Egor Mayorov
3fd03d4c2a biulding new order 2026-02-19 20:47:21 +03:00
Egor Mayorov
aa92a918a4 some loop analysis done 2026-02-19 20:47:21 +03:00
Egor Mayorov
6f649696ab Add _bin to gitignore 2026-02-19 20:47:21 +03:00
Egor Mayorov
e2356498dc Some actions simplify analyzing IR 2026-02-19 20:47:21 +03:00
Egor Mayorov
55ba751dc3 Pass with output file added 2026-02-19 20:47:21 +03:00
Egor Mayorov
212460ac15 change pass deps 2026-02-19 20:47:21 +03:00
Egor Mayorov
d17b4c2702 New pass 2026-02-19 20:47:21 +03:00
3eb09fe5cf change propagation 2025-12-27 13:30:25 +03:00
5 changed files with 112 additions and 69 deletions

View File

@@ -10,6 +10,7 @@
using namespace std;
static SgStatement* declPlace = NULL;
static unordered_set<SgStatement*> changed;;
static bool CheckConstIndexes(SgExpression* exp)
{
@@ -36,13 +37,13 @@ static bool CheckConstIndexes(SgExpression* exp)
static SgExpression* CreateVar(int& variableNumber, SgType* type)
{
string varName = "__tmp_prop_var";
string varName = "tmp_prop_var";
string name = varName + std::to_string(variableNumber) + "__";
variableNumber++;
SgSymbol* varSymbol = new SgSymbol(VARIABLE_NAME, name.c_str(), *type, *declPlace->controlParent());
const string commonBlockName = "__propagation_common__";
const string commonBlockName = "propagation_common__";
SgStatement* funcStart = declPlace->controlParent();
SgStatement* commonStat = NULL;
@@ -169,7 +170,6 @@ static SgExpression* CreateVar(int& variableNumber, SgType* type)
commonList->setLhs(varList);
}
return new SgExpression(VAR_REF, NULL, NULL, varSymbol, type->copyPtr());
}
@@ -227,6 +227,8 @@ static void TransformLeftPart(SgStatement* st, SgExpression* exp, unordered_map<
{
if (exp->symbol()->type()->variant() == T_STRING)
return;
if (changed.find(st) != changed.end())
return;
string expUnparsed = exp->unparse();
if (arrayToVariable.find(expUnparsed) == arrayToVariable.end() && exp->symbol()->type()->baseType())
{
@@ -240,6 +242,56 @@ static void TransformLeftPart(SgStatement* st, SgExpression* exp, unordered_map<
newStatement->setlineNumber(getNextNegativeLineNumber());
newStatement->setLocalLineNumber(st->lineNumber());
st->insertStmtBefore(*newStatement, *st->controlParent());
changed.insert(st);
}
static void TransformBorder(SgStatement* st, SgExpression* exp, unordered_map<string, SgExpression*>& arrayToVariable, int& variableNumber)
{
SgStatement* firstStatement = declPlace->lexPrev();
st = st->lexPrev();
string array = exp->unparse();
arrayToVariable[array] = CreateVar(variableNumber, exp->symbol()->type()->baseType());
while (st != firstStatement)
{
if (st->variant() == ASSIGN_STAT && arrayToVariable.find(st->expr(0)->unparse()) != arrayToVariable.end())
{
if (st->expr(1))
{
TransformRightPart(st, st->expr(1), arrayToVariable, variableNumber);
}
if (st->expr(0) && st->expr(0)->variant() == ARRAY_REF && CheckConstIndexes(st->expr(0)->lhs()) && arrayToVariable.find(st->expr(0)->unparse()) != arrayToVariable.end())
{
TransformLeftPart(st, st->expr(0), arrayToVariable, variableNumber);
}
}
st = st->lexPrev();
}
}
static void CheckVariable(SgStatement* st, SgExpression* exp, unordered_map<string, SgExpression*>& arrayToVariable, int& variableNumber)
{
SgStatement* firstStatement = declPlace->lexPrev();
st = st->lexPrev();
string varName = exp->unparse();
while (st != firstStatement)
{
if (st->variant() == ASSIGN_STAT && st->expr(0)->symbol() == exp->symbol())
{
TransformRightPart(st, st->expr(1), arrayToVariable, variableNumber);
}
if (st->variant() == ASSIGN_STAT && arrayToVariable.find(st->expr(0)->unparse()) != arrayToVariable.end())
{
if (st->expr(1))
{
TransformRightPart(st, st->expr(1), arrayToVariable, variableNumber);
}
if (st->expr(0) && st->expr(0)->variant() == ARRAY_REF && CheckConstIndexes(st->expr(0)->lhs()) && arrayToVariable.find(st->expr(0)->unparse()) != arrayToVariable.end())
{
TransformLeftPart(st, st->expr(0), arrayToVariable, variableNumber);
}
}
st = st->lexPrev();
}
}
void ArrayConstantPropagation(SgProject& project)
@@ -262,40 +314,29 @@ void ArrayConstantPropagation(SgProject& project)
for (; st != lastNode; st = st->lexNext())
{
if (st->variant() == ASSIGN_STAT)
{
if (st->expr(1))
{
TransformRightPart(st, st->expr(1), arrayToVariable, variableNumber);
}
if (st->expr(0) && st->expr(0)->variant() == ARRAY_REF && CheckConstIndexes(st->expr(0)->lhs()))
{
TransformLeftPart(st, st->expr(0), arrayToVariable, variableNumber);
}
}
else if (st->variant() == FOR_NODE)
if (st->variant() == FOR_NODE)
{
SgExpression* lowerBound = st->expr(0)->lhs();
SgExpression* upperBound = st->expr(0)->rhs();
string lowerBoundUnparsed = lowerBound->unparse(), upperBoundUnparsed = upperBound->unparse();
if (upperBound->variant() == ARRAY_REF && upperBound->symbol()->type()->baseType() && CheckConstIndexes(upperBound->lhs()))
{
if (arrayToVariable.find(upperBoundUnparsed) == arrayToVariable.end())
{
arrayToVariable[upperBoundUnparsed] = CreateVar(variableNumber, upperBound->symbol()->type()->baseType());
}
TransformBorder(st, upperBound, arrayToVariable, variableNumber);
st->expr(0)->setRhs(arrayToVariable[upperBoundUnparsed]->copyPtr());
}
else if (upperBound->variant() == VAR_REF)
CheckVariable(st, upperBound, arrayToVariable, variableNumber);
if (lowerBound->variant() == ARRAY_REF && lowerBound->symbol()->type()->baseType() && CheckConstIndexes(lowerBound->lhs()))
{
if (arrayToVariable.find(lowerBoundUnparsed) == arrayToVariable.end())
{
arrayToVariable[lowerBoundUnparsed] = CreateVar(variableNumber, lowerBound->symbol()->type()->baseType());
}
TransformBorder(st, lowerBound, arrayToVariable, variableNumber);
st->expr(0)->setLhs(arrayToVariable[lowerBoundUnparsed]->copyPtr());
}
else if (lowerBound->variant() == VAR_REF)
CheckVariable(st, lowerBound, arrayToVariable, variableNumber);
}
}
cout << file->functions(i)->unparse() << endl;
}
}
}

View File

@@ -180,7 +180,8 @@ static void SolveDataFlowIteratively(Region* DFG)
b->array_out = newOut;
else
worklist.erase(b);
} while (!worklist.empty());
}
while (!worklist.empty());
}
static void SolveForBasickBlock(Region* block)
@@ -372,7 +373,7 @@ static void AddPrivateArraysToLoop(LoopGraph* loop, const ArrayAccessingIndexes&
}
}
void FindPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR, set<SgStatement*>& insertedPrivates)
void FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR, set<SgStatement*> &insertedPrivates)
{
map<LoopGraph*, ArrayAccessingIndexes> result;
for (const auto& [fileName, loops] : loopGraph)
@@ -387,7 +388,7 @@ void FindPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*
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)
{

View File

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

View File

@@ -95,7 +95,7 @@ static string FindIndexName(int pos, SAPFOR::BasicBlock* block, map<string, Loop
return "";
}
static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAccessingIndexes& def, ArrayAccessingIndexes& use, Region* region) {
static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAccessingIndexes& def, ArrayAccessingIndexes& use, ArrayAccessingIndexes& all_use, Region* region) {
auto instructions = block->getInstructions();
map<string, LoopGraph*> loopForIndex;
BuildLoopIndex(loopForIndex, loop);
@@ -166,7 +166,7 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
}
}
coeffsForDims = { coeffsForDims.rbegin(), coeffsForDims.rend() };
coeffsForDims = {coeffsForDims.rbegin(), coeffsForDims.rend()};
while (!index_vars.empty() && !refPos.empty() && !coeffsForDims.empty())
{
@@ -227,6 +227,7 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
else
{
instruction.use[array_name] = { { accessPoint } };
all_use[array_name].Insert(accessPoint);
if (def.find(array_name) == def.end())
use[array_name].Insert(accessPoint);
else
@@ -327,7 +328,7 @@ Region::Region(LoopGraph* loop, const vector<SAPFOR::BasicBlock*>& Blocks)
{
bbToRegion[poiner] = new Region(*poiner);
this->basickBlocks.push_back(bbToRegion[poiner]);
GetDefUseArray(poiner, loop, bbToRegion[poiner]->array_def, bbToRegion[poiner]->array_use, bbToRegion[poiner]);
GetDefUseArray(poiner, loop, bbToRegion[poiner]->array_def, bbToRegion[poiner]->array_use, bbToRegion[poiner]->array_all_use, bbToRegion[poiner]);
}
this->header = bbToRegion[header];

View File

@@ -67,7 +67,7 @@ public:
std::vector<RegionInstruction> instructions;
ArrayAccessingIndexes array_def, array_use, array_out, array_in, array_priv;
ArrayAccessingIndexes array_def, array_use, array_out, array_in, array_priv, array_all_use;
private:
std::vector<Region*> basickBlocks;