From 1d82af702e6f5d7e32419ccc4520ee4acdd1fae8 Mon Sep 17 00:00:00 2001 From: Grigorii Gusev Date: Sat, 16 Mar 2024 00:10:28 +0300 Subject: [PATCH] private_removing: add dead code removing --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 15 +- .../_src/Transformations/private_removing.cpp | 159 +++++++++--------- .../_src/Transformations/private_removing.h | 5 +- .../Sapfor_2017/_src/Utils/PassManager.h | 2 +- 4 files changed, 92 insertions(+), 89 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index d3f76e8..d15c7f8 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1106,11 +1106,13 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { auto itFound = loopGraph.find(file->filename()); if (itFound != loopGraph.end()) - removePrivatesAnalysis(itFound->second, getObjectForFileFromMap(file_name, SPF_messages), usersDirectives, commonBlocks, allFuncInfo); + removePrivatesAnalysis(file_name, itFound->second, getObjectForFileFromMap(file_name, SPF_messages), + usersDirectives, commonBlocks, allFuncInfo); } else if (curr_regime == PRIVATE_REMOVING) { - removePrivates(file, getObjectForFileFromMap(file_name, SPF_messages), commonBlocks, allFuncInfo, countOfTransform); + removePrivates(file_name, getObjectForFileFromMap(file_name, SPF_messages), + commonBlocks, allFuncInfo, countOfTransform); } else if (curr_regime == CREATE_INTER_TREE) { @@ -2498,15 +2500,8 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam case REMOVE_OMP_DIRS_TRANSFORM: case REMOVE_COMMENTS: case INSERT_NO_DISTR_FLAGS_FROM_GUI: - runAnalysis(*project, curr_regime, true, "", folderName); - break; case PRIVATE_REMOVING: - runAnalysis(*project, curr_regime, false, "", folderName); - runPass(REVERT_SUBST_EXPR_RD, proj_name, folderName); - if (folderName) - runAnalysis(*project, UNPARSE_FILE, true, "", folderName); - else - __spf_print(1, "can not run UNPARSE_FILE - folder name is null\n"); + runAnalysis(*project, curr_regime, true, "", folderName); break; case INLINE_PROCEDURES: runAnalysis(*project, curr_regime, false); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index fe12532..eef5fca 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -599,38 +599,39 @@ static bool isVarChangedBetween(string var, SgStatement* first, SgStatement* sec return false; } +// TODO: remove if needless // removeDeadCodeFromLoop removes assign statements to private scalar vars which are not read in loop -static void removeDeadCodeFromLoop(LoopGraph* loop) -{ - SgForStmt* loopStmt = (SgForStmt*) loop->loop->GetOriginal(); - set privateVars; - for (auto data : getAttributes(loopStmt, set{ SPF_ANALYSIS_DIR })) - fillPrivatesFromComment(new Statement(data), privateVars); - - set privates; - for (Symbol* symbol : privateVars) - privates.insert(OriginalSymbol((SgSymbol*)symbol)->identifier()); - - vector stmtsToDelete; - for (SgStatement* st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt(); st = st->lexNext()) - { - if (st->variant() != ASSIGN_STAT) - continue; - - SgSymbol* var = st->expr(0)->symbol(); - if (var == nullptr || var->variant() != VARIABLE_NAME) - continue; - - if (privates.find(var->identifier()) != privates.end() && !isVarReadInLoop(var, loopStmt)) - stmtsToDelete.push_back(st); - } - - for (auto stmt : stmtsToDelete) - stmt->deleteStmt(); - - for (auto childLoop : loop->children) - removeDeadCodeFromLoop(childLoop); -} +//static void removeDeadCodeFromLoop(LoopGraph* loop) +//{ +// SgForStmt* loopStmt = (SgForStmt*) loop->loop->GetOriginal(); +// set privateVars; +// for (auto data : getAttributes(loopStmt, set{ SPF_ANALYSIS_DIR })) +// fillPrivatesFromComment(new Statement(data), privateVars); +// +// set privates; +// for (Symbol* symbol : privateVars) +// privates.insert(OriginalSymbol((SgSymbol*)symbol)->identifier()); +// +// vector stmtsToDelete; +// for (SgStatement* st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt(); st = st->lexNext()) +// { +// if (st->variant() != ASSIGN_STAT) +// continue; +// +// SgSymbol* var = st->expr(0)->symbol(); +// if (var == nullptr || var->variant() != VARIABLE_NAME) +// continue; +// +// if (privates.find(var->identifier()) != privates.end() && !isVarReadInLoop(var, loopStmt)) +// stmtsToDelete.push_back(st); +// } +// +// for (auto stmt : stmtsToDelete) +// stmt->deleteStmt(); +// +// for (auto childLoop : loop->children) +// removeDeadCodeFromLoop(childLoop); +//} // fillReadShortFixedSumscripts fills all short fixed subscripts vectors of array var, // which are used for reading from array var in exp @@ -697,30 +698,31 @@ static void removeExcessiveDefs(const PrivateToRemove& var) st->deleteStmt(); } +// TODO: remove is needless // removeEmptyLoops removes loops with empty body and create messages -static void removeEmptyLoops(LoopGraph* loop, vector& messages) -{ - vector loopsToDelete; - vector newChildrenVector; - for (auto childLoop : loop->children) - { - SgStatement* loopStmt = childLoop->loop->GetOriginal(); - if (loopStmt->lastNodeOfStmt() == loopStmt->lexNext()) - loopsToDelete.push_back(childLoop); - else - newChildrenVector.push_back(childLoop); - } - - for (auto loopToDelete : loopsToDelete) - { - addMessageRemoveLoop(messages, loopToDelete->lineNum); - loopToDelete->loop->extractStmt(); - } - - loop->children.swap(newChildrenVector); - for (auto childLoop : loop->children) - removeEmptyLoops(childLoop, messages); -} +//static void removeEmptyLoops(LoopGraph* loop, vector& messages) +//{ +// vector loopsToDelete; +// vector newChildrenVector; +// for (auto childLoop : loop->children) +// { +// SgStatement* loopStmt = childLoop->loop->GetOriginal(); +// if (loopStmt->lastNodeOfStmt() == loopStmt->lexNext()) +// loopsToDelete.push_back(childLoop); +// else +// newChildrenVector.push_back(childLoop); +// } +// +// for (auto loopToDelete : loopsToDelete) +// { +// addMessageRemoveLoop(messages, loopToDelete->lineNum); +// loopToDelete->loop->extractStmt(); +// } +// +// loop->children.swap(newChildrenVector); +// for (auto childLoop : loop->children) +// removeEmptyLoops(childLoop, messages); +//} // removeVarFromPrivateAttributes removes var from SPF ANALYSIS PRIVATE attributes of loop static void removeVarFromPrivateAttributes(SgSymbol* var, LoopGraph* loop) @@ -820,39 +822,35 @@ static set> removeArray(string filename, const PrivateToRemove& arra SgExpression* substExp = substituteExpressions(useStmt->expr(i), refToExpMap); useStmt->setExpression(i, *substExp); - - // don't revert substitutions in useStmt: - cancelRevertionForStatement(filename, useStmt, i); } } return removedFixedSubscripts; } -void removePrivates(SgFile* file, vector& messages, +void removePrivates(string filename, vector& messages, const map& commonBlocks, const map>& allFuncInfo, int& countOfTransform) { for (auto& varToRemove : privatesToRemoveGlobal) { - if (string(file->filename()) != varToRemove.loop->fileName) + if (filename != varToRemove.loop->fileName) continue; - auto removedDimensions = removeArray(file->filename(), varToRemove); + auto removedDimensions = removeArray(filename, varToRemove); countOfTransform++; - //removeDeadCodeFromLoop(varToRemove.loop); // TODO: problem with reverting substitution + //removeDeadCodeFromLoop(varToRemove.loop); removeExcessiveDefs(varToRemove); - removeEmptyLoops(varToRemove.loop, messages); // removing is made by REMOVE_DEAD_CODE pass + //removeEmptyLoops(varToRemove.loop, messages); SgForStmt* loopStmt = (SgForStmt*)varToRemove.loop->loop->GetOriginal(); FuncInfo* currFunc = getCurrectFunc(loopStmt, allFuncInfo); if (currFunc == nullptr) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - // TODO: problem with removing dead code before reverting substitution - //removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks); + removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks); vector varRefs = getDirectArrayRefs(loopStmt, varToRemove.varSymbol); int loopLineNum = varToRemove.loop->lineNum; @@ -904,6 +902,7 @@ struct Context { const map>& allFuncInfo; const map& commonBlocks; vector& messages; + string filename; Regime regime; LoopGraph* loop; @@ -2083,9 +2082,19 @@ void removePrivateAnalyze(Context *ctx) { vector resultDefUsePairs; for (auto& pair : defUseStmtsPairs) + { if (checkDefUsePair(ctx, pair, CFG_ForFunc)) + { resultDefUsePairs.push_back(pair); + // don't revert substitutions in use and def stmts: + cancelRevertionForStatement(ctx->filename, pair.first, 1); + cancelRevertionForStatement(ctx->filename, pair.second, 0); + cancelRevertionForStatement(ctx->filename, pair.second, 1); + cancelRevertionForStatement(ctx->filename, pair.second, 2); + } + } + PrivateToRemove newPrivateToRemove; newPrivateToRemove.loop = ctx->loop; newPrivateToRemove.varSymbol = ctx->arraySymbol; @@ -2104,7 +2113,8 @@ void removePrivateAnalyze(Context *ctx) deleteCFG(CFG_ForFunc); } -void removePrivatesAnalysis(vector& loopGraphs, +void removePrivatesAnalysis(string filename, + vector& loopGraphs, vector& messages, const UsersDirectives& usersDirectives, const map& commonBlocks, @@ -2151,7 +2161,7 @@ void removePrivatesAnalysis(vector& loopGraphs, if (arrayToRemove == nullptr) // no array to remove break; - Context context = Context{allFuncInfo, commonBlocks, messages}; + Context context = Context{allFuncInfo, commonBlocks, messages, filename}; context.regime = Regime::DEFLT; context.loop = loop; context.loopStmt = loopStmt; @@ -2173,20 +2183,17 @@ void removePrivatesAnalysis(vector& loopGraphs, { removePrivateAnalyze(&context); } - else + else if (checkRegularIndexRefs(&context)) { - if (checkRegularIndexRefs(&context)) - { - context.regime = Regime::REGULAR_INDEXES; - context.fixedDimensionsMask = vector{}; - removePrivateAnalyze(&context); - } - else - addMessageDoesNotMatchMask(messages, context.arraySymbol->identifier(), context.loop->lineNum); + context.regime = Regime::REGULAR_INDEXES; + context.fixedDimensionsMask = vector{}; + removePrivateAnalyze(&context); } + else + addMessageDoesNotMatchMask(messages, context.arraySymbol->identifier(), context.loop->lineNum); } } for (LoopGraph* loop : loopGraphs) - removePrivatesAnalysis(loop->children, messages, usersDirectives, commonBlocks, allFuncInfo); + removePrivatesAnalysis(filename, loop->children, messages, usersDirectives, commonBlocks, allFuncInfo); } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.h b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.h index 63fe5c3..e29ec4b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.h @@ -22,7 +22,7 @@ struct PrivateToRemove { // removePrivates removes all privates from vector privatesToRemoveGloval // and add info messages -void removePrivates(SgFile* file, std::vector& messages, +void removePrivates(std::string filename, std::vector& messages, const std::map& commonBlocks, const std::map>& allFuncInfo, int& countOfTransform); @@ -30,7 +30,8 @@ void removePrivates(SgFile* file, std::vector& messages, // removePrivatesAnalysis checks all private variables in loopGraphs specified by usersDirectives // if they can be removed, and adds those that can to vector privatesToRemoveGloval. // if private var cannot be removed, the error message is returned with vector messages -void removePrivatesAnalysis(std::vector& loopGraphs, +void removePrivatesAnalysis(std::string filename, + std::vector& loopGraphs, std::vector& messages, const std::map, std::set>& usersDirectives, const std::map& commonBlocks, diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index 9c63fb1..feff4fd 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -212,7 +212,7 @@ void InitPassesDependencies(map> &passDepsIn, set Pass(BUILD_IR) <= Pass(SUBST_EXPR_RD) <= Pass(SUBST_EXPR_RD_AND_UNPARSE); - list({ LOOP_ANALYZER_DATA_DIST_S1, SUBST_EXPR_RD } ) <= Pass(PRIVATE_REMOVING_ANALYSIS) <= Pass(PRIVATE_REMOVING); + list({ LOOP_ANALYZER_DATA_DIST_S1, SUBST_EXPR_RD } ) <= Pass(PRIVATE_REMOVING_ANALYSIS) <= Pass(REVERT_SUBST_EXPR_RD) <= Pass(PRIVATE_REMOVING); Pass(RESTORE_LOOP_FROM_ASSIGN) <= list({ SUBST_EXPR_AND_UNPARSE, SUBST_EXPR_RD_AND_UNPARSE });