fixed different names of same arrays in common

This commit is contained in:
ALEXks
2026-02-01 12:25:54 +03:00
parent 331d4f9d99
commit b90d200fad
5 changed files with 109 additions and 27 deletions

View File

@@ -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);

View File

@@ -542,6 +542,22 @@ 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())
{
#if __SPF
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
#endif
return NULL;
}
return it->second;
}
Symbol* GetDeclSymbol() const { return declSymbol; }
void SetDeclSymbol(Symbol *s) { declSymbol = s; }

View File

@@ -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);
@@ -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);

View File

@@ -953,9 +953,21 @@ DIST::Array* getArrayFromDeclarated(SgStatement *st, const string &arrayName)
for (auto itSet = it->second.begin(); itSet != it->second.end() && !found; ++itSet)
{
auto itD = declaredArrays.find(*itSet);
if (itD != declaredArrays.end())
if (itD->second.first->GetShortName() == arrayName)
found = itD->second.first;
if (itD != declaredArrays.end())
{
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()));

View File

@@ -1,3 +1,3 @@
#pragma once
#define VERSION_SPF "2453"
#define VERSION_SPF "2454"