fixed shared memory parallelization
This commit is contained in:
@@ -1388,6 +1388,37 @@ static string makeName(SgSymbol* var, map<SgSymbol*, set< SgSymbol*>>& modVarsTo
|
||||
return name;
|
||||
}
|
||||
|
||||
static bool filterFromList(SgStatement* st, const set<string>& idents, bool exclude = false)
|
||||
{
|
||||
bool empty = false;
|
||||
SgExpression* list = st->expr(0);
|
||||
vector<SgExpression*> newList;
|
||||
|
||||
int total = 0;
|
||||
while (list)
|
||||
{
|
||||
if (exclude)
|
||||
{
|
||||
if (idents.find(list->lhs()->symbol()->identifier()) == idents.end())
|
||||
newList.push_back(list->lhs());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (idents.find(list->lhs()->symbol()->identifier()) != idents.end())
|
||||
newList.push_back(list->lhs());
|
||||
}
|
||||
total++;
|
||||
list = list->rhs();
|
||||
}
|
||||
|
||||
if (newList.size() == 0)
|
||||
empty = true;
|
||||
else if (total != newList.size())
|
||||
st->setExpression(0, makeExprList(newList));
|
||||
|
||||
return empty;
|
||||
}
|
||||
|
||||
static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
|
||||
{
|
||||
string oldFile = current_file->filename();
|
||||
@@ -1395,22 +1426,21 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
auto copy = duplicateProcedure(func, NULL, false, false, false, true);
|
||||
|
||||
const set<string> ident(pars.identificators.begin(), pars.identificators.end());
|
||||
const set<string> idents(pars.identificators.begin(), pars.identificators.end());
|
||||
|
||||
//remove all exec
|
||||
SgStatement* st = copy->lexNext();
|
||||
SgStatement* last = copy->lastNodeOfStmt();
|
||||
vector<SgStatement*> toExtract;
|
||||
|
||||
while (st != last)
|
||||
{
|
||||
if (isDVM_stat(st) || isSPF_stat(st))
|
||||
{
|
||||
if (st->variant() != ACC_ROUTINE_DIR)
|
||||
{
|
||||
SgStatement* next = st->lexNext();
|
||||
st->extractStmt();
|
||||
st = next;
|
||||
toExtract.push_back(st);
|
||||
st = st->lexNext();
|
||||
}
|
||||
else
|
||||
st = st->lexNext();
|
||||
@@ -1431,31 +1461,20 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
|
||||
st = copy->lexNext();
|
||||
while (st != last)
|
||||
{
|
||||
if (st->variant() == VAR_DECL
|
||||
|| st->variant() == VAR_DECL_90
|
||||
|| st->variant() == DIM_STAT
|
||||
|| st->variant() == INTENT_STMT)
|
||||
{
|
||||
SgExpression* list = st->expr(0);
|
||||
vector<SgExpression*> newList;
|
||||
while (list)
|
||||
{
|
||||
if (ident.find(list->lhs()->symbol()->identifier()) != ident.end())
|
||||
newList.push_back(list->lhs());
|
||||
list = list->rhs();
|
||||
}
|
||||
const int var = st->variant();
|
||||
|
||||
if (newList.size() == 0)
|
||||
if (var == VAR_DECL || var == VAR_DECL_90 || var == DIM_STAT ||
|
||||
var == INTENT_STMT || var == EXTERN_STAT)
|
||||
{
|
||||
bool empty = filterFromList(st, idents);
|
||||
if (empty)
|
||||
{
|
||||
SgStatement* next = st->lexNext();
|
||||
toExtract.push_back(st);
|
||||
st = next;
|
||||
st = st->lexNext();
|
||||
continue;
|
||||
}
|
||||
else
|
||||
st->setExpression(0, makeExprList(newList));
|
||||
}
|
||||
else
|
||||
else if (!isDVM_stat(st) && !isSPF_stat(st))
|
||||
toExtract.push_back(st);
|
||||
|
||||
if (st->variant() == CONTAINS_STMT)
|
||||
@@ -1466,16 +1485,56 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
|
||||
for (auto& elem : toExtract)
|
||||
elem->extractStmt();
|
||||
|
||||
string retVal = copy->unparse();
|
||||
string codeString = copy->unparse();
|
||||
|
||||
if (SgFile::switchToFile(oldFile) == -1)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
//insert tabs
|
||||
const string tab = " ";
|
||||
const int countEnds = std::count(codeString.begin(), codeString.end(), '\n');
|
||||
|
||||
string retVal = " ";
|
||||
retVal.reserve(retVal.size() + codeString.size() + countEnds * tab.size());
|
||||
|
||||
for (int z = 0, ends = 0; z < codeString.size(); ++z)
|
||||
{
|
||||
retVal += codeString[z];
|
||||
if (codeString[z] == '\n')
|
||||
{
|
||||
ends++;
|
||||
if (ends == countEnds)
|
||||
continue;
|
||||
|
||||
int p = z + 1;
|
||||
while (codeString[p] == ' ' && p < codeString.size())
|
||||
++p;
|
||||
|
||||
auto start = p;
|
||||
auto end = string::npos;
|
||||
auto sub = codeString.find("subroutine", p);
|
||||
auto func = codeString.find("function", p);
|
||||
auto end_sub = codeString.find("end subroutine", p);
|
||||
auto end_func = codeString.find("end function", p);
|
||||
|
||||
if (sub != end && sub == start || end_sub != end && end_sub == start ||
|
||||
func != end && func == start || end_func != end && end_func == start)
|
||||
{
|
||||
retVal += " ";
|
||||
}
|
||||
else
|
||||
retVal += tab;
|
||||
}
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static void insertInterface(SgStatement* func, const string& iface)
|
||||
void insertInterface(SgStatement* func, const FuncInfo *callFrom)
|
||||
{
|
||||
const string& iface = getInterfaceBlock(callFrom->funcPointer->GetOriginal(), callFrom->funcParams);
|
||||
const string& fName = callFrom->funcName;
|
||||
|
||||
string oldFile = current_file->filename();
|
||||
if (!func->switchToFile())
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
@@ -1484,6 +1543,18 @@ static void insertInterface(SgStatement* func, const string& iface)
|
||||
SgStatement* last = func->lastNodeOfStmt();
|
||||
while (st != last)
|
||||
{
|
||||
if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90)
|
||||
{
|
||||
bool empty = filterFromList(st, { fName }, true);
|
||||
if (empty)
|
||||
{
|
||||
SgStatement* next = st->lexNext();
|
||||
st->extractStmt();
|
||||
st = next;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (isSgExecutableStatement(st))
|
||||
break;
|
||||
st = st->lexNext();
|
||||
@@ -1491,7 +1562,7 @@ static void insertInterface(SgStatement* func, const string& iface)
|
||||
SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT);
|
||||
addControlEndToStmt(ifaceBlock->thebif);
|
||||
|
||||
ifaceBlock->setlineNumber(st->lineNumber());
|
||||
ifaceBlock->setlineNumber(getNextNegativeLineNumber());
|
||||
ifaceBlock->setFileName(st->fileName());
|
||||
st->insertStmtBefore(*ifaceBlock, *st->controlParent());
|
||||
ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str());
|
||||
@@ -1507,7 +1578,7 @@ static void createInterfaceBlockForToCalls(FuncInfo* func)
|
||||
if (callTo->interfaceBlocks.find(func->funcName) == callTo->interfaceBlocks.end())
|
||||
{
|
||||
callTo->interfaceBlocks[func->funcName] = func;
|
||||
insertInterface(callTo->funcPointer, getInterfaceBlock(func->funcPointer->GetOriginal(), func->funcParams));
|
||||
insertInterface(callTo->funcPointer, func);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user