diff --git a/src/ParallelizationRegions/ParRegions.cpp b/src/ParallelizationRegions/ParRegions.cpp index a05d827..b27531b 100644 --- a/src/ParallelizationRegions/ParRegions.cpp +++ b/src/ParallelizationRegions/ParRegions.cpp @@ -24,6 +24,7 @@ using std::make_pair; using std::map; using std::set; using std::wstring; +using std::tuple; extern void createMapLoopGraph(map &sortedLoopGraph, const vector *loopGraph); @@ -954,4 +955,65 @@ void calculateLinesOfCode(vector &allRegions) __spf_print(1, " Count of lines in region '%s' = %d\n", elem->GetName().c_str(), lineCounter); } +} + +void propagateRegionInfo(map, pair>& declaredArrays, + const map>& arrayLinksByFuncCalls, + const vector ¶llelRegions) +{ + bool modified = true; + while (modified) + { + modified = false; + + for (auto &array_pair: declaredArrays) + { + auto array = array_pair.second.first; + if (array->GetLocation().first == DIST::l_PARAMETER) + { + set realArrayRef; + getAllArrayRefs(array, array, realArrayRef, arrayLinksByFuncCalls); + + auto regs = array->GetRegionsName(); + for (auto& ref : realArrayRef) + { + auto regsRef = ref->GetRegionsName(); + for (auto& reg : regsRef) + { + if (regs.count(reg) == 0) + { + array->SetRegionPlace(reg); + modified = true; + } + } + + } + } + } + } + + bool hasNonDefaultReg = false; + for (auto& elem : parallelRegions) + { + string regName = elem->GetName(); + convertToLower(regName); + if (regName != "default") + hasNonDefaultReg = true; + } + + if (hasNonDefaultReg) + { + for (auto array : declaredArrays) + { + if (array.second.first->GetRegionsName().size() == 0) + array.second.first->SetDistributeFlag(DIST::NO_DISTR); + else if (array.second.first->GetRegionsName().size() == 1) + { + string regName = *array.second.first->GetRegionsName().begin(); + convertToLower(regName); + if (regName == "default") + array.second.first->SetDistributeFlag(DIST::NO_DISTR); + } + } + } } \ No newline at end of file diff --git a/src/ParallelizationRegions/ParRegions_func.h b/src/ParallelizationRegions/ParRegions_func.h index d1ac9b8..1cc15df 100644 --- a/src/ParallelizationRegions/ParRegions_func.h +++ b/src/ParallelizationRegions/ParRegions_func.h @@ -10,3 +10,7 @@ int printParalleRegions(const char *fileName, std::vector ®i bool buildGraphFromUserDirectives(const std::vector &userDvmAlignDirs, DIST::GraphCSR &G, DIST::Arrays &allArrays, const std::map> &arrayLinksByFuncCalls, const std::set& alignedArrays, std::set& addedArrays, const std::map>& funcsByFile); void clearRegionStaticData(); void calculateLinesOfCode(std::vector &allRegions); + +void propagateRegionInfo(std::map, std::pair>& declaredArrays, + const std::map>& arrayLinksByFuncCall, + const std::vector& parallelRegions); diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index 8ba8b92..a78cb70 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -1264,6 +1264,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne moveAllocatesInterproc(arrayLinksByFuncCalls); + propagateRegionInfo(declaredArrays, arrayLinksByFuncCalls, subs_parallelRegions); + removeDistrStateFromDeadFunctions(allFuncInfo, declaredArrays); propagateArrayFlags(arrayLinksByFuncCalls, declaredArrays, SPF_messages); } @@ -1681,30 +1683,11 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne findDeadFunctionsAndFillCalls(allFuncInfo_IR, SPF_messages, true); else if (curr_regime == GET_ALL_ARRAY_DECL) { - bool hasNonDefaultReg = false; - for (auto &elem : subs_parallelRegions) - if (elem->GetName() != "DEFAULT") - hasNonDefaultReg = true; - - if (hasNonDefaultReg) + if (ignoreArrayDistributeState) { - for (auto array : declaredArrays) - { - if (array.second.first->GetRegionsName().size() == 0) - array.second.first->SetDistributeFlag(DIST::NO_DISTR); - else if (array.second.first->GetRegionsName().size() == 1) - { - string regName = *array.second.first->GetRegionsName().begin(); - convertToLower(regName); - if (regName == "default") - array.second.first->SetDistributeFlag(DIST::NO_DISTR); - } - } - } - - if (ignoreArrayDistributeState) for (auto array : declaredArrays) array.second.first->SetDistributeFlag(DIST::NO_DISTR); + } } else if (curr_regime == GCOV_PARSER) { diff --git a/src/Utils/version.h b/src/Utils/version.h index b895678..c4c9c11 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2478" +#define VERSION_SPF "2479"