51 Commits

Author SHA1 Message Date
ff9dac4802 fix some compiler warnings 2026-02-18 23:20:58 +03:00
ALEXks
11b3ecba2e dvm updated 2026-02-18 20:43:04 +03:00
ALEXks
d4e7b39acd dvm updated 2026-02-18 19:58:50 +03:00
ALEXks
d8e5c1bdf6 fixed shadow grouping 2026-02-14 10:15:28 +03:00
ALEXks
9afdf2a98b added CFG_withUnreachable option 2026-02-14 10:05:25 +03:00
ALEXks
6091fa474d improved CFG settings 2026-02-14 09:59:20 +03:00
ALEXks
bc9c7cba5c turn on staticShadowAnalysis option 2026-02-14 08:39:57 +03:00
ALEXks
c1d94be0be fixed private filling 2026-02-10 09:18:44 +03:00
ALEXks
d78753888f fixed deps 2026-02-06 08:28:18 +03:00
ALEXks
025bbbe259 fixed getNameInLocation for module functions 2026-02-05 15:01:05 +03:00
ALEXks
076a0c9699 fixed unparsing COMMON list 2026-02-05 13:52:24 +03:00
ALEXks
90b311d049 fixed GetDeclSymbol 2026-02-04 16:34:19 +03:00
ALEXks
5a1377e7ea fixed ChangeName function for common 2026-02-03 09:26:06 +03:00
ALEXks
b90d200fad fixed different names of same arrays in common 2026-02-01 12:25:54 +03:00
ALEXks
331d4f9d99 fixed private analysis 2026-01-19 21:01:49 +03:00
ALEXks
904292f109 updated submodule libpredictor 2026-01-18 16:50:57 +03:00
ALEXks
c36326660c fixed submodule libpredictor 2026-01-06 18:50:54 +03:00
ALEXks
ec08e3af0e version updated 2026-01-06 18:36:07 +03:00
ALEXks
b1ef5d0b67 dvm submodule updated 2026-01-06 18:35:34 +03:00
d6c046ea57 Merge pull request 'egormayorov' (#72) from egormayorov into master 2025-12-29 18:26:19 +00:00
ALEXks
af85311480 refactored, added pass to Visualizer calls 2025-12-29 21:22:53 +03:00
ALEXks
d9f54739d2 refactored 2025-12-29 21:10:55 +03:00
Egor Mayorov
6907f44ac5 fixes & improvements 2025-12-25 15:01:01 +03:00
Egor Mayorov
582d2d5e70 Adding handing of nested loops and conditional statements 2025-12-24 21:08:42 +03:00
Egor Mayorov
1c37336459 Make pass correct 2025-12-24 21:08:42 +03:00
Egor Mayorov
f527deb02c attempt to build new ast 2025-12-24 21:08:42 +03:00
d09e92a947 moved to transformations 2025-12-24 21:08:42 +03:00
Egor Mayorov
029da32719 swap operators in AST 2025-12-24 21:08:42 +03:00
Egor Mayorov
085e6312a3 Use more complex algorythm for building new order of statements 2025-12-24 21:08:42 +03:00
Egor Mayorov
c5927fe80f update in new order 2025-12-24 21:08:42 +03:00
Egor Mayorov
8728f84546 biulding new order 2025-12-24 21:08:42 +03:00
Egor Mayorov
9e4db270fc some loop analysis done 2025-12-24 21:08:42 +03:00
Egor Mayorov
0c20b37923 Add _bin to gitignore 2025-12-24 21:08:42 +03:00
Egor Mayorov
61c6ad1363 Some actions simplify analyzing IR 2025-12-24 21:08:42 +03:00
Egor Mayorov
e5fa2e41b3 Pass with output file added 2025-12-24 21:08:42 +03:00
Egor Mayorov
3b9e4653b6 change pass deps 2025-12-24 21:08:42 +03:00
Egor Mayorov
2d84aaff1f New pass 2025-12-24 21:08:42 +03:00
032cdb9b03 Merge pull request 'private_arrays' (#71) from private_arrays into master 2025-12-24 05:59:30 +00:00
ALEXks
a8f8f44ac1 corrected style, updated version 2025-12-24 08:58:28 +03:00
1c39001e28 small fix 2025-12-23 16:29:10 +03:00
7802f538e8 add whole array assign 2025-12-23 02:03:57 +03:00
93fa183b63 fix 2025-12-21 03:58:45 +03:00
a07a701826 Merge pull request 'fix private arrays search' (#70) from private_arrays into master 2025-12-19 18:07:14 +00:00
ALEXks
e99855cdff updated version, fixed code style 2025-12-19 21:06:55 +03:00
f07bea4980 fix FIND_PRIVATE_ARRAYS 2025-12-19 04:52:31 +03:00
ALEXks
3de06d9261 finalyze first version of private arrays search 2025-12-11 12:26:39 +03:00
678c2cf351 Merge pull request 'add directives' (#69) from private_arrays into master 2025-12-11 08:30:47 +00:00
40cfd83de5 add directives 2025-12-10 01:46:26 +03:00
ALEXks
a0cea2df91 added new function for visualizer 2025-11-08 20:17:32 +03:00
ALEXks
4b7df86b8a version updated 2025-11-08 20:08:22 +03:00
836894fef1 Merge pull request 'private_arrays' (#68) from private_arrays into master 2025-11-08 17:07:07 +00:00
23 changed files with 886 additions and 985 deletions

View File

@@ -1162,8 +1162,9 @@ map<FuncInfo*, vector<BBlock*>> buildCFG(const map<string, CommonBlock*>& common
if (SgFile::switchToFile(oldFile) == -1) if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
for (auto& [func, blocks] : result) if (!settings.withUnreachable)
removedUnreachableBlocks(blocks); for (auto& [func, blocks] : result)
removedUnreachableBlocks(blocks);
return result; return result;
} }

View File

@@ -105,23 +105,52 @@ namespace SAPFOR
struct CFG_Settings struct CFG_Settings
{ {
enum setting { CFG_atLeastOneIterInLoop = 1,
CFG_withRD = 2,
CFG_withRegisters = 3,
CFG_withSPF = 4,
CFG_withDVM = 5,
CFG_withCallsInBlocks = 6,
CFG_withCallFrom = 7,
CFG_withDominators = 8,
CFG_withUnreachable = 9 };
bool atLeastOneIterInLoop = false; bool atLeastOneIterInLoop = false;
bool withRD = true; bool withRD = false;
bool withRegisters = false; bool withRegisters = false;
bool withSPF = false; bool withSPF = false;
bool withDVM = false; bool withDVM = false;
bool withCallsInBlocks = false; // separate each F_CALL to own BasicBlock bool withCallsInBlocks = false; // separate each F_CALL to own BasicBlock
bool withCallFrom = true; bool withCallFrom = false;
bool withDominators = true; bool withDominators = false;
bool withUnreachable = false;
explicit CFG_Settings(int) { } explicit CFG_Settings(const std::set<setting> &settings = { CFG_withRD, CFG_withCallFrom, CFG_withDominators })
{
explicit CFG_Settings(bool atLeastOneIterInLoop = false, bool withRD = true, bool withRegisters = false, for (auto& set : settings)
bool withDVM = false, bool withSPF = false, bool withCallsInBlocks = false, {
bool withCallFrom = true, bool withDominators = true) : if (set == CFG_atLeastOneIterInLoop)
atLeastOneIterInLoop(atLeastOneIterInLoop), withRD(withRD), withRegisters(withRegisters), withDVM(withDVM), withSPF(withSPF), atLeastOneIterInLoop = true;
withCallsInBlocks(withCallsInBlocks), withCallFrom(withCallFrom), withDominators(withDominators) else if (set == CFG_withRD)
{ } withRD = true;
else if (set == CFG_withRegisters)
withRegisters = true;
else if (set == CFG_withSPF)
withSPF = true;
else if (set == CFG_withDVM)
withDVM = true;
else if (set == CFG_withCallsInBlocks)
withCallsInBlocks = true;
else if (set == CFG_withCallFrom)
withCallFrom = true;
else if (set == CFG_withDominators)
withDominators = true;
else if (set == CFG_withUnreachable)
withUnreachable = true;
else
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
}
}
}; };
} }

View File

@@ -200,20 +200,46 @@ static void fillOutForFunc(const FuncInfo* func, const vector<SAPFOR::BasicBlock
outForFunc[func->funcName] = { defined, common_defined }; outForFunc[func->funcName] = { defined, common_defined };
} }
static bool isInstructionSpfParameter(SAPFOR::Instruction* instr)
{
SgStatement* st = instr->getOperator();
// check if this operator is SPF(ANALYSIS(PARAMETER( )))
if (st && st->variant() == ASSIGN_STAT)
{
if (st->lineNumber() < 0 && st->numberOfAttributes())
{
for (int i = 0; i < st->numberOfAttributes(); ++i)
{
SgAttribute* attr = st->getAttribute(i);
SgStatement* attributeStatement = (SgStatement*)(attr->getAttributeData());
int type = st->attributeType(i);
if (type == SPF_PARAMETER_OP)
return true;
}
}
}
return false;
}
static void getDefsFromBlock(SAPFOR::BasicBlock* block, set<SAPFOR::Argument*>& res, static void getDefsFromBlock(SAPFOR::BasicBlock* block, set<SAPFOR::Argument*>& res,
const vector<pair<const Variable*, CommonBlock*>>& commonVars, const vector<pair<const Variable*, CommonBlock*>>& commonVars,
const FuncInfo* func) const FuncInfo* func)
{ {
vector<SAPFOR::Argument*> lastParamRef; vector<SAPFOR::Argument*> lastParamRef;
for (auto ir_block : block->getInstructions()) for (const auto &ir_block : block->getInstructions())
{ {
SAPFOR::Instruction* instr = ir_block->getInstruction(); SAPFOR::Instruction* instr = ir_block->getInstruction();
if (isInstructionSpfParameter(instr))
continue;
SAPFOR::CFG_OP instr_operation = instr->getOperation(); SAPFOR::CFG_OP instr_operation = instr->getOperation();
if (instr_operation == SAPFOR::CFG_OP::PARAM) if (instr_operation == SAPFOR::CFG_OP::PARAM)
{ {
SAPFOR::Argument* arg = instr->getArg1(); SAPFOR::Argument* arg = instr->getArg1();
if(arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR) if (arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR)
addPlaceWithDef(commonVars, func, arg, instr); addPlaceWithDef(commonVars, func, arg, instr);
lastParamRef.push_back(arg); lastParamRef.push_back(arg);
@@ -236,12 +262,20 @@ static void getDefsFromBlock(SAPFOR::BasicBlock* block, set<SAPFOR::Argument*>&
int last_instr_num = block->getInstructions().back()->getNumber(); int last_instr_num = block->getInstructions().back()->getNumber();
for (const auto& def : block->getRD_Out()) for (const auto& def : block->getRD_Out())
{
for (int place : def.second) for (int place : def.second)
{
if (place >= first_instr_num && place <= last_instr_num && def.first->getType() == SAPFOR::CFG_ARG_TYPE::VAR) if (place >= first_instr_num && place <= last_instr_num && def.first->getType() == SAPFOR::CFG_ARG_TYPE::VAR)
{ {
SAPFOR::Instruction* instr = block->getInstructions()[place - first_instr_num]->getInstruction();
if (isInstructionSpfParameter(instr))
continue;
res.insert(def.first); res.insert(def.first);
addPlaceWithDef(commonVars, func, def.first, block->getInstructions()[place - first_instr_num]->getInstruction()); addPlaceWithDef(commonVars, func, def.first, instr);
} }
}
}
} }
// recursively analyze FOR loops // recursively analyze FOR loops
@@ -266,7 +300,7 @@ static set<SAPFOR::BasicBlock*> analyzeLoop(LoopGraph* loop, const set<SAPFOR::B
SAPFOR::BasicBlock* head_block = NULL; SAPFOR::BasicBlock* head_block = NULL;
int loop_start = loop->lineNum, loop_end = loop->lineNumAfterLoop; int loop_start = loop->lineNum, loop_end = loop->lineNumAfterLoop;
for (auto bb : blocks) for (const auto &bb : blocks)
{ {
if (!bb || (bb->getInstructions().size() == 0)) if (!bb || (bb->getInstructions().size() == 0))
continue; continue;
@@ -348,7 +382,7 @@ static set<SAPFOR::BasicBlock*> analyzeLoop(LoopGraph* loop, const set<SAPFOR::B
getDefsFromBlock(*loop_it, changeValueOnExit, commonVars, func); getDefsFromBlock(*loop_it, changeValueOnExit, commonVars, func);
for (auto bb : currentLoop) for (const auto &bb : currentLoop)
{ {
//fill LiveWhenLoopEnds //fill LiveWhenLoopEnds
bool has_next_outside_body = false; bool has_next_outside_body = false;

View File

@@ -853,12 +853,21 @@ static pair<string, string> getModuleRename(const set<SgStatement*>& allocatable
return make_pair("", ""); return make_pair("", "");
} }
static void doRename(string& str, const pair<string, string>& renamePair)
{
auto it = str.find(renamePair.first);
if (it != string::npos)
if (str[it + renamePair.first.size()] == '(' && str[it - 1] == ' ')
str = str.replace(it, renamePair.first.size(), renamePair.second);
}
static pair<DIST::Array*, string> static pair<DIST::Array*, string>
getNewDirective(const string &fullArrayName, getNewDirective(const string &fullArrayName,
const vector<string> &distrRules, const vector<string> &distrRules,
const vector<string> &alignRules, const vector<string> &alignRules,
const DataDirective &dataDir, const DataDirective &dataDir,
const set<SgStatement*>& allocatableStmts) const set<SgStatement*>& allocatableStmts,
const pair<string, int>& position_decl)
{ {
string out = ""; string out = "";
DIST::Array* outA = NULL; DIST::Array* outA = NULL;
@@ -877,7 +886,8 @@ getNewDirective(const string &fullArrayName,
for (int i = 0; i < dataDir.alignRules.size(); ++i) for (int i = 0; i < dataDir.alignRules.size(); ++i)
{ {
if (dataDir.alignRules[i].alignArray->GetName() == fullArrayName) auto alignArray = dataDir.alignRules[i].alignArray;
if (alignArray->GetName() == fullArrayName)
{ {
string rule = alignRules[i]; string rule = alignRules[i];
if (allocatableStmts.size()) if (allocatableStmts.size())
@@ -889,21 +899,21 @@ getNewDirective(const string &fullArrayName,
it = rule.find("ALIGN", it + 7); it = rule.find("ALIGN", it + 7);
} }
auto renamePair = getModuleRename(allocatableStmts, dataDir.alignRules[i].alignArray); auto renamePair = getModuleRename(allocatableStmts, alignArray);
if (renamePair.first != "") doRename(rule, renamePair);
{ }
it = rule.find(renamePair.first); else if (alignArray->GetLocation().first == DIST::l_COMMON)
if (it != string::npos) {
if (rule[it + renamePair.first.size()] == '(' && rule[it - 1] == ' ') auto symb = alignArray->GetDeclSymbol(position_decl);
rule = rule.replace(it, renamePair.first.size(), renamePair.second); if (symb->identifier() != alignArray->GetShortName())
} doRename(rule, make_pair(alignArray->GetShortName(), symb->identifier()));
} }
out += "!DVM$ " + rule + "\n"; out += "!DVM$ " + rule + "\n";
if (!out_free_form) if (!out_free_form)
out = splitDirective(out); out = splitDirective(out);
return make_pair(dataDir.alignRules[i].alignArray, out); return make_pair(alignArray, out);
} }
} }
@@ -1743,7 +1753,7 @@ void insertDistributionToFile(SgFile *file, const char *fin_name, const DataDire
if (allocatableStmtsCopy.size()) if (allocatableStmtsCopy.size())
allocatableStmts = filterAllocateStats(file, allocatableStmtsCopy, currSymb->identifier()); allocatableStmts = filterAllocateStats(file, allocatableStmtsCopy, currSymb->identifier());
pair<DIST::Array*, string> dirWithArray = getNewDirective(fullArrayName, distrRules, alignRules, dataDir, allocatableStmts); pair<DIST::Array*, string> dirWithArray = getNewDirective(fullArrayName, distrRules, alignRules, dataDir, allocatableStmts, make_pair(st->fileName(), st->lineNumber()));
string toInsert = dirWithArray.second; string toInsert = dirWithArray.second;
if (toInsert != "") if (toInsert != "")
@@ -1975,20 +1985,27 @@ void insertDistributionToFile(SgFile *file, const char *fin_name, const DataDire
set<string> toInsertArrays; set<string> toInsertArrays;
for (auto &array : dynamicArraysLocal) for (auto &array : dynamicArraysLocal)
{ {
string name = array->GetShortName();
if (array->GetLocation().first == DIST::l_COMMON)
{
auto symb = array->GetDeclSymbol(make_pair(st->fileName(), st->lineNumber()));
name = symb->identifier();
}
if (extractDir) if (extractDir)
{ {
if (dynamicArraysAdded.find(array->GetShortName()) != dynamicArraysAdded.end()) if (dynamicArraysAdded.find(name) != dynamicArraysAdded.end())
{ {
dynamicArraysAdded.erase(array->GetShortName()); dynamicArraysAdded.erase(name);
toInsertArrays.insert(array->GetShortName()); toInsertArrays.insert(name);
} }
} }
else else
{ {
if (dynamicArraysAdded.find(array->GetShortName()) == dynamicArraysAdded.end()) if (dynamicArraysAdded.find(name) == dynamicArraysAdded.end())
{ {
dynamicArraysAdded.insert(array->GetShortName()); dynamicArraysAdded.insert(name);
toInsertArrays.insert(array->GetShortName()); toInsertArrays.insert(name);
} }
} }
} }
@@ -2145,7 +2162,14 @@ void insertShadowSpecToFile(SgFile *file, const char *fin_name, const set<string
if (needToGen) if (needToGen)
{ {
string shadowSpecInsert = "!DVM$ SHADOW " + array->GetShortName() + "("; string name = array->GetShortName();
if (array->GetLocation().first == DIST::l_COMMON)
{
auto symb = array->GetDeclSymbol(make_pair(st->fileName(), st->lineNumber()));
name = symb->identifier();
}
string shadowSpecInsert = "!DVM$ SHADOW " + name + "(";
for (int k = 0; k < currSpec.size(); ++k) for (int k = 0; k < currSpec.size(); ++k)
{ {
char buf[256]; char buf[256];
@@ -2157,7 +2181,7 @@ void insertShadowSpecToFile(SgFile *file, const char *fin_name, const set<string
shadowSpecInsert += ")\n"; shadowSpecInsert += ")\n";
shadowsSpecsString.push_back(shadowSpecInsert); shadowsSpecsString.push_back(shadowSpecInsert);
pair<SgExpression*, SgExpression*> newSpec = genShadowSpec(file, make_pair(array->GetShortName(), currSpec)); pair<SgExpression*, SgExpression*> newSpec = genShadowSpec(file, make_pair(name, currSpec));
if (newSpec.first == NULL || newSpec.second == NULL) if (newSpec.first == NULL || newSpec.second == NULL)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
shadowsSpecs.push_back(newSpec); shadowsSpecs.push_back(newSpec);

View File

@@ -26,6 +26,7 @@ using std::string;
using std::vector; using std::vector;
using std::pair; using std::pair;
using std::make_pair; using std::make_pair;
using SAPFOR::CFG_Settings;
extern int debSh; extern int debSh;
@@ -1672,9 +1673,12 @@ void GroupShadow(const map<string, vector<FuncInfo*>>& allFuncs,
SgStatement* func = currF->funcPointer->GetOriginal(); SgStatement* func = currF->funcPointer->GetOriginal();
auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, true, false, true, false), commonBlocks, allFuncs); const auto settings = CFG_Settings({ CFG_Settings::CFG_atLeastOneIterInLoop, CFG_Settings::CFG_withDVM,
CFG_Settings::CFG_withCallsInBlocks, CFG_Settings::CFG_withUnreachable });
auto cfg = buildCFGforCurrentFunc(func, settings, commonBlocks, allFuncs);
if (cfg.size() != 1) if (cfg.size() != 1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto& blocks = cfg.begin()->second; auto& blocks = cfg.begin()->second;
//create reaching blocks //create reaching blocks

View File

@@ -336,9 +336,24 @@ namespace Distribution
if (pos != STRING::npos) if (pos != STRING::npos)
{ {
name.erase(pos, shortName.size()); name.erase(pos, shortName.size());
shortName = newName;
name += newName; name += newName;
} }
else if (locationPos.first == l_COMMON) // name of array in common may be different
{
pos = name.rfind("_");
if (pos != STRING::npos)
{
name.erase(pos + 1, shortName.size());
name += newName;
}
else
{
#if __SPF
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
#endif
}
}
shortName = newName;
GenUniqKey(); GenUniqKey();
} }
@@ -542,6 +557,44 @@ namespace Distribution
return NULL; return NULL;
} }
Symbol* GetDeclSymbol(const PAIR<STRING, int>& position_decl) const
{
if (!IsArray() || locationPos.first != l_COMMON)
return declSymbol;
auto it = declPlacesSymbol.find(position_decl);
if (it != declPlacesSymbol.end())
return it->second;
else // find nearest
{
MAP<PAIR<STRING, int>, Symbol*> currFile;
for (auto& [position, symb] : declPlacesSymbol)
{
if (position.first == position_decl.first)
currFile[position] = symb;
}
PAIR<int, Symbol*> nearest = { (int)0, NULL };
const int needed_pos = position_decl.second;
for (auto& [position, symb] : currFile)
{
if (nearest.second == NULL)
nearest = { abs(position.second - needed_pos), symb };
if (abs(position.second - needed_pos) < nearest.first)
nearest = { abs(position.second - needed_pos), symb };
}
if (nearest.second)
return nearest.second;
#if __SPF
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
#endif
}
return NULL;
}
Symbol* GetDeclSymbol() const { return declSymbol; } Symbol* GetDeclSymbol() const { return declSymbol; }
void SetDeclSymbol(Symbol *s) { declSymbol = s; } void SetDeclSymbol(Symbol *s) { declSymbol = s; }

View File

@@ -33,6 +33,7 @@ using std::set;
using std::ofstream; using std::ofstream;
using std::pair; using std::pair;
using std::tuple; using std::tuple;
using SAPFOR::CFG_Settings;
using json = nlohmann::json; using json = nlohmann::json;
@@ -507,7 +508,8 @@ static void parallelDir(const map<DIST::Array*, int>& byPos, SgExpression* spec,
if (currF == NULL) if (currF == NULL)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, true, false, false, true), commonBlocks, allFuncInfo); const auto settings = CFG_Settings({ CFG_Settings::CFG_atLeastOneIterInLoop, CFG_Settings::CFG_withSPF, CFG_Settings::CFG_withDominators });
auto cfg = buildCFGforCurrentFunc(func, settings, commonBlocks, allFuncInfo);
//TODO IP analysis //TODO IP analysis
unsigned countOfAccess = 0; unsigned countOfAccess = 0;

View File

@@ -1893,7 +1893,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
findParameters(parametersOfProject, fullIR, declaredArrays); findParameters(parametersOfProject, fullIR, declaredArrays);
else if (curr_regime == BUILD_IR) else if (curr_regime == BUILD_IR)
{ {
auto CFG_forFile = buildCFG(commonBlocks, allFuncInfo_IR, SAPFOR::CFG_Settings(0)); auto CFG_forFile = buildCFG(commonBlocks, allFuncInfo_IR, SAPFOR::CFG_Settings());
for (auto& byFunc : CFG_forFile) for (auto& byFunc : CFG_forFile)
fullIR[byFunc.first].insert(fullIR[byFunc.first].end(), byFunc.second.begin(), byFunc.second.end()); fullIR[byFunc.first].insert(fullIR[byFunc.first].end(), byFunc.second.begin(), byFunc.second.end());
@@ -2524,8 +2524,8 @@ int main(int argc, char **argv)
out_free_form = 1; out_free_form = 1;
out_line_unlimit = 1; out_line_unlimit = 1;
} }
else if (string(curr_arg) == "-sh") /*else if (string(curr_arg) == "-sh")
staticShadowAnalysis = 1; staticShadowAnalysis = 1;*/
else if (string(curr_arg) == "-shWidth") else if (string(curr_arg) == "-shWidth")
{ {
i++; i++;

View File

@@ -19,7 +19,7 @@
extern std::map<std::string, std::string> shortFileNames; extern std::map<std::string, std::string> shortFileNames;
static int activeState = 0; static int activeState = 0;
int staticShadowAnalysis = 0; int staticShadowAnalysis = 1;
int staticPrivateAnalysis = 0; int staticPrivateAnalysis = 0;
int keepDvmDirectives = 0; int keepDvmDirectives = 0;
int keepFiles = 0; int keepFiles = 0;

View File

@@ -12,6 +12,7 @@ using std::map;
using std::string; using std::string;
using std::vector; using std::vector;
using std::set; using std::set;
using SAPFOR::CFG_Settings;
using std::remove_if; using std::remove_if;
@@ -424,7 +425,8 @@ int removeDeadCode(SgStatement* func,
if (intervalDelEnd->lineNumber() < prog->lineNumber() || intervalDelEnd->lineNumber() > prog->lastNodeOfStmt()->lineNumber()) if (intervalDelEnd->lineNumber() < prog->lineNumber() || intervalDelEnd->lineNumber() > prog->lastNodeOfStmt()->lineNumber())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, false, false, false, false), commonBlocks, allFuncs); const auto settings = CFG_Settings({ CFG_Settings::CFG_atLeastOneIterInLoop });
auto cfg = buildCFGforCurrentFunc(func, settings, commonBlocks, allFuncs);
if(cfg.size() != 1) if(cfg.size() != 1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);

View File

@@ -224,6 +224,8 @@ bool equalDims(const CommConstraint& a, const CommConstraint& b)
if (adim[i].second - adim[i].first != bdim[i].second - bdim[i].first) if (adim[i].second - adim[i].first != bdim[i].second - bdim[i].first)
return false; return false;
} }
return true;
} }

View File

@@ -19,6 +19,7 @@ using std::pair;
using std::make_pair; using std::make_pair;
using std::wstring; using std::wstring;
using std::stack; using std::stack;
using SAPFOR::CFG_Settings;
#define PRINT_SPLITTED_FRAGMENTS 0 #define PRINT_SPLITTED_FRAGMENTS 0
@@ -315,7 +316,7 @@ static map<SgStatement*, pair<set<SgStatement*>, set<SgStatement*>>>
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
map<SAPFOR::Argument*, set<int>> outForCurr; map<SAPFOR::Argument*, set<int>> outForCurr;
buildGenKillForCFG(itCFG->second, funcByName, outForFunc, gen, kill, &genForIR, &killForIR, notInitedGlobals, SAPFOR::CFG_Settings(0)); buildGenKillForCFG(itCFG->second, funcByName, outForFunc, gen, kill, &genForIR, &killForIR, notInitedGlobals, SAPFOR::CFG_Settings());
if (outForFunc.count(byFunc)) if (outForFunc.count(byFunc))
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
@@ -1051,7 +1052,8 @@ int splitLoops(SgFile *file, vector<LoopGraph*> &loopGraphs, vector<Messages> &m
checkNull(listExp, convertFileName(__FILE__).c_str(), __LINE__); checkNull(listExp, convertFileName(__FILE__).c_str(), __LINE__);
int deep = listExp->length(); int deep = listExp->length();
currIR = buildCFGforCurrentFunc(loop->loop, SAPFOR::CFG_Settings(true, true), commonBlocks, allFuncInfo); const auto settings = CFG_Settings({ CFG_Settings::CFG_atLeastOneIterInLoop, CFG_Settings::CFG_withRD, CFG_Settings::CFG_withCallFrom, CFG_Settings::CFG_withDominators });
currIR = buildCFGforCurrentFunc(loop->loop, settings, commonBlocks, allFuncInfo);
totalErr = splitLoop(loop, messages, deep, depInfoForLoopGraph); totalErr = splitLoop(loop, messages, deep, depInfoForLoopGraph);
if (totalErr > 0) if (totalErr > 0)

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,7 @@ using std::set;
using std::string; using std::string;
using std::vector; using std::vector;
using std::wstring; using std::wstring;
using SAPFOR::CFG_Settings;
using CFG_Type = map<FuncInfo*, vector<SAPFOR::BasicBlock*>>; using CFG_Type = map<FuncInfo*, vector<SAPFOR::BasicBlock*>>;
using UsersDirectives = map<pair<string, int>, set<SgStatement*>>; using UsersDirectives = map<pair<string, int>, set<SgStatement*>>;
@@ -2207,8 +2208,8 @@ static void removePrivateAnalyze(Context *ctx)
makeDeclaration(ctx->loopStmt, vector<SgSymbol*> {receiverVar}, nullptr) makeDeclaration(ctx->loopStmt, vector<SgSymbol*> {receiverVar}, nullptr)
)); ));
CFG_Type CFG_ForFunc = buildCFGforCurrentFunc(ctx->loopStmt, const auto settings = CFG_Settings({ CFG_Settings::CFG_atLeastOneIterInLoop, CFG_Settings::CFG_withRD, CFG_Settings::CFG_withCallFrom, CFG_Settings::CFG_withDominators });
SAPFOR::CFG_Settings(true, true), CFG_Type CFG_ForFunc = buildCFGforCurrentFunc(ctx->loopStmt, settings,
ctx->commonBlocks, ctx->allFuncInfo); ctx->commonBlocks, ctx->allFuncInfo);
if (CFG_ForFunc.empty()) if (CFG_ForFunc.empty())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);

View File

@@ -206,7 +206,9 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
Pass(DEF_USE_STAGE1) <= Pass(DEF_USE_STAGE2); Pass(DEF_USE_STAGE1) <= Pass(DEF_USE_STAGE2);
list({ VERIFY_DVM_DIRS, PRIVATE_CALL_GRAPH_STAGE1, PRIVATE_CALL_GRAPH_STAGE2, MACRO_EXPANSION, CONVERT_ASSIGN_TO_LOOP, DEF_USE_STAGE1, DEF_USE_STAGE2, FILL_PARALLEL_REG_IR, VERIFY_COMMON, FILL_COMMON_BLOCKS, CALL_GRAPH_IR }) <= list({ SUBST_EXPR, SUBST_EXPR_RD, BUILD_IR }); list({ VERIFY_DVM_DIRS, VERIFY_COMMON, FILL_COMMON_BLOCKS, PRIVATE_CALL_GRAPH_STAGE1, PRIVATE_CALL_GRAPH_STAGE2, MACRO_EXPANSION, CONVERT_ASSIGN_TO_LOOP, DEF_USE_STAGE1, DEF_USE_STAGE2, FILL_PARALLEL_REG_IR, CALL_GRAPH_IR }) <= list({ SUBST_EXPR, SUBST_EXPR_RD, BUILD_IR });
Pass(VERIFY_COMMON) <= Pass(FILL_COMMON_BLOCKS);
Pass(BUILD_IR) <= Pass(SUBST_EXPR) <= Pass(SUBST_EXPR_AND_UNPARSE); Pass(BUILD_IR) <= Pass(SUBST_EXPR) <= Pass(SUBST_EXPR_AND_UNPARSE);
@@ -217,7 +219,7 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
Pass(RESTORE_LOOP_FROM_ASSIGN) <= list({ SUBST_EXPR_AND_UNPARSE, SUBST_EXPR_RD_AND_UNPARSE }); Pass(RESTORE_LOOP_FROM_ASSIGN) <= list({ SUBST_EXPR_AND_UNPARSE, SUBST_EXPR_RD_AND_UNPARSE });
Pass(GET_ALL_ARRAY_DECL) <= list({ CALL_GRAPH_IR, INSERT_NO_DISTR_FLAGS_FROM_GUI }); Pass(FILL_COMMON_BLOCKS) <= Pass(GET_ALL_ARRAY_DECL) <= list({ CALL_GRAPH_IR, INSERT_NO_DISTR_FLAGS_FROM_GUI });
Pass(LOOP_GRAPH) <= Pass(PRIVATE_CALL_GRAPH_STAGE3) <= list(FIND_FUNC_TO_INCLUDE, PRIVATE_ANALYSIS_IR) <= list({ LOOP_ANALYZER_DATA_DIST_S0, LOOP_ANALYZER_DATA_DIST_S1, ONLY_ARRAY_GRAPH, LOOP_ANALYZER_ALIGNS }); Pass(LOOP_GRAPH) <= Pass(PRIVATE_CALL_GRAPH_STAGE3) <= list(FIND_FUNC_TO_INCLUDE, PRIVATE_ANALYSIS_IR) <= list({ LOOP_ANALYZER_DATA_DIST_S0, LOOP_ANALYZER_DATA_DIST_S1, ONLY_ARRAY_GRAPH, LOOP_ANALYZER_ALIGNS });
@@ -227,7 +229,7 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_SPF, PREPROC_ALLOCATES, GET_ALL_ARRAY_DECL, GCOV_PARSER }) <= list({ CALL_GRAPH, MACRO_EXPANSION, DEF_USE_STAGE1 }); list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_SPF, PREPROC_ALLOCATES, GET_ALL_ARRAY_DECL, GCOV_PARSER }) <= list({ CALL_GRAPH, MACRO_EXPANSION, DEF_USE_STAGE1 });
list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_ALLOCATES, FILL_PARALLEL_REG_IR }) <= list({ GET_ALL_ARRAY_DECL, FILL_COMMON_BLOCKS, PARSE_OMP_DIRS }) <= Pass(PREPROC_SPF); list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_ALLOCATES, FILL_PARALLEL_REG_IR }) <= list({ FILL_COMMON_BLOCKS, GET_ALL_ARRAY_DECL, PARSE_OMP_DIRS }) <= Pass(PREPROC_SPF);
Pass(CHECK_PAR_REG_DIR) <= Pass(FILL_PARALLEL_REG_IR); Pass(CHECK_PAR_REG_DIR) <= Pass(FILL_PARALLEL_REG_IR);

View File

@@ -934,8 +934,14 @@ void fillNonDistrArraysAsPrivate(SgStatement *st,
{ {
auto itD = declaredArrays.find(*itSet); auto itD = declaredArrays.find(*itSet);
if (itD != declaredArrays.end()) if (itD != declaredArrays.end())
if (itD->second.first->IsNotDistribute()) {
privatesVars.insert(itD->second.first->GetShortName()); const auto array = itD->second.first;
if (array->IsNotDistribute())
{
auto symb = array->GetDeclSymbol(make_pair(st->fileName(), st->lineNumber()));
privatesVars.insert(symb->identifier());
}
}
} }
} }
} }
@@ -954,8 +960,20 @@ DIST::Array* getArrayFromDeclarated(SgStatement *st, const string &arrayName)
{ {
auto itD = declaredArrays.find(*itSet); auto itD = declaredArrays.find(*itSet);
if (itD != declaredArrays.end()) if (itD != declaredArrays.end())
if (itD->second.first->GetShortName() == arrayName) {
found = itD->second.first; DIST::Array* array = itD->second.first;
if (array->GetLocation().first == DIST::l_COMMON)
{
auto symb = array->GetDeclSymbol(make_pair(st->fileName(), st->lineNumber()));
if (symb && symb->identifier() == arrayName)
found = array;
}
else
{
if (array->GetShortName() == arrayName)
found = array;
}
}
} }
} }
return found; return found;
@@ -1264,6 +1282,32 @@ static SgExpression* isInCommon(const vector<SgExpression*> &commonBlocks, const
return NULL; return NULL;
} }
//all common block in project
extern map<string, CommonBlock*> commonBlocks;
static string getCommonNameOnPos(const string& name, const int commonPos)
{
if (commonBlocks.size() == 0)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto it = commonBlocks.find(name);
if (it == commonBlocks.end())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto inPos = it->second->getGroupedVars().find(commonPos);
if (inPos == it->second->getGroupedVars().end())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
set<string> namesOnPos;
for (auto& var : inPos->second)
namesOnPos.insert(var->getName());
if (namesOnPos.size() == 0)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return *namesOnPos.begin();
}
static map<tuple<string, string, int>, tuple<int, string, string>> tableOfUniqNames; static map<tuple<string, string, int>, tuple<int, string, string>> tableOfUniqNames;
tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>> &commonBlocks, SgStatement *decl, SgSymbol *symb) tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>> &commonBlocks, SgStatement *decl, SgSymbol *symb)
{ {
@@ -1272,6 +1316,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
int commonPos = 0; int commonPos = 0;
SgExpression *foundCommon = NULL; SgExpression *foundCommon = NULL;
string symbCommn = "";
SgStatement *declCP = decl->controlParent(); SgStatement *declCP = decl->controlParent();
// find symbol in parameter list of functions // find symbol in parameter list of functions
@@ -1307,6 +1352,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
if (foundCommon) if (foundCommon)
{ {
inCommon = true; inCommon = true;
symbCommn = getCommonNameOnPos(common.first, commonPos);
break; break;
} }
} }
@@ -1314,7 +1360,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
tuple<int, string, string> retVal; tuple<int, string, string> retVal;
if (inCommon) if (inCommon)
retVal = make_tuple(commonPos, string("common_") + getCommonName(foundCommon), string(symb->identifier())); retVal = make_tuple(commonPos, string("common_") + getCommonName(foundCommon), symbCommn);
else else
retVal = make_tuple(decl->lineNumber(), string(decl->fileName()), string(symb->identifier())); retVal = make_tuple(decl->lineNumber(), string(decl->fileName()), string(symb->identifier()));

View File

@@ -325,7 +325,7 @@ static void getModuleSymbols(SgStatement* func, set<SgSymbol*>& symbs)
} }
} }
const set<SgSymbol*>& getModuleSymbols(SgStatement *func) set<SgSymbol*> getModuleSymbols(SgStatement *func)
{ {
auto it = symbolsForFunc.find(func->symbol()->identifier()); auto it = symbolsForFunc.find(func->symbol()->identifier());
if (it != symbolsForFunc.end()) if (it != symbolsForFunc.end())
@@ -337,8 +337,13 @@ const set<SgSymbol*>& getModuleSymbols(SgStatement *func)
//if function or module in contains //if function or module in contains
auto cp = func->controlParent(); auto cp = func->controlParent();
if (isSgProgHedrStmt(cp) || cp->variant() == MODULE_STMT) if (isSgProgHedrStmt(cp) || cp->variant() == MODULE_STMT)
{
getModuleSymbols(cp, symbs); getModuleSymbols(cp, symbs);
if (func->variant() == FUNC_HEDR)
symbs.insert(func->symbol());
}
symbolsForFunc[func->symbol()->identifier()] = symbs; symbolsForFunc[func->symbol()->identifier()] = symbs;
return symbs; return symbs;
} }
@@ -349,9 +354,19 @@ static void findSymbol(SgStatement* func, const string& varName, const string& l
for (const auto& s : getModuleSymbols(func)) for (const auto& s : getModuleSymbols(func))
{ {
SgSymbol* orig = OriginalSymbol(s); SgSymbol* orig = OriginalSymbol(s);
printf("%s == %s\n", orig->identifier(), s->identifier());
//any suitable symbol can be used //any suitable symbol can be used
if (orig->identifier() == varName && orig->scope()->symbol()->identifier() == locName)
altNames[s->identifier()] = s; if (orig->variant() == FUNCTION_NAME)
{
if (orig->identifier() == varName)
altNames[s->identifier()] = s;
}
else
{
if (orig->identifier() == varName && orig->scope()->symbol()->identifier() == locName)
altNames[s->identifier()] = s;
}
} }
} }
@@ -369,6 +384,7 @@ SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const stri
return altNames.begin()->second; return altNames.begin()->second;
else { else {
__spf_print(1, "%s (%s %s) %s\n", func->symbol()->identifier(), clearName.c_str(), varName.c_str(), locName.c_str()); __spf_print(1, "%s (%s %s) %s\n", func->symbol()->identifier(), clearName.c_str(), varName.c_str(), locName.c_str());
findSymbol(func, varName, locName, altNames);
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
} }

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
std::string correctSymbolModuleName(const std::string& origFull); std::string correctSymbolModuleName(const std::string& origFull);
const std::set<SgSymbol*>& getModuleSymbols(SgStatement* func); std::set<SgSymbol*> getModuleSymbols(SgStatement* func);
void getModulesAndFunctions(SgFile* file, std::vector<SgStatement*>& modulesAndFunctions); void getModulesAndFunctions(SgFile* file, std::vector<SgStatement*>& modulesAndFunctions);
void findModulesInFile(SgFile* file, std::vector<SgStatement*>& modules); void findModulesInFile(SgFile* file, std::vector<SgStatement*>& modules);
std::map<std::string, std::set<std::string>> createMapOfModuleUses(SgFile* file); std::map<std::string, std::set<std::string>> createMapOfModuleUses(SgFile* file);

View File

@@ -569,8 +569,8 @@ void copyIncludes(const set<string> &allIncludeFiles, const map<string, map<int,
while (!feof(oldFile)) while (!feof(oldFile))
{ {
char buf[8192]; char buf[16384];
char *res = fgets(buf, 16384, oldFile); char *res = fgets(buf, sizeof(buf), oldFile);
if (res == NULL) if (res == NULL)
break; break;

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2451" #define VERSION_SPF "2464"

View File

@@ -152,7 +152,7 @@ static void setOptions(const short* options, bool isBuildParallel = false, const
intOptions[z] = -1; intOptions[z] = -1;
} }
staticShadowAnalysis = intOptions[STATIC_SHADOW_ANALYSIS]; //staticShadowAnalysis = intOptions[STATIC_SHADOW_ANALYSIS];
staticPrivateAnalysis = intOptions[STATIC_PRIVATE_ANALYSIS]; staticPrivateAnalysis = intOptions[STATIC_PRIVATE_ANALYSIS];
out_free_form = intOptions[FREE_FORM]; out_free_form = intOptions[FREE_FORM];
if (out_free_form == 1) if (out_free_form == 1)