diff --git a/projects/dvm b/projects/dvm index 4b7ef11..4d4041a 160000 --- a/projects/dvm +++ b/projects/dvm @@ -1 +1 @@ -Subproject commit 4b7ef11871a0abf5868ba3866d1371e863fb9139 +Subproject commit 4d4041a0811397add7e5e742681b5786e6c8a021 diff --git a/src/PrivateAnalyzer/private_arrays_search.cpp b/src/PrivateAnalyzer/private_arrays_search.cpp index 4de5382..eec5d5b 100644 --- a/src/PrivateAnalyzer/private_arrays_search.cpp +++ b/src/PrivateAnalyzer/private_arrays_search.cpp @@ -124,16 +124,30 @@ static void SolveDataFlow(Region* DFG) map FindPrivateArrays(map> &loopGraph, map>& FullIR) { map result; - for (const auto& [loopName, loops] : loopGraph) + for (const auto& [fileName, loops] : loopGraph) { + SgFile::switchToFile(fileName); for (const auto& loop : loops) { + SgStatement* search_func = loop->loop->GetOriginal(); + + while (search_func && (!isSgProgHedrStmt(search_func))) + search_func = search_func->controlParent(); + for (const auto& [funcInfo, blocks]: FullIR) { - Region* loopRegion = new Region(loop, blocks); - SolveDataFlow(loopRegion); - result[loop] = loopRegion->array_priv; - delete(loopRegion); + if (funcInfo->fileName == fileName && funcInfo->funcPointer->GetOriginal() == search_func) + { + Region* loopRegion = new Region(loop, blocks); + if (loopRegion->getBasickBlocks().size() <= 1) + { + delete(loopRegion); + continue; + } + SolveDataFlow(loopRegion); + result[loop] = loopRegion->array_priv; + delete(loopRegion); + } } } } diff --git a/src/PrivateAnalyzer/region.cpp b/src/PrivateAnalyzer/region.cpp index 252c9d2..94b94fd 100644 --- a/src/PrivateAnalyzer/region.cpp +++ b/src/PrivateAnalyzer/region.cpp @@ -14,6 +14,7 @@ using namespace std; static bool isParentStmt(SgStatement* stmt, SgStatement* parent) { + // && sgStats.find(stmt->thebif) == sgStats.end() for (; stmt; stmt = stmt->controlParent()) if (stmt == parent) return true; diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index ff10c5c..ccb2ee5 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -1019,8 +1019,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne if(func->funcPointer->variant() != ENTRY_STAT) countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); } - else if (curr_regime == FIND_PRIVATE_ARRAYS) - FindPrivateArrays(loopGraph, fullIR); else if (curr_regime == TEST_PASS) { //test pass @@ -1916,6 +1914,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne } else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS) transformAssumedSizeParameters(allFuncInfo); + else if (curr_regime == FIND_PRIVATE_ARRAYS) + auto result = FindPrivateArrays(loopGraph, fullIR); const float elapsed = duration_cast(high_resolution_clock::now() - timeForPass).count() / 1000.; const float elapsedGlobal = duration_cast(high_resolution_clock::now() - globalTime).count() / 1000.;