replace_io_arrays #67
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define VERSION_SPF "2445"
|
#define VERSION_SPF "2446"
|
||||||
|
|||||||
Reference in New Issue
Block a user