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;
|
using namespace std;
|
||||||
|
|
||||||
static SgStatement* declPlace = NULL;
|
static SgStatement* declPlace = NULL;
|
||||||
static unordered_set<SgStatement*> changed;;
|
|
||||||
|
|
||||||
static bool CheckConstIndexes(SgExpression* exp)
|
static bool CheckConstIndexes(SgExpression* exp)
|
||||||
{
|
{
|
||||||
@@ -37,13 +36,13 @@ static bool CheckConstIndexes(SgExpression* exp)
|
|||||||
|
|
||||||
static SgExpression* CreateVar(int& variableNumber, SgType* type)
|
static SgExpression* CreateVar(int& variableNumber, SgType* type)
|
||||||
{
|
{
|
||||||
string varName = "tmp_prop_var";
|
string varName = "__tmp_prop_var";
|
||||||
string name = varName + std::to_string(variableNumber) + "__";
|
string name = varName + std::to_string(variableNumber) + "__";
|
||||||
variableNumber++;
|
variableNumber++;
|
||||||
|
|
||||||
SgSymbol* varSymbol = new SgSymbol(VARIABLE_NAME, name.c_str(), *type, *declPlace->controlParent());
|
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* funcStart = declPlace->controlParent();
|
||||||
SgStatement* commonStat = NULL;
|
SgStatement* commonStat = NULL;
|
||||||
@@ -170,6 +169,7 @@ static SgExpression* CreateVar(int& variableNumber, SgType* type)
|
|||||||
|
|
||||||
commonList->setLhs(varList);
|
commonList->setLhs(varList);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SgExpression(VAR_REF, NULL, NULL, varSymbol, type->copyPtr());
|
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)
|
if (exp->symbol()->type()->variant() == T_STRING)
|
||||||
return;
|
return;
|
||||||
if (changed.find(st) != changed.end())
|
|
||||||
return;
|
|
||||||
string expUnparsed = exp->unparse();
|
string expUnparsed = exp->unparse();
|
||||||
if (arrayToVariable.find(expUnparsed) == arrayToVariable.end() && exp->symbol()->type()->baseType())
|
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->setlineNumber(getNextNegativeLineNumber());
|
||||||
newStatement->setLocalLineNumber(st->lineNumber());
|
newStatement->setLocalLineNumber(st->lineNumber());
|
||||||
st->insertStmtBefore(*newStatement, *st->controlParent());
|
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)
|
void ArrayConstantPropagation(SgProject& project)
|
||||||
@@ -314,29 +262,40 @@ void ArrayConstantPropagation(SgProject& project)
|
|||||||
|
|
||||||
for (; st != lastNode; st = st->lexNext())
|
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* lowerBound = st->expr(0)->lhs();
|
||||||
SgExpression* upperBound = st->expr(0)->rhs();
|
SgExpression* upperBound = st->expr(0)->rhs();
|
||||||
string lowerBoundUnparsed = lowerBound->unparse(), upperBoundUnparsed = upperBound->unparse();
|
string lowerBoundUnparsed = lowerBound->unparse(), upperBoundUnparsed = upperBound->unparse();
|
||||||
if (upperBound->variant() == ARRAY_REF && upperBound->symbol()->type()->baseType() && CheckConstIndexes(upperBound->lhs()))
|
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());
|
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 (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());
|
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 getNextTag()
|
||||||
{
|
{
|
||||||
static long int INTERVAL_TAG = 0;
|
static long int INTERVAL_TAG = 0;
|
||||||
return INTERVAL_TAG++;
|
return -(INTERVAL_TAG++);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Debug funcs
|
//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->lineFile = std::make_pair(currentSt->lineNumber(), currentSt->fileName());
|
||||||
inter->parent = interval;
|
inter->parent = interval;
|
||||||
inter->exit_levels.push_back(0);
|
inter->exit_levels.push_back(0);
|
||||||
inter->tag = getNextTag();
|
inter->tag = currentSt->lineNumber();//getNextTag();
|
||||||
interval->nested.push_back(inter);
|
interval->nested.push_back(inter);
|
||||||
|
|
||||||
findIntervals(inter, labelsRef, gotoStmts, currentSt);
|
findIntervals(inter, labelsRef, gotoStmts, currentSt);
|
||||||
|
|||||||
@@ -180,8 +180,7 @@ static void SolveDataFlowIteratively(Region* DFG)
|
|||||||
b->array_out = newOut;
|
b->array_out = newOut;
|
||||||
else
|
else
|
||||||
worklist.erase(b);
|
worklist.erase(b);
|
||||||
}
|
} while (!worklist.empty());
|
||||||
while (!worklist.empty());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SolveForBasickBlock(Region* block)
|
static void SolveForBasickBlock(Region* block)
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#include "range_structures.h"
|
#include "range_structures.h"
|
||||||
#include "region.h"
|
#include "region.h"
|
||||||
|
|
||||||
#include "..\Transformations\ExpressionSubstitution\expr_transform.h"
|
|
||||||
#include "SgUtils.h"
|
#include "SgUtils.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -95,7 +93,7 @@ static string FindIndexName(int pos, SAPFOR::BasicBlock* block, map<string, Loop
|
|||||||
return "";
|
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();
|
auto instructions = block->getInstructions();
|
||||||
map<string, LoopGraph*> loopForIndex;
|
map<string, LoopGraph*> loopForIndex;
|
||||||
BuildLoopIndex(loopForIndex, loop);
|
BuildLoopIndex(loopForIndex, loop);
|
||||||
@@ -227,7 +225,6 @@ static int GetDefUseArray(SAPFOR::BasicBlock* block, LoopGraph* loop, ArrayAcces
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
instruction.use[array_name] = { { accessPoint } };
|
instruction.use[array_name] = { { accessPoint } };
|
||||||
all_use[array_name].Insert(accessPoint);
|
|
||||||
if (def.find(array_name) == def.end())
|
if (def.find(array_name) == def.end())
|
||||||
use[array_name].Insert(accessPoint);
|
use[array_name].Insert(accessPoint);
|
||||||
else
|
else
|
||||||
@@ -328,7 +325,7 @@ Region::Region(LoopGraph* loop, const vector<SAPFOR::BasicBlock*>& Blocks)
|
|||||||
{
|
{
|
||||||
bbToRegion[poiner] = new Region(*poiner);
|
bbToRegion[poiner] = new Region(*poiner);
|
||||||
this->basickBlocks.push_back(bbToRegion[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];
|
this->header = bbToRegion[header];
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
|
|
||||||
std::vector<RegionInstruction> instructions;
|
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:
|
private:
|
||||||
std::vector<Region*> basickBlocks;
|
std::vector<Region*> basickBlocks;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "Utils/leak_detector.h"
|
#include "Utils/leak_detector.h"
|
||||||
|
|
||||||
#pragma comment(linker, "/STACK:536870912") // 512 МБ
|
#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)
|
else if (curr_regime == MOVE_OPERATORS)
|
||||||
moveOperators(file, loopGraph, fullIR, countOfTransform);
|
moveOperators(file, fullIR, countOfTransform);
|
||||||
else if (curr_regime == PRIVATE_REMOVING_ANALYSIS)
|
else if (curr_regime == PRIVATE_REMOVING_ANALYSIS)
|
||||||
{
|
{
|
||||||
auto itFound = loopGraph.find(file->filename());
|
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);
|
SgGotoStmt* gotoSt = new SgGotoStmt(*contLab);
|
||||||
|
if (st->label())
|
||||||
|
gotoSt->setLabel(*st->label());
|
||||||
st->insertStmtBefore(*gotoSt, *st->controlParent());
|
st->insertStmtBefore(*gotoSt, *st->controlParent());
|
||||||
|
|
||||||
toDelete.push_back(st);
|
toDelete.push_back(st);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,4 +3,4 @@
|
|||||||
#include "../../GraphLoop/graph_loops.h"
|
#include "../../GraphLoop/graph_loops.h"
|
||||||
#include "../../CFGraph/CFGraph.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)
|
for (auto& incl : inclByPos.second)
|
||||||
inlcude += (renameIncludes ? renameInclude(incl) : incl);
|
inlcude += (renameIncludes ? renameInclude(incl) : incl);
|
||||||
|
|
||||||
if (st->comments())
|
//check inserted operators
|
||||||
st->setComments((inlcude + st->comments()).c_str());
|
SgStatement* toInsert = st;
|
||||||
|
do {
|
||||||
|
auto lexPrev = toInsert->lexPrev();
|
||||||
|
if (lexPrev && lexPrev->variant() > 0 && lexPrev->lineNumber() < 0)
|
||||||
|
toInsert = lexPrev;
|
||||||
else
|
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
|
#pragma once
|
||||||
|
|
||||||
#define VERSION_SPF "2465"
|
#define VERSION_SPF "2472"
|
||||||
|
|||||||
Reference in New Issue
Block a user