diff --git a/src/Transformations/ReplaceArraysInIO/replace_dist_arrays_in_io.cpp b/src/Transformations/ReplaceArraysInIO/replace_dist_arrays_in_io.cpp index 02c7035..c40bdba 100644 --- a/src/Transformations/ReplaceArraysInIO/replace_dist_arrays_in_io.cpp +++ b/src/Transformations/ReplaceArraysInIO/replace_dist_arrays_in_io.cpp @@ -17,6 +17,19 @@ using std::pair; #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) { if (exp) @@ -167,7 +180,7 @@ static void findArrays(SgExpression* exp, set& arrays) } } -static void populateDistributedIoArrays(map>& arrays, +static bool populateDistributedIoArrays(map>& arrays, SgStatement* stat, const string& current_file_name, FuncInfo *current_func) @@ -175,7 +188,7 @@ static void populateDistributedIoArrays(map>& array auto var = stat->variant(); if (var != READ_STAT && var != PRINT_STAT && var != WRITE_STAT) - return; + return false; // check if such IO allowed in dvm: // list should consist only of single array and format string should be * @@ -185,22 +198,26 @@ static void populateDistributedIoArrays(map>& array SgExpression* ioList = stat->expr(0); if (!ioList) - return; + return false; if (ioList->variant() != EXPR_LIST) - return; + return false; if (ioList->rhs() == NULL) { SgExpression* arg = ioList->lhs(); if (!arg) - return; + return false; - if (!isArrayRef(arg)) - return; - - if (arg->lhs()) - need_replace = true; + if (hasArrayRef(arg)) + { + if (isArrayRef(arg) && arg->lhs()) + need_replace = true; + } + else + { + return false; + } } else { @@ -220,7 +237,6 @@ static void populateDistributedIoArrays(map>& array if (fmt->rhs()->variant() != KEYWORD_VAL || fmt->rhs()->sunparse() != "*") need_replace = true; - break; } case READ_STAT: @@ -261,7 +277,9 @@ static void populateDistributedIoArrays(map>& array } if (!need_replace) - return; + return false; + + bool ret = false; set found_arrays; @@ -280,10 +298,13 @@ static void populateDistributedIoArrays(map>& array if (inserted) __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"); + return ret; } 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_NODE, EXIT_STMT, - EXIT_NODE + EXIT_NODE, + GOTO_NODE }; if (border_stats.find(var) != border_stats.end()) return true; + if (stat->hasLabel()) + return true; + if (last_io_bound && last_io_bound->lastNodeOfStmt() && last_io_bound->lastNodeOfStmt() == stat) return true; @@ -644,18 +669,17 @@ void replaceDistributedArraysInIO(vector& regions, newDeclsToInclude, copied_syms); - // original declaration statement 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__); auto dynamic_array = checkAssumedShape(decl_stmt, array_name); while (decl_stmt && !isSgExecutableStatement(decl_stmt)) { - if (isSgDeclarationStatement(decl_stmt) && + if (isArrayDeclaration(decl_stmt) && decl_stmt->expr(0) && decl_stmt->expr(0)->lhs() && decl_stmt->expr(0)->lhs()->symbol() == copied_symbol.second) @@ -667,7 +691,7 @@ void replaceDistributedArraysInIO(vector& regions, } // created declaration statement - if (!decl_stmt || !isSgDeclarationStatement(decl_stmt)) + if (!decl_stmt || !isArrayDeclaration(decl_stmt)) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); // insert !$SPF ANALYSIS(PROCESS_PRIVATE(array)) directive before declaration statement @@ -833,7 +857,17 @@ void replaceDistributedArraysInIO(vector& 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(); } } diff --git a/src/Utils/version.h b/src/Utils/version.h index dce1888..6387e03 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2445" +#define VERSION_SPF "2446"