diff --git a/src/Transformations/FunctionPurifying/function_purifying.cpp b/src/Transformations/FunctionPurifying/function_purifying.cpp index 7c65db2..0e8b03e 100644 --- a/src/Transformations/FunctionPurifying/function_purifying.cpp +++ b/src/Transformations/FunctionPurifying/function_purifying.cpp @@ -234,9 +234,8 @@ static bool hasDvmParallel(SgStatement *func) return false; } -void transformAssumedSizeParameters(const map>& allFuncInfo) -{ - map> assumedSizeArraysByFunc; +static map createDvmParallelInfo(const map>& allFuncInfo) { + map hasDvmParallelMap; for (auto& funcByFile : allFuncInfo) { @@ -249,7 +248,63 @@ void transformAssumedSizeParameters(const map>& allFun if (prog == NULL) continue; - if (!hasDvmParallel(prog)) + hasDvmParallelMap[func] = hasDvmParallel(prog); + } + } + + bool changed = true; + while (changed) + { + changed = false; + + for (auto& funcByFile : allFuncInfo) + { + for (auto& func : funcByFile.second) + { + if (!hasDvmParallelMap[func]) + { + bool hasParallel = false; + for (auto& callF : func->callsFromV) + { + if (hasDvmParallelMap[callF]) + { + hasParallel = true; + break; + } + } + + if (hasParallel) + { + changed = true; + hasDvmParallelMap[func] = true; + } + + } + } + } + } + + return hasDvmParallelMap; +} + + +void transformAssumedSizeParameters(const map>& allFuncInfo) +{ + map> assumedSizeArraysByFunc; + const map hasDvmParallelMap = createDvmParallelInfo(allFuncInfo); + + for (auto& funcByFile : allFuncInfo) + { + if (SgFile::switchToFile(funcByFile.first) == -1) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + for (auto& func : funcByFile.second) + { + SgProgHedrStmt* prog = isSgProgHedrStmt(func->funcPointer->GetOriginal()); + if (prog == NULL) + continue; + + if (!hasDvmParallelMap.at(func)) continue; vector parNames; @@ -259,7 +314,8 @@ void transformAssumedSizeParameters(const map>& allFun bool hasRefs = false; for (int z = 0; z < func->funcParams.countOfPars; ++z) { - if (func->funcParams.parametersT[z] == ARRAY_T) + if (func->funcParams.parametersT[z] == ARRAY_T || + func->funcParams.parametersT[z] == STRING_ARRAY_T) { auto s = prog->parameter(z); const string name = s->identifier(); diff --git a/src/Utils/version.h b/src/Utils/version.h index 4eb8abe..e8531ab 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2476" +#define VERSION_SPF "2477"