diff --git a/src/DirectiveProcessing/insert_directive.cpp b/src/DirectiveProcessing/insert_directive.cpp index c927150..9dbdfd9 100644 --- a/src/DirectiveProcessing/insert_directive.cpp +++ b/src/DirectiveProcessing/insert_directive.cpp @@ -853,12 +853,21 @@ static pair getModuleRename(const set& allocatable return make_pair("", ""); } +static void doRename(string& str, const pair& 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 getNewDirective(const string &fullArrayName, const vector &distrRules, const vector &alignRules, const DataDirective &dataDir, - const set& allocatableStmts) + const set& allocatableStmts, + const pair& 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 dirWithArray = getNewDirective(fullArrayName, distrRules, alignRules, dataDir, allocatableStmts); + pair 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 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 setGetShortName() + "("; + 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 newSpec = genShadowSpec(file, make_pair(array->GetShortName(), currSpec)); + pair newSpec = genShadowSpec(file, make_pair(name, currSpec)); if (newSpec.first == NULL || newSpec.second == NULL) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); shadowsSpecs.push_back(newSpec); diff --git a/src/Distribution/Array.h b/src/Distribution/Array.h index 2092451..d8aebf5 100644 --- a/src/Distribution/Array.h +++ b/src/Distribution/Array.h @@ -542,6 +542,22 @@ namespace Distribution return NULL; } + Symbol* GetDeclSymbol(const PAIR& 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; } diff --git a/src/Utils/PassManager.h b/src/Utils/PassManager.h index 0ca232e..9881df8 100644 --- a/src/Utils/PassManager.h +++ b/src/Utils/PassManager.h @@ -206,7 +206,9 @@ void InitPassesDependencies(map> &passDepsIn, set 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> &passDepsIn, set 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); diff --git a/src/Utils/SgUtils.cpp b/src/Utils/SgUtils.cpp index 1a206c5..024de03 100644 --- a/src/Utils/SgUtils.cpp +++ b/src/Utils/SgUtils.cpp @@ -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 &commonBlocks, const return NULL; } +//all common block in project +extern map 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 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> tableOfUniqNames; tuple getUniqName(const map> &commonBlocks, SgStatement *decl, SgSymbol *symb) { @@ -1272,6 +1310,7 @@ tuple getUniqName(const map> int commonPos = 0; SgExpression *foundCommon = NULL; + string symbCommn = ""; SgStatement *declCP = decl->controlParent(); // find symbol in parameter list of functions @@ -1307,6 +1346,7 @@ tuple getUniqName(const map> if (foundCommon) { inCommon = true; + symbCommn = getCommonNameOnPos(common.first, commonPos); break; } } @@ -1314,7 +1354,7 @@ tuple getUniqName(const map> tuple 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())); diff --git a/src/Utils/version.h b/src/Utils/version.h index 3513a82..c10a41a 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2453" +#define VERSION_SPF "2454"