20 Commits

Author SHA1 Message Date
ALEXks
a0cea2df91 added new function for visualizer 2025-11-08 20:17:32 +03:00
ALEXks
4b7df86b8a version updated 2025-11-08 20:08:22 +03:00
836894fef1 Merge pull request 'private_arrays' (#68) from private_arrays into master 2025-11-08 17:07:07 +00:00
9ac15eec79 fix codestyle 2025-11-08 20:06:07 +03:00
03f565f50b add multifile support 2025-11-08 20:06:07 +03:00
47e2b961e2 Merge pull request 'replace_io_arrays' (#67) from replace_io_arrays into master 2025-10-01 18:13:01 +00:00
ALEXks
b95b336372 version updated 2025-10-01 21:12:49 +03:00
f35d7cb4bd REMOVE_DIST_ARRAYS_FROM_IO: consider write/read statements with nested loops 2025-10-01 19:48:34 +03:00
54615e34d4 REMOVE_DIST_ARRAYS_FROM_IO: use more general isSgVarListDeclStmt and isSgNestedVarListDeclStmt functions 2025-10-01 18:54:55 +03:00
8752f4a139 REMOVE_DIST_ARRAYS_FROM_IO: consider labels and goto statements while inserting copy statements 2025-10-01 18:54:55 +03:00
453105d273 REMOVE_DIST_ARRAYS_FROM_IO: consider array declarations from common blocks and dimension statements 2025-10-01 18:54:55 +03:00
cad0a0b217 Merge pull request 'cmake: set -O2 optimization level only if CMAKE_BUILD_TYPE is not specified' (#66) from cmake_linux_opt_level into master 2025-09-25 18:13:00 +00:00
9c0fd40e7b cmake: change default optimization level to O3 2025-09-25 20:49:11 +03:00
c7a31c8bbb cmake: set -O2 optimization level only if CMAKE_BUILD_TYPE is not specified 2025-09-25 13:44:10 +03:00
ALEXks
9900929349 refactored 2025-09-23 08:21:05 +03:00
ALEXks
e1ba299159 cleanup 2025-09-21 08:47:42 +03:00
ALEXks
8de18d1788 added json to global results 2025-09-18 21:09:43 +03:00
06aabdbee6 Merge pull request 'REMOVE_DIST_ARRAYS_FROM_IO Handle assumed-size and assumed-shape arrays' (#64) from replace_io_arrays into master 2025-09-16 05:23:30 +00:00
ALEXks
c6f290bb56 trivial, version updated 2025-09-16 08:22:53 +03:00
49d3b9b96e REMOVE_DIST_ARRAYS_FROM_IO: revert hotfix for issue with generated intent statements 2025-09-15 21:25:57 +03:00
19 changed files with 387 additions and 507 deletions

View File

@@ -487,7 +487,7 @@ source_group (Predictor\\Library FILES ${LIBPREDICTOR})
source_group (Parser FILES ${PARSER}) source_group (Parser FILES ${PARSER})
source_group (PPPA\\PPPA FILES ${PPPA}) source_group (PPPA\\PPPA FILES ${PPPA})
source_group (PPPA\\ZLib FILES ${ZLIB}) source_group (PPPA\\ZLib FILES ${ZLIB})
if (MSVC_IDE) if (MSVC_IDE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /Zc:__cplusplus") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /Zc:__cplusplus")
else() else()
@@ -496,7 +496,9 @@ else()
else() else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
endif()
endif() endif()
add_subdirectory(projects/Fdvm) add_subdirectory(projects/Fdvm)

View File

@@ -15,7 +15,7 @@
#include "SgUtils.h" #include "SgUtils.h"
#include "expr_transform.h" #include "expr_transform.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "shadow.h" #include "shadow.h"
#include "dvm.h" #include "dvm.h"

View File

@@ -14,7 +14,7 @@
#include "dvm.h" #include "dvm.h"
#include "graph_calls_func.h" #include "graph_calls_func.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "graph_loops_func.h" #include "graph_loops_func.h"
#include "../DirectiveProcessing/directive_parser.h" #include "../DirectiveProcessing/directive_parser.h"
#include "SgUtils.h" #include "SgUtils.h"

View File

@@ -22,7 +22,7 @@
#include "graph_loops_func.h" #include "graph_loops_func.h"
#include "expr_transform.h" #include "expr_transform.h"
#include "../LoopAnalyzer/loop_analyzer.h" #include "../LoopAnalyzer/loop_analyzer.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "json.hpp" #include "json.hpp"

View File

@@ -12,7 +12,7 @@
#include "graph_calls.h" #include "graph_calls.h"
#include "private_analyzer.h" #include "private_analyzer.h"
#include "dvm.h" #include "dvm.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
using std::vector; using std::vector;

View File

@@ -11,11 +11,11 @@
#include "region.h" #include "region.h"
#include "SgUtils.h" #include "SgUtils.h"
#include "graph_loops.h" #include "graph_loops.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
using namespace std; using namespace std;
void Collapse(Region* region) static void Collapse(Region* region)
{ {
if (region->getBasickBlocks().empty()) if (region->getBasickBlocks().empty())
return; return;
@@ -124,16 +124,30 @@ static void SolveDataFlow(Region* DFG)
map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR) map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR)
{ {
map<LoopGraph*, ArrayAccessingIndexes> result; map<LoopGraph*, ArrayAccessingIndexes> result;
for (const auto& [loopName, loops] : loopGraph) for (const auto& [fileName, loops] : loopGraph)
{ {
SgFile::switchToFile(fileName);
for (const auto& loop : loops) for (const auto& loop : loops)
{ {
SgStatement* search_func = loop->loop->GetOriginal();
while (search_func && (!isSgProgHedrStmt(search_func)))
search_func = search_func->controlParent();
for (const auto& [funcInfo, blocks]: FullIR) for (const auto& [funcInfo, blocks]: FullIR)
{ {
Region* loopRegion = new Region(loop, blocks); if (funcInfo->fileName == fileName && funcInfo->funcPointer->GetOriginal() == search_func)
SolveDataFlow(loopRegion); {
result[loop] = loopRegion->array_priv; Region* loopRegion = new Region(loop, blocks);
delete(loopRegion); if (loopRegion->getBasickBlocks().size() <= 1)
{
delete(loopRegion);
continue;
}
SolveDataFlow(loopRegion);
result[loop] = loopRegion->array_priv;
delete(loopRegion);
}
} }
} }
} }

View File

@@ -5,10 +5,8 @@
#include <unordered_set> #include <unordered_set>
#include "range_structures.h" #include "range_structures.h"
#include "region.h"
#include "graph_loops.h" #include "graph_loops.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
void Collapse(Region* region);
std::map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR); std::map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR);
std::pair<SAPFOR::BasicBlock*, std::unordered_set<SAPFOR::BasicBlock*>> GetBasicBlocksForLoop(const LoopGraph* loop, const std::vector<SAPFOR::BasicBlock*> blocks); std::pair<SAPFOR::BasicBlock*, std::unordered_set<SAPFOR::BasicBlock*>> GetBasicBlocksForLoop(const LoopGraph* loop, const std::vector<SAPFOR::BasicBlock*> blocks);

View File

@@ -6,7 +6,7 @@
#include <string> #include <string>
#include "graph_loops.h" #include "graph_loops.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
class Region : public SAPFOR::BasicBlock { class Region : public SAPFOR::BasicBlock {
public: public:

View File

@@ -1019,8 +1019,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
if(func->funcPointer->variant() != ENTRY_STAT) if(func->funcPointer->variant() != ENTRY_STAT)
countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks);
} }
else if (curr_regime == FIND_PRIVATE_ARRAYS)
FindPrivateArrays(loopGraph, fullIR);
else if (curr_regime == TEST_PASS) else if (curr_regime == TEST_PASS)
{ {
//test pass //test pass
@@ -1916,6 +1914,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
} }
else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS) else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS)
transformAssumedSizeParameters(allFuncInfo); transformAssumedSizeParameters(allFuncInfo);
else if (curr_regime == FIND_PRIVATE_ARRAYS)
auto result = FindPrivateArrays(loopGraph, fullIR);
const float elapsed = duration_cast<milliseconds>(high_resolution_clock::now() - timeForPass).count() / 1000.; const float elapsed = duration_cast<milliseconds>(high_resolution_clock::now() - timeForPass).count() / 1000.;
const float elapsedGlobal = duration_cast<milliseconds>(high_resolution_clock::now() - globalTime).count() / 1000.; const float elapsedGlobal = duration_cast<milliseconds>(high_resolution_clock::now() - globalTime).count() / 1000.;

View File

@@ -6,7 +6,7 @@
#include <set> #include <set>
#include <algorithm> #include <algorithm>
#include "../../CFGraph/CFGraph.h" #include "../CFGraph/CFGraph.h"
using std::map; using std::map;
using std::string; using std::string;

View File

@@ -4,10 +4,10 @@
#include<vector> #include<vector>
#include "SgUtils.h" #include "SgUtils.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "../CFGraph/live_variable_analysis.h" #include "CFGraph/live_variable_analysis.h"
#include "../CFGraph/DataFlow/data_flow.h" #include "CFGraph/DataFlow/data_flow.h"
#include "../CFGraph/DataFlow/backward_data_flow.h" #include "CFGraph/DataFlow/backward_data_flow.h"
int removeDeadCode(SgStatement* func, int removeDeadCode(SgStatement* func,
const std::map<std::string, std::vector<FuncInfo*>>&allFuncs, const std::map<std::string, std::vector<FuncInfo*>>&allFuncs,

View File

@@ -6,7 +6,7 @@
#include "../LoopAnalyzer/loop_analyzer.h" #include "../LoopAnalyzer/loop_analyzer.h"
#include "expr_transform.h" #include "expr_transform.h"
#include "errors.h" #include "errors.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "../SageAnalysisTool/OmegaForSage/include/lang-interf.h" #include "../SageAnalysisTool/OmegaForSage/include/lang-interf.h"
#include "../DirectiveProcessing/directive_parser.h" #include "../DirectiveProcessing/directive_parser.h"
#include "../DirectiveProcessing/directive_omp_parser.h" #include "../DirectiveProcessing/directive_omp_parser.h"

View File

@@ -2,8 +2,8 @@
#include "dvm.h" #include "dvm.h"
#include "../DirectiveProcessing/directive_parser.h" #include "../DirectiveProcessing/directive_parser.h"
#include "../CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "../CFGraph/RD_subst.h" #include "CFGraph/RD_subst.h"
// Regime defines the regime of private removing // Regime defines the regime of private removing
enum class Regime { DEFLT = 1, REGULAR_INDEXES }; enum class Regime { DEFLT = 1, REGULAR_INDEXES };

View File

@@ -17,17 +17,17 @@ using std::pair;
#define DEBUG_TRACE 0 #define DEBUG_TRACE 0
static SgStatement* getDeclStatement(int line_num) static bool hasArrayRef(SgExpression* ex)
{ {
PTR_BFND node = current_file->firstStatement()->thebif; if (ex)
for (; node; node = node->thread) return isArrayRef(ex) || hasArrayRef(ex->lhs()) || hasArrayRef(ex->rhs());
{
SgStatement *st = BfndMapping(node);
if (st->lineNumber() == line_num && isSgDeclarationStatement(st))
return st;
}
return NULL; 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)
@@ -49,10 +49,10 @@ static SgExpression* findExprWithVariant(SgExpression* exp, int variant)
return NULL; return NULL;
} }
bool switchToDeclarationFile(DIST::Array* array_p, static bool switchToDeclarationFile(DIST::Array* array_p,
pair<string, int>& decl_place, pair<string, int>& decl_place,
const string &current_file_name, const string &current_file_name,
FuncInfo *current_func) FuncInfo *current_func)
{ {
if (!array_p) if (!array_p)
return false; return false;
@@ -134,10 +134,8 @@ static bool checkAssumedSize(const string &array_name, DIST::Array* array_p, con
if (!switchToDeclarationFile(array_p, decl_place, current_file_name, current_func)) if (!switchToDeclarationFile(array_p, decl_place, current_file_name, current_func))
return true; return true;
auto *st = getDeclStatement(decl_place.second); auto *st = SgStatement::getStatementByFileAndLine(decl_place.first, decl_place.second);
checkNull(st, convertFileName(__FILE__).c_str(), __LINE__);
if (!st)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
SgExpression* list = st->expr(0); SgExpression* list = st->expr(0);
while (list) while (list)
@@ -182,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)
@@ -190,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 *
@@ -200,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
{ {
@@ -235,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:
@@ -268,6 +269,7 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
spec = spec->rhs(); spec = spec->rhs();
} }
} }
break;
} }
default: default:
break; break;
@@ -275,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;
@@ -288,17 +292,19 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
DIST::Array* array_p = getArrayFromDeclarated(declaratedInStmt(by_symb), array_name); DIST::Array* array_p = getArrayFromDeclarated(declaratedInStmt(by_symb), array_name);
if (array_p && if (array_p &&
array_p->GetDistributeFlagVal() == Distribution::distFlag::IO_PRIV && array_p->GetDistributeFlagVal() == Distribution::distFlag::IO_PRIV &&
!checkAssumedSize(array_name, array_p, current_file_name, current_func) !checkAssumedSize(array_name, array_p, current_file_name, current_func))
)
{ {
auto inserted = arrays[by_symb].insert(stat).second; auto inserted = arrays[by_symb].insert(stat).second;
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)
@@ -392,6 +398,7 @@ static void copyArrayBetweenStatements(SgSymbol* replace_symb,
auto* parent = start_is_scope ? start : start->controlParent(); auto* parent = start_is_scope ? start : start->controlParent();
if (parent && parent->lastNodeOfStmt() == start) if (parent && parent->lastNodeOfStmt() == start)
parent = parent->controlParent(); parent = parent->controlParent();
checkNull(parent, convertFileName(__FILE__).c_str(), __LINE__);
start->insertStmtAfter(*assign, *parent); start->insertStmtAfter(*assign, *parent);
} }
@@ -515,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;
@@ -553,13 +564,10 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
auto func_info_it = allFuncInfo.find(current_file_name); auto func_info_it = allFuncInfo.find(current_file_name);
if (func_info_it == allFuncInfo.end()) if (func_info_it == allFuncInfo.end())
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
auto *lbound_symb = new SgSymbol(PROCEDURE_NAME, "lbound"); auto *lbound_symb = new SgSymbol(FUNCTION_NAME, "lbound");
auto *ubound_symb = new SgSymbol(PROCEDURE_NAME, "ubound"); auto *ubound_symb = new SgSymbol(FUNCTION_NAME, "ubound");
for (auto& lines : lines_by_file.second) for (auto& lines : lines_by_file.second)
{ {
@@ -607,10 +615,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
} }
if (!current_func_info) if (!current_func_info)
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
curr_stmt = curr_stmt->lexNext(); curr_stmt = curr_stmt->lexNext();
while (curr_stmt && !isSgExecutableStatement(curr_stmt)) while (curr_stmt && !isSgExecutableStatement(curr_stmt))
@@ -664,17 +669,17 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
newDeclsToInclude, newDeclsToInclude,
copied_syms); copied_syms);
// original declaration statement // original declaration statement
auto* decl_stmt = getDeclStatement(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)
@@ -686,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
@@ -852,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();
} }
} }

View File

@@ -390,32 +390,15 @@ void clearGlobalBuffer() { globalOutputBuffer = ""; }
const string& getGlobalBuffer() { return globalOutputBuffer; } const string& getGlobalBuffer() { return globalOutputBuffer; }
set<short*> allocated; set<short*> allocated;
set<int*> allocatedInt;
static void convertGlobalBuffer(short *&result, int *&resultSize)
{
const unsigned len = (unsigned)globalOutputBuffer.size();
result = new short[len + 1];
allocated.insert(result);
result[len] = '\0';
for (unsigned i = 0; i < len; ++i)
result[i] = globalOutputBuffer[i];
resultSize = new int[1];
resultSize[0] = (int)len;
}
extern map<string, vector<Messages>> SPF_messages; //file ->messages extern map<string, vector<Messages>> SPF_messages; //file ->messages
void clearGlobalMessagesBuffer() void clearGlobalMessagesBuffer()
{ {
//clear allocated memory //clear allocated memory
for (auto& elem : allocated) for (auto& elem : allocated)
delete[]elem; delete []elem;
for (auto& elem : allocatedInt)
delete[]elem;
allocated.clear(); allocated.clear();
allocatedInt.clear();
SPF_messages.clear(); SPF_messages.clear();
} }
@@ -451,7 +434,7 @@ static map<string, vector<Messages>> removeCopies(map<string, vector<Messages>>
return out; return out;
} }
static void convertGlobalMessagesBuffer(short *&result, int *&resultSize) static string convertGlobalMessagesBuffer()
{ {
auto copySPF_messages = removeCopies(SPF_messages); auto copySPF_messages = removeCopies(SPF_messages);
for (auto &byFile : copySPF_messages) for (auto &byFile : copySPF_messages)
@@ -489,21 +472,13 @@ static void convertGlobalMessagesBuffer(short *&result, int *&resultSize)
json all; json all;
all["allMessages"] = allMessages; all["allMessages"] = allMessages;
const string str = all.dump(); return all.dump();
const unsigned len = (unsigned)str.size();
copyStringToShort(result, str);
allocated.insert(result);
resultSize = new int[1];
resultSize[0] = (int)len;
} }
void convertBuffers(string &resultM, string &result)
void convertBuffers(short*& resultM, int*& resultSizeM, short*& result, int*& resultSize)
{ {
convertGlobalMessagesBuffer(resultM, resultSizeM); resultM = convertGlobalMessagesBuffer();
convertGlobalBuffer(result, resultSize); result = getGlobalBuffer();
} }
bool isSPF_comment(const string &bufStr) bool isSPF_comment(const string &bufStr)

View File

@@ -33,7 +33,7 @@ void addToGlobalBufferAndPrint(const std::string &toPrint);
void clearGlobalBuffer(); void clearGlobalBuffer();
const std::string& getGlobalBuffer(); const std::string& getGlobalBuffer();
std::wstring to_wstring(const std::string); std::wstring to_wstring(const std::string);
void convertBuffers(short*& resultM, int*& resultSizeM, short*& result, int*& resultSize); void convertBuffers(std::string& resultM, std::string& result);
void clearGlobalMessagesBuffer(); void clearGlobalMessagesBuffer();
std::string renameInclude(const std::string& inc); std::string renameInclude(const std::string& inc);
void copyIncludes(const std::set<std::string> &allIncludeFiles, const std::map<std::string, std::map<int, std::set<std::string>>> &commentsToInclude, const std::map<std::string, std::map<int, std::set<std::string>>>& newCopyDeclToIncl, const char *folderName, bool keepSpfDirs, bool isFreeStyle, bool isRename, int removeDirs = 0); void copyIncludes(const std::set<std::string> &allIncludeFiles, const std::map<std::string, std::map<int, std::set<std::string>>> &commentsToInclude, const std::map<std::string, std::map<int, std::set<std::string>>>& newCopyDeclToIncl, const char *folderName, bool keepSpfDirs, bool isFreeStyle, bool isRename, int removeDirs = 0);

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2443" #define VERSION_SPF "2447"

File diff suppressed because it is too large Load Diff