fix local var error caused by GloabalVarCache
This commit is contained in:
@ -94,12 +94,12 @@ void GlobalBuildDomForFunction(const std::shared_ptr<FunctionDefItem> &func, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_map<std::string, size_t> InNodeReplace(
|
std::unordered_map<std::string, size_t> InNodeReplace(
|
||||||
CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk) {
|
CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk,
|
||||||
|
std::unordered_map<std::string, std::string> &is_an_alias_generated_by_load) {
|
||||||
std::unordered_map<std::string, size_t> var_to_versions_pushed;
|
std::unordered_map<std::string, size_t> var_to_versions_pushed;
|
||||||
BlockItem *cur_block = cur_node->corresponding_block;
|
BlockItem *cur_block = cur_node->corresponding_block;
|
||||||
std::list<std::shared_ptr<ActionItem>> new_actions;
|
std::list<std::shared_ptr<ActionItem>> new_actions;
|
||||||
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load;
|
for (auto &[origin_var_name, _] : var_to_name_stk) {
|
||||||
for (auto [origin_var_name, _] : var_to_name_stk) {
|
|
||||||
if (cur_block->phi_map.find(origin_var_name) != cur_block->phi_map.end()) {
|
if (cur_block->phi_map.find(origin_var_name) != cur_block->phi_map.end()) {
|
||||||
var_to_name_stk[origin_var_name].push(cur_block->phi_map[origin_var_name]->result_full);
|
var_to_name_stk[origin_var_name].push(cur_block->phi_map[origin_var_name]->result_full);
|
||||||
var_to_versions_pushed[origin_var_name]++;
|
var_to_versions_pushed[origin_var_name]++;
|
||||||
@ -206,12 +206,12 @@ std::unordered_map<std::string, size_t> InNodeReplace(
|
|||||||
cur_block->actions = new_actions;
|
cur_block->actions = new_actions;
|
||||||
return var_to_versions_pushed;
|
return var_to_versions_pushed;
|
||||||
}
|
}
|
||||||
void GlobalDFSReplace(CFGNodeType *cur_node,
|
void GlobalDFSReplace(CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk,
|
||||||
std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk) {
|
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load) {
|
||||||
// std::cerr << "GlobalDFSReplace: " << cur_node->corresponding_block->label_full << std::endl;
|
// std::cerr << "GlobalDFSReplace: " << cur_node->corresponding_block->label_full << std::endl;
|
||||||
std::unordered_map<std::string, size_t> var_to_version_pushed;
|
std::unordered_map<std::string, size_t> var_to_version_pushed;
|
||||||
// step 1: process current node
|
// step 1: process current node
|
||||||
var_to_version_pushed = InNodeReplace(cur_node, var_to_name_stk);
|
var_to_version_pushed = InNodeReplace(cur_node, var_to_name_stk, is_an_alias_generated_by_load);
|
||||||
// step 2: process the phi commands in the successors in cfg
|
// step 2: process the phi commands in the successors in cfg
|
||||||
for (auto [origin_var_name, _] : var_to_name_stk) {
|
for (auto [origin_var_name, _] : var_to_name_stk) {
|
||||||
for (auto succ : cur_node->successors) {
|
for (auto succ : cur_node->successors) {
|
||||||
@ -222,9 +222,22 @@ void GlobalDFSReplace(CFGNodeType *cur_node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto succ : cur_node->successors) {
|
||||||
|
for (auto &[var, _] : succ->corresponding_block->phi_map) {
|
||||||
|
if (var_to_name_stk.find(var) == var_to_name_stk.end()) {
|
||||||
|
// this phi is generated by mem2reg
|
||||||
|
auto cur_phi = succ->corresponding_block->phi_map[var];
|
||||||
|
for (auto &[val, _] : cur_phi->values) {
|
||||||
|
if (is_an_alias_generated_by_load.find(val) != is_an_alias_generated_by_load.end()) {
|
||||||
|
val = is_an_alias_generated_by_load[val];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// step 3: process the successors in dom tree
|
// step 3: process the successors in dom tree
|
||||||
for (auto succ : cur_node->successors_in_dom_tree) {
|
for (auto succ : cur_node->successors_in_dom_tree) {
|
||||||
GlobalDFSReplace(succ, var_to_name_stk);
|
GlobalDFSReplace(succ, var_to_name_stk, is_an_alias_generated_by_load);
|
||||||
}
|
}
|
||||||
// step 4: restore the stack
|
// step 4: restore the stack
|
||||||
for (auto [var, version_pushed] : var_to_version_pushed) {
|
for (auto [var, version_pushed] : var_to_version_pushed) {
|
||||||
@ -296,7 +309,8 @@ void ConductGloabalVarCacheForFunction(const std::shared_ptr<FunctionDefItem> &f
|
|||||||
var_to_name_stk[var] = std::stack<std::string>();
|
var_to_name_stk[var] = std::stack<std::string>();
|
||||||
var_to_name_stk[var].push("~");
|
var_to_name_stk[var].push("~");
|
||||||
}
|
}
|
||||||
GlobalDFSReplace(cfg.entry, var_to_name_stk);
|
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load;
|
||||||
|
GlobalDFSReplace(cfg.entry, var_to_name_stk, is_an_alias_generated_by_load);
|
||||||
for (auto node : cfg.nodes) {
|
for (auto node : cfg.nodes) {
|
||||||
auto block = node->corresponding_block;
|
auto block = node->corresponding_block;
|
||||||
for (auto &[var, _] : var_to_name_stk) {
|
for (auto &[var, _] : var_to_name_stk) {
|
||||||
|
Reference in New Issue
Block a user