Compare commits
8 Commits
5dbe2b08ec
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d78753888f | ||
|
|
025bbbe259 | ||
|
|
076a0c9699 | ||
|
|
90b311d049 | ||
|
|
5a1377e7ea | ||
|
|
b90d200fad | ||
|
|
331d4f9d99 | ||
|
|
904292f109 |
Submodule projects/dvm updated: 3aad02affb...9e9e77f1fa
Submodule projects/libpredictor updated: 5cf49ecbff...d08cb25cc6
@@ -200,15 +200,41 @@ static void fillOutForFunc(const FuncInfo* func, const vector<SAPFOR::BasicBlock
|
||||
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,
|
||||
const vector<pair<const Variable*, CommonBlock*>>& commonVars,
|
||||
const FuncInfo* func)
|
||||
{
|
||||
vector<SAPFOR::Argument*> lastParamRef;
|
||||
|
||||
for (auto ir_block : block->getInstructions())
|
||||
for (const auto &ir_block : block->getInstructions())
|
||||
{
|
||||
SAPFOR::Instruction* instr = ir_block->getInstruction();
|
||||
if (isInstructionSpfParameter(instr))
|
||||
continue;
|
||||
|
||||
SAPFOR::CFG_OP instr_operation = instr->getOperation();
|
||||
if (instr_operation == SAPFOR::CFG_OP::PARAM)
|
||||
{
|
||||
@@ -236,11 +262,19 @@ static void getDefsFromBlock(SAPFOR::BasicBlock* block, set<SAPFOR::Argument*>&
|
||||
int last_instr_num = block->getInstructions().back()->getNumber();
|
||||
|
||||
for (const auto& def : block->getRD_Out())
|
||||
{
|
||||
for (int place : def.second)
|
||||
{
|
||||
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);
|
||||
addPlaceWithDef(commonVars, func, def.first, block->getInstructions()[place - first_instr_num]->getInstruction());
|
||||
addPlaceWithDef(commonVars, func, def.first, instr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,7 +300,7 @@ static set<SAPFOR::BasicBlock*> analyzeLoop(LoopGraph* loop, const set<SAPFOR::B
|
||||
SAPFOR::BasicBlock* head_block = NULL;
|
||||
|
||||
int loop_start = loop->lineNum, loop_end = loop->lineNumAfterLoop;
|
||||
for (auto bb : blocks)
|
||||
for (const auto &bb : blocks)
|
||||
{
|
||||
if (!bb || (bb->getInstructions().size() == 0))
|
||||
continue;
|
||||
@@ -348,7 +382,7 @@ static set<SAPFOR::BasicBlock*> analyzeLoop(LoopGraph* loop, const set<SAPFOR::B
|
||||
getDefsFromBlock(*loop_it, changeValueOnExit, commonVars, func);
|
||||
|
||||
|
||||
for (auto bb : currentLoop)
|
||||
for (const auto &bb : currentLoop)
|
||||
{
|
||||
//fill LiveWhenLoopEnds
|
||||
bool has_next_outside_body = false;
|
||||
|
||||
@@ -853,12 +853,21 @@ static pair<string, string> getModuleRename(const set<SgStatement*>& allocatable
|
||||
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>
|
||||
getNewDirective(const string &fullArrayName,
|
||||
const vector<string> &distrRules,
|
||||
const vector<string> &alignRules,
|
||||
const DataDirective &dataDir,
|
||||
const set<SgStatement*>& allocatableStmts)
|
||||
const set<SgStatement*>& allocatableStmts,
|
||||
const pair<string, int>& position_decl)
|
||||
{
|
||||
string out = "";
|
||||
DIST::Array* outA = NULL;
|
||||
@@ -877,7 +886,8 @@ getNewDirective(const string &fullArrayName,
|
||||
|
||||
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];
|
||||
if (allocatableStmts.size())
|
||||
@@ -889,21 +899,21 @@ getNewDirective(const string &fullArrayName,
|
||||
it = rule.find("ALIGN", it + 7);
|
||||
}
|
||||
|
||||
auto renamePair = getModuleRename(allocatableStmts, dataDir.alignRules[i].alignArray);
|
||||
if (renamePair.first != "")
|
||||
{
|
||||
it = rule.find(renamePair.first);
|
||||
if (it != string::npos)
|
||||
if (rule[it + renamePair.first.size()] == '(' && rule[it - 1] == ' ')
|
||||
rule = rule.replace(it, renamePair.first.size(), renamePair.second);
|
||||
auto renamePair = getModuleRename(allocatableStmts, alignArray);
|
||||
doRename(rule, renamePair);
|
||||
}
|
||||
else if (alignArray->GetLocation().first == DIST::l_COMMON)
|
||||
{
|
||||
auto symb = alignArray->GetDeclSymbol(position_decl);
|
||||
if (symb->identifier() != alignArray->GetShortName())
|
||||
doRename(rule, make_pair(alignArray->GetShortName(), symb->identifier()));
|
||||
}
|
||||
|
||||
out += "!DVM$ " + rule + "\n";
|
||||
if (!out_free_form)
|
||||
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())
|
||||
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;
|
||||
if (toInsert != "")
|
||||
@@ -1975,20 +1985,27 @@ void insertDistributionToFile(SgFile *file, const char *fin_name, const DataDire
|
||||
set<string> toInsertArrays;
|
||||
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 (dynamicArraysAdded.find(array->GetShortName()) != dynamicArraysAdded.end())
|
||||
if (dynamicArraysAdded.find(name) != dynamicArraysAdded.end())
|
||||
{
|
||||
dynamicArraysAdded.erase(array->GetShortName());
|
||||
toInsertArrays.insert(array->GetShortName());
|
||||
dynamicArraysAdded.erase(name);
|
||||
toInsertArrays.insert(name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dynamicArraysAdded.find(array->GetShortName()) == dynamicArraysAdded.end())
|
||||
if (dynamicArraysAdded.find(name) == dynamicArraysAdded.end())
|
||||
{
|
||||
dynamicArraysAdded.insert(array->GetShortName());
|
||||
toInsertArrays.insert(array->GetShortName());
|
||||
dynamicArraysAdded.insert(name);
|
||||
toInsertArrays.insert(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2145,7 +2162,14 @@ void insertShadowSpecToFile(SgFile *file, const char *fin_name, const set<string
|
||||
|
||||
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)
|
||||
{
|
||||
char buf[256];
|
||||
@@ -2157,7 +2181,7 @@ void insertShadowSpecToFile(SgFile *file, const char *fin_name, const set<string
|
||||
shadowSpecInsert += ")\n";
|
||||
|
||||
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)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
shadowsSpecs.push_back(newSpec);
|
||||
|
||||
@@ -336,9 +336,24 @@ namespace Distribution
|
||||
if (pos != STRING::npos)
|
||||
{
|
||||
name.erase(pos, shortName.size());
|
||||
shortName = 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();
|
||||
}
|
||||
|
||||
@@ -542,6 +557,44 @@ namespace Distribution
|
||||
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; }
|
||||
void SetDeclSymbol(Symbol *s) { declSymbol = s; }
|
||||
|
||||
|
||||
@@ -206,7 +206,9 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
|
||||
|
||||
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);
|
||||
|
||||
@@ -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(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 });
|
||||
|
||||
@@ -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_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);
|
||||
|
||||
|
||||
@@ -954,8 +954,20 @@ DIST::Array* getArrayFromDeclarated(SgStatement *st, const string &arrayName)
|
||||
{
|
||||
auto itD = declaredArrays.find(*itSet);
|
||||
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;
|
||||
@@ -1264,6 +1276,32 @@ static SgExpression* isInCommon(const vector<SgExpression*> &commonBlocks, const
|
||||
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;
|
||||
tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>> &commonBlocks, SgStatement *decl, SgSymbol *symb)
|
||||
{
|
||||
@@ -1272,6 +1310,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
|
||||
int commonPos = 0;
|
||||
|
||||
SgExpression *foundCommon = NULL;
|
||||
string symbCommn = "";
|
||||
|
||||
SgStatement *declCP = decl->controlParent();
|
||||
// find symbol in parameter list of functions
|
||||
@@ -1307,6 +1346,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
|
||||
if (foundCommon)
|
||||
{
|
||||
inCommon = true;
|
||||
symbCommn = getCommonNameOnPos(common.first, commonPos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1314,7 +1354,7 @@ tuple<int, string, string> getUniqName(const map<string, vector<SgExpression*>>
|
||||
|
||||
tuple<int, string, string> retVal;
|
||||
if (inCommon)
|
||||
retVal = make_tuple(commonPos, string("common_") + getCommonName(foundCommon), string(symb->identifier()));
|
||||
retVal = make_tuple(commonPos, string("common_") + getCommonName(foundCommon), symbCommn);
|
||||
else
|
||||
retVal = make_tuple(decl->lineNumber(), string(decl->fileName()), string(symb->identifier()));
|
||||
|
||||
|
||||
@@ -337,8 +337,13 @@ const set<SgSymbol*>& getModuleSymbols(SgStatement *func)
|
||||
//if function or module in contains
|
||||
auto cp = func->controlParent();
|
||||
if (isSgProgHedrStmt(cp) || cp->variant() == MODULE_STMT)
|
||||
{
|
||||
getModuleSymbols(cp, symbs);
|
||||
|
||||
if (func->variant() == FUNC_HEDR)
|
||||
symbs.insert(func->symbol());
|
||||
}
|
||||
|
||||
symbolsForFunc[func->symbol()->identifier()] = symbs;
|
||||
return symbs;
|
||||
}
|
||||
@@ -349,11 +354,21 @@ static void findSymbol(SgStatement* func, const string& varName, const string& l
|
||||
for (const auto& s : getModuleSymbols(func))
|
||||
{
|
||||
SgSymbol* orig = OriginalSymbol(s);
|
||||
printf("%s == %s\n", orig->identifier(), s->identifier());
|
||||
//any suitable symbol can be used
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const string& locName)
|
||||
{
|
||||
@@ -369,6 +384,7 @@ SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const stri
|
||||
return altNames.begin()->second;
|
||||
else {
|
||||
__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__);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define VERSION_SPF "2452"
|
||||
#define VERSION_SPF "2459"
|
||||
|
||||
Reference in New Issue
Block a user