From e33fe45a2b9baf7bfe74d6abe8fad9605b52e55d Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sun, 7 Apr 2024 16:38:57 +0300 Subject: [PATCH] handle contains statement while removing dead code, fix getLive method --- .../_src/CFGraph/live_variable_analysis.cpp | 7 +++- .../_src/Transformations/dead_code.cpp | 33 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) 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 ad41626..05f6bfb 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using std::string; using std::pair; @@ -138,7 +139,11 @@ namespace SAPFOR for (auto& by_pair : by_source) { auto& dest = res[by_pair.first]; - dest.insert(dest.end(), by_pair.second.begin(), by_pair.second.end()); + auto dest_copy = dest; + + dest.resize(dest_copy.size() + by_pair.second.size()); + + set_union(dest_copy.begin(), dest_copy.end(), by_pair.second.begin(), by_pair.second.end(), dest.begin()); } } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 659eef7..0db25af 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -503,12 +503,29 @@ void removeDeadCode(SgStatement* func, READ_STAT }; + set skip = + { + PROG_HEDR, + PROC_HEDR, + FUNC_HEDR + }; + vector remove; SgStatement* start = intervalDelStart ? intervalDelStart : func; SgStatement* end = intervalDelEnd ? intervalDelEnd : func->lastNodeOfStmt(); - for (auto st = start; st != end; st = st->lexNext()) + auto st = start; + if (skip.find(st->variant()) != skip.end()) + st = st->lexNext(); + + for (; st != end; st = st->lexNext()) { + if (skip.find(st->variant()) != skip.end()) + { + st = st->lastNodeOfStmt(); + continue; + } + if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) { remove.push_back(st); @@ -526,9 +543,21 @@ void removeDeadCode(SgStatement* func, do { remove.clear(); - for (auto st = start; st != end; st = st->lexNext()) + + st = start; + if (skip.find(st->variant()) != skip.end()) + st = st->lexNext(); + + for (; st != end; st = st->lexNext()) { const int var = st->variant(); + + if (skip.find(var) != skip.end()) + { + st = st->lastNodeOfStmt(); + continue; + } + if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && st->lexNext()->variant() == CONTROL_END) {