From 7b12fb1bb08fbe27504231377a22fefe031e3c96 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 18 Feb 2025 18:57:05 +0300 Subject: [PATCH] improved module analysis --- .../DirectiveProcessing/remote_access.cpp | 1 - .../_src/Distribution/DvmhDirective.cpp | 35 +++--- .../Sapfor_2017/_src/Utils/module_utils.cpp | 100 ++++++++++-------- .../Sapfor_2017/_src/Utils/module_utils.h | 3 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 5 files changed, 80 insertions(+), 61 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/remote_access.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/remote_access.cpp index 5e3ae08..a35c844 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/remote_access.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/remote_access.cpp @@ -872,7 +872,6 @@ ArrayRefExp* createRemoteLink(const LoopGraph* currLoop, const DIST::Array* forA const set allFiles = getAllFilesInProject(); SgStatement* realStat = (SgStatement*)currLoop->getRealStat(file->filename()); - const map> byUseInFunc = moduleRefsByUseInFunction(realStat); SgExpression* ex = new SgExpression(EXPR_LIST); SgExpression* p = ex; diff --git a/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective.cpp b/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective.cpp index f2c6973..798eef2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective.cpp @@ -226,7 +226,6 @@ static SgStatement* getModuleScope(const string& origFull, vector& static vector compliteTieList(const LoopGraph* currLoop, const vector& loops, const map>& arrayLinksByFuncCalls, - const map>& byUseInFunc, File* file, SgStatement *location, const set& onlyFor, const set& privates) @@ -506,7 +505,6 @@ ParallelDirective::genDirective(File* file, const vectorgetRealStat(file->filename()); SgStatement* parentFunc = getFuncStat(realStat); - const map> byUseInFunc = moduleRefsByUseInFunction(realStat); const int nested = countPerfectLoopNest(loopG); vector loopSymbs; @@ -666,7 +664,7 @@ ParallelDirective::genDirective(File* file, const vector tieList; if (sharedMemoryParallelization) - tieList = compliteTieList(currLoop, loopsTie, arrayLinksByFuncCalls, byUseInFunc, file, parentFunc, onlyFor, uniqNamesOfPrivates); + tieList = compliteTieList(currLoop, loopsTie, arrayLinksByFuncCalls, file, parentFunc, onlyFor, uniqNamesOfPrivates); else if (onlyFor.size()) // not MPI regime - tieList = compliteTieList(currLoop, loopsTie, arrayLinksByFuncCalls, byUseInFunc, file, parentFunc, onlyFor, uniqNamesOfPrivates); + tieList = compliteTieList(currLoop, loopsTie, arrayLinksByFuncCalls, file, parentFunc, onlyFor, uniqNamesOfPrivates); if (tieList.size()) { @@ -950,16 +948,21 @@ ParallelDirective::genDirective(File* file, const vectorfirst; - for (auto& list : it->second) + for (auto& red : it->second) { if (k != 0) { directive += ","; p = createAndSetNext(RIGHT, EXPR_LIST, p); } + + SgSymbol* redS; + string clearName = correctSymbolModuleName(red); + if (clearName != red) + redS = getNameInLocation(parentFunc, clearName, getModuleScope(red, moduleList, parentFunc)->symbol()->identifier()); + else + redS = findSymbolOrCreate(file, clearName, NULL, parentFunc); - SgSymbol* base = findSymbolOrCreate(file, correctSymbolModuleName(list), NULL, getModuleScope(list, moduleList, parentFunc)); - SgSymbol* redS = getFromModule(byUseInFunc, base, list.find("::") != string::npos); directive += nameGroup + "(" + redS->identifier() + ")"; SgVarRefExp* tmp2 = new SgVarRefExp(redS); @@ -1009,11 +1012,19 @@ ParallelDirective::genDirective(File* file, const vector(list)), NULL, getModuleScope(get<0>(list), moduleList, parentFunc)); - SgSymbol* base2 = findSymbolOrCreate(file, correctSymbolModuleName(get<1>(list)), NULL, getModuleScope(get<1>(list), moduleList, parentFunc)); + SgSymbol *redS1, *redS2; + string clearName1 = correctSymbolModuleName(get<0>(list)); + string clearName2 = correctSymbolModuleName(get<1>(list)); - SgSymbol* redS1 = getFromModule(byUseInFunc, base1, get<0>(list).find("::") != string::npos); - SgSymbol* redS2 = getFromModule(byUseInFunc, base2, get<1>(list).find("::") != string::npos); + if (clearName1 != get<0>(list)) + redS1 = getNameInLocation(parentFunc, clearName1, getModuleScope(get<0>(list), moduleList, parentFunc)->symbol()->identifier()); + else + redS1 = findSymbolOrCreate(file, clearName1, NULL, parentFunc); + + if (clearName2 != get<1>(list)) + redS2 = getNameInLocation(parentFunc, clearName2, getModuleScope(get<1>(list), moduleList, parentFunc)->symbol()->identifier()); + else + redS2 = findSymbolOrCreate(file, clearName2, NULL, parentFunc); directive += nameGroup + "(" + redS1->identifier() + ", " + redS2->identifier() + ", " + std::to_string(get<2>(list)) + ")"; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.cpp index 76bc0fb..a4a83ec 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.cpp @@ -57,27 +57,6 @@ void getModulesAndFunctions(SgFile* file, vector& modulesAndFuncti modulesAndFunctions.push_back(file->functions(i)); } -SgSymbol* getFromModule(const map>& byUse, SgSymbol* orig, bool processAsModule) -{ - if (!processAsModule) - { - checkNull(orig->scope(), convertFileName(__FILE__).c_str(), __LINE__); - if (orig->scope()->variant() != MODULE_STMT) - return orig; - } - - if (byUse.size()) - { - for (auto& elem : byUse) - { - for (auto& localS : setToMapWithSortByStr(elem.second)) - if (OriginalSymbol(localS.second)->thesymb == orig->thesymb) - return localS.second; - } - } - return orig; -} - map> createMapOfModuleUses(SgFile* file) { map> retValMap; @@ -335,6 +314,57 @@ static const set& getModeulSymbols(SgStatement *func) return symbolsForFunc[func]; } +SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const string& locName) +{ + map altNames; + for (const auto& s : getModeulSymbols(func)) + { + SgSymbol* orig = OriginalSymbol(s); + if (orig->identifier() == varName && orig->scope()->symbol()->identifier() == locName) + { + if (altNames.count(s->identifier())) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + altNames[s->identifier()] = s; + } + } + + if (altNames.size() > 0) + return altNames.begin()->second; + else + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + return NULL; +} + +SgSymbol* getNameInLocation(SgSymbol* curr, SgStatement* location) +{ + string oldFileName = ""; + if (location->getFileId() != current_file_id) + { + oldFileName = current_file->filename(); + if (!location->switchToFile()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } + + SgStatement* func = getFuncStat(location, { MODULE_STMT }); + if (func == NULL) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + SgSymbol* returnVal = curr; + if (IS_BY_USE(curr)) + { + const string location = OriginalSymbol(curr)->scope()->symbol()->identifier(); + returnVal = getNameInLocation(func, OriginalSymbol(curr)->identifier(), location); + } + + checkNull(returnVal, convertFileName(__FILE__).c_str(), __LINE__); + + if (oldFileName != "" && SgFile::switchToFile(oldFileName) == -1) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + return returnVal; +} namespace Distribution { @@ -347,11 +377,9 @@ namespace Distribution { SgStatement* location = (SgStatement*)location_p; - int old_id = -1; string oldFileName = ""; if (location->getFileId() != current_file_id) { - old_id = current_file_id; oldFileName = current_file->filename(); if (!location->switchToFile()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -374,35 +402,15 @@ namespace Distribution const string& varName = shortName; const string& locName = locationPos.second; - - map altNames; - for (const auto& s : getModeulSymbols(func)) - { - SgSymbol* orig = OriginalSymbol(s); - if (orig->identifier() == varName && orig->scope()->symbol()->identifier() == locName) - { - if (altNames.count(s->identifier())) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - - altNames[s->identifier()] = s; - } - } - - if (altNames.size() > 0) - returnVal = altNames.begin()->second; - else - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + returnVal = getNameInLocation(func, varName, locName); } else returnVal = GetDeclSymbol(filename, lineRange, allFiles); checkNull(returnVal, convertFileName(__FILE__).c_str(), __LINE__); - if (old_id != -1) - { - if (SgFile::switchToFile(oldFileName) == -1) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - } + if (oldFileName != "" && SgFile::switchToFile(oldFileName) == -1) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); return returnVal; } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.h b/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.h index 82216b2..fb14657 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/module_utils.h @@ -2,10 +2,11 @@ void getModulesAndFunctions(SgFile* file, std::vector& modulesAndFunctions); void findModulesInFile(SgFile* file, std::vector& modules); -SgSymbol* getFromModule(const std::map>& byUse, SgSymbol* orig, bool processAsModule = false); std::map> createMapOfModuleUses(SgFile* file); void fillModuleUse(SgFile* file, std::map>& moduleUses, std::map& moduleDecls); void filterModuleUse(std::map>& moduleUses, std::map& moduleDecls); +SgSymbol* getNameInLocation(SgStatement* func, const std::string& varName, const std::string& locName); +SgSymbol* getNameInLocation(SgSymbol* curr, SgStatement* location); void fillUsedModulesInFunction(SgStatement* st, std::vector& useStats); void fillUseStatement(SgStatement* st, std::set& useMod, std::map>>& modByUse, std::map>>& modByUseOnly); void fixUseOnlyStmt(SgFile* file, const std::vector& regs); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index c5b1c0d..7a1ee3e 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2391" +#define VERSION_SPF "2392"