Files
SAPFOR/src/Utils/PassManager.h

341 lines
15 KiB
C
Raw Normal View History

2023-09-14 19:43:13 +03:00
#pragma once
#include <map>
#include <set>
#include <vector>
#include "../Sapfor.h"
using std::vector;
using std::map;
using std::set;
#define list vector<Pass>
static map<passes, vector<passes>> *passDeps;
2023-09-20 20:51:11 +03:00
static map<passes, set<passes>> passRemovals;
2023-09-14 19:43:13 +03:00
class Pass
{
private:
passes name;
public:
const Pass& operator<=(const Pass &right) const
{
if ((*passDeps).find(right.name) == (*passDeps).end())
(*passDeps)[right.name] = vector<passes>();
(*passDeps)[right.name].push_back(this->name);
return right;
}
Pass& operator<=(Pass &right) const
{
if ((*passDeps).find(right.name) == (*passDeps).end())
(*passDeps)[right.name] = vector<passes>();
(*passDeps)[right.name].push_back(this->name);
return right;
}
const list& operator<=(const list &right_vec) const
{
for (int i = 0; i < right_vec.size(); ++i)
{
if ((*passDeps).find(right_vec[i].name) == (*passDeps).end())
(*passDeps)[right_vec[i].name] = vector<passes>();
(*passDeps)[right_vec[i].name].push_back(this->name);
}
return right_vec;
}
friend const Pass& operator<=(const list &left_vec, const Pass &right)
{
if ((*passDeps).find(right.name) == (*passDeps).end())
(*passDeps)[right.name] = vector<passes>();
for (int i = 0; i < left_vec.size(); ++i)
(*passDeps)[right.name].push_back(left_vec[i].name);
return right;
}
2023-09-21 18:10:40 +03:00
friend const list& operator<=(const list &left_vec, const list &right_vec)
2023-09-14 19:43:13 +03:00
{
for (int k = 0; k < right_vec.size(); ++k)
{
if ((*passDeps).find(right_vec[k].name) == (*passDeps).end())
(*passDeps)[right_vec[k].name] = vector<passes>();
for (int i = 0; i < left_vec.size(); ++i)
(*passDeps)[right_vec[k].name].push_back(left_vec[i].name);
}
return right_vec;
}
friend void operator-=(const list& left_vec, const list& right_vec)
{
/* erase each pass in right_vec from dependency tree for each pass in left_vec */
2023-09-20 20:51:11 +03:00
for(const auto& left : left_vec)
{
auto& eraseFrom = passRemovals[left.name];
2023-09-20 20:51:11 +03:00
for(const auto& right : right_vec)
eraseFrom.insert(right.name);
}
}
friend void operator-=(const list& left_vec, const Pass& right)
{
left_vec -= list({right});
}
void operator-=(const list& right_vec) const
{
list({ *this }) -= right_vec;
}
void operator-=(const Pass& right) const
{
list({ *this }) -= list({ right });
}
2023-09-26 22:13:21 +03:00
void applyRemovals()
{
2023-09-26 20:48:41 +03:00
map<passes, set<passes>> to_process, processed;
to_process[name] = {};
2023-09-20 20:51:11 +03:00
while (!to_process.empty())
{
2023-09-26 20:48:41 +03:00
map<passes, set<passes>> to_process_next;
2023-09-20 20:51:11 +03:00
2023-09-26 22:13:21 +03:00
for (const auto& pass : to_process)
{
2023-09-26 20:48:41 +03:00
auto processed_it = processed.find(pass.first);
auto& done_removals = processed_it != processed.end() ? processed_it->second : processed[pass.first];
set<passes> removals_to_do;
bool process_pass = false;
2023-09-26 22:13:21 +03:00
if (processed_it == processed.end())
{
2023-09-26 20:48:41 +03:00
removals_to_do = done_removals = pass.second;
process_pass = true;
}
2023-09-26 22:13:21 +03:00
else
{
2023-09-26 20:48:41 +03:00
const auto& needed_removals = pass.second;
set_difference(needed_removals.begin(), needed_removals.end(), done_removals.begin(), done_removals.end(),
inserter(removals_to_do, removals_to_do.begin()));
process_pass = needed_removals.size() != 0;
done_removals.insert(removals_to_do.begin(), removals_to_do.end());
}
2023-09-26 22:13:21 +03:00
if (process_pass)
{
2023-09-26 20:48:41 +03:00
processed[pass.first] = pass.second;
auto removals_it = passRemovals.find(pass.first);
2023-09-26 22:13:21 +03:00
if (removals_it != passRemovals.end())
{
2023-09-26 20:48:41 +03:00
auto& removals_saved = removals_it->second;
set<passes> add;
set_difference(removals_saved.begin(), removals_saved.end(), done_removals.begin(), done_removals.end(),
inserter(add, add.begin()));
done_removals.insert(add.begin(), add.end());
removals_to_do.insert(add.begin(), add.end());
}
2023-09-20 20:51:11 +03:00
2023-09-26 20:48:41 +03:00
auto deps_it = passDeps->find(pass.first);
2023-09-26 22:13:21 +03:00
if (deps_it != passDeps->end())
{
2023-09-20 20:51:11 +03:00
auto& deps = deps_it->second;
2023-09-26 20:48:41 +03:00
2023-09-26 22:13:21 +03:00
for (auto dep_it = deps.begin(); dep_it != deps.end();)
{
2023-09-26 20:48:41 +03:00
if (removals_to_do.find(*dep_it) == removals_to_do.end())
to_process_next[*(dep_it++)].insert(removals_to_do.begin(), removals_to_do.end());
2023-09-20 20:51:11 +03:00
else
dep_it = deps.erase(dep_it);
}
}
}
}
to_process = to_process_next;
}
}
2023-09-14 19:43:13 +03:00
Pass(passes name) : name(name) { }
};
static void depsToGraphViz(const map<passes, vector<passes>> &passDepsIn)
{
FILE *file = fopen("pass_tree.txt", "w");
if (!file)
printf("ERROR in creating 'pass_tree.txt' file\n");
else
{
fprintf(file, "digraph G {");
for (auto it = passDepsIn.begin(); it != passDepsIn.end(); ++it)
{
for (int k = 0; k < it->second.size(); ++k)
fprintf(file, "\"%s\" -> \"%s\";\n", passNames[it->first], passNames[it->second[k]]);
}
fprintf(file, "}\n");
fclose(file);
printf("write to 'pass_tree.txt' file complited\n");
}
}
void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes> &passesIgnoreStateDone, bool printTree = false)
{
2023-09-20 20:51:11 +03:00
passDepsIn.clear();
2023-09-14 19:43:13 +03:00
passDeps = &passDepsIn;
Pass(PREPROC_SPF) <= Pass(CREATE_INTER_TREE);
2023-09-21 18:10:40 +03:00
list({ CREATE_INTER_TREE, CORRECT_VAR_DECL }) <= list({ GCOV_PARSER, PREDICT_SCHEME, INSERT_INTER_TREE });
2023-09-14 19:43:13 +03:00
list({ FILE_LINE_INFO, BUILD_INCLUDE_DEPENDENCIES }) <= Pass(CORRECT_VAR_DECL);
Pass(DEF_USE_STAGE1) <= Pass(DEF_USE_STAGE2);
2023-09-21 18:10:40 +03:00
list({ VERIFY_DVM_DIRS, PRIVATE_CALL_GRAPH_STAGE1, PRIVATE_CALL_GRAPH_STAGE2, MACRO_EXPANSION, CONVERT_ASSIGN_TO_LOOP, DEF_USE_STAGE1, DEF_USE_STAGE2, FILL_PARALLEL_REG_IR, VERIFY_COMMON, FILL_COMMON_BLOCKS, CALL_GRAPH_IR }) <= list({ SUBST_EXPR, SUBST_EXPR_RD, BUILD_IR });
2023-09-14 19:43:13 +03:00
Pass(BUILD_IR) <= Pass(SUBST_EXPR) <= Pass(SUBST_EXPR_AND_UNPARSE);
Pass(BUILD_IR) <= Pass(SUBST_EXPR_RD) <= Pass(SUBST_EXPR_RD_AND_UNPARSE);
2024-03-17 18:49:59 +03:00
list({ LOOP_ANALYZER_DATA_DIST_S1, SUBST_EXPR_RD } ) <= Pass(PRIVATE_REMOVING_ANALYSIS);
list({ PRIVATE_REMOVING_ANALYSIS, REVERT_SUBST_EXPR_RD }) <= Pass(PRIVATE_REMOVING);
2023-09-14 19:43:13 +03:00
Pass(RESTORE_LOOP_FROM_ASSIGN) <= list({ SUBST_EXPR_AND_UNPARSE, SUBST_EXPR_RD_AND_UNPARSE });
2023-12-27 12:57:00 +03:00
Pass(GET_ALL_ARRAY_DECL) <= list({ CALL_GRAPH_IR, INSERT_NO_DISTR_FLAGS_FROM_GUI });
2023-09-14 19:43:13 +03:00
2023-09-21 18:10:40 +03:00
Pass(LOOP_GRAPH) <= Pass(PRIVATE_CALL_GRAPH_STAGE3) <= list(FIND_FUNC_TO_INCLUDE, PRIVATE_ANALYSIS_IR) <= list({ LOOP_ANALYZER_DATA_DIST_S0, LOOP_ANALYZER_DATA_DIST_S1, ONLY_ARRAY_GRAPH, LOOP_ANALYZER_ALIGNS });
Pass(PRIVATE_ANALYSIS_IR) <= Pass(LOOP_ANALYZER_NODIST);
2023-09-14 19:43:13 +03:00
2024-07-20 13:03:27 +03:00
Pass(CORRECT_VAR_DECL) <= list({ VERIFY_DVM_DIRS, VERIFY_OPERATORS, VERIFY_FORMAT, VERIFY_ENDDO, PREPROC_SPF, VERIFY_INCLUDES, PREPROC_ALLOCATES, CHECK_FUNC_TO_INCLUDE, FILL_PAR_REGIONS_LINES, CONVERT_ASSIGN_TO_LOOP, VERIFY_COMMON, VERIFY_EQUIVALENCE, PRINT_PAR_REGIONS_ERRORS }) <= Pass(CODE_CHECKER_PASSES);
2023-09-14 19:43:13 +03:00
2024-07-20 13:03:27 +03:00
list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_SPF, PREPROC_ALLOCATES, GET_ALL_ARRAY_DECL, GCOV_PARSER }) <= list({ CALL_GRAPH, MACRO_EXPANSION, DEF_USE_STAGE1 });
2023-09-14 19:43:13 +03:00
2024-07-20 13:03:27 +03:00
list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_INCLUDES, PREPROC_ALLOCATES, FILL_PARALLEL_REG_IR }) <= list({ GET_ALL_ARRAY_DECL, FILL_COMMON_BLOCKS, PARSE_OMP_DIRS }) <= Pass(PREPROC_SPF);
2023-09-14 19:43:13 +03:00
Pass(CHECK_PAR_REG_DIR) <= Pass(FILL_PARALLEL_REG_IR);
2024-07-19 21:10:43 +03:00
list({ CODE_CHECKER_PASSES, GET_ALL_ARRAY_DECL, CALL_GRAPH2, SUBST_EXPR_RD, ARRAY_ACCESS_ANALYSIS_FOR_CORNER }) <= list({ LOOP_ANALYZER_NODIST, LOOP_ANALYZER_DATA_DIST_S0, LOOP_ANALYZER_DATA_DIST_S1, ONLY_ARRAY_GRAPH });
2023-09-14 19:43:13 +03:00
2024-07-18 12:35:14 +03:00
list({ LOOP_ANALYZER_NODIST, REMOVE_OMP_DIRS }) <= Pass(INSERT_PARALLEL_DIRS_NODIST);
2023-09-14 19:43:13 +03:00
Pass(CHECK_ARGS_DECL) <= Pass(CREATE_TEMPLATE_LINKS);
Pass(LOOP_ANALYZER_DATA_DIST_S0) <= Pass(LOOP_ANALYZER_DATA_DIST_S1) <= Pass(LOOP_ANALYZER_DATA_DIST_S2) <= Pass(CREATE_TEMPLATE_LINKS) <= Pass(LOOP_ANALYZER_COMP_DIST);
2024-07-19 21:10:43 +03:00
list({ VERIFY_OPERATORS, VERIFY_ENDDO, VERIFY_FORMAT, SUBST_EXPR_RD, CONVERT_ASSIGN_TO_LOOP }) <= Pass(LOOP_GRAPH) <= Pass(CALL_GRAPH) <= Pass(CALL_GRAPH2);
2023-09-14 19:43:13 +03:00
Pass(MACRO_EXPANSION) <= Pass(CALL_GRAPH);
2024-03-18 14:49:04 +03:00
list({ PREPROC_SPF, PROCESS_IO, CALL_GRAPH2, CONVERT_SAVE_TO_MODULE, REVERT_SUBST_EXPR_RD }) <= Pass(CREATE_CHECKPOINTS);
2023-09-14 19:43:13 +03:00
Pass(FILL_PAR_REGIONS_LINES) <= Pass(VERIFY_EQUIVALENCE);
Pass(LOOP_ANALYZER_DATA_DIST_S2) <= Pass(CREATE_NESTED_LOOPS);
2023-09-21 18:10:40 +03:00
list({ CORRECT_VAR_DECL, PREPROC_SPF }) <= list({ LOOP_GRAPH, CALL_GRAPH, CALL_GRAPH2 });
2023-09-14 19:43:13 +03:00
2024-03-29 15:27:41 +03:00
list({ PREPROC_SPF, CALL_GRAPH2 }) <= Pass(FILL_PAR_REGIONS_LINES) <= list({ EXPAND_EXTRACT_PAR_REGION, CHECK_FUNC_TO_INCLUDE, FIND_FUNC_TO_INCLUDE, CHECK_ARGS_DECL });
2023-09-14 19:43:13 +03:00
list({ PREPROC_SPF, CALL_GRAPH2, FILL_PAR_REGIONS_LINES }) <= Pass(FILL_PAR_REGIONS) <= Pass(RESOLVE_PAR_REGIONS);
2024-03-18 14:49:04 +03:00
list({ REVERT_SUBST_EXPR_RD, CONVERT_LOOP_TO_ASSIGN }) <= Pass(RESOLVE_PAR_REGIONS);
2023-09-14 19:43:13 +03:00
list({ REVERT_SUBST_EXPR_RD, CONVERT_LOOP_TO_ASSIGN, FILL_PAR_REGIONS}) <= Pass(REMOVE_DIST_ARRAYS_FROM_IO);
2024-03-18 14:49:04 +03:00
Pass(REVERT_SUBST_EXPR_RD) <= Pass(EXPAND_EXTRACT_PAR_REGION);
2023-09-14 19:43:13 +03:00
Pass(FILL_PAR_REGIONS) <= Pass(PRINT_PAR_REGIONS_ERRORS);
list({ PREPROC_SPF, CORRECT_VAR_DECL }) <= Pass(FILL_PAR_REGIONS_LINES);
2023-10-31 20:39:33 +03:00
list({ LOOP_ANALYZER_COMP_DIST, REMOVE_OMP_DIRS }) <= list({ CREATE_DISTR_DIRS, CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS });
2023-09-14 19:43:13 +03:00
Pass(CALL_GRAPH2) <= list({ ONLY_ARRAY_GRAPH, CREATE_NESTED_LOOPS, FIND_FUNC_TO_INCLUDE, CHECK_FUNC_TO_INCLUDE, FIND_PARAMETERS, GET_STATS_FOR_PREDICTOR });
2023-09-14 19:43:13 +03:00
Pass(CALL_GRAPH2) <= list({ PURE_SAVE_TO_PARAMS, PURE_MODULE_TO_PARAMS, PURE_COMMON_TO_PARAMS, PURE_INTENT_INSERT });
2024-03-18 14:49:04 +03:00
Pass(REVERT_SUBST_EXPR_RD) <= list({ PURE_SAVE_TO_PARAMS, PURE_MODULE_TO_PARAMS, PURE_COMMON_TO_PARAMS, PURE_INTENT_INSERT });
2023-09-14 19:43:13 +03:00
2025-03-18 09:37:20 +03:00
list({ CORRECT_VAR_DECL, REVERT_SUBST_EXPR_RD, VERIFY_INCLUDES }) <= list({ CONVERT_TO_ENDDO, CORRECT_CODE_STYLE, REMOVE_DVM_DIRS, REMOVE_DVM_DIRS_TO_COMMENTS, REMOVE_SPF_DIRS, REMOVE_DVM_INTERVALS });
2023-09-14 19:43:13 +03:00
2024-03-18 14:49:04 +03:00
list({ CALL_GRAPH2, CONVERT_LOOP_TO_ASSIGN, REVERT_SUBST_EXPR_RD, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(INLINE_PROCEDURES);
2023-09-14 19:43:13 +03:00
2025-03-18 09:37:20 +03:00
list({ CONVERT_LOOP_TO_ASSIGN, CORRECT_FORMAT_PLACE }) <= list({ CONVERT_TO_ENDDO, CORRECT_CODE_STYLE, INSERT_INCLUDES, REMOVE_DVM_DIRS, REMOVE_DVM_DIRS_TO_COMMENTS, REMOVE_SPF_DIRS, REMOVE_DVM_INTERVALS });
2023-09-14 19:43:13 +03:00
2024-03-18 14:49:04 +03:00
list({ CORRECT_VAR_DECL, REVERT_SUBST_EXPR_RD }) <= list({ INSERT_INCLUDES, UNPARSE_FILE, SET_TO_ALL_DECL_INIT_ZERO });
2023-09-14 19:43:13 +03:00
Pass(CALL_GRAPH2) <= Pass(PRIVATE_ARRAYS_SHRINKING_ANALYSIS) <= Pass(PRIVATE_ARRAYS_SHRINKING);
2024-03-18 14:49:04 +03:00
list({ CALL_GRAPH2, LOOP_ANALYZER_ALIGNS, REVERT_SUBST_EXPR_RD }) <= list({ PRIVATE_ARRAYS_EXPANSION, PRIVATE_ARRAYS_SHRINKING });
2023-09-14 19:43:13 +03:00
list({ GCOV_PARSER, CREATE_INTER_TREE, CALL_GRAPH, CALL_GRAPH2 }) <= Pass(CREATE_PARALLEL_REGIONS);
list({ PRIVATE_CALL_GRAPH_STAGE1, PRIVATE_CALL_GRAPH_STAGE2, MACRO_EXPANSION, CONVERT_ASSIGN_TO_LOOP, DEF_USE_STAGE1, DEF_USE_STAGE2, LOOP_GRAPH, CALL_GRAPH, PRIVATE_ANALYSIS_IR, FIND_FUNC_TO_INCLUDE }) <= Pass(INSERT_REGIONS);
2023-09-14 19:43:13 +03:00
2024-03-18 14:49:04 +03:00
list({ LOOP_ANALYZER_DATA_DIST_S1, REVERT_SUBST_EXPR_RD }) <= list({ LOOPS_SPLITTER, LOOPS_COMBINER, UNROLL_LOOPS, INSERT_REGIONS });
2023-09-14 19:43:13 +03:00
2024-03-18 14:49:04 +03:00
list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= list({ DUPLICATE_FUNCTIONS, REMOVE_UNUSED_FUNCTIONS });
2023-09-14 19:43:13 +03:00
2024-04-06 18:04:59 +03:00
list({ CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= list({ LOOPS_SPLITTER, LOOPS_COMBINER, PRIVATE_ARRAYS_EXPANSION, PRIVATE_ARRAYS_SHRINKING, CREATE_PARALLEL_REGIONS, PURE_SAVE_TO_PARAMS, PURE_MODULE_TO_PARAMS, PURE_COMMON_TO_PARAMS, PURE_INTENT_INSERT, PRIVATE_REMOVING });
2023-09-14 19:43:13 +03:00
list({ GET_ALL_ARRAY_DECL, FILL_PARALLEL_REG_IR }) <= Pass(CONVERT_ASSIGN_TO_LOOP);
2024-03-18 14:49:04 +03:00
list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(RENAME_SYMBOLS);
2023-09-14 19:43:13 +03:00
list({ BUILD_IR, CALL_GRAPH }) <= Pass(LIVE_ANALYSIS_IR);
list({ BUILD_IR, LOOP_GRAPH, LIVE_ANALYSIS_IR }) <= Pass(PRIVATE_ANALYSIS_IR);
2023-09-14 19:43:13 +03:00
2023-11-22 20:21:18 +03:00
Pass(FILE_LINE_INFO) <= Pass(GET_MIN_MAX_BLOCK_DIST);
2023-09-14 19:43:13 +03:00
Pass(CALL_GRAPH2) <= Pass(FIX_COMMON_BLOCKS);
2023-11-26 18:57:05 +03:00
Pass(REMOVE_OMP_DIRS) <= Pass(REMOVE_OMP_DIRS_TRANSFORM);
2024-04-03 21:13:56 +03:00
list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(REMOVE_DEAD_CODE);
list({ REMOVE_DEAD_CODE, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE);
2024-07-20 13:03:27 +03:00
list({ VERIFY_INCLUDES, CORRECT_VAR_DECL }) <= Pass(SET_IMPLICIT_NONE);
2024-05-15 17:54:18 +03:00
2023-09-14 19:43:13 +03:00
passesIgnoreStateDone.insert({ CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS, INSERT_SHADOW_DIRS, EXTRACT_PARALLEL_DIRS,
EXTRACT_SHADOW_DIRS, CREATE_REMOTES, UNPARSE_FILE, REMOVE_AND_CALC_SHADOW,
REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL,
RESTORE_LOOP_FROM_ASSIGN, RESTORE_LOOP_FROM_ASSIGN_BACK, INSERT_REGIONS, REMOVE_COPIES, RESTORE_COPIES, SHADOW_GROUPING,
SWAP_LOOPS, RESTORE_SWAP_LOOPS, TEST_PASS, GROUP_ACTUAL_AND_REMOTE, GROUP_ACTUAL_AND_REMOTE_RESTORE, ADD_TEMPL_TO_USE_ONLY });
//only for print
if (printTree)
{
2024-03-18 14:49:04 +03:00
list({ CREATE_PARALLEL_DIRS, PRIVATE_ANALYSIS_IR, CREATE_REMOTES, REVERT_SUBST_EXPR_RD, UNPARSE_FILE, EXTRACT_PARALLEL_DIRS }) <= Pass(INSERT_PARALLEL_DIRS);
2023-09-14 19:43:13 +03:00
depsToGraphViz(passDepsIn);
exit(0);
}
}
2023-09-20 20:51:11 +03:00
void removalsFromPassesDependencies(map<passes, vector<passes>>& passDepsIn, const int curr_regime)
{
passDeps = &passDepsIn;
list({ INSERT_PARALLEL_DIRS_NODIST, LOOP_ANALYZER_NODIST }) -= list({ FIND_FUNC_TO_INCLUDE, CHECK_FUNC_TO_INCLUDE });
2023-09-20 20:51:11 +03:00
Pass(passes(curr_regime)).applyRemovals();
}
2023-09-14 19:43:13 +03:00
#undef list