improve dead code analysis

This commit is contained in:
2024-05-22 10:33:58 +03:00
parent 62e4c5cdfe
commit 01016a7b9f
4 changed files with 49 additions and 43 deletions

View File

@@ -6,6 +6,12 @@
#include "../CFGraph.h"
#include "../IR.h"
enum DATA_FLOW_UPD_STATUS {
NO_CHANGE = 0,
FORWARD,
NEW
};
template <class DataType>
class DataFlowAnalysisNode {
static const int CNT_NOTINIT = 0;
@@ -13,7 +19,6 @@ class DataFlowAnalysisNode {
int in_cnt = CNT_NOTINIT, out_cnt = CNT_NOTINIT;
std::set<int> rollback;
std::set<int> ignore_rollback;
std::set<DataFlowAnalysisNode<DataType>*> prev_blocks;
@@ -30,7 +35,7 @@ public:
virtual bool addOut(const DataType& data) = 0;
virtual bool updateState() { return false; }
virtual bool forwardData(const DataType& data) = 0;
virtual DATA_FLOW_UPD_STATUS forwardData(const DataType& data) = 0;
bool newerThan(const DataFlowAnalysisNode<DataType>* block) const { return out_cnt > block->in_cnt; }
@@ -42,7 +47,6 @@ public:
static int getStartCounter() { return CNT_NOTINIT; }
std::set<int>& getRollback() { return rollback; }
std::set<int>& getIgnoreRollback() { return ignore_rollback; }
std::set<DataFlowAnalysisNode<DataType>*>& getPrevBlocks() { return prev_blocks; }

View File

@@ -19,7 +19,6 @@ template <class DataType>
DataFlowAnalysisNode<DataType>::DataFlowAnalysisNode()
{
getRollback() = {};
getIgnoreRollback() = {};
prev_blocks = {};
}
@@ -33,18 +32,21 @@ void DataFlowAnalysisNode<DataType>::doStep()
{
if (in_cnt < next->out_cnt)
{
if (next->out_cnt > in_max_cnt)
in_max_cnt = next->out_cnt;
const auto& byOut = next->getOut();
bool inserted = addIn( byOut);
if (inserted)
{
if (next->out_cnt > in_max_cnt)
in_max_cnt = next->out_cnt;
inserted = forwardData(byOut);
auto status = forwardData(byOut);
inserted = status != DATA_FLOW_UPD_STATUS::NO_CHANGE;
if (inserted && next->out_cnt > out_max_cnt)
out_max_cnt = next->out_cnt;
uniq_change |= status == DATA_FLOW_UPD_STATUS::NEW;
}
}
}
@@ -81,12 +83,10 @@ void DataFlowAnalysis<NodeType>::analyze()
const auto& jumps = curr_bb->getRollback();
if (jumps.size() != 0)
{
auto& ignored_jumps = curr_bb->getIgnoreRollback();
bool jump = false;
for (const auto& jump_to : jumps)
{
if (ignored_jumps.insert(jump_to).second && curr_bb->newerThan(nodes[jump_to]))
if (curr_bb->newerThan(nodes[jump_to]))
{
jump = true;
curr = jump_to;
@@ -94,9 +94,7 @@ void DataFlowAnalysis<NodeType>::analyze()
}
}
if (!jump)
curr_bb->getIgnoreRollback().clear();
else
if (jump)
continue;
}

View File

@@ -107,8 +107,6 @@ namespace SAPFOR
removed |= (current_set.erase(to_remove) != 0);
if (!removed)
{
auto it = live_inout.find(to_remove);
if (it != live_inout.end())
@@ -122,9 +120,9 @@ namespace SAPFOR
dest.insert(find_bb_from_dest, bb);
}
live_inout.erase(to_remove);
removed = true;
}
}
return removed;
}
@@ -253,7 +251,7 @@ public:
return getBlock()->addLiveIn(data);
}
bool forwardData(const map<SAPFOR::Argument*, vector<SAPFOR::BasicBlock*>>& data)
DATA_FLOW_UPD_STATUS forwardData(const map<SAPFOR::Argument*, vector<SAPFOR::BasicBlock*>>& data)
{
bool inserted = false;
@@ -261,7 +259,7 @@ public:
if (live.find(byArg.first) == live.end() && dead.find(byArg.first) == dead.end())
inserted |= getBlock()->addLiveIn({ byArg });
return inserted;
return inserted ? DATA_FLOW_UPD_STATUS::FORWARD : DATA_FLOW_UPD_STATUS::NO_CHANGE;
}
LiveVarAnalysisNode(SAPFOR::BasicBlock* block, vector<SAPFOR::Argument*>& formal_parameters,

View File

@@ -235,6 +235,15 @@ public:
if (!useful_block)
updated |= updateNextNotEmpty();
if (!useful_block)
{
if (next_notempty_in != next_notempty_out)
{
updated = true;
next_notempty_out = next_notempty_in;
}
}
updated |= updateJumpStatus();
if(updated)
@@ -243,9 +252,10 @@ public:
return updated;
}
bool forwardData(const map<SAPFOR::Argument*, vector<SAPFOR::BasicBlock*>>& data)
DATA_FLOW_UPD_STATUS forwardData(const map<SAPFOR::Argument*, vector<SAPFOR::BasicBlock*>>& data)
{
bool inserted = false;
bool inserted_forward = false, inserted_new = false;
SAPFOR::BasicBlock* bb = getBlock();
set<SAPFOR::Argument*> use, def;
@@ -271,7 +281,7 @@ public:
if (data_it == data.end())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
inserted |= bb->addLiveIn({ *data_it });
inserted_forward |= bb->addLiveIn({ *data_it });
}
else
{
@@ -285,7 +295,7 @@ public:
bb->removeLiveIn(arg);
}
if(!skip)
inserted |= bb->addLiveIn({ { arg, { bb } } });
inserted_new |= bb->addLiveIn({ { arg, { bb } } });
}
}
}
@@ -298,23 +308,19 @@ public:
{
useful_block = true;
inserted = true;
inserted_new = true;
next_notempty_out = { this };
break;
}
}
}
if (!useful_block)
{
if (next_notempty_in != next_notempty_out)
{
inserted = true;
next_notempty_out = next_notempty_in;
}
}
if(inserted_new)
return DATA_FLOW_UPD_STATUS::NEW;
else if(inserted_forward)
return DATA_FLOW_UPD_STATUS::FORWARD;
return inserted;
return DATA_FLOW_UPD_STATUS::NO_CHANGE;
}
DeadCodeAnalysisNode(SAPFOR::BasicBlock* block,