dvm updated, fixed and improved dead_code pass
This commit is contained in:
@@ -31,7 +31,6 @@ extern "C" int out_upper_case;
|
||||
extern "C" int out_line_unlimit;
|
||||
extern "C" int out_line_length;
|
||||
extern "C" PTR_SYMB last_file_symbol;
|
||||
extern "C" PTR_SYMB FileLastSymbol(...);
|
||||
|
||||
static int convertFile(int argc, char* argv[], const set<string>& filesInProj, const set<string>& moduleDeclsInFiles)
|
||||
{
|
||||
@@ -353,7 +352,6 @@ static int convertFile(int argc, char* argv[], const set<string>& filesInProj, c
|
||||
fout_name_info_C = ChangeFto_info_C(fout_name); /*ACC*/
|
||||
|
||||
//set the last symbol of file
|
||||
last_file_symbol = FileLastSymbol(file->filename());
|
||||
initLibNames(); //for every file
|
||||
InitDVM(file); //for every file
|
||||
current_file = file; // global variable (used in SgTypeComplex)
|
||||
|
||||
@@ -13,7 +13,7 @@ using std::set;
|
||||
|
||||
using std::remove_if;
|
||||
|
||||
#define PRINT_USELESS_STATEMENTS 0
|
||||
#define PRINT_USELESS_STATEMENTS 1
|
||||
|
||||
static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr,
|
||||
set<SAPFOR::Argument*>& use, set<SAPFOR::Argument*>& def,
|
||||
@@ -329,10 +329,22 @@ public:
|
||||
|
||||
void removeDeadCode(SgStatement* func,
|
||||
const map<string, vector<FuncInfo*>>& allFuncs,
|
||||
const map<string, CommonBlock*>& commonBlocks)
|
||||
const map<string, CommonBlock*>& commonBlocks,
|
||||
SgStatement* intervalDelStart, SgStatement* intervalDelEnd)
|
||||
{
|
||||
if (intervalDelStart && !intervalDelEnd || !intervalDelStart && intervalDelEnd)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
SgProgHedrStmt* prog = isSgProgHedrStmt(func);
|
||||
|
||||
if (intervalDelStart)
|
||||
if (intervalDelStart->lineNumber() < prog->lineNumber() || intervalDelStart->lineNumber() > prog->lastNodeOfStmt()->lineNumber())
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
if (intervalDelEnd)
|
||||
if (intervalDelEnd->lineNumber() < prog->lineNumber() || intervalDelEnd->lineNumber() > prog->lastNodeOfStmt()->lineNumber())
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, false, false, false, false), commonBlocks, allFuncs);
|
||||
|
||||
if(cfg.size() != 1)
|
||||
@@ -422,11 +434,8 @@ void removeDeadCode(SgStatement* func,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: need to add [intervalDelStart; intervalDelEnd]
|
||||
// remove dead statements
|
||||
|
||||
SgStatement* end = func->lastNodeOfStmt(), *st = func;
|
||||
|
||||
set<int> removable =
|
||||
{
|
||||
ASSIGN_STAT,
|
||||
@@ -435,49 +444,52 @@ void removeDeadCode(SgStatement* func,
|
||||
READ_STAT
|
||||
};
|
||||
|
||||
while (st != end)
|
||||
vector<SgStatement*> remove;
|
||||
for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext())
|
||||
{
|
||||
SgStatement* next = st->lexNext();
|
||||
|
||||
if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end())
|
||||
{
|
||||
remove.push_back(st);
|
||||
st = st->lastNodeOfStmt();
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& rem : remove)
|
||||
{
|
||||
__spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName());
|
||||
rem->deleteStmt();
|
||||
}
|
||||
|
||||
remove.clear();
|
||||
//remove empty blocks
|
||||
for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext())
|
||||
{
|
||||
const int var = st->variant();
|
||||
if ((var == FOR_NODE || var == WHILE_NODE || var == IF_NODE || var == SWITCH_NODE) &&
|
||||
st->lexNext()->variant() == CONTROL_END)
|
||||
{
|
||||
__spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement '%s' on line %d]\n", st->unparse(), st->lineNumber());
|
||||
|
||||
st->deleteStmt();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isSgControlEndStmt(st))
|
||||
{
|
||||
SgStatement* parent = st->controlParent();
|
||||
SgStatement* parent_end;
|
||||
|
||||
if (parent && (parent_end = parent->lastNodeOfStmt()) && parent_end == st)
|
||||
{
|
||||
bool empty_parent = false;
|
||||
|
||||
switch (parent->variant())
|
||||
{
|
||||
case IF_NODE:
|
||||
empty_parent =
|
||||
parent->lexNext() == parent_end || // IF THEN ENDIF
|
||||
isSgControlEndStmt(parent->lexNext()) &&
|
||||
parent->lexNext()->lexNext() == parent_end; // IF THEN ELSE ENDIF
|
||||
break;
|
||||
default:
|
||||
empty_parent = parent->lexNext() == parent_end; // DO, WHILE
|
||||
break;
|
||||
}
|
||||
|
||||
if (empty_parent)
|
||||
parent->deleteStmt();
|
||||
else if(isSgIfStmt(parent) && isSgControlEndStmt(parent_end->lexPrev())) // IF with empty ELSE branch
|
||||
parent_end->deleteStmt();
|
||||
}
|
||||
}
|
||||
remove.push_back(st);
|
||||
continue;
|
||||
}
|
||||
|
||||
st = next;
|
||||
if (var == IF_NODE)
|
||||
{
|
||||
SgStatement* ifS = st;
|
||||
while (ifS->lexNext()->variant() == ELSEIF_NODE)
|
||||
ifS = ifS->lexNext();
|
||||
|
||||
if (ifS->lexNext()->variant() == CONTROL_END)
|
||||
remove.push_back(st);
|
||||
}
|
||||
|
||||
//TODO: SWITCH and other block statements
|
||||
}
|
||||
|
||||
|
||||
for (auto& rem : remove)
|
||||
{
|
||||
__spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName());
|
||||
rem->deleteStmt();
|
||||
}
|
||||
|
||||
deleteCFG(cfg);
|
||||
|
||||
@@ -11,4 +11,5 @@
|
||||
|
||||
void removeDeadCode(SgStatement* func,
|
||||
const std::map<std::string, std::vector<FuncInfo*>>&allFuncs,
|
||||
const std::map<std::string, CommonBlock*>& commonBlocks);
|
||||
const std::map<std::string, CommonBlock*>& commonBlocks,
|
||||
SgStatement* intervalDelStart = NULL, SgStatement* intervalDelEnd = NULL);
|
||||
@@ -1,3 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define VERSION_SPF "2289"
|
||||
#define VERSION_SPF "2290"
|
||||
|
||||
Reference in New Issue
Block a user