Compare commits
41 Commits
private_ar
...
private_ar
| Author | SHA1 | Date | |
|---|---|---|---|
| b6665271dd | |||
|
|
68b6883f30 | ||
|
|
fe81822c96 | ||
| 2a0cfdb68e | |||
| 4229041da4 | |||
|
|
14e3bc54f1 | ||
|
|
46ff7761d6 | ||
|
|
19254c0641 | ||
|
|
78aa84f8e5 | ||
|
|
aa7f9cfa4f | ||
|
|
ef76988301 | ||
|
|
0b46007f8e | ||
|
|
3024a52963 | ||
|
|
4245afa5c8 | ||
|
|
7d8c4b4714 | ||
|
|
557c58f879 | ||
|
|
b8d8bb9ddc | ||
|
|
5c6a2444f3 | ||
|
|
e958fdbc7c | ||
|
|
390b1f7076 | ||
|
|
9f3c4310ed | ||
|
|
1c0e02dd9c | ||
|
|
ece05bf29a | ||
|
|
0f4e970adf | ||
|
|
05b72fe9b7 | ||
|
|
806365daa8 | ||
|
|
b27539edea | ||
|
|
7a62268f61 | ||
|
|
88e9a1532e | ||
| 087247b11f | |||
|
|
de5c17b46f | ||
|
|
d5f70c3604 | ||
|
|
af7b343ebd | ||
|
|
3fd03d4c2a | ||
|
|
aa92a918a4 | ||
|
|
6f649696ab | ||
|
|
e2356498dc | ||
|
|
55ba751dc3 | ||
|
|
212460ac15 | ||
|
|
d17b4c2702 | ||
| 3eb09fe5cf |
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user