From c3827ed8f6606512d0813242a968617bc1461595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=BE=D1=87?= =?UTF-8?q?=D0=B0=D1=80=D0=BC=D0=B8=D0=BD?= Date: Sat, 6 Jan 2024 17:26:19 +0300 Subject: [PATCH] initial version of dead code analysis (dirty) --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 6 +- .../Sapfor_2017/_src/CFGraph/CFGraph.h | 5 + .../_src/CFGraph/live_variable_analysis.cpp | 466 ++++++------------ .../_src/CFGraph/live_variable_analysis.h | 33 ++ .../_src/Transformations/dead_code.cpp | Bin 0 -> 16918 bytes .../_src/Transformations/dead_code.h | Bin 0 -> 542 bytes 6 files changed, 195 insertions(+), 315 deletions(-) create mode 100644 sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp create mode 100644 sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 78370cc..bd96c3d 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -160,7 +160,9 @@ set(PARALLEL_REG _src/ParallelizationRegions/ParRegions.cpp _src/ParallelizationRegions/expand_extract_reg.h _src/ParallelizationRegions/resolve_par_reg_conflicts.cpp _src/ParallelizationRegions/resolve_par_reg_conflicts.h) - + +set(TR_DEAD_CODE _src/Transformations/dead_code.cpp + _src/Transformations/dead_code.h) set(TR_CP _src/Transformations/checkpoints.cpp _src/Transformations/checkpoints.h) set(TR_VECTOR _src/Transformations/array_assign_to_loop.cpp @@ -191,6 +193,7 @@ set(TR_CONV _src/Transformations/convert_to_c.cpp _src/Transformations/convert_to_c.h) set(TRANSFORMS + ${TR_DEAD_CODE} ${TR_CP} ${TR_VECTOR} ${TR_ENDDO_LOOP} @@ -414,6 +417,7 @@ source_group (CFGraph FILES ${CFG}) source_group (CFGraph\\DataFlow FILES ${DATA_FLOW}) source_group (Transformations\\ExpressionSubstitution FILES ${EXPR_TRANSFORM}) +source_group (Transformations\\DeadCodeRemoving FILES ${TR_DEAD_CODE}) source_group (Transformations\\CheckPoints FILES ${TR_CP}) source_group (Transformations\\LoopEndDoConverter FILES ${TR_ENDDO_LOOP}) source_group (Transformations\\LoopNesting FILES ${TR_LOOP_NEST}) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/CFGraph.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/CFGraph.h index 99b98dd..559ba6f 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/CFGraph.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/CFGraph.h @@ -33,6 +33,7 @@ namespace SAPFOR bool addLive(const std::map>& to_add, bool in); std::map> getLive(bool in) const; + bool removeLive(SAPFOR::Argument* to_remove, bool in); public: BasicBlock() { num = lastNumBlock++; } BasicBlock(IR_Block* item); @@ -74,6 +75,10 @@ namespace SAPFOR std::map> getLiveIn() const { return getLive(true); }; std::map> getLiveOut() const { return getLive(false); }; + + bool removeLiveIn(SAPFOR::Argument* to_remove) { return removeLive(to_remove, true); }; + bool removeLiveOut(SAPFOR::Argument* to_remove) { return removeLive(to_remove, false); }; + void compressLives(); /* diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp index 955a215..8290438 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp @@ -1,5 +1,5 @@ #include "live_variable_analysis.h" -#include "DataFlow/forward_data_flow.h" +#include "DataFlow/backward_data_flow.h" #include "RD_subst.h" #include @@ -17,6 +17,8 @@ using std::set; using std::unordered_map; using std::list; +using LIVE_VARIABLES::fcall; + namespace SAPFOR { bool BasicBlock::addLive(const map>& to_add, bool in) { @@ -28,7 +30,7 @@ namespace SAPFOR { const set& add_in_live = byNew.second; set new_in_live = {}; - + auto current_set_iter = current_set.find(byNew.first); if (current_set_iter == current_set.end()) @@ -106,106 +108,114 @@ namespace SAPFOR return res; } - + void BasicBlock::compressLives() { for (auto& bySrc : { &live_in, &live_out, &live_inout }) for (auto& byArg : *bySrc) byArg.second.shrink_to_fit(); } + + bool BasicBlock::removeLive(SAPFOR::Argument* to_remove, bool in) { + std::map>& current_set = (in ? live_in : live_out); + std::map>& opposite_set = (!in ? live_in : live_out); + + bool removed = false; + + removed |= (current_set.erase(to_remove) != 0); + + if (!removed) { + auto it = live_inout.find(to_remove); + + if (it != live_inout.end()) + { + auto& dest = opposite_set[to_remove]; + for (SAPFOR::BasicBlock* bb : it->second) + { + auto find_bb_from_dest = std::lower_bound(dest.begin(), dest.end(), bb); + + if (find_bb_from_dest == dest.end() || *find_bb_from_dest != bb) + dest.insert(find_bb_from_dest, bb); + } + + removed = true; + } + } + + return removed; + }; } -struct fcall +bool fcall::tryInsert(set& dest, SAPFOR::BasicBlock* b) { -private: - bool tryInsert(set& dest, SAPFOR::BasicBlock* b) + if (b == block || dest.find(block) == dest.end()) { - if (b == block || dest.find(block) == dest.end()) - { - dest.insert(b); - return true; - } - - return false; + dest.insert(b); + return true; } -public: - FuncInfo* func; - - map> live_after; - set dead_after; + return false; +} - map> commons_live_after; - set commons_dead_after; +fcall::fcall(FuncInfo* f, SAPFOR::BasicBlock* b, const vector& p) +{ + block = b; + func = f; - vector params; - SAPFOR::BasicBlock* block; + int param_size = p.size(); + params = vector(param_size, NULL); - fcall(FuncInfo* f, SAPFOR::BasicBlock* b, const vector& p) - { - block = b; - func = f; - - int param_size = p.size(); - params = vector(param_size, NULL); + for (int i = 0; i < param_size; i++) + if (f->funcParams.isArgOut(i)) + params[i] = p[i]; +} - for (int i = 0; i < param_size; i++) - if (f->funcParams.isArgOut(i)) - params[i] = p[i]; - } - - void make_live(SAPFOR::Argument* arg, SAPFOR::BasicBlock* b) +void fcall::make_live(SAPFOR::Argument* arg, SAPFOR::BasicBlock* b) +{ + if (arg->getMemType() == SAPFOR::CFG_MEM_TYPE::COMMON_ || arg->getMemType() == SAPFOR::CFG_MEM_TYPE::MODULE_) { - if (arg->getMemType() == SAPFOR::CFG_MEM_TYPE::COMMON_ || arg->getMemType() == SAPFOR::CFG_MEM_TYPE::MODULE_) - { - if (commons_dead_after.find(arg) == commons_dead_after.end()) - tryInsert(commons_live_after[arg], b); - } - - auto it = find(params.begin(), params.end(), arg); - if (it != params.end()) - { - int idx = it - params.begin(); - if (dead_after.find(idx) == dead_after.end()) - tryInsert(live_after[idx], b); - } + if (commons_dead_after.find(arg) == commons_dead_after.end()) + tryInsert(commons_live_after[arg], b); } - void make_dead(SAPFOR::Argument* arg) + auto it = find(params.begin(), params.end(), arg); + if (it != params.end()) { - if (arg->getMemType() == SAPFOR::CFG_MEM_TYPE::COMMON_ || arg->getMemType() == SAPFOR::CFG_MEM_TYPE::MODULE_) - { - if (commons_live_after.find(arg) == commons_live_after.end()) - commons_dead_after.insert(arg); - } - - auto it = find(params.begin(), params.end(), arg); - if (it != params.end()) - { - int idx = it - params.begin(); - if (live_after.find(idx) == live_after.end()) - dead_after.insert(idx); - } + int idx = it - params.begin(); + if (dead_after.find(idx) == dead_after.end()) + tryInsert(live_after[idx], b); } +} - void updateFromOut() +void fcall::make_dead(SAPFOR::Argument* arg) +{ + if (arg->getMemType() == SAPFOR::CFG_MEM_TYPE::COMMON_ || arg->getMemType() == SAPFOR::CFG_MEM_TYPE::MODULE_) { - for (const auto& p : block->getLiveOut()) - for (auto b : p.second) - make_live(p.first, b); + if (commons_live_after.find(arg) == commons_live_after.end()) + commons_dead_after.insert(arg); } -}; + + auto it = find(params.begin(), params.end(), arg); + if (it != params.end()) + { + int idx = it - params.begin(); + if (live_after.find(idx) == live_after.end()) + dead_after.insert(idx); + } +} + +void fcall::updateFromOut() +{ + for (const auto& p : block->getLiveOut()) + for (auto b : p.second) + make_live(p.first, b); +} static bool getLiveDead(const vector& params, const string& func_name, set& live, set& dead); static void buildUseDef(SAPFOR::BasicBlock* block, set& use, set& def, - vector& formal_parameters, vector& fcalls, - const map& funcByName); - -static void buildUseDef2(SAPFOR::BasicBlock* block, set& use, set& def, - vector& formal_parameters, vector& fcalls, - const map& funcByName); - + vector& formal_parameters, vector& fcalls, + const map& funcByName, bool interprocedural); class LiveVarAnalysisNode : public DataFlowAnalysisNode>> { private: @@ -232,7 +242,7 @@ public: for (const auto& byArg : data) if (live.find(byArg.first) == live.end() && dead.find(byArg.first) == dead.end()) - inserted |= getBlock()->addLiveIn({byArg}); + inserted |= getBlock()->addLiveIn({ byArg }); return inserted; }; @@ -242,98 +252,7 @@ public: { setBlock(block); - set live1, dead1; - vector formal_parameters1 = formal_parameters; - vector fcalls1; - - buildUseDef(getBlock(), live1, dead1, formal_parameters1, fcalls1, funcByName); - - set live2, dead2; - vector formal_parameters2 = formal_parameters; - vector fcalls2; - - buildUseDef2(getBlock(), live2, dead2, formal_parameters2, fcalls2, funcByName); - - bool err = false; - - for (auto& l1 : live1) { - if (live2.find(l1) == live2.end()) { - __spf_print(1, "bb %d use %s >> 1\n", getBlock()->getNumber(), l1->getValue().c_str()); - err = true; - } - } - - for (auto& l2 : live2) { - if (live1.find(l2) == live1.end()) { - __spf_print(1, "bb %d use %s >> 2\n", getBlock()->getNumber(), l2->getValue().c_str()); - err = true; - } - } - - err |= live1.size() != live2.size(); - - for (auto& l1 : dead1) { - if (dead2.find(l1) == dead2.end()) { - __spf_print(1, "bb %d dead %s >> 1\n", getBlock()->getNumber(), l1->getValue().c_str()); - err = true; - } - } - - for (auto& l2 : dead2) { - if (dead1.find(l2) == dead1.end()) { - __spf_print(1, "bb %d dead %s >> 2\n", getBlock()->getNumber(), l2->getValue().c_str()); - err = true; - } - } - - err |= dead1.size() != dead2.size(); - - if (fcalls1.size() != fcalls2.size()) { - __spf_print(1, "bb %d different fcall sizes: 1: %d, w: %d\n", getBlock()->getNumber(), fcalls1.size(), fcalls2.size()); - - err = true; - } - else { - for (int i = 0; i < fcalls1.size(); i++) { - auto& c1 = fcalls1[i]; - auto& c2 = fcalls2[fcalls1.size() - i - 1]; - - if (c1.func->funcName != c2.func->funcName) { - __spf_print(1, "different fnames %s, %s\n", c1.func->funcName.c_str(), c2.func->funcName.c_str()); - err = true; - } - - if (c1.live_after != c2.live_after) { - __spf_print(1, "different live_after\n"); - err = true; - } - - if (c1.dead_after != c2.dead_after) { - __spf_print(1, "different dead_after\n"); - err = true; - } - - if (c1.commons_dead_after != c2.commons_dead_after) { - __spf_print(1, "different commons_dead_after\n"); - err = true; - } - - if (c1.commons_live_after != c2.commons_live_after) { - __spf_print(1, "different commons_live_after\n"); - err = true; - } - } - } - - if (err) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - - live = live1; - dead = dead1; - formal_parameters = formal_parameters1; - - for (auto& fc : fcalls1) - fcalls.push_back(fc); + buildUseDef(getBlock(), live, dead, formal_parameters, fcalls, funcByName, true); for (SAPFOR::Argument* arg : live) getBlock()->addLiveIn({ { arg, { getBlock() } } }); @@ -351,22 +270,20 @@ protected: }; public: LiveVarAnalysis(vector& formal_parameters, vector& fcalls, - const map& funcByName) : formal_parameters(formal_parameters), fcalls(fcalls), funcByName(funcByName) + const map& funcByName) : formal_parameters(formal_parameters), fcalls(fcalls), funcByName(funcByName) { }; }; -static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, - set& use, set& def, - vector& formal_parameters, vector& fcalls, - vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, - string& fName, - const map& funcByName) +void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, + set& use, set& def, + vector& formal_parameters, vector& fcalls, + vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + string& fName, const map& funcByName, bool interprocedural) { for (auto arg : { instr->getArg1(), instr->getArg2(), instr->getResult() }) if (arg && arg->getMemType() == SAPFOR::CFG_MEM_TYPE::FUNC_PARAM_) formal_parameters[getParamIndex(arg, formal_parameters.size())] = arg; - set res = {}, args = {}; SAPFOR::Argument* res_arg = NULL; static const set skip = { SAPFOR::CFG_OP::ENTRY }; @@ -375,7 +292,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru { res_arg = instr->getArg1(); set instr_args = { instr->getResult(), instr->getArg2() }; - insertIfVar(instr_args.begin(), instr_args.end(), args); + use.insert(instr_args.begin(), instr_args.end()); } else if (instr_operation == SAPFOR::CFG_OP::PARAM) { @@ -399,7 +316,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru //default res_arg = instr->getResult(); std::set intr_args = { instr->getArg1(), instr->getArg2() }; - insertIfVar(intr_args.begin(), intr_args.end(), args); + use.insert(intr_args.begin(), intr_args.end()); } else { @@ -416,7 +333,6 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru auto r_it = fcalls.rbegin(); auto r_end = fcalls.rend(); - for (auto e : def) r_it->make_dead(e); @@ -426,40 +342,65 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru set make_live, make_dead; if (fName == "_READ") - res.insert(lastParamRef.begin(), lastParamRef.end()); - else if (getLiveDead(lastParamRef, fName, make_live, make_dead)) + def.insert(lastParamRef.begin(), lastParamRef.end()); + else if (interprocedural && getLiveDead(lastParamRef, fName, make_live, make_dead)) { - insertIfVar(make_live.begin(), make_live.end(), args); - insertIfVar(make_dead.begin(), make_dead.end(), res); + use.insert(make_live.begin(), make_live.end()); + def.insert(make_dead.begin(), make_dead.end()); } else - insertIfVar(lastParamRef.begin(), lastParamRef.end(), args); + use.insert(lastParamRef.begin(), lastParamRef.end()); last_param_ref_index = 0; last_param_ref_size = 0; lastParamRef.clear(); + fName = ""; } - if (res_arg && res_arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR) - res.insert(res_arg); + if (res_arg) + def.insert(res_arg); +} + +static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, + set& use, set& def, + vector& formal_parameters, vector& fcalls, + vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + string& fName, const map& funcByName, bool interprocedural) +{ + set res, args; + + getUseDefForInstruction(block, instr, + args, res, + formal_parameters, fcalls, + lastParamRef, last_param_ref_index, last_param_ref_size, + fName, funcByName, + interprocedural + ); for (auto e : res) { - def.insert(e); - use.erase(e); + if (e && e->getType() == SAPFOR::CFG_ARG_TYPE::VAR) + { + def.insert(e); + use.erase(e); + } } - for (auto e : args) { - use.insert(e); - def.erase(e); + for (auto e : args) + { + if (e && e->getType() == SAPFOR::CFG_ARG_TYPE::VAR) + { + use.insert(e); + def.erase(e); + } } } //Build use and def sets of block. Result are stored in use and def -static void buildUseDef2(SAPFOR::BasicBlock* block, set& use, set& def, - vector& formal_parameters, vector& fcalls, - const map& funcByName) +static void buildUseDef(SAPFOR::BasicBlock* block, set& use, set& def, + vector& formal_parameters, vector& fcalls, + const map& funcByName, bool interprocedural) { vector lastParamRef; int last_param_ref_index = 0, last_param_ref_size = 0; @@ -470,119 +411,16 @@ static void buildUseDef2(SAPFOR::BasicBlock* block, set& use, for (; ir_block_it != ir_block_end; ir_block_it++) { - updateUseDefForInstruction(block, (*ir_block_it)->getInstruction(), - use, def, - formal_parameters, fcalls, - lastParamRef, last_param_ref_index, last_param_ref_size, - fName, funcByName + updateUseDefForInstruction(block, (*ir_block_it)->getInstruction(), + use, def, + formal_parameters, fcalls, + lastParamRef, last_param_ref_index, last_param_ref_size, + fName, funcByName, + interprocedural ); } } -//Build use and def sets of block. Result are stored in use and def -static void buildUseDef(SAPFOR::BasicBlock* block, set& use, set& def, - vector& formal_parameters, vector& fcalls, - const map& funcByName) -{ - set tmp_use, tmp_def; - - vector lastParamRef; - bool fcall_added; - - for (auto ir_block : block->getInstructions()) - { - fcall_added = false; - SAPFOR::Instruction* instr = ir_block->getInstruction(); - for (auto arg : { instr->getArg1(), instr->getArg2(), instr->getResult() }) - if (arg && arg->getMemType() == SAPFOR::CFG_MEM_TYPE::FUNC_PARAM_) - formal_parameters[getParamIndex(arg, formal_parameters.size())] = arg; - - set res = {}, args = {}; - SAPFOR::Argument* res_arg = NULL; - - static const set skip = { SAPFOR::CFG_OP::ENTRY }; - SAPFOR::CFG_OP instr_operation = instr->getOperation(); - if (hasStoreStructure(instr_operation)) { - res_arg = instr->getArg1(); - std::set instr_args = { instr->getResult(), instr->getArg2()}; - insertIfVar(instr_args.begin(), instr_args.end(), args); - } - else if (instr_operation == SAPFOR::CFG_OP::PARAM) - lastParamRef.push_back(instr->getArg1()); - else if (instr_operation == SAPFOR::CFG_OP::F_CALL) - { - res_arg = instr->getResult(); - - int count = stoi(instr->getArg2()->getValue()); - if (lastParamRef.size() != count) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - - const string& fName = instr->getArg1()->getValue(); - auto func_it = funcByName.find(fName); - if (func_it != funcByName.end()) - { - fcalls.push_back(fcall(func_it->second, block, lastParamRef)); - fcall_added = true; - } - - set make_live, make_dead; - if (fName == "_READ") - res.insert(lastParamRef.begin(), lastParamRef.end()); - else if (getLiveDead(lastParamRef, fName, make_live, make_dead)) - { - insertIfVar(make_live.begin(), make_live.end(), args); - insertIfVar(make_dead.begin(), make_dead.end(), res); - } - else - insertIfVar(lastParamRef.begin(), lastParamRef.end(), args); - - lastParamRef.clear(); - } - else if(skip.find(instr_operation) == skip.end()) - { - //default - res_arg = instr->getResult(); - std::set intr_args = { instr->getArg1(), instr->getArg2() }; - insertIfVar(intr_args.begin(), intr_args.end(), args); - } - else { - //skip - continue; - } - - if (res_arg && res_arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR) - res.insert(res_arg); - - for (auto e : args) - if (!tmp_def.count(e)) - tmp_use.insert(e); - - for(auto e : res) - if (!tmp_use.count(e)) - tmp_def.insert(e); - - auto r_it = fcalls.rbegin(); - auto r_end = fcalls.rend(); - if (fcall_added && r_it != r_end) - r_it++; - - while (r_it != r_end && r_it->block == block) - { - for (auto e : args) - r_it->make_live(e, block); - - for (auto e : res) - r_it->make_dead(e); - - r_it++; - } - } - - use = tmp_use; - def = tmp_def; -} - - // prints info about live variables void doDumpLive(const map>& CFGraph_for_project) { @@ -598,7 +436,7 @@ void doDumpLive(const map>& CFGraph_for_p for (const auto& live : byBB->getLiveIn()) { __spf_print(1, " %s:", live.first->getValue().c_str()); - for(auto use : live.second) + for (auto use : live.second) __spf_print(1, " %d", use->getNumber()); __spf_print(1, "\n"); } @@ -701,8 +539,8 @@ static void fillLiveDeadArgs(const FuncInfo* func, const vector& params, - const map, set>>& params_and_globals, - const string& func_name, set& result) + const map, set>>& params_and_globals, + const string& func_name, set& result) { auto globals_it = params_and_globals.find(func_name); @@ -717,7 +555,7 @@ bool joinGlobalsWithParameters(const vector& params, for (int idx : param_indexes) { if (idx < params_size) { - if(params[idx] && params[idx]->getType() == SAPFOR::CFG_ARG_TYPE::VAR) + if (params[idx] && params[idx]->getType() == SAPFOR::CFG_ARG_TYPE::VAR) result.insert(params[idx]); } else @@ -729,11 +567,11 @@ bool joinGlobalsWithParameters(const vector& params, } // fill sets of arguments wich becomes live or dead after call with parameters params -static bool getLiveDead(const vector& params, const string& func_name, - set& live, set& dead) +static bool getLiveDead(const vector& params, const string& func_name, + set& live, set& dead) { return joinGlobalsWithParameters(params, live_by_func, func_name, live) && - joinGlobalsWithParameters(params, dead_by_func, func_name, dead); + joinGlobalsWithParameters(params, dead_by_func, func_name, dead); } // entrypoint for live variable analysis pass @@ -753,7 +591,7 @@ void runLiveVariableAnalysis(const map>& callDeps[byFunc.first].insert(byFunc.first->callsFromV.begin(), byFunc.first->callsFromV.end()); funcByName[byFunc.first->funcName] = byFunc.first; } - + vector> scc; vector> callLvls = groupByCallDependencies(callDeps, scc); @@ -800,7 +638,7 @@ void runLiveVariableAnalysis(const map>& auto it = assembled_fcalls.find(call.func); if (it == assembled_fcalls.end()) it = assembled_fcalls.insert({ call.func, fcall(call.func, call.block, {}) }).first; - + for (const auto& p : call.live_after) it->second.live_after[p.first].insert(p.second.begin(), p.second.end()); @@ -815,7 +653,7 @@ void runLiveVariableAnalysis(const map>& printInternalError(convertFileName(__FILE__).c_str(), __LINE__); auto param_it = func_to_parameters.find(func.first->funcName); - if(param_it == func_to_parameters.end()) + if (param_it == func_to_parameters.end()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); const vector& params = param_it->second; @@ -852,12 +690,12 @@ void runLiveVariableAnalysis(const map>& if (exit->addIn({ byArg })) { exit->setInCnt(max_cnt); - if(exit->forwardData({ byArg })) + if (exit->forwardData({ byArg })) exit->setOutCnt(max_cnt); } } } - + // now we can update live sets in all blocks func_it->second->analyze(); } diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h index 52e183b..b41680c 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h @@ -1,6 +1,33 @@ #include "../Utils/SgUtils.h" #include "CFGraph.h" +namespace LIVE_VARIABLES +{ + struct fcall + { + private: + bool tryInsert(std::set& dest, SAPFOR::BasicBlock* b); + public: + FuncInfo* func; + + std::map> live_after; + std::set dead_after; + + std::map> commons_live_after; + std::set commons_dead_after; + + std::vector params; + SAPFOR::BasicBlock* block; + + fcall(FuncInfo* f, SAPFOR::BasicBlock* b, const std::vector& p); + + void make_live(SAPFOR::Argument* arg, SAPFOR::BasicBlock* b); + void make_dead(SAPFOR::Argument* arg); + + void updateFromOut(); + }; +} + template void insertIfVar(IT begin, IT end, DEST& to) { for (auto it = begin; it != end; it++) @@ -8,6 +35,12 @@ void insertIfVar(IT begin, IT end, DEST& to) { to.insert(*it); }; +void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, + std::set& use, std::set& def, + std::vector& formal_parameters, std::vector& fcalls, + std::vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + std::string& fName, const std::map& funcByName, bool interprocedural); + void runLiveVariableAnalysis(const std::map>& CFGraph_for_project); void doDumpLive(const std::map>& CFGraph_for_project); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c5050d861df437befb4412205048cb4522070d1e GIT binary patch literal 16918 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 literal 0 HcmV?d00001