|
|
|
@@ -17,6 +17,19 @@ using std::pair;
|
|
|
|
|
|
|
|
|
|
|
|
#define DEBUG_TRACE 0
|
|
|
|
#define DEBUG_TRACE 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool hasArrayRef(SgExpression* ex)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (ex)
|
|
|
|
|
|
|
|
return isArrayRef(ex) || hasArrayRef(ex->lhs()) || hasArrayRef(ex->rhs());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline bool isArrayDeclaration(SgStatement* st)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return isSgDeclarationStatement(st) || isSgVarListDeclStmt(st) || isSgNestedVarListDeclStmt(st);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SgExpression* findExprWithVariant(SgExpression* exp, int variant)
|
|
|
|
static SgExpression* findExprWithVariant(SgExpression* exp, int variant)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (exp)
|
|
|
|
if (exp)
|
|
|
|
@@ -167,7 +180,7 @@ static void findArrays(SgExpression* exp, set<SgSymbol*>& arrays)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& arrays,
|
|
|
|
static bool populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& arrays,
|
|
|
|
SgStatement* stat,
|
|
|
|
SgStatement* stat,
|
|
|
|
const string& current_file_name,
|
|
|
|
const string& current_file_name,
|
|
|
|
FuncInfo *current_func)
|
|
|
|
FuncInfo *current_func)
|
|
|
|
@@ -175,7 +188,7 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
|
|
|
|
auto var = stat->variant();
|
|
|
|
auto var = stat->variant();
|
|
|
|
|
|
|
|
|
|
|
|
if (var != READ_STAT && var != PRINT_STAT && var != WRITE_STAT)
|
|
|
|
if (var != READ_STAT && var != PRINT_STAT && var != WRITE_STAT)
|
|
|
|
return;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
// check if such IO allowed in dvm:
|
|
|
|
// check if such IO allowed in dvm:
|
|
|
|
// list should consist only of single array and format string should be *
|
|
|
|
// list should consist only of single array and format string should be *
|
|
|
|
@@ -185,22 +198,26 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
|
|
|
|
SgExpression* ioList = stat->expr(0);
|
|
|
|
SgExpression* ioList = stat->expr(0);
|
|
|
|
|
|
|
|
|
|
|
|
if (!ioList)
|
|
|
|
if (!ioList)
|
|
|
|
return;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (ioList->variant() != EXPR_LIST)
|
|
|
|
if (ioList->variant() != EXPR_LIST)
|
|
|
|
return;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (ioList->rhs() == NULL)
|
|
|
|
if (ioList->rhs() == NULL)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SgExpression* arg = ioList->lhs();
|
|
|
|
SgExpression* arg = ioList->lhs();
|
|
|
|
if (!arg)
|
|
|
|
if (!arg)
|
|
|
|
return;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (!isArrayRef(arg))
|
|
|
|
if (hasArrayRef(arg))
|
|
|
|
return;
|
|
|
|
{
|
|
|
|
|
|
|
|
if (isArrayRef(arg) && arg->lhs())
|
|
|
|
if (arg->lhs())
|
|
|
|
need_replace = true;
|
|
|
|
need_replace = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@@ -220,7 +237,6 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
|
|
|
|
if (fmt->rhs()->variant() != KEYWORD_VAL || fmt->rhs()->sunparse() != "*")
|
|
|
|
if (fmt->rhs()->variant() != KEYWORD_VAL || fmt->rhs()->sunparse() != "*")
|
|
|
|
need_replace = true;
|
|
|
|
need_replace = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case READ_STAT:
|
|
|
|
case READ_STAT:
|
|
|
|
@@ -261,7 +277,9 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!need_replace)
|
|
|
|
if (!need_replace)
|
|
|
|
return;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
|
|
|
|
set<SgSymbol*> found_arrays;
|
|
|
|
set<SgSymbol*> found_arrays;
|
|
|
|
|
|
|
|
|
|
|
|
@@ -280,10 +298,13 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
|
|
|
|
|
|
|
|
|
|
|
|
if (inserted)
|
|
|
|
if (inserted)
|
|
|
|
__spf_print(DEBUG_TRACE, "[%d]: add array %s %p\n", stat->lineNumber(), array_p->GetName().c_str(), by_symb);
|
|
|
|
__spf_print(DEBUG_TRACE, "[%d]: add array %s %p\n", stat->lineNumber(), array_p->GetName().c_str(), by_symb);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__spf_print(DEBUG_TRACE, "[replace]\n");
|
|
|
|
__spf_print(DEBUG_TRACE, "[replace]\n");
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void replaceArrayRec(SgSymbol* arr, SgSymbol* replace_by, SgExpression* exp, bool& has_read, bool& has_write, bool from_read, bool from_write)
|
|
|
|
static void replaceArrayRec(SgSymbol* arr, SgSymbol* replace_by, SgExpression* exp, bool& has_read, bool& has_write, bool from_read, bool from_write)
|
|
|
|
@@ -501,12 +522,16 @@ static bool ioReginBorder(SgStatement* stat, SgStatement* last_io_bound)
|
|
|
|
STOP_STAT,
|
|
|
|
STOP_STAT,
|
|
|
|
STOP_NODE,
|
|
|
|
STOP_NODE,
|
|
|
|
EXIT_STMT,
|
|
|
|
EXIT_STMT,
|
|
|
|
EXIT_NODE
|
|
|
|
EXIT_NODE,
|
|
|
|
|
|
|
|
GOTO_NODE
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (border_stats.find(var) != border_stats.end())
|
|
|
|
if (border_stats.find(var) != border_stats.end())
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (stat->hasLabel())
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
if (last_io_bound && last_io_bound->lastNodeOfStmt() && last_io_bound->lastNodeOfStmt() == stat)
|
|
|
|
if (last_io_bound && last_io_bound->lastNodeOfStmt() && last_io_bound->lastNodeOfStmt() == stat)
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
@@ -644,18 +669,17 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
|
|
|
|
newDeclsToInclude,
|
|
|
|
newDeclsToInclude,
|
|
|
|
copied_syms);
|
|
|
|
copied_syms);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// original declaration statement
|
|
|
|
// original declaration statement
|
|
|
|
auto *decl_stmt = SgStatement::getStatementByFileAndLine(decl_place.first, decl_place.second);
|
|
|
|
auto *decl_stmt = SgStatement::getStatementByFileAndLine(decl_place.first, decl_place.second);
|
|
|
|
|
|
|
|
|
|
|
|
if (!decl_stmt || !isSgDeclarationStatement(decl_stmt))
|
|
|
|
if (!decl_stmt || !isArrayDeclaration(decl_stmt))
|
|
|
|
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
|
|
|
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
|
|
|
|
|
|
|
|
|
|
|
auto dynamic_array = checkAssumedShape(decl_stmt, array_name);
|
|
|
|
auto dynamic_array = checkAssumedShape(decl_stmt, array_name);
|
|
|
|
|
|
|
|
|
|
|
|
while (decl_stmt && !isSgExecutableStatement(decl_stmt))
|
|
|
|
while (decl_stmt && !isSgExecutableStatement(decl_stmt))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (isSgDeclarationStatement(decl_stmt) &&
|
|
|
|
if (isArrayDeclaration(decl_stmt) &&
|
|
|
|
decl_stmt->expr(0) &&
|
|
|
|
decl_stmt->expr(0) &&
|
|
|
|
decl_stmt->expr(0)->lhs() &&
|
|
|
|
decl_stmt->expr(0)->lhs() &&
|
|
|
|
decl_stmt->expr(0)->lhs()->symbol() == copied_symbol.second)
|
|
|
|
decl_stmt->expr(0)->lhs()->symbol() == copied_symbol.second)
|
|
|
|
@@ -667,7 +691,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// created declaration statement
|
|
|
|
// created declaration statement
|
|
|
|
if (!decl_stmt || !isSgDeclarationStatement(decl_stmt))
|
|
|
|
if (!decl_stmt || !isArrayDeclaration(decl_stmt))
|
|
|
|
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
|
|
|
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
|
|
|
|
|
|
|
|
|
|
|
// insert !$SPF ANALYSIS(PROCESS_PRIVATE(array)) directive before declaration statement
|
|
|
|
// insert !$SPF ANALYSIS(PROCESS_PRIVATE(array)) directive before declaration statement
|
|
|
|
@@ -833,7 +857,17 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
populateDistributedIoArrays(need_replace, curr_stmt, current_file_name, current_func_info);
|
|
|
|
auto need_fix_io = populateDistributedIoArrays(need_replace, curr_stmt, current_file_name, current_func_info);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// incorrect IO statement with label
|
|
|
|
|
|
|
|
// move label to dummy statement and insert copy statements between dummy statement and IO
|
|
|
|
|
|
|
|
if (need_fix_io && curr_stmt->hasLabel())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
moveLabelBefore(curr_stmt);
|
|
|
|
|
|
|
|
if (last_io_bound == curr_stmt) // always true
|
|
|
|
|
|
|
|
last_io_bound = curr_stmt->lexPrev();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
curr_stmt = curr_stmt->lexNext();
|
|
|
|
curr_stmt = curr_stmt->lexNext();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|