Compare commits
65 Commits
b6665271dd
...
egormayoro
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7390d96b1f | ||
| a1e12f5c1c | |||
|
|
cad8c0913d | ||
|
|
bde804cff6 | ||
|
|
589680a78b | ||
|
|
88bac54901 | ||
|
|
0d4d2b78d8 | ||
|
|
bbac07202d | ||
|
|
9325723e69 | ||
|
|
18ac53f342 | ||
|
|
0bec2c6527 | ||
| aa56778be1 | |||
|
|
0a484e77de | ||
|
|
4818884d48 | ||
|
|
e172678e1b | ||
|
|
0a977146a7 | ||
|
|
0b50e0630a | ||
|
|
980ddeeac7 | ||
| 788eeda22e | |||
|
|
4a9cba7b96 | ||
| 42044b60f1 | |||
|
|
80a1fecb1c | ||
|
|
2db6bf4bdf | ||
| ca77cc05d5 | |||
|
|
a04ee16023 | ||
|
|
0c4f9465df | ||
| 9dbbe9fcdc | |||
| f5d2ecf549 | |||
| eee6f30f94 | |||
|
|
11b3ecba2e | ||
|
|
d4e7b39acd | ||
|
|
d8e5c1bdf6 | ||
|
|
9afdf2a98b | ||
|
|
6091fa474d | ||
|
|
bc9c7cba5c | ||
|
|
c1d94be0be | ||
|
|
d78753888f | ||
|
|
025bbbe259 | ||
|
|
076a0c9699 | ||
|
|
90b311d049 | ||
|
|
5a1377e7ea | ||
|
|
b90d200fad | ||
|
|
331d4f9d99 | ||
|
|
904292f109 | ||
|
|
c36326660c | ||
|
|
ec08e3af0e | ||
|
|
b1ef5d0b67 | ||
| d6c046ea57 | |||
|
|
af85311480 | ||
|
|
d9f54739d2 | ||
|
|
6907f44ac5 | ||
|
|
582d2d5e70 | ||
|
|
1c37336459 | ||
|
|
f527deb02c | ||
| d09e92a947 | |||
|
|
029da32719 | ||
|
|
085e6312a3 | ||
|
|
c5927fe80f | ||
|
|
8728f84546 | ||
|
|
9e4db270fc | ||
|
|
0c20b37923 | ||
|
|
61c6ad1363 | ||
|
|
e5fa2e41b3 | ||
|
|
3b9e4653b6 | ||
|
|
2d84aaff1f |
Submodule projects/dvm updated: cdda71deab...ab99430aee
Submodule projects/libpredictor updated: d08cb25cc6...7e57477dfa
@@ -10,7 +10,6 @@
|
||||
using namespace std;
|
||||
|
||||
static SgStatement* declPlace = NULL;
|
||||
static unordered_set<SgStatement*> changed;;
|
||||
|
||||
static bool CheckConstIndexes(SgExpression* exp)
|
||||
{
|
||||
@@ -37,13 +36,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;
|
||||
@@ -170,6 +169,7 @@ static SgExpression* CreateVar(int& variableNumber, SgType* type)
|
||||
|
||||
commonList->setLhs(varList);
|
||||
}
|
||||
|
||||
return new SgExpression(VAR_REF, NULL, NULL, varSymbol, type->copyPtr());
|
||||
}
|
||||
|
||||
@@ -227,8 +227,6 @@ 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())
|
||||
{
|
||||
@@ -242,56 +240,6 @@ 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)
|
||||
@@ -314,29 +262,40 @@ void ArrayConstantPropagation(SgProject& project)
|
||||
|
||||
for (; st != lastNode; st = st->lexNext())
|
||||
{
|
||||
if (st->variant() == FOR_NODE)
|
||||
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)
|
||||
{
|
||||
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()))
|
||||
{
|
||||
TransformBorder(st, upperBound, arrayToVariable, variableNumber);
|
||||
if (arrayToVariable.find(upperBoundUnparsed) == arrayToVariable.end())
|
||||
{
|
||||
arrayToVariable[upperBoundUnparsed] = CreateVar(variableNumber, upperBound->symbol()->type()->baseType());
|
||||
}
|
||||
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()))
|
||||
{
|
||||
TransformBorder(st, lowerBound, arrayToVariable, variableNumber);
|
||||
if (arrayToVariable.find(lowerBoundUnparsed) == arrayToVariable.end())
|
||||
{
|
||||
arrayToVariable[lowerBoundUnparsed] = CreateVar(variableNumber, lowerBound->symbol()->type()->baseType());
|
||||
}
|
||||
st->expr(0)->setLhs(arrayToVariable[lowerBoundUnparsed]->copyPtr());
|
||||
}
|
||||
else if (lowerBound->variant() == VAR_REF)
|
||||
CheckVariable(st, lowerBound, arrayToVariable, variableNumber);
|
||||
}
|
||||
}
|
||||
cout << file->functions(i)->unparse() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ using std::fstream;
|
||||
static long int getNextTag()
|
||||
{
|
||||
static long int INTERVAL_TAG = 0;
|
||||
return INTERVAL_TAG++;
|
||||
return -(INTERVAL_TAG++);
|
||||
}
|
||||
|
||||
//Debug funcs
|
||||
@@ -413,7 +413,7 @@ static void findIntervals(SpfInterval *interval, map<int, int> &labelsRef, map<i
|
||||
inter->lineFile = std::make_pair(currentSt->lineNumber(), currentSt->fileName());
|
||||
inter->parent = interval;
|
||||
inter->exit_levels.push_back(0);
|
||||
inter->tag = getNextTag();
|
||||
inter->tag = currentSt->lineNumber();//getNextTag();
|
||||
interval->nested.push_back(inter);
|
||||
|
||||
findIntervals(inter, labelsRef, gotoStmts, currentSt);
|
||||
|
||||
@@ -180,8 +180,7 @@ static void SolveDataFlowIteratively(Region* DFG)
|
||||
b->array_out = newOut;
|
||||
else
|
||||
worklist.erase(b);
|
||||
}
|
||||
while (!worklist.empty());
|
||||
} while (!worklist.empty());
|
||||
}
|
||||
|
||||
static void SolveForBasickBlock(Region* block)
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
#include "range_structures.h"
|
||||
#include "region.h"
|
||||
|
||||
#include "..\Transformations\ExpressionSubstitution\expr_transform.h"
|
||||
#include "SgUtils.h"
|
||||
|
||||
using namespace std;
|
||||
@@ -95,7 +93,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, ArrayAccessingIndexes& all_use, Region* region) {
|
||||
static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAccessingIndexes& def, ArrayAccessingIndexes& use, Region* region) {
|
||||
auto instructions = block->getInstructions();
|
||||
map<string, LoopGraph*> loopForIndex;
|
||||
BuildLoopIndex(loopForIndex, loop);
|
||||
@@ -227,7 +225,6 @@ 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
|
||||
@@ -328,7 +325,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]->array_all_use, bbToRegion[poiner]);
|
||||
GetDefUseArray(poiner, loop, bbToRegion[poiner]->array_def, bbToRegion[poiner]->array_use, bbToRegion[poiner]);
|
||||
|
||||
}
|
||||
this->header = bbToRegion[header];
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
|
||||
std::vector<RegionInstruction> instructions;
|
||||
|
||||
ArrayAccessingIndexes array_def, array_use, array_out, array_in, array_priv, array_all_use;
|
||||
ArrayAccessingIndexes array_def, array_use, array_out, array_in, array_priv;
|
||||
|
||||
private:
|
||||
std::vector<Region*> basickBlocks;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "Utils/leak_detector.h"
|
||||
#include "Utils/leak_detector.h"
|
||||
|
||||
#pragma comment(linker, "/STACK:536870912") // 512 МБ
|
||||
|
||||
@@ -943,7 +943,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
|
||||
}
|
||||
}
|
||||
else if (curr_regime == MOVE_OPERATORS)
|
||||
moveOperators(file, loopGraph, fullIR, countOfTransform);
|
||||
moveOperators(file, fullIR, countOfTransform);
|
||||
else if (curr_regime == PRIVATE_REMOVING_ANALYSIS)
|
||||
{
|
||||
auto itFound = loopGraph.find(file->filename());
|
||||
|
||||
@@ -1089,6 +1089,8 @@ static int clean(const string& funcName, SgStatement* funcSt, const map<string,
|
||||
}
|
||||
|
||||
SgGotoStmt* gotoSt = new SgGotoStmt(*contLab);
|
||||
if (st->label())
|
||||
gotoSt->setLabel(*st->label());
|
||||
st->insertStmtBefore(*gotoSt, *st->controlParent());
|
||||
|
||||
toDelete.push_back(st);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,4 +3,4 @@
|
||||
#include "../../GraphLoop/graph_loops.h"
|
||||
#include "../../CFGraph/CFGraph.h"
|
||||
|
||||
void moveOperators(SgFile *file, std::map<std::string, std::vector<LoopGraph*>>& loopGraph, const std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR, int& countOfTransform);
|
||||
void moveOperators(SgFile* file, const std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR, int& countOfTransform);
|
||||
|
||||
@@ -577,10 +577,20 @@ string removeIncludeStatsAndUnparse(SgFile *file, const char *fileName, const ch
|
||||
for (auto& incl : inclByPos.second)
|
||||
inlcude += (renameIncludes ? renameInclude(incl) : incl);
|
||||
|
||||
if (st->comments())
|
||||
st->setComments((inlcude + st->comments()).c_str());
|
||||
//check inserted operators
|
||||
SgStatement* toInsert = st;
|
||||
do {
|
||||
auto lexPrev = toInsert->lexPrev();
|
||||
if (lexPrev && lexPrev->variant() > 0 && lexPrev->lineNumber() < 0)
|
||||
toInsert = lexPrev;
|
||||
else
|
||||
st->addComment(inlcude.c_str());
|
||||
break;
|
||||
} while (true);
|
||||
|
||||
if (toInsert->comments())
|
||||
toInsert->setComments((inlcude + toInsert->comments()).c_str());
|
||||
else
|
||||
toInsert->addComment(inlcude.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define VERSION_SPF "2465"
|
||||
#define VERSION_SPF "2472"
|
||||
|
||||
Reference in New Issue
Block a user