REMOVE_DIST_ARRAYS_FROM_IO: consider labels and goto statements while inserting copy statements

This commit is contained in:
2025-10-01 18:54:55 +03:00
parent 453105d273
commit 8752f4a139

View File

@@ -172,7 +172,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)
@@ -180,7 +180,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 *
@@ -190,19 +190,19 @@ 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 (!isArrayRef(arg))
return; return false;
if (arg->lhs()) if (arg->lhs())
need_replace = true; need_replace = true;
@@ -225,7 +225,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:
@@ -266,7 +265,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;
@@ -285,10 +286,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)
@@ -506,12 +510,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;
@@ -837,7 +845,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();
} }
} }