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,8 +170,7 @@ static SgExpression* CreateVar(int& variableNumber, SgType* type)
commonList->setLhs(varList);
}
return new SgExpression(VAR_REF, NULL, NULL, varSymbol, type->copyPtr());
return new SgExpression(VAR_REF, NULL, NULL, varSymbol, type->copyPtr());
}
static void TransformRightPart(SgStatement* st, SgExpression* exp, unordered_map<string, SgExpression*>& arrayToVariable, int& variableNumber)
@@ -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())
{
@@ -234,12 +236,62 @@ static void TransformLeftPart(SgStatement* st, SgExpression* exp, unordered_map<
}
SgStatement* newStatement = new SgStatement(ASSIGN_STAT, NULL, NULL, arrayToVariable[expUnparsed]->copyPtr(), st->expr(1)->copyPtr(), NULL);
newStatement->setFileId(st->getFileId());
newStatement->setFileId(st->getFileId());
newStatement->setProject(st->getProject());
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

@@ -83,7 +83,7 @@ static void Collapse(Region* region)
RegionInstruction instruction;
instruction.def = move(region->array_def);
for (auto& byBlock : region->getBasickBlocks())
{
@@ -107,13 +107,13 @@ static void Collapse(Region* region)
region->array_priv[arrayName] = useUnionB[arrayName].Diff(region->array_use[arrayName]);
instruction.use = move(region->array_use);
for (Region* prevBlock : region->getHeader()->getPrevRegions())
{
prevBlock->replaceInNextRegions(region, region->getHeader());
region->addPrevRegion(prevBlock);
}
for (Region* nextBlock : region->getHeader()->getNextRegions())
{
nextBlock->replaceInPrevRegions(region, region->getHeader());
@@ -123,7 +123,7 @@ static void Collapse(Region* region)
}
static void SolveDataFlowIteratively(Region* DFG)
static void SolveDataFlowIteratively(Region* DFG)
{
auto blocks = DFG->getBasickBlocks();
std::unordered_set<Region*> worklist(blocks.begin(), blocks.end());
@@ -150,7 +150,7 @@ static void SolveDataFlowIteratively(Region* DFG)
for (const auto& [arrayName, accessSet] : prevBlock->array_out)
{
if (newIn.find(arrayName) != newIn.end())
newIn[arrayName] = newIn[arrayName].Intersect(accessSet);
newIn[arrayName] = newIn[arrayName].Intersect(accessSet);
else
newIn[arrayName] = AccessingSet();
}
@@ -160,7 +160,7 @@ static void SolveDataFlowIteratively(Region* DFG)
b->array_in = move(newIn);
ArrayAccessingIndexes newOut;
if (b->array_def.empty())
if (b->array_def.empty())
newOut = b->array_in;
else if (b->array_in.empty())
newOut = b->array_def;
@@ -176,11 +176,12 @@ static void SolveDataFlowIteratively(Region* DFG)
}
/* can not differ */
if (newOut != b->array_out)
if (newOut != b->array_out)
b->array_out = newOut;
else
worklist.erase(b);
} while (!worklist.empty());
}
while (!worklist.empty());
}
static void SolveForBasickBlock(Region* block)
@@ -364,7 +365,7 @@ static void AddPrivateArraysToLoop(LoopGraph* loop, const ArrayAccessingIndexes&
}
toAdd->setLhs(new SgVarRefExp(elem));
}
if (arraysToInsert.size() != 0)
{
loop->loop->insertStmtBefore(*spfStat, *loop->loop->controlParent());
@@ -372,8 +373,8 @@ 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,8 +388,8 @@ 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)
{
Region* loopRegion = new Region(loop, blocks);
@@ -408,4 +409,4 @@ void FindPrivateArrays(map<string, vector<LoopGraph*>>& loopGraph, map<FuncInfo*
AddPrivateArraysToLoop(loop, result[loop], insertedPrivates);
}
}
}
}

View File

@@ -29,7 +29,7 @@ static ArrayDimension* DimensionIntersection(const ArrayDimension& dim1, const A
vector<uint64_t> partSolution = FindParticularSolution(dim1, dim2);
if (partSolution.empty())
return NULL;
int64_t x0 = partSolution[0], y0 = partSolution[1];
/* x = x_0 + c * t */
/* y = y_0 + d * t */
@@ -44,10 +44,10 @@ static ArrayDimension* DimensionIntersection(const ArrayDimension& dim1, const A
uint64_t tMax = min(tXMax, tYMax);
if (tMin > tMax)
return NULL;
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;
}
@@ -57,12 +57,12 @@ static vector<ArrayDimension> DimensionDifference(const ArrayDimension& dim1, co
ArrayDimension* intersection = DimensionIntersection(dim1, dim2);
if (!intersection)
return { dim1 };
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 });
if (dim1.start < intersection->start)
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;
}
}
@@ -109,7 +109,7 @@ static vector<ArrayDimension> ElementsIntersection(const vector<ArrayDimension>&
{
if (firstElement.empty() || secondElement.empty())
return {};
size_t dimAmount = firstElement.size();
/* check if there is no intersecction */
for (size_t i = 0; i < dimAmount; i++)
@@ -136,12 +136,12 @@ static vector<vector<ArrayDimension>> ElementsDifference(const vector<ArrayDimen
return {};
if (secondElement.empty())
return { firstElement };
vector<ArrayDimension> intersection = ElementsIntersection(firstElement, secondElement);
vector<vector<ArrayDimension>> result;
if (intersection.empty())
return { firstElement };
for (int i = 0; i < firstElement.size(); i++)
{
auto dimDiff = DimensionDifference(firstElement[i], secondElement[i]);
@@ -293,4 +293,4 @@ bool operator!=(const ArrayAccessingIndexes& lhs, const ArrayAccessingIndexes& r
return true;
return false;
}
}

View File

@@ -64,14 +64,14 @@ static void BuildLoopIndex(map<string, LoopGraph*>& loopForIndex, LoopGraph* loo
static string FindIndexName(int pos, SAPFOR::BasicBlock* block, map<string, LoopGraph*>& loopForIndex) {
unordered_set<SAPFOR::Argument*> args = { block->getInstructions()[pos]->getInstruction()->getArg1() };
for (int i = pos - 1; i >= 0; i--)
for (int i = pos - 1; i >= 0; i--)
{
SAPFOR::Argument* res = block->getInstructions()[i]->getInstruction()->getResult();
if (res && args.find(res) != args.end())
if (res && args.find(res) != args.end())
{
SAPFOR::Argument* arg1 = block->getInstructions()[i]->getInstruction()->getArg1();
SAPFOR::Argument* arg2 = block->getInstructions()[i]->getInstruction()->getArg2();
if (arg1)
if (arg1)
{
string name = arg1->getValue();
int idx = name.find('%');
@@ -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())
{
@@ -180,22 +180,22 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
string name, full_name = var->getValue();
int pos = full_name.find('%');
LoopGraph* currentLoop;
if (pos != -1)
if (pos != -1)
{
name = full_name.substr(pos + 1);
if (loopForIndex.find(name) != loopForIndex.end())
currentLoop = loopForIndex[name];
currentLoop = loopForIndex[name];
else
return -1;
}
else
else
{
name = FindIndexName(currentVarPos, block, loopForIndex);
if (name == "")
return -1;
if (loopForIndex.find(name) != loopForIndex.end())
currentLoop = loopForIndex[name];
currentLoop = loopForIndex[name];
else
return -1;
}
@@ -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
@@ -285,7 +286,7 @@ static void SetConnections(unordered_map<SAPFOR::BasicBlock*, Region*>& bbToRegi
for (SAPFOR::BasicBlock* nextBlock : block->getNext())
if (bbToRegion.find(nextBlock) != bbToRegion.end())
bbToRegion[block]->addNextRegion(bbToRegion[nextBlock]);
for (SAPFOR::BasicBlock* prevBlock : block->getPrev())
if (bbToRegion.find(prevBlock) != bbToRegion.end())
bbToRegion[block]->addPrevRegion(bbToRegion[prevBlock]);
@@ -298,17 +299,17 @@ static Region* CreateSubRegion(LoopGraph* loop, const vector<SAPFOR::BasicBlock*
auto [header, blockSet] = GetBasicBlocksForLoop(loop, Blocks);
RemoveHeaderConnection(header, blockSet, bbToRegion);
if (bbToRegion.find(header) != bbToRegion.end())
region->setHeader(bbToRegion.at(header));
region->setHeader(bbToRegion.at(header));
else
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return NULL;
}
for (SAPFOR::BasicBlock* block : blockSet)
if (bbToRegion.find(block) != bbToRegion.end())
region->addBasickBlocks(bbToRegion.at(block));
for (LoopGraph* childLoop : loop->children)
{
if (!childLoop->isFor())
@@ -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];
@@ -341,4 +342,4 @@ Region::Region(LoopGraph* loop, const vector<SAPFOR::BasicBlock*>& Blocks)
subRegions.insert(CreateSubRegion(childLoop, Blocks, bbToRegion));
}
TopologySort(basickBlocks, this->header);
}
}

View File

@@ -33,7 +33,7 @@ public:
std::unordered_set<Region*>& getNextRegions() { return nextRegions; }
void removeNextRegion(Region* region)
void removeNextRegion(Region* region)
{
if (nextRegions.find(region) != nextRegions.end())
nextRegions.erase(region);
@@ -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;
@@ -79,4 +79,4 @@ private:
Region* header;
};
void TopologySort(std::vector<Region*>& basikBlocks, Region* header);
void TopologySort(std::vector<Region*>& basikBlocks, Region* header);